一、redis缓存过期是如何处理的?
???????设置了expire的key缓存过期了,但是服务器的内存还是会被占用,这是因为redis所基于的两种删除策略
1、(主动)定时删除
???????定时随机的检查过期的key,如果过期则清理删除。(每秒检查次数在redis.conf中的hz配置)
2、(被动)惰性删除
???????当客户端请求一个已经过期的key的时候,那么redis会检查这个key是否过期,如果过期了,则删除,然后返回一个nil。这种策略对cpu比较友好,不会有太多的损耗,但是内存占用会比较高。 ???????所以,虽然key过期了,但是只要没有被redis清理,那么其实内存还是会被占
二、redis内存淘汰机制是什么?
???????如果定期删除漏掉了很多过期的key,而我们也没有再去访问它,如果不加处理,很可能导致内存耗尽。 Redis配置文件中可以设置maxmemory,内存的最大使用量,到达限度时会执行内存淘汰机制。
Redis中的内存淘汰机制: 没有配置时,默认为no-eviction
名称 | 描述 |
---|
volatile-lru | 从已设置过期时间 的数据集中挑选最近最少使用 的数据淘汰 | volatile-lfu | 从已设置过期时间的数据集中挑选最不经常 使用的数据淘汰 | volatile-ttl | 从已设置过期时间的数据集中挑选将要过期 的数据淘汰 | volatile-random | 从已设置过期时间的数据集中挑选任意数据 淘汰 | allkeys-lru | 当内存不足写入新数据时淘汰最近最少使用的Key | allkeys-random | 当内存不足写入新数据时随机选择key淘汰 | allkeys-lfu | 当内存不足写入新数据时移除最不经常使用的Key | no-eviction | 当内存不足写入新数据时,写入操作会报错,同时不删除数据 |
- volatile为前缀的策略都是从已过期的数据集中进行淘汰。
- allkeys为前缀的策略都是面向所有key进行淘汰。
- LRU(least recently used)最近最少用到的。
在这里插入代码片 - LFU(Least Frequently Used)最不常用的。
- 它们的触发条件都是Redis使用的内存达到阈值时。
三、redis缓存击穿原因?
???????key对应的数据存在,但在redis中过期,此时若有大量并发请求过来,这些请求发现缓存过期一般都会从后端DB加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端DB压垮。让数据库承压,被叫做缓存击穿
四、redis缓存雪崩原因?
???????主要是对于redis集群 来说的,大量的缓存失效,由数据库承压,叫做雪崩
五、redis缓存穿透原因?
???????key对应的数据在数据源并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据源,从而可能压垮数据源。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。 ???????通俗理解:用户发起的请求,缓存中没有数据,数据库中也没有响应的数据,短时间发起大量的假请求都走了数据库,让数据库承压了,并且数据库中还不存在这些数据。
|