zoukankan      html  css  js  c++  java
  • 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不做任何动作。

  • 相关阅读:
    数据仓库 数据可视化 Hive导出到MySql
    数据仓库 品牌复购率
    数据仓库 转化率及漏斗分析
    数据仓库 GMV成交总额
    数据仓库 DWS层之用户行为宽表
    数据仓库 业务数仓 DWD层
    数据仓库 业务数仓 ODS层
    数据仓库 表的分类与同步策略
    数据仓库 最近七天内连续三天活跃用户数
    CF505E Mr. Kitayuta vs. Bamboos 二分+贪心
  • 原文地址:https://www.cnblogs.com/feiqiangsheng/p/12511363.html
Copyright © 2011-2022 走看看