Redis:缓存击穿

缓存击穿

在某些 Key 属于极端热点数据,且并发量很大的情况下,如果这个 Key 过期,可能会在某个瞬间出现大量的并发请求同时回源,相当于大量的并发请求直接打到了数据库。这种情况,就是我们常说的缓存击穿或缓存并发问题。

*** 现象 ** :数据库的访问压力瞬间激增,Redis正常运行

*** 解决办法**

  • 业务允许下,设置缓存永不过期

    • 启动一个后台线程 30 秒一次定时把所有数据更新到缓存,而且通过适当的休眠,控制从数据库更新数据的频率,降低数据库压力
  • 使用互斥锁

    • 缓存失效的时候(判断拿出来的值为空),不是立即去加载数据库。
    • 先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX)去set一个mutex key。
    • 当操作返回成功时,再进行加载数据库的操作,并回设缓存,最后删除mutex key。
    • 当操作返回失败,证明有线程在加载数据库,当前线程睡眠一段时间再重试整个get缓存的方法。

    ​

java 复制代码
@Autowired
    private RedissonClient redissonClient;
    @GetMapping("mutex")
    public String mutex() {
        String data = stringRedisTemplate.opsForValue().get("hot_key");
        if (StringUtils.isEmpty(data)) {
            RLock locker = redissonClient.getLock("mutex_locker");
            //获取分布式锁
            if (locker.tryLock()) {
                try {
                    data = stringRedisTemplate.opsForValue().get("hot_key");
                    //双重检查,因为可能已经有一个B线程过了第一次判断,在等锁,然后A线程已经把数据写入了Redis中
                    if (StringUtils.isEmpty(data)) {
                        //回源到数据库查询
                        data = getDatabaseData();
                        stringRedisTemplate.opsForValue().set("hot_key", data, 5, TimeUnit.SECONDS);
                    }
                } finally {
                    //别忘记释放,另外注意写法,获取锁后整段代码try+finally,确保unlock万无一失
                    locker.unlock();
                }
            }
        }
        return data;
    }

缓存穿透和缓存击穿的区别:

  • 缓存穿透是指,缓存没有起到压力缓冲的作用;
  • 而缓存击穿是指,缓存失效时瞬时的并发打到数据库。
相关推荐
这个DBA有点耶12 小时前
从症状到根因:数据库监控指标的分层方法与静态/动态阈值策略
数据库·mysql·代码规范
SelectDB13 小时前
时间旅行与快照能力速查:Doris 侧三条落地路径
大数据·数据库·数据分析
SelectDB13 小时前
云数仓成本结构拆解速查:五层计费 vs Doris / 托管形态
大数据·数据库·数据分析
SelectDB13 小时前
什么场景能承接与建议保留:Doris vs Snowflake 边界速查
大数据·数据库·数据分析
这个DBA有点耶15 小时前
DELETE没删多少数据,表却越来越大——InnoDB删除空洞与页合并失效的根因
数据库·mysql·代码规范
ly768918 小时前
PostgreSQL 备份恢复策略:pg_basebackup、WAL 归档与 PITR 在企业 Java 系统中的落地
java·数据库·postgresql·pitr·pg_basebackup·wal 归档
小羊没烦恼!19 小时前
Ajax与JSON的一些总结
android·java·前端·数据库·mysql·算法·okhttp
注塑机数据采集联网19 小时前
如何解决注塑机数据采集联网对接MES系统数据WiFi传输数据不稳问题
大数据·数据库·物联网·数据挖掘·数据分析
黄俊懿19 小时前
【架构师从入门到进阶】第六章:服务集群优化——第八节:线程数公式
java·服务器·数据库·分布式·性能优化·架构·系统架构