首页 > 数据库 >Redis 缓存穿透,击穿,雪崩 并发 之 读写数据编码实战

Redis 缓存穿透,击穿,雪崩 并发 之 读写数据编码实战

时间:2023-02-27 17:26:07浏览次数:37  
标签:数据编码 缓存 过期 数据库 Redis 查询 key 数据

 

什么是缓存穿透

 

 

缓存穿透是指查询一个缓存中和数据库中都不存在的数据,导致每次查询这条数据都会透过缓存,直接查库,最后返回空。当用户使用这条不存在的数据疯狂发起查询请求的时候,对数据库造成的压力就非常大,甚至可能直接挂掉。

缓存穿透解决方案

 

 

解决缓存穿透的方法一般有两种,第一种是缓存空对象,第二种是使用布隆过滤器。

 

 

第一种方法比较好理解,就是当数据库中查不到数据的时候,我缓存一个空对象,然后给这个空对象的缓存设置一个过期时间,这样下次再查询该数据的时候,就可以直接从缓存中拿到,从而达到了减小数据库压力的目的。但这种解决方式有两个缺点:(1)需要缓存层提供更多的内存空间来缓存这些空对象,当这种空对象很多的时候,就会浪费更多的内存;(2)会导致缓存层和存储层的数据不一致,即使在缓存空对象时给它设置了一个很短的过期时间,那也会导致这一段时间内的数据不一致问题。

 

 

第二种方案是使用布隆过滤器,这是比较推荐的方法。所谓布隆过滤器,就是一种数据结构,它是由一个长度为m bit的位数组与n个hash函数组成的数据结构,位数组中每个元素的初始值都是0。在初始化布隆过滤器时,会先将所有key进行n次hash运算,这样就可以得到n个位置,然后将这n个位置上的元素改为1。这样,就相当于把所有的key保存到了布隆过滤器中了

 

什么是缓存击穿

 

 

缓存击穿是指当缓存中某个热点数据过期了,在该热点数据重新载入缓存之前,有大量的查询请求穿过缓存,直接查询数据库。这种情况会导致数据库压力瞬间骤增,造成大量请求阻塞,甚至直接挂掉。

 

缓存击穿解决方案

 

 

解决缓存击穿的方法也有两种,第一种是设置key永不过期;第二种是使用分布式锁,保证同一时刻只能有一个查询请求重新加载热点数据到缓存中,这样,其他的线程只需等待该线程运行完毕,即可重新从Redis中获取数据。

 

 

第一种方式比较简单,在设置热点key的时候,不给key设置过期时间即可。不过还有另外一种方式也可以达到key不过期的目的,就是正常给key设置过期时间,不过在后台同时启一个定时任务去定时地更新这个缓存。

 

第二种方式使用了加锁的方式,锁的对象就是key,这样,当大量查询同一个key的请求并发进来时,只能有一个请求获取到锁,然后获取到锁的线程查询数据库,然后将结果放入到缓存中,然后释放锁,此时,其他处于锁等待的请求即可继续执行,由于此时缓存中已经有了数据,所以直接从缓存中获取到数据返回,并不会查询数据库。

什么是缓存雪崩

 

 

缓存雪崩是指当缓存中有大量的key在同一时刻过期,或者Redis直接宕机了,导致大量的查询请求全部到达数据库,造成数据库查询压力骤增,甚至直接挂掉。

缓存雪崩解决方案

 

 

针对第一种大量key同时过期的情况,解决起来比较简单,只需要将每个key的过期时间打散即可,使它们的失效点尽可能均匀分布。

 

 

针对第二种redis发生故障的情况,部署redis时可以使用redis的几种高可用方案部署

 

 

 读取数据

 

 局部放大

 

 

 

 

 

 

 

标签:数据编码,缓存,过期,数据库,Redis,查询,key,数据
From: https://www.cnblogs.com/hztech/p/17160493.html

相关文章

  • 云服务器安装 redis
    下载地址:https://download.redis.io/releases/此处示例使用的版本是:redis-6.2.10.tar.gz前提环境:云服务器Xshell(操作终端)Xftp(传输工具)RedisDesktopManager(redis......
  • 本地虚拟机centos7通过docker安装主从redis3.2
    1、下载redisdocker镜像dockerpullredis:3.22、在home下建立mydata目录在/home/mydata/redis下面建立两个目录conf与data3、docker运行主从dockerrun-p6379:6379--n......
  • 虹科案例|Redis企业版数据库:金融行业客户案例解读
    传统银行无法提供无缝的全渠道客户体验、无法实时检测欺诈、无法获得业务洞察力、用户体验感较差、品牌声誉受损和业务损失?虹科提供的Redis企业版数据库具有低延迟、高吞......
  • LinkSLA智能运维技术派-Redis的监控
    Redis是一个开源,内存存储的数据服务器,可用作数据库、高速缓存和消息队列代理等场景。首先我们对内存进行监控,主要指标如下:used_memory:使用内存used_memory_rss:从操作系统......
  • Redis高频面试题总结
    前言大家好,我是小卷聊开发。春暖花开即将到来,整理了13道Redis高频面试题,有些不全面还请谅解,感谢观看!!!1.Redis过期键的删除策略定时删除:在设置键的过期时间的同时,创建......
  • Redis
    是什么键值类型数据库,主要用来做缓存单线程+多路IO复用多路IO复用:实时监视redis全部请求任务,已经准备好的请求直接交给redis处理,redis不会停,没有阻塞状态I/O......
  • zxk-logs_springboot集成redis
    pom.xml:<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><gro......
  • 03_20_JavaWeb||day23_redis&Jedis||day23_redis(NOSQL系列的非关系型数据库)&Jedis(j
    今日内容1.redis1.概念2.下载安装3.命令操作1.数据结构4.持久化操作5.使用Java客户端操作redis1.Redis【以后配置到Linux系统上】概念:redis是一款高......
  • 【Redis】字符串String 数据类型详解
    String是Redis最基本的数据类型,一个Key对应一个Value,一个Redis中字符串Value最多可以是512MString类型是二进制安全的,意味着Redis的String可以包含任何数据。比如照片或者序......
  • 一个比 Redis 性能更强的数据库
    给大家推荐一个比Redis性能更强的数据:KeyDBKeyDB是Redis的高性能分支,侧重于多线程、内存效率和高吞吐量。除了性能改进外,KeyDB还提供主动复制、闪存和子密钥过期等功能。K......