Redis

2022/1/8 19:03:45

本文主要是介绍Redis,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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是单线程的。

组成:

    1. 多个socket
    2. IO多路复用程序
    3. scocket队列
    4. 文件事件分配器
    5. 事件处理器(连接应答处理器,命令请求处理器,命令回复处理器)

**注:**多个 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、执行命令

redis不支持事务回滚,但会检查每个事务中的命令是否正确

WATCH命令乐观锁提供CAS机制

监听key是否改变,如果被其他客户端改变(REDIS-DIRTY_CAS),那么该机制监听到后会认为该事务的安全性已经发生改变,之后的事务不会执行,监控一直到执行exec命令



这篇关于Redis的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程