1.Redis 的过期策略是怎么样的
-
Redis 的过期实现方法
-
Redis 通过设置过期时间来控制键值对的生命周期
-
过期时间可以通过EXPIRE、EXPIREAT、PERSIST等命令设置,也可以在插入数据时直接设置过期时间。
-
-
-
Redis 的过期策略是怎么样的
-
Redis 的过期策略采用的是定期删除和惰性删除相结合的方式。
-
Redis 定期删除会每隔一定时间进行一次扫描,检查当前设置了过期时间的键,讲将过期的键删除,但不会立即释放内存,直到内存使用率达到一定阈值,会进行一次内存回收
-
而惰性删除则是在键被访问时进行过期检查,如果过期了则删除键并释放内存。
-
-
2.Redis的内存淘汰策略是怎么样的?
-
内存淘汰策略是什么:
-
Redis 的内存淘汰策略用于内存使用到达最大内存限制了之后,决定哪些 key 要被淘汰
-
Redis 可以通过配置文件中的 maxmemory-policy 参数来指定内存淘汰策略
-
-
Redis 支持的内存淘汰策略:
-
noeviction:不会淘汰任何键值对,而是直接返回错误信息。
-
allkeys-lru:从所有 key 中选择最近最少使用的那个 key 并淘汰。
-
volatile-lru:从设置了过期时间的 key 中选择最近最少使用的那个 key 并淘汰。
-
allkeys-random:从所有 key 中随机选择一个 key 并淘汰。
-
volatile-random:从设置了过期时间的 key 中随机选择一个 key 并淘汰。
-
volatile-ttl:从设置了过期时间的 key 中选择剩余时间最短的 key 并淘汰。
-
volatile-lfu:淘汰的对象是带有过期时间的键值对中,访问频率最低的那个。
-
allkeys-lfu:淘汰的对象则是所有键值对中,访问频率最低的那个。
-
3.过期可能导致的问题
3.1大批key瞬间过期导致读写效率降低
-
如果出现了一批key同时过期,就需要删除大量的Key,而命令执行是单线程的,所以这时候后面来的业务操作请求,就需要等这个删除命令执行完才可以处理业务请求。
3.2 缓存击穿
-
定义
-
当某一key的缓存过期时大并发量的请求同时访问此key,瞬间击穿缓存服务器直接访问数据库,让数据库处于负载的情况。
-
-
如何解决:
-
当Redis中根据key获得的value值为空时,先锁上,然后从数据库加载,加载完毕,释放锁。
-
通过定时任务去更新这个热点key,并重新设置其过期时间。
-
3.3缓存雪崩
-
定义
-
是指当大量缓存同时过期或缓存服务宕机,所有请求的都直接访问数据库,造成数据库高负载,影响性能,甚至数据库宕机。
-
-
如何解决:
- 把不同的key过期时间设置成不同的, 并且通过定时刷新的方式更新过期时间。
- 采用集群方式部署,使用集群可以避免服务单点故障
- 注意与缓存穿透 的区别
- 缓存穿透 指缓存服务器中没有缓存数据,数据库中也没有符合条件的数据,导致业务系统每次都绕过缓存服务器查询下游的数据库,缓存服务器完全失去了其应用的作用。
- 缓存穿透解决方案
- 对不存在的值用Key缓存下来,把key对应的值设置为null并放到缓存中,这样再出现查询这个key 的请求的时候,直接返回null即可 。
- 将查询的数据条件都哈希到一个足够大的布隆过滤器中,用户发送的请求会先被布隆过滤器拦截,一定不存在的数据就直接拦截返回了,从而避免下一步对数据库的压力