Redis单线程、高并发快的原因&&Redis的缓存过期处理与内存淘汰机制

Redis的高并发和快速原因

1.redis是基于内存的,内存的读写速度非常快;

2.redis是单线程的,省去了很多上下文切换线程的时间;

3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。

Redis是单线程的原因

Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,于是顺理成章地采用单线程的方案

详细原因:

  • 在单线程的情况下,就不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗。

  • 采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU。

  • 多服务器集群化的方案中,单线程、多进程的集群是一个很好的解决方案。

Redis缓存过期处理

Redis的高并发高性能都是基于内存的,但是计算机内存有限,内存越大成本就越高。所以需要定期删除过期的缓存。

#在SpringBoot项目中使用redis set key-value时设置过期时间

@Autowired
private StringRedisTemplate redisTemplate;

redisTemplate.opsForValue().set(key, value, timeout, TimeUnit.SECONDS);

但是设置了expire的key缓存过期之后,服务器的内存还是被占用,这是因为redis基于的两种删除策略。

定时删除(主动)

定期随机的检查过期的key,如果过期则清理删除。

hz 10        #hz参数用于指定Redis定期任务的执行频率,每秒检查次数为10个

为了平衡Redis的CPU使用率和响应及时性,Redis 5.0版本新增了dynamic-hz参数,并分离了实际hz(hz)和已设置的hz(configured_hz)

dynamic-hz yes   # dynamic-hz的可选值为yes和no,分别代表开启动态hz和关闭动态hz。默认值为yes。

当动态hz开启时,设置的hz参数的值,即configured_hz,将作为基线值,而Redis服务中的实际hz值会在基线值的基础上根据已连接到Redis的客户端数量自动调整,连接的客户端越多,实际hz值越高,Redis执行定期任务的频率就越高。

惰性删除(被动)

当客户端请求一个key的时候,redis会检查这个key是否过期,如果过期了,则删除,然后返回一个nil。这种策略对cpu比较友好,不会有太多的损耗,但是内存占用会比较高。

Redis的内存淘汰机制

如果内存占用满了之后,redis提供了一套缓存淘汰机制:MEMORY MANAGEMENT

在这里插入图片描述

maxmemory

Redis 检查内存使用情况,如果已使用的内存大于 maxmemory 则开始根据用户配置的不同淘汰策略来淘汰已存储的数据(key),从而换取一定的内存

maxmemory 为 0 的时候表示我们对 Redis 的内存使用没有限制,redis 默认设置 maxmemory 为 0

maxmemory-policy

volatile-lru:在设置了expire过期时间的缓存中,清除最少用的旧缓存,然后保存新的缓存

volatile-ttl:在设置了expire过期时间的缓存中,清除即将过期的

volatile-random:在设置了expire过期时间的缓存中,随机删除缓存

allkeys-lru:清除最少用的旧缓存,然后保存新的缓存

allkeys-random:在所有的缓存中随机删除

noeviction:旧缓存永不过期,新缓存设置不了,返回错误
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值