Redis
1、惰性删除:只有在访问获取key的时候才会去检查key是否过期
缺点:存在大量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事务实现
- MULTI :开启事务,redis会将后续的命令逐个放入队列中,然后使用EXEC命令来原子化执行这个命令系列。
- EXEC:执行事务中的所有操作命令。
- disCARD:取消事务,放弃执行事务块中的所有命令。
- WATCH:监视一个或多个key,如果事务在执行前,这个key(或多个key)被其他命令修改,则事务被中断,不会执行事务中的任何命令。
- UNWATCH:取消WATCH对所有key的监视。
1、事务开始(MULTI)
2、命令入队
3、执行命令
WATCH命令乐观锁提供CAS机制
监听key是否改变,如果被其他客户端改变(REdis-DIRTY_CAS),那么该机制监听到后会认为该事务的安全性已经发生改变,之后的事务不会执行,监控一直到执行exec命令
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。