首页 > 数据库 >Redis(十四)——缓存问题

Redis(十四)——缓存问题

时间:2023-02-08 00:23:25浏览次数:38  
标签:缓存 过期 数据库 Redis key 操作 十四 数据

 1、缓存穿透

(1)问题描述

缓存和数据库中都没有数据。例如利用不存在的key恶意攻击,导致数据库压力过大

(2)解决方案

  • 接口层增加参数校验,用户鉴权,id非法拦截。
  • 从缓存取不到数据,数据库也没有查到,返回值在缓存设置短时间默认值或者空。
  • 布隆过滤器快速判断key是否存在数据库。

2、缓存击穿

(1)问题描述

1个key过期时,访问量巨大

(2)解决方案

  • 热点数据永不过期
  • 互斥锁,第一个线程访问key的时候就锁住,等查询数据库返回后,把值写到缓存再释放锁,后续请求直接取缓存。

3、缓存雪崩

(1)问题描述

大量key同时过期或者缓存服务器宕机也算雪崩

(2)解决方案

  • 热点数据永不过期
  • 缓存数据的过期时间设置随机
  • 分布式缓存集群,确保高可用,例如redis-cluster

4、缓存和数据库一致性

(1)问题描述

数据库与缓存更新,可能会出现数据不一致的情况。写和读是并发的,无论是「先写数据库再删缓存」还是「先删缓存再写数据库」都可能出现数据不一致的情况。

  • 如果删除了缓存Redis,还没有来得及写库MySQL,另一个线程就来读取,发现缓存为空,则去数据库中读取数据写入缓存,此时缓存中为脏数据。
  • 如果先写了库,在删除缓存前,写库的线程宕机了,没有删除掉缓存,则也会出现数据不一致情况。

(2)解决方案

  • 先删缓存再写数据库:一般情况用这个就够了。这种操作出现数据不一致的条件是:读缓存时缓存失效,而且并发着有一个写操作,读操作必需在写操作前进入数据库操作,而又要晚于写操作更新缓存。 但实际上写操作会比读操作慢很多,还要锁表,因此满足数据不一致的概率不大。
  • 队列+失败重试:写库成功后删除缓存失败,将key发到MQ中消费,失败继续发MQ,直到成功。缺点是对业务代码造成大量入侵。
  • 订阅binlog:订阅MySQL的写操作日志,更新redis。

 

标签:缓存,过期,数据库,Redis,key,操作,十四,数据
From: https://www.cnblogs.com/shoulinniao/p/16965052.html

相关文章

  • java——spring boot集成redis——首先进行复习——本机环境安装(windows环境下)
    鉴于之前学习的时候已经安装完成,此处不重复安装,有需要的可以参考网上各种教程。 本章节以黑马教程为准开始进行复习和学习,进一步提高后端能力 黑马教程:redis——B站......
  • 代码随想录算法训练营第二十四天 | 第七章 回溯算法-理论基础,77. 组合
    一、参考资料理论基础题目链接/文章讲解:https://programmercarl.com/%E5%9B%9E%E6%BA%AF%E7%AE%97%E6%B3%95%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html视频讲解:htt......
  • WinForm(十四)窗体滚动日志
    在桌面程序里,一般日志记录到文件里就可以了,但有的时间,也需要在窗体上动态滚动显示,这时,就需要引入日志框架了。这里引入的依旧是NLog(在我的MiniAPI系统里,用的也是NL......
  • redis同步一条键值对脚本
    #!/bin/bashsrchost=111.xx.xx.xx#源地址srcport=6379#源端口srcpass=passwod#密码srcku=2#同步的库desthost=111.x.xx.xxdestport=6666destpass=xxxxxdestku=13re......
  • 【Redis场景4】单机环境下秒杀问题
    单机环境下的秒杀问题全局唯一ID为什么要使用全局唯一ID:当用户抢购时,就会生成订单并保存到订单表中,而订单表如果使用数据库自增ID就存在一些问题:受单表数据量的限制i......
  • redis实现分布式锁释放锁和分布式锁实现可重入性
    本文为上一篇redis使用setnx实现分布式锁的增加篇重在体会思想与开源的框架自然是无法比拟的 如果当前线程已经获取到锁的情况下,不需要重复获取锁,而是直接复用。 ......
  • WinForm(十四)窗体滚动日志
    在桌面程序里,一般日志记录到文件里就可以了,但有的时间,也需要在窗体上动态滚动显示,这时,就需要引入日志框架了。这里引入的依旧是NLog(在我的MiniAPI系统里,用的也是......
  • WinForm(十四)窗体滚动日志
    在桌面程序里,一般日志记录到文件里就可以了,但有的时间,也需要在窗体上动态滚动显示,这时,就需要引入日志框架了。这里引入的依旧是NLog(在我的MiniAPI系统里,用的也是......
  • redis使用setnx实现分布式锁
     packagecom.shanhe.service;importcom.shanhe.entity.CommodityDetails;importcom.shanhe.lock.impl.RedisLockImpl;importcom.shanhe.mapper.CommodityDetail......
  • Redis在java中的使用
    1.添加价包<!--Redis依赖--><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-redis</artifactId><version>......