1、redis雪崩、穿透、击穿的原因和解决方案
1)雪崩:多个key在某一时间同时失效,导致数据库压力过大
解决方案:不同的key设置不同的过期时间,尽量错开
2)穿透:在访问某个key时缓存中不存在,导致每次查询都会访问数据库
解决方案:第一次访问时如果key不存在,则在缓存中设置一个空值,并设置较短的过期时间
3)击穿:单个key缓存突然失效,这时大量的请求进行访问,导致数据压力过大
解决方案:
1、双重检索机制:某个key只让一个线程查询,阻塞其他线程

 private static volaite Object lockHelp = new Object();public String getValue(String key) {String value = redis.get(key, String.class);if (value == "null" || value == null || StringUtils.isBlank(value) {synchronized (lockHelp) {value = redis.get(key, String.class);if (value == "null" || value == null || StringUtils.isBlank(value) {value = db.query(key);redis.set(key, value, 1000);}}}return value;}

2、 使用互斥锁(mutex key):比较常见的做法,就是缓存失效的时候,不是去立即load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如redis的SETNX)去set一个mutex key,当操作返回成功时,在进行load db的操作并放入缓存,否则,就重试整个get缓存的方法;

 public String get(key) {String value = redis.get(key);if (value == null) { //代表缓存值过期//设置3min的超时,防止del操作失败的时候,下次缓存过期一直不能load dbif (redis.setnx(key_mutex, 1, 3 * 60) == 1) { //代表设置成功value = db.get(key);redis.set(key, value, expire_secs);redis.del(key_mutex);return value;} else { //这个时候代表同时候的其他线程已经load db并回设到缓存了,这时候重试获取缓存值即可sleep(10);get(key); //重试}} else {return value;}}

2、redis数据类型
1)String(字符串):value最大能存储512M
2)List(列表):lpush,左边添加元素;lrange key 0,10,查看key列表0到10的元素
3)Set(集合):元素唯一;sadd,添加元素;smembers key,查看key集合
4)Sort Set(有序集合):元素唯一,每个元素都会关联一个double类型的分数,通过分数来为集合中的元素从小到大进行排序;zadd key score value,往key集合中添加元素;
5)hash(哈希):value为键值对;HMSET key value,设置值;HGET 大key 小key,获取值

redis雪崩、穿透、击穿的原因和解决方案相关推荐

  1. Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)

    一.概述 ① 缓存穿透:大量请求根本不存在的key(下文详解) ② 缓存雪崩:redis中大量key集体过期(下文详解) ③ 缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热 ...

  2. 缓存穿透、缓存雪崩、缓存击穿的原因及解决方案

    缓存穿透.缓存雪崩.缓存击穿的原因及解决方案 参考文章: (1)缓存穿透.缓存雪崩.缓存击穿的原因及解决方案 (2)https://www.cnblogs.com/hujinshui/p/100288 ...

  3. 【redis】缓存预热雪崩穿透击穿

    [redis]缓存预热雪崩穿透击穿(上) 文章目录 [redis]缓存预热雪崩穿透击穿(上) 前言 一.面试题 二.缓存预热 三.缓存雪崩 发生原因 预防+解决 高可用: 多缓存结合: 人民币玩家 四 ...

  4. Redis 5.0.8+常见面试题(单线程还是多线程、先更新缓存还是数据库、雪崩穿透击穿解决办法...)

    Redis 6.0 保姆级教程(含微服务案例与完整面试题):https://www.yuque.com/yuxuandmbjz/redis Redis是单线程还是多线程 ?为什么这么设计 ? Redi ...

  5. 老生常谈的 Redis 雪崩、击穿、穿透、预热、降级一次全安排

    △Hollis, 一个对Coding有着独特追求的人△ 这是Hollis的第 348 篇原创分享 作者 l zyz1992 来源 l Hollis(ID:hollischuang) 关于 Redis ...

  6. Java面试核心知识:Redis 雪崩、击穿、穿透、预热、降级,一文带你全部学会

    文章目录 Java面试核心知识点 Spring原理及应用 spring CIoud原理及应用 Netty网络编程原理及应用 Zookeeper原理及应用 kafka原理及应用 Hadoop原理及应用 ...

  7. 一文搞懂Redis缓存穿透/击穿/雪崩

    缓存穿透 问题描述 缓存穿透是指查询一个一定不存在的数据,由于缓存时不命中的,则需要从数据库中查询.查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库中去查询,进而增大了数据库的压力 ...

  8. Java --- redis7之缓存预热+雪崩+穿透+击穿

    目录 一.缓存预热 二.缓存雪崩 三.缓存穿透 3.1.解决方案 3.1.1.空对象缓存或者缺省值 3.1.2.Goolge布隆过滤器Guava解决缓存穿透 四.缓存击穿 4.1.危害 4.2.解决方 ...

  9. Redis缓存穿透击穿雪崩

    目录 1.缓存穿透 2.缓存击穿 3.缓存雪崩 1.缓存穿透 概述: 缓存穿透的概念很简单,用户想要査询一个数据,发现redis内存数据库没有,也就是缓存没有命中,于是向持久层数据库査询.发现也数据库 ...

  10. Redis缓存/穿透/击穿/雪崩

    目录 1 缓存穿透 1.1 问题描述 1.2 产生原因 1.3 解决方案 2 缓存击穿 2.1 问题描述 2.2 解决方案 3 缓存雪崩 3.1 问题描述 3.2 解决方案: 1 缓存穿透 1.1 问 ...

最新文章

  1. Linux_Makefile模板
  2. 《我也能做CTO之程序员职业规划》写作过程重播之二
  3. 软件测试用python一般用来做什么-python能够做软件的自动化测试吗?
  4. (转贴) C#编码标准--编码习惯
  5. 巨杉内核笔记(一)| SequoiaDB 会话(session)简介
  6. 乘方运算中的“次幂”和“次方”有什么区别?
  7. java编写斐波那契数列,实战案例
  8. 前端学习(1339):mongodb更新数据文档
  9. linux net 伪指令码,1.2.2. ldr pWTCON
  10. qtdesigner 组件全吗_显示屏种类这么多,你知道怎么分类吗?
  11. 前沿 | 谷歌用深度学习进行深度预测
  12. 【SpringClould】SpringClould eureka 单机 案例实验
  13. 命令行ssh连接服务器
  14. C# ManualResetEvent 类的理解
  15. 惠普803墨盒清零步骤_惠普2622墨盒清零步骤
  16. [win7 百度网盘] 登录安全验证显示空白页
  17. Pytorch里addmm()和addmm_()的用法详解
  18. 【Mysql】Mysql数据库查询“表空间”
  19. 我国著名的计算机科学家,我国著名计算机科学家、西安交大郑守淇教授逝世
  20. 安装cPanelWHM 技巧

热门文章

  1. Thinkphp6 获取当前协议+域名
  2. html5海报 在线制作软件,免费H5在线制作工具大全(48种),不会写代码的看过来
  3. maxscale连接mysql_MaxScale实现mysql读写分离,负载均衡
  4. Insyde uefi 隐藏设置_文颐法语:iOS 14安装后发现的9个隐藏的iPhone功能
  5. ArcCatalog添加数据库连接
  6. go-sqlite3 “database is locked”问题解决方案
  7. 常见四大类型视频接口
  8. 用python分析股票收益影响因素的方法_【Python】用Python分析股票的收益和风险
  9. videojs重播_videojs 视频播放器从入门到精通
  10. Python实现电影抢票系统需要几行代码?猜对有奖