reids 过期时间
1 | 127.0.0.1:6379> SET cache_page "www.google.com" |
redis 默认采用定期删除+惰性删除
1 | 127.0.0.1:6379> config get maxmemory |
内存淘汰机制
redis.conf1
2
3
4127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379> config set maxmemory-policy volatile-lru
noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用,目前项目在用这种。allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐redis 常见问题
redis 与数据库双写一致性的问题
对 数据库有强一致性要求,不要放缓存
缓存穿透 缓存雪崩 缓存击穿
缓存穿透: 查询不存在数据 但是请求每次都会打到数据库上面去
缓存击穿: 大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去
缓存雪崩: 某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上面
一般避免以上情况发生我们从三个时间段去分析下:
事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。
事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL被打死。
事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。
redis 多线程
单线程性能瓶颈 主要在 网络 IO 上。
redis 6 版本将 网络数据读写和协议 解析 通过 多线程 的方式来处理,执行命令依旧使用单线程操作