Redis涉及的概念

redis单线程

运行速度:CPU > 内存 > 硬盘。redis将所有数据放在内存中,所有的操作都在内存中。使用多线程导致CUP会来回切换,导致性能下降,使用一个线程性能反而不错。

redis缓存穿透

缓存穿透的概念很简单,用户想要查询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候,缓存都没有命中,于是都去请求了持久层数据库。这会给持久层数据库造成很大的压力,这时候就相当于出现了缓存穿透。要是有人利用不存在的key频繁攻击我们的应用,这就是漏洞。

解决方案:
如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),我们仍然把这个空结果进行缓存,但它的过期时间会很短,最长不超过五分钟。

redis缓存击穿

这里需要注意和缓存击穿的区别,缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案:
业界比较常用的做法,是使用mutex。简单地来说,就是在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存。

if (redis.get(key) == null) {    
    // 设置3分钟失效 
    if (redis.add(key_mutex, 3 * 60 * 1000) == true) {    
        value = db.get(key);    
        redis.set(key, value);    
        redis.delete(key_mutex);    
    } else {    
        sleep(50);    
        retry();    
    }    
}   

redis缓存雪崩

缓存雪崩是指,缓存层出现了错误,不能正常工作了。于是所有的请求都会达到存储层,存储层的调用量会暴增,造成存储层也会挂掉的情况。

解决方案:
1、redis高可用:其实就是搭建的集群。

2、限流降级:在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。

3、数据预热:式部署之前,我先把可能的数据先预先访问一遍,这样部分可能大量访问的数据就会加载到缓存中。

redis实现分布式锁

redis为单进程单线程模式,采用队列模式将并发访问变成串行访问,且多客户端对redis的连接并不存在竞争关系redis中可以使用SETNX命令实现分布式锁。将key的值设为value ,当且仅当key不存在。 若给定的key已经存在,则SETNX不做任何动作。

原文地址:https://www.cnblogs.com/feiqiangsheng/p/12511363.html