首页 > 数据库 >Redis 缓存常见问题处理

Redis 缓存常见问题处理

时间:2024-05-19 23:29:36浏览次数:23  
标签:缓存 数据库 Redis 互斥 常见问题 线程 key

缓存穿透

缓存穿透是指客户端的请求数据在缓存和数据库中都不存在,这样缓存永远不会生效,这些请求都会到达数据库,从而导致数据库负载过高。
常见解决方案有两种:

  • 缓存空对象:实现简单、方便维护,是解决缓存穿透的首选方法,但会造成额外内存消耗,或短期的数据不一致
  • 布隆过滤:内存占用少,没有多余key,但实现复杂且有可能误判

缓存雪崩

缓存雪崩是指在同一时间段大量缓存 key 同时失效或 Redis 服务宕机,导致大量请求到达数据库,导致数据库负载过高。
常见解决方案如下:

  • 给不同的 key 的过期时间添加随机值
  • 利用 Redis 集群提高服务的可用性
  • 给缓存业务添加限流降级策略
  • 给业务添加多级缓存

缓存击穿

缓存击穿也叫热点 key 问题,就是一个被高并发访问并且缓存重建业务比较复杂的 key 突然失效了,无数的请求访问会在瞬间给数据库带来巨大的冲击。
常见解决方案有以下两种:

互斥锁

image
给重建缓存的逻辑加上一个互斥锁,避免多个线程同时访问数据库,这种方法通常应用在一致性要求较高的场景。

逻辑过期

image
在缓存对象中维护一个过期时间的字段,当查询缓存时发现已过期则获取互斥锁(例如 Redis 中的 setnx)并开启一个新线程重建缓存数据并将释放互斥锁的逻辑放在新线程中,原线程返回过期数据。当在缓存重建时有其他线程访问缓存并发现数据过期时获取互斥锁失败则直接返回过期数据。这种方法通常应用在对可用性较高的场景。

总结

image

标签:缓存,数据库,Redis,互斥,常见问题,线程,key
From: https://www.cnblogs.com/ljzy666/p/18200953

相关文章

  • redis存储之序列化问题
    1.问题描述:在SpringBoot集成Redis过程中,添加进redisf的内容如下2.出现这种情况的原因(1) 键和值都是通过Spring提供的Serializer序列化到数据库的(2) RedisTemplate默认使用的是JdkSerializationRedisSerializer,StringRedisTemplate默认使用的是StringRedisSerializer3.解......
  • Redis内存回收与缓存问题
    内存回收:1.过期key处理通过expire命令给key设置ttlRedis本身是KV型数据库,所有数据都存在RedisDB结构体中,其中有两张哈希表dict:用于存放KV(这里K是K,V是V)expires:保存Redis中所有的设置了过期时间的KEY以及到期时间TTL(这里K是K,V是TTL)过期KEY有两种删除策略:惰性删除,有......
  • Redis的缓存雪崩、击穿、穿透问题,小小缓存问题,拿捏
    前言来整理一下缓存雪崩、击穿和穿透的问题,这个问题在面试中常出现,不是瞎说,我已经遇到几次了一、缓存雪崩1.雪崩什么是雪崩,某度给出的解释雪崩当山坡积雪内部的内聚力抗拒不了它所受到的重力拉引时,便向下滑动,引起大量雪体崩塌,人们把这种自然现象称作雪崩。说白了就......
  • redis数据结构:RedisObject,SkipList,SortedSet
    1.RedisObject对象redis中任何KV都会被封装为RedisObject对象,也叫做Redis对象 2.SkipList跳表元素按照升序排列存储,是有序的双向链表节点可以有多个指针,并且跨度不同。指针个数根据节点数自动生成,1~32性能和红黑树;二分查找差不多。实现简单,但是空间复杂度高样例:1——2......
  • redis实现分片集群
     为什么要使用分片集群?主从和哨兵可以解决高可用、高并发读的问题。但是仍存在海量数据存储、高并发写问题分片集群特征:集群中有多个master,每个master保存不同数据。为master置备了后备隐藏能源:多个slave节点优化了sentinel,master互相ping检测彼此状态结构复杂,难弄 ......
  • [SWPUCTF 2016]Web7 利用ssrf攻击redis
    今天做了一道攻击redis的相关题目,以前没接触过。初始界面有输入框,随便输入看看。是urllib2相关库报错,去搜了搜发现是Python2的Urllib2头部注入(CVE-2016-5699)。那就看看这个cve。说是Python2.x3.x的urllib/urllib2从数据解析到发包的整个流程中,均未对URL提供安全性过滤或检查......
  • 在spring boot中使用redis
    第一步,引入依赖```<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency>```第二步,配置redisspring:redis:host:loc......
  • Docker启动 Redis提示:Can't initialize Background Jobg
     今天使用docker启动redis失败,但是查看容器日志,除了提示Fatal:Can'tinitializeBackgroundJobg,没有其他错误信息。经过长时间查找资料及试错,现记录下可能的产生原因及解决方案,以便以后参考。产生原因:宿主机安装的docker版本太低,同镜像所需的版本不匹配解决方案: 方案1、......
  • 一对一视频源码,Redis数据源还能这样隔离
    一对一视频源码,Redis数据源还能这样隔离通过ThreadLocal识别出来压测数据,自定义Redis的主键的序列化方式,如果是压测数据则在主键后面加上后缀,这样就可以通过不同主键将Redis数据进行隔离。一、实现key序列化publicclassKeyStringRedisSerializerextendsStringRedis......
  • Redis 的安装与配置详解【Redis系列一】
    〇、前言关于Redis在日常开发中还是用的比较多的,特别是在秒杀、消息队列、排行榜等数据交互时效要求较高的场景,Redis都可以轻松应对。本文将针对Redis进行简单介绍,以及如何安装,并罗列下全部配置项。后续还将另行发文汇总Redis的常用数据结构和常见问题等。一、什么是Re......