1.Redis为什么要个数据设置过期时间?
- 防止oom,而且还是适用于多种业务场景,有实效的验证码、token等。
2.Redis如何判断数据过期?
- redis通过一个过期字典来板寸过期的数据,过期字典的键值指向Redis数据库中的某个key,过期字典的值十一个long long int的时间戳,保存了过期时间。
3.过期的数据删除的策略?
- 惰性删除:取出key的时候才会进行过期检查,对cpu友好,但是会漏掉过多的过期key,从而造成oom。
- 定期删除:每隔一段时间抽取一批key进行删除过期的可以操作,对内存友好。
- redis采用的是定期删除+惰性/懒汉式删除。
4.redis内存淘汰机制?
- volatile-lru(least recently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
- volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
- volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
- allkeys-lru(least recently used):当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的 key(这个是最常用的)
- allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
- no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。这个应该没人使用吧!
- 4.0 版本后增加以下两种:
- volatile-lfu(least frequently used):从已设置过期时间的数据集(server.db[i].expires)中挑选最不经常使用的数据淘汰
- allkeys-lfu(least frequently used):当内存不足以容纳新写入数据时,在键空间中,移除最不经常使用的 key
5.redis持久化机制?
- RBD:snapshotting快照的形式,redis通过创建快照的获得存储在内存里面的数据在某个时间点上的副本。
- AOF:append of File的方式,持久性实时性更好,没执行一条更改Redis数据的命令,Redis就将命令写入内存,然后根据一定刷盘到磁盘中的AOF文件中。
6.缓存穿透
- 概念:是指缓存中不存在key,大量的请求打在数据库上面。
- 解决方法:1,设置无效的key并定时,当在数据库中没查找数据的时候,在缓存中设置无效的key并设置过期时间。2,布隆过滤器:将所有的请求的key放入布隆过滤器中,当存在则进而查询缓存。
7.缓存雪崩
- 概念:缓存大面积的时效,导致大量的请求打在了数据库上面。
解决方法:1,redis集群,2,限流
8.缓存击穿
- 概念:大量请求访问redis中的某个key,会造成一部分访问不到就会访问数据库。
- 解放方法:1,设置热点数据不过期,2,使用互斥队列,3,设置缓存屏障。
9.缓存异常
10.如何保证缓存一致性?
- 方法一:Cache Aside Pattern(旁路缓存模式):先更新DB,在删除缓存,若删除缓存失败,则可以采用重试机制保证缓存的删除。
- 方法二:延时双删:更新操作先删除缓存,在更新数据库,sleep一段时候后之后在删除缓存。
- 方法三:通过中间件监听binlog日志达到缓存一致性。