redis能干啥?
MySQL说,其实有一大半的用户请求都是读操作,而且经常都是重复查询一个东西,浪费它很多时间去进行磁盘I/O。
后来有人就琢磨,是不是可以学学CPU,给数据库也加一个缓存呢?于是redis就诞生了!
缓存的数据都是在内存中,可是就算是在服务器上,内存的空间资源还是很有限的。
如何处理内存不足?
1、给缓存内容设置一个超时时间,具体设置多长交给应用程序们去设置,我要做的就是把过期了的内容从我里面删除掉,及时腾出空间就行了。
定期删除,我决定100ms就做一次,一秒钟就是10次!
2、惰性删除
那些原来逃脱我随机选择算法的键值,一旦遇到查询请求,被我发现已经超期了,那我就绝不客气,立即删除。
这种方式因为是被动式触发的,不查询就不会发生,所以也叫惰性删除!
3、内存淘汰策略
我提供了8种策略供应用程序选择,用于我遇到内存不足时该如何决策:
-
noeviction:返回错误,不会删除任何键值
-
allkeys-lru:使用LRU算法删除最近最少使用的键值
-
volatile-lru:使用LRU算法从设置了过期时间的键集合中删除最近最少使用的键值
-
allkeys-random:从所有key随机删除
-
volatile-random:从设置了过期时间的键的集合中随机删除
-
volatile-ttl:从设置了过期时间的键中删除剩余时间最短的键
-
volatile-lfu:从配置了过期时间的键中删除使用频率最少的键
-
allkeys-lfu:从所有键中删除使用频率最少的键
缓存穿透 && 布隆过滤器
有时候遇到些烦人的请求,查询的数据不存在,MySQL就要白忙活一场!不仅如此,因为不存在,我也没法缓存啊,导致同样的请求来了每次都要去让MySQL白忙活一场。我作为缓存的价值就没得到体现啦!这就是人们常说的缓存穿透。
缓存击穿 && 缓存雪崩
缓存击穿:有一个热点数据到了过期时间,被我删掉了,不巧的是随后就有对这个数据的大量查询请求来了,我这里已经删了,所以请求都发到你那里来了”。
缓存雪崩:这一次是一大批数据几乎同时过了有效期,然后又发生了很多对这些数据的请求,所以比起上一次这规模更大了”。
找应用程序商量了,不仅把键值的过期时间随机了一下,还设置了热点数据永不过期,这个问题缓解了不少。
引用如下:
https://www.cnblogs.com/xuanyuan/p/13665170.html