Redis是一种非关系型数据库,它是一种Key-Value存储系统。类似于memcached,但与memcached不同的是,Redis支持更为丰富的数据结构,例如hashes、lists、sets、sorted sets等。同时,Redis支持多种数据持久化方式,非常适合用来做缓存系统,尤其是高并发的互联网应用中。在Redis中,对于一些频繁读取但又不容易修改的数据可以将其缓存在内存中,以此提高系统的查询性能,也就是所谓的缓存。
Redis缓存穿透
缓存穿透是指访问一个不存在的缓存对象,此时会直接请求数据库,如果这样的行为频繁发生,会导致数据库的压力过大,从而影响系统的性能和稳定性。根据经验,在访问缓存时,可以通过对key进行校验已达到避免访问不存在的缓存数据的目的。例如,可以设置一个布隆过滤器(BloomFilter)来缓存数百万条数据的key,以此来避免请求缓存中不存在的key。这种解决方法能够有效地解决缓存穿透问题,大大降低了对数据库的访问频率。
Redis缓存击穿和雪崩
缓存击穿是指在高并发的情况下,大量的请求同时访问一些需要频繁查询并且缓存时间较短的缓存数据,这时如果缓存数据刚好过期,那么所有的请求都会直接访问数据库,对数据库造成巨大压力,从而引起系统的崩溃。而缓存雪崩则是指当缓存中的大量数据同时过期,所有请求都会直接反问数据库,使得数据库负载过高,系统无法正常运行,也会导致系统的崩溃。
一种有效的预防方法是,对于热点数据,可以采取加锁操作来保障并发控制。例如在调用方法时,维护一个正在处理的缓存数据集合,当有线程访问的时候,先判断缓存中是否有数据,如果有,直接返回,如果没有,则加锁,从数据库中查询数据后在加入缓存,释放锁。这种方式可以保证在高并发情况下,只有一个请求能够去数据库中查询数据,从而预防缓存击穿和缓存雪崩。