Redis 十三 一些问题
Redis删除机制
1.定期删除,每隔100ms去随机查3个设置了生存时间的key,如果过期,就删除;
2.惰性删除,当有人查看一个设置了生存时间的key时,检查是否过期,过期则删除。
Redis淘汰机制
在Redis内存满了的时候,如果再加入新的key,会开启淘汰机制。
volatile-lru:在设置了生存时间的key中,干掉一个最近最少使用的,类似有个队列,一个key被用过了,就排到后面去,淘汰的时候就会比较靠后找到它,最推荐。
allkeys-lru:在所有的key中,干掉一个最近最少使用的。
allkeys-lfu:在设置了生存时间的key中,干掉一个最近最少频次使用的,类似记录使用频率,频率少的,哪怕最近刚用过,也可能被淘汰。
allkeys-lfu:在所有的key中,干掉一个最近最少频次使用的。
volatile-random:在设置了生存时间的key中,随机干掉一个,简直离谱。
allkeys-random:在所有的key中,随机干掉一个,更加离谱。
volatile-ttl:在设置了生存时间的key中,干掉一个剩余时间最少的。
noeviction:直接报错,默认的机制。
-----------------------------------------------------
设置淘汰机制
maxmemory-policy noeviction
设置最大内存
maxmemory 1024000000
Redis缓存问题
缓存穿透:查询的数据,Redis和数据库中都没有,这样大量的查询,会导致redis和数据库都宕机。
1.如果是通过id查询,id是自增的,可以首先在业务上排除小于0,然后将数据库中id的最大值放到redis中,查询时比较一下,超出这个值,根本不用查;
2.如果id不是整形,可以将全部的id放到set中,在查询前去set中查看一下,有才查;
3.限制某个高频次访问ip的访问次数,甚至拉入黑名单。
缓存击穿:在一个热点缓存正好过期的时候,大量访问突然来访,于是只能去访问数据库,造成数据库宕机。
1.在访问缓存中没有的时候,添加一个锁,只让几个请求去访问数据库,然后新增该缓存,分布式锁可以解决该问题;
2.去掉热点缓存的生存时间,不推荐。
缓存雪崩:当大量缓存(未必是热点缓存)同时到期时,大量请求同时访问数据库,导致宕机。
1.将缓存的生存时间设置成不一样的,避免同时到期。
缓存倾斜:大量热点数据都在一台redis节点上,导致无法承受。
1.给这个节点加主从。