Redis缓存异常及解决方案
本文分享自天翼云开发者社区《Redis缓存异常及解决方案》,作者:l****n
本文向读者解释了Redis使用过程中,数据不一致、缓存雪崩、缓存击穿和缓存穿透等问题的定义,并给出对应的解决方案。
1、数据不一致
一致指的是:
缓存中有数据,那么,缓存的数据值需要和数据库中的值相同;
缓存中本身没有数据,那么,数据库中的值必须是最新值。
不一致如何发生:
对于读写缓存来说,写缓存时同步写数据库,需要使用事务保证缓存和数据库的更新具有原子性。弱一致性情况下,可以使用异步写回。
对于只读缓存,删改数据需要既更新数据库,又删除缓存。如果不使用事务,就会出现数据不一致。
比如先更新数据库,再删除缓存。更新成功,删除缓存失败,则缓存中为旧值。如果先删除缓存再更新数据库,则缓存删除成功,数据库更新失败,再访问数据库,数据库还是旧值。
解决方案
需要重试机制,当两个操作任意一个失败时,重新执行。
特别的,当数据库更新成功,缓存删除也成功时,其实也有可能不一致。比如删除了缓存,还未更新数据库。线程B此时读取数据库中旧值并写到缓存。
解决方法:延迟双删。sleep是为了等B线程执行完写缓存操作。sleep时间根据读数据和写缓存时间来估算。
redis.delKey(X)
db.update(X)
Thread.sleep(N)
redis.delKey(X)
比如更新了数据库,还未删除缓存时。B线程就开始读数据,从缓存读到旧值。不过这种情况下缓存会马上被删除,所以影响较小。
2、缓存雪崩
大量请求无法在redis得到处理,从而打到数据库。主要原因:
缓存中大量数据同时过期,应用访问时无法命中缓存,从而都请求到数据库;
redis宕机。
解决方案:
过期时间增加随机数;
发生雪崩时进行服务降级。非核心数据直接返回默认值或错误;
限流熔断,当数据库负载突升时,暂停业务应用对缓存的访问。
3、缓存击穿
热点数据过期失效,大量请求突然打到数据库。
解决方法
热点数据不设置过期时间。
4、缓存穿透
数据不在缓存中,也不在数据库中。可能原因:
业务层误操作,删除了数据库数据。
恶意攻击。
解决方案:
缓存默认值;
使用布隆过滤器快速判断数据是否存在;
前端进行请求检查。
在实际的业务中,以上异常场景可能会同时出现,排查时要根据自己的情况进行针对性分析。
Redis缓存异常及解决方案的更多相关文章
- redis缓存穿透穿透解决方案-布隆过滤器
redis缓存穿透穿透解决方案-布隆过滤器 我们先来看一段代码 cache_key = "id:1" cache_value = GetValueFromRedis(cache_k ...
- Redis缓存异常的容错实现方法( .net)
using DotNet.Log; /// <summary> /// Redis缓存辅助类 /// /// 修改纪录 /// /// 2015-10-26 版本:1.0 SongBiao ...
- 高并发下redis缓存穿透问题解决方案
一.使用场景 我们在日常的开发中,经常会遇到查询数据列表的问题,有些数据是不经常变化的,如果想做一下优化,在提高查询的速度的同时减轻数据库的压力,那么redis缓存绝对是一个好的解决方案. 二.需求 ...
- Redis 缓存问题及解决方案
[相关概念] 缓存击穿:指的是一些热点数据过期,由于热点数据存在并发量大的特性,所以短时间内对数据库的造成很大的冲击,导致系统瘫痪.常见于例如微博系统中明星结婚或出轨时微博瘫痪的情况. 缓存雪崩:指的 ...
- Redis缓存的主要异常及解决方案
作者:京东物流 陈昌浩 1 导读 Redis 是当前最流行的 NoSQL数据库.Redis主要用来做缓存使用,在提高数据查询效率.保护数据库等方面起到了关键性的作用,很大程度上提高系统的性能.当然在使 ...
- Redis缓存穿透、缓存雪崩、并发问题分析与解决方案
(一)缓存和数据库间数据一致性问题 分布式环境下(单机就不用说了)非常容易出现缓存和数据库间的数据一致性问题,针对这一点的话,只能说,如果你的项目对缓存的要求是强一致性的,那么请不要使用缓存.我们只能 ...
- Redis缓存穿透、缓存雪崩、redis并发问题 并发竞争key的解决方案 (阿里)
阿里的人问我 缓存雪崩(大量数据在同一时间过期了)了如何处理,缓存击穿了如何处理,回答的很烂,做了总结: 把redis作为缓存使用已经是司空见惯,但是使用redis后也可能会碰到一系列的问题,尤其是数 ...
- Redis缓存篇(四)缓存异常
这一节,我们来学习一下缓存异常.缓存异常有四种类型,分别是缓存和数据库的数据不一致.缓存雪崩.缓存击穿和缓存穿透. 下面通过了解这四种缓存异常的原理和应对方法. 缓存和数据库的数据不一致 缓存和数据库 ...
- .NET基于Redis缓存实现单点登录SSO的解决方案[转]
一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...
- .NET基于Redis缓存实现单点登录SSO的解决方案
一.基本概念 最近公司的多个业务系统要统一整合使用同一个登录,这就是我们耳熟能详的单点登录,现在就NET基于Redis缓存实现单点登录做一个简单的分享. 单点登录(Single Sign On),简称 ...
随机推荐
- python argparse变量到class变量的转换代码
github上的项目总喜欢使用argparse + bash来运行,这对于快速运行一个项目来说可能有好处,但在debug的时候是很难受的.因为我们需要在.sh文件中修改传入参数,并且不能使用jupyt ...
- spring IOC 实现原理模拟实现
原文系装载: http://blog.sina.com.cn/s/blog_6a7f00ed01011dyv.html 最近对spring IOC AOP 机制实现原理了解了下,在此做下整理,希望能给 ...
- 浅谈Java的Mina框架传递对象
本篇文章主要讲解Java的Mina框架传递对象是什么,并附于代码和图片方便大家理解. AD:2013大数据全球技术峰会课程PPT下载 接触java的Mina框架已经有很多时间了,在网上也读过了很多的相 ...
- Java深度历险(六)——Java注解——(七)——Java反射与动态代理
在开发Java程序,尤其是Java EE应用的时候,总是免不了与各种配置文件打交道.以Java EE中典型的S(pring)S(truts)H(ibernate)架构来说,Spring.Struts和 ...
- 【COS 加码福利】COS 用户实践有奖征文,等你来投稿!
COS用户实践征文活动火热进行中,本次征集主题为:如何在生态场景下使用 COS? 优质文章将有机会被编入腾讯云官方文档库,供广大用户学习参考.更有多重好礼等你来拿,速来围观投稿吧! 投稿说明: 1.投 ...
- 04. PART 2 IdentityServer4 ASP.NET Core Identity .NET Core 3.1
04. PART 2 IdentityServer4 ASP.NET Core Identity .NET Core 3.1 如果您已经来到这里,那么祝贺你的坚持,最难的部分已经完成了.我们仅仅需要的 ...
- JDK 18 最新动态和 JDK 19 新特性预测
JDK 18 最新动态和 JDK 19 新特性预测_语言 & 开发_Michael Redlich_InfoQ精选文章 里面提到文章 定界延续(delimited continuations) ...
- 虚拟机安装 Win10 ,无法启动,报错EFI Network ... Time out
问题情况 VMWare 16 安装 win10 的镜像文件,无法启动,报错 EFI Network ... Time out 解决办法 虚拟机设置中 固件类型 改用 BIOS 已解决
- 【转载】Apache Doris、DorisDB傻傻分不清。。。
https://www.sohu.com/a/488816742_827544 相信这两天很多社区小伙伴都看到 StarRocks 所谓"开源"的动态了,开源用户群里有很多小伙 ...
- Netty 中ChannelOption的含义以及使用的场景Netty 中ChannelOption的含义以及使用的场景
一.概述 最近在写一个分布式服务框架,打算用netty框架做底层网络通信,关于netty的学习可以参考如下资料: http://blog.csdn.net/column/details/enjoyne ...