redis-补充

reids 过期时间

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
127.0.0.1:6379> SET cache_page "www.google.com"
OK
127.0.0.1:6379> EXPIRE cache_page 30 # 设置过期时间为 30 秒
(integer) 1
127.0.0.1:6379> TTL cache_page # 查看当前过期时间
(integer) 24
127.0.0.1:6379> EXPIRE cache_page 300 # 修改过期时间
(integer) 1
127.0.0.1:6379> TTL cache_page
(integer) 296
127.0.0.1:6379> PERSIST cache_page # 移除过期时间
(integer) 1
127.0.0.1:6379> TTL cache_page
(integer) -1
127.0.0.1:6379> GET cache_page
"www.google.com"
127.0.0.1:6379>

redis 默认采用定期删除+惰性删除

1
2
3
4
5
6
7
8
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "0" # 不限制
127.0.0.1:6379> config set maxmemory 100mb
OK
127.0.0.1:6379> config get maxmemory
1) "maxmemory"
2) "104857600"

内存淘汰机制

redis.conf

1
2
3
4
127.0.0.1:6379> config get maxmemory-policy
1) "maxmemory-policy"
2) "noeviction"
127.0.0.1:6379> config set maxmemory-policy volatile-lru

  1. noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。

  2. allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用,目前项目在用这种。

  3. allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。

  4. volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐

  5. volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐

  6. volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐

    redis 常见问题

    redis 与数据库双写一致性的问题

对 数据库有强一致性要求,不要放缓存

缓存穿透 缓存雪崩 缓存击穿

缓存穿透: 查询不存在数据 但是请求每次都会打到数据库上面去

缓存击穿: 大量的请求同时查询一个 key 时,此时这个key正好失效了,就会导致大量的请求都打到数据库上面去

缓存雪崩: 某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上面

一般避免以上情况发生我们从三个时间段去分析下:

事前:Redis 高可用,主从+哨兵,Redis cluster,避免全盘崩溃。

事中:本地 ehcache 缓存 + Hystrix 限流+降级,避免MySQL被打死。

事后:Redis 持久化 RDB+AOF,一旦重启,自动从磁盘上加载数据,快速恢复缓存数据。

redis 多线程

单线程性能瓶颈 主要在 网络 IO 上。
redis 6 版本将 网络数据读写和协议 解析 通过 多线程 的方式来处理,执行命令依旧使用单线程操作

redis 锁