Redis
redis过期键删除策略
1、惰性删除:只有在访问获取key的时候才会去检查key是否过期
优势:对cpu性能消耗较低
缺点:存在大量key已过期但是没有被清除
2、定期删除:按照固定时间间隔进行扫描key进行检查是否过期进行删除key操作,并且redis底层会通过限制删除操作执行时长和频率来减少删除操作对cpu的时间影响
优势:对内存比较友好,大部分已过期的key都会删除
缺点:对cpu消耗较高
淘汰机制
1、volatile-lru:从设置过期时间的数据集中删除最近最少使用的数据淘汰
2、volatile-ttl:从设置过期时间的数据集中删除即将过期的数据进行淘汰
3、volatile-random:从设置过期时间的数据集中随机删除数据进行淘汰
4、allkeys-lru:当内存不足以容纳新写入的数据时,移除最近最少使用的key
5、allkeys-random:从数据中任意选择数据进行删除
6、no-eviction:当内存不足以容纳数据时,新写入数据会报错
4.0版本新增
7、voiatile-lfu:从设置过期时间的数据集中删除不经常使用的数据进行淘汰
8、allkeys-lfu:当内存不足以容纳新写入的数据时,移除不经常使用的key
redis线程模型?
Redis基于Reactor模式开发了自己的网络事件处理器。被称为文件事件处理器,由于这个处理器是单线程的所以决定了redis是单线程的。
组成:
**注:**多个 socket 可能会并发产生不同的操作,每个操作对应不同的文件事件,但是 IO 多路复用程序会监听多个 socket,会将 socket 产生的事件放入队列中排队,事件分派器每次从队列中取出一个事件,把该事件交给对应的事件处理器进行处理。
缓存雪崩、缓存穿透、缓存击穿?
缓存雪崩:同一时间大量缓存失效,导致后面的请求到落在了数据库,造成数据库短时间内承受大量请求从而可能发生服务器宕机
解决:
1、将缓存过期失效时间分散,防止统一时间大量缓存失效
2、缓存预热,防止一上来就直接宕机
3、互斥锁,如果数据已经不存在,就拦截后面的请求,不在请求数据库
4、给每一个缓存增加一个缓存标识,记录是否失效,如果失效,就重新更新缓存(性能消耗较大)
缓存击穿:请求缓存中肯定不存在的数据,从而将请求落在数据库中
解决:
1、拦截不合理的请求数据
2、数据库中不存在的数据,也要设置缓存
3、布隆过滤器
缓存击穿:针对缓冲中的一个热点数据,在失效的瞬间将大量请求落在服务器上,导致服务器宕机
解决:
1、永不过期
2、互斥锁
redis事务实现
1、事务开始(MULTI)
2、命令入队
3、执行命令
redis不支持事务回滚,但会检查每个事务中的命令是否正确
WATCH命令乐观锁提供CAS机制
监听key是否改变,如果被其他客户端改变(REDIS-DIRTY_CAS),那么该机制监听到后会认为该事务的安全性已经发生改变,之后的事务不会执行,监控一直到执行exec命令