Redis双写一致性与缓存更新策略】的更多相关文章

一.双写一致性 双写一致性,也就是说 Redis 和 mysql 数据同步 双写一致性数据同步的方案有: 1.先更新数据库,再更新缓存 这个方案一般不用: 因为当有两个请求AB先后更新数据库后,A应该先更新缓存,但是因为网络原因,B却先更新了缓存,导致了脏数据,所以不考虑用. 2.先删缓存,再更新数据库 这个方案也不是很好: 缓存删了,数据库还没存完,又来了一个请求,又去数据库拿,然后缓存又有了(在存数据的时候,请求来了,缓存不是最新的) 3.先更新数据库,再删缓存 推荐用这个方案: 更新了数据…
首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作. 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者是先删除缓存,再更新数据库,其实大家存在很大的争议.目前没有一篇全面的博客,对这几种方案进行解析.于是博主战战兢兢,顶着被大家喷的风险,写了这篇文章. 文章结构 本文由以下三个部分组成 1.讲解缓存更新策略2.对每种策略进行缺点分析3.针对缺点给出改进方案 正文 先做一个说明,从理论上来说,给缓存设…
首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作. 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者是先删除缓存,再更新数据库,其实大家存在很大的争议.目前没有一篇全面的博客,对这几种方案进行解析.于是博主战战兢兢,顶着被大家喷的风险,写了这篇文章. 文章结构 本文由以下三个部分组成1.讲解缓存更新策略2.对每种策略进行缺点分析3.针对缺点给出改进方案 正文 先做一个说明,从理论上来说,给缓存设置…
首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作. 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者是先删除缓存,再更新数据库,其实大家存在很大的争议.目前没有一篇全面的博客,对这几种方案进行解析.于是博主战战兢兢,顶着被大家喷的风险,写了这篇文章. 文章结构 本文由以下三个部分组成 1.讲解缓存更新策略2.对每种策略进行缺点分析3.针对缺点给出改进方案 正文 先做一个说明,从理论上来说,给缓存设…
一. 缓存雪崩 1. 含义 同一时刻,大量的缓存同时过期失效. 2. 产生原因和后果 (1). 原因:由于开发人员经验不足或失误,大量热点缓存设置了统一的过期时间. (2). 产生后果:恰逢秒杀高峰,缓存过期,瞬间海量的QPS(每秒查询次数)直接打到DB上,如果系统架构没有熔断机制,直接将导致系统全线崩溃. 3. 处理方案 (1). 设置不同的缓存失效时间,比如可以在缓存过期时间后面加个随机数,这样就避免同一时刻缓存大量过期失效. setRedis(key,value,time + Math.r…
首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作. 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者是先删除缓存,再更新数据库,其实大家存在很大的争议.目前没有一篇全面的博客,对这几种方案进行解析.于是博主战战兢兢,顶着被大家喷的风险,写了这篇文章. 文章结构 本文由以下三个部分组成 1.讲解缓存更新策略2.对每种策略进行缺点分析3.针对缺点给出改进方案 正文 先做一个说明,从理论上来说,给缓存设…
[原创]分布式之数据库和缓存双写一致性方案解析(三)   正文 博主本来觉得,<分布式之数据库和缓存双写一致性方案解析>,一文已经十分清晰.然而这一两天,有人在微信上私聊我,觉得应该要采用 先删缓存,再更新数据库,再删缓存 这一方案作为缓存更新策略,而不是先更新数据库,再删缓存.并且搬出了两篇大佬的文章,<Cache Aside Pattern>,<缓存与数据库不一致,咋办?>,希望博主能加以说明.因为问的人太多了,所以才有了这篇文章的诞生. 正文 在开始这篇文章之前,…
一 前言 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者是先删除缓存,再更新数据库,其实大家存在很大的争议 本文由以下三个部分组成 1.讲解缓存更新策略 2.对每种策略进行缺点分析 3.针对缺点给出改进方案 二 一致性方案 先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案.这种方案下,我们可以对存入缓存的数据设置过期时间…
如果不是严格要求“缓存和数据库”必须保证一致性的话,最好不要做这个方案:即 读请求和写请求串行化,串到一个内存队列里面去.串行化可以保证一定不会出现不一致的情况,但会导致系统吞吐量大幅度降低. 解决这个问题的最经典的模式,就是Cache Aside Pattern. Cache Aside Pattern:     (1)读的时候先读缓存,如果缓存不存在的话就读数据库,取出数据库后更新缓存:如果存在的话直接读取缓存的信息.     (2)写的时候,先更新数据库,再删除缓存. 说到这个问题,又会出…
一:序 - 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题. - 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案. 二:(更新策略)-  先更新数据库,后更新缓存 - 产生的问题 -  - 由上面流程图可知道,请求A更新缓存应该比请求B更新缓存早才对,但是因为网络等原因,B却比A更早更新了缓存. - 这就导致了脏数据,因此不考虑 先更新数据库,后更新缓存 这个更新策略. 三:(更新策略)-  先删除缓存,在更新数据库 - 产生的问题 -  - 如果同时有…
一:序 - 最近在对数据做缓存时候,会涉及到如何保证 数据库/Redis 一致性问题. - 刚好今天来总结下 一致性问题 产生的问题,和可能存在的解决方案. 二:(更新策略)-  先更新数据库,后更新缓存 - 产生的问题 -  - 由上面流程图可知道,请求A更新缓存应该比请求B更新缓存早才对,但是因为网络等原因,B却比A更早更新了缓存. - 这就导致了脏数据,因此不考虑 先更新数据库,后更新缓存 这个更新策略. 三:(更新策略)-  先删除缓存,在更新数据库 - 产生的问题 -  - 如果同时有…
并发场景中大部分处理的是先更新DB,再(删缓.更新)缓存的处理方式,但是在实际场景中有可能DB更新成功了,但是缓存设置失败了,就造成了缓存与DB数据不一致的问题,下面就以实际情况说下怎么解决此类问题. 名词 Cache:本文内指redis,ReadRequest:请求从Cache.Db中拿去数据,WriteRequest:数据写入DB并删除缓存 若要保证数据库与缓存一直,我们需要采用先删缓存,在更新DB的情况,这时候有的同学可能会问,如果缓存删除成功了,而DB更新失败了怎么办,其实仔细考虑一下,…
只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? 面试题剖析 一般来说,如果允许缓存可以稍微的跟数据库偶尔有不一致的情况,也就是说如果你的系统不是严格要求 “缓存+数据库” 必须保持一致性的话,最好不要做这个方案,即:读请求和写请求串行化,串到一个内存队列里去. 串行化可以保证一定不会出现不一致的情况,但是它也会导致系统的吞吐量大幅度降低,用比正常情况下多几倍的机器去支撑线上请求. Cache Aside Pattern 最经…
分布式缓存是现在很多分布式应用中必不可少的组件,但是用到了分布式缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致性的问题,那么你如何解决一致性问题? Cache Aside Pattern 最经典的缓存+数据库读写的模式,就是 Cache Aside Pattern.读的时候,先读缓存,缓存没有的话,就读数据库,然后取出数据后放入缓存,同时返回响应.更新的时候,先更新数据库,然后再删除缓存. 为什么是删除缓存,而不是更新缓存? 原因很简单,很多时候,在复杂点的缓存场景…
Redis 单线程高性能,它所有的数据都在内存中,所有的运算都是内存级别的运算,而且单线程避免了多线程的切换性能损耗问题.redis利用epoll来实现IO多路复用,将连接信息和事件放到队列中,依次放到文件事件分派器,事件分派器将事件分发给事件处理器. 1.Redis数据结构及简单操作指令 String.list.set.hash.zset(有序set) 总体来说redis都是通过Key-Value的形式来存储数据的.只是不用数据类型Value的形式不同. String:最简单数据结构,比如我们…
首先下载redis_fdw,这里要注意下载的版本.(https://github.com/pg-redis-fdw/redis_fdw) 一开始,我下载了REL9_4_STABLE_pre2.8版本,安装成功后只能进行查询,不能增删改,联系上德哥后才知道未开发写接口,于是我换成了REL9_4_STABLE版本,终于成功了... hiredis在redis的目录下是有的,可以直接拷贝到postgres的包路径下.(redis_fdw-1.0.0下面是hiredis文件)…
1.缓存更新策略 1.LRU/LFU/FIFO算法剔除:例如maxmemory-policy 2.超时剔除,过期时间expire,对于一些用户可以容忍延时更新的数据,例如文章简介内容改了几个字 3.主动更新:代码控制生命周期,对于一些必须实时更新的数据,例如金额 策略 一致性 维护成本 LRU/LFU/FIFO算法剔除 最差 低 超时剔除 较差 低 主动更新 强 高 2.缓存粒度问题 1.通用性:全量属性最好 2.占用空间:部分属性最好 3.代码维护:表面上看全量属性最好 大部分应用来说都是缓存…
转载自:https://blog.csdn.net/lzhcoder/article/details/79469123 https://blog.csdn.net/u013374645/article/details/91409150 1.最经典的缓存+数据库读写的模式,cache aside pattern 1.1.Cache Aside Pattern (1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应 (2)更新的时候,先删除缓存,然后再更新数据库…
我是风筝,公众号「古时的风筝」. 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在里面. 那天我在 LeetCode 上刷到一道 LRU 缓存机制的问题,第 146 题,难度为中等,题目如下. 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果关键字 (key) 存在于缓存中,则获取关键字的值(总是正数),否则返回 -1.…
一 前言 首先,缓存由于其高并发和高性能的特性,已经在项目中被广泛使用.在读取缓存方面,大家没啥疑问,都是按照下图的流程来进行业务操作 但是在更新缓存方面,对于更新完数据库,是更新缓存呢,还是删除缓存.又或者是先删除缓存,再更新数据库,其实大家存在很大的争议 本文由以下三个部分组成 1.讲解缓存更新策略 2.对每种策略进行缺点分析 3.针对缺点给出改进方案 回到目录 二 一致性方案 先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案.这种方案下,我们可以对存入缓存的数据设…
文章很长,建议收藏起来,慢慢读! 疯狂创客圈为小伙伴奉上以下珍贵的学习资源: 疯狂创客圈 经典图书 : <Netty Zookeeper Redis 高并发实战> 面试必备 + 大厂必备 + 涨薪必备 疯狂创客圈 经典图书 : <SpringCloud.Nginx高并发核心编程> 面试必备 + 大厂必备 + 涨薪必备 资源宝库: Java程序员必备 网盘资源大集合 价值>1000元 随便取 GO->[博客园总入口 ] 送书活动:联合机械工业出版社 Java高并发三部曲…
数据库与缓存双写问题 计算机领域任何一个问题都可以通过增加一个抽象"层"来解决. 业务中为了减少热点数据不必要的db查询,往往会增加一层缓存来解决I/O性能.可是I/O多了一层也就多了一层的更新维护与容错保障,当修改db中某些数据时,往往会面临缓存更新的问题,在这里简单介绍 数据库与缓存双写问题以及在业务场景如何使用双写策略. 缓存更新时机 缓存在以下情况下需要更新: 不存在缓存,回源至db后添加缓存 缓存超时,重复上个步骤 修改db,更新缓存 缓存更新策略 若不存在缓存或者缓存超时:…
Redis 本地缓存+远程缓存方案 使用纯java的ehcache作为本地缓存 Reids 作为远程分布式缓存 解决redis缓存压力过大,提高缓存速度,以及缓存性能. Redis和ehcache缓存的区别 如果是单个应用或者对缓存访问要求很高的应用,用ehcache.如果是大型系统,存在缓存共享.分布式部署.缓存内容很大的,建议用redis. 缓存更新策略 1.广播更新策略 使用redis的发布与订阅来实现缓存更新广播,本地缓存存放更新频率低,但请求量很高的数据,对于更新频率很高的数据应该由r…
简单的场景: 直接使用 1. 使用Cache Aside pattern 读取的时候,先读取缓存中是否有数据,缓存中没有数据,再去数据库中进行查询,查询出来以后,然后再存入到缓存中 更新的时候,先删除缓存库,然后再更新数据库. 为什么是先删除缓存,然后再更新数据库? 因为有可能存入到缓存中的是一个经过复杂运算的数值. 我更新数据库的时候,并不是每次都要将这个经过复杂运算的值取出来,所以使用一个lazy的加载思想,先删除缓存库,然后等我什么时候需要,什么时候再进行加载.   在高并发的情况下,出现…
今天来分享一下Redis几道常见的面试题: 如何解决缓存雪崩? 如何解决缓存穿透? 如何保证缓存与数据库双写时一致的问题? 一.缓存雪崩 1.1什么是缓存雪崩? 回顾一下我们为什么要用缓存(Redis): <figcaption style="margin: 10px 0px 0px; padding: 0px; max-width: %; box-sizing: border-box !important; word-wrap: break-word !important; line-h…
背景:redis问题在面试过程中经常被问到,对于常见问题一定不能放过. 面试前必知Redis面试题—缓存雪崩+穿透+缓存与数据库双写一致问题 一.缓存雪崩 1.1什么是缓存雪崩? 如果缓存数据设置的过期时间是相同的,并且Redis恰好将这部分数据全部删光了.这就会导致在这段时间内,这些缓存同时失效,全部请求到数据库中. 这就是缓存雪崩: Redis挂掉了,请求全部走数据库. 对缓存数据设置相同的过期时间,导致某段时间内缓存失效,请求全部走数据库. 缓存雪崩如果发生了,很可能就把我们的数据库搞垮,…
当执行写操作后,需要保证从缓存读取到的数据与数据库中持久化的数据是一致的,因此需要对缓存进行更新. 因为涉及到数据库和缓存两步操作,难以保证更新的原子性. 在设计更新策略时,我们需要考虑多个方面的问题: 对系统吞吐量的影响:比如更新缓存策略产生的数据库负载小于删除缓存策略的负载 并发安全性:并发读写时某些异常操作顺序可能造成数据不一致,如缓存中长期保存过时数据 更新失败的影响:若某个操作失败,如何对业务影响降到最小 检测和修复故障的难度: 操作失败导致的错误会在日志留下详细的记录容易检测和修复.…
采用三级缓存:nginx本地缓存+redis分布式缓存+tomcat堆缓存的多级缓存架构 时效性要求非常高的数据:库存 一般来说,显示的库存,都是时效性要求会相对高一些,因为随着商品的不断的交易,库存会不断的变化 时效性要求不高的数据:商品的基本信息(名称.颜色.版本.规格参数,等等) 商品价格/库存等时效性要求高的数据,而且种类较少,采取相关的服务系统每次发生了变更的时候,直接采取数据库和redis缓存双写的方案,这样缓存的时效性最高 商品基本信息等时效性不高的数据,而且种类繁多,来自多种不同…
1.Cache aside pattern 这是最经典的 缓存+数据库 读写模式,操作如下: ①读的时候,先读缓存,缓存没有就读数据库,然后将取出的数据放到缓存,同时返回请求响应. ②更新的时候,先删除缓存,然后更新数据库. 2.为什么是删除缓存,而不是更新缓存呢? ①因为很多时候,缓存中放的并不是简单的从数据中取出来值,可能要进行一个状态的替换,一些数据的计算,还有可能要进行数据的组合等等. ②二八法则,即20%的数据,占用了80%的访问量,这个更新的数据,可能是冷门数据,好久也访问不了不了一…
Redis缓存能够有效地加速应用的读写速度,就DB来说,Redis成绩已经很惊人了,且不说memcachedb和Tokyo Cabinet之流,就说原版的memcached,速度似乎也只能达到这个级别.今天主要讲讲在使用Redis时经常遇到的几个问题.缓存雪崩.缓存击穿.缓存穿透.缓存预热.缓存更新.缓存降级. v缓存雪崩 缓存雪崩,是指在某一个时间段,缓存集中过期失效.所有原本应该访问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,严重的会造成数据库宕机.从而形成一系列连锁反应…