首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

谈谈缓存更新

看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。...试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。...一些了解Linux操作系统内核的同学对write back应该非常熟悉,这不就是Linux文件系统的Page Cache的算法吗?是的,你看基础这玩意全都是相通的。...Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。...1、上面讲的这些Design Pattern,其实并不是软件架构里的mysql数据库和memcache/redis的更新策略,这些东西都是计算机体系结构里的设计,比如CPU的缓存,硬盘文件系统中的缓存

1.1K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    缓存雪崩、缓存穿透、缓存预热、缓存更新缓存降级等问题!

    ,今天给大家整理一篇关于Redis经常被问到的问题:缓存雪崩、缓存穿透、缓存预热、缓存更新缓存降级等概念的入门及简单解决方案。...(2)还有一个解决办法解决方案是:给每一个缓存数据增加相应的缓存标记,记录缓存的是否失效,如果缓存标记失效,则更新数据缓存,实例伪代码如下: ?...解释说明: 1、缓存标记:记录缓存数据是否过期,如果过期会触发通知另外的线程在后台去更新实际key的缓存; 2、缓存数据:它的过期时间比缓存标记的时间延长1倍,例:标记缓存时间30分钟,数据缓存设置为60...这样,当缓存标记key过期后,实际缓存还能把旧数据返回给调用端,直到另外的线程在后台更新完成后,才会返回新缓存。...关于缓存崩溃的解决方法,这里提出了三种方案:使用锁或队列、设置过期标志更新缓存、为key设置不同的缓存失效时间,还有一各被称为“二级缓存”的解决方法,有兴趣的读者可以自行研究。

    3.8K10

    漫谈缓存更新之道

    许多人在更新缓存时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载入缓存中。 然而,这个逻辑是错误的!!!...试想,两个并发操作,一个更新,一个查询,更新删除缓存后,查询没有命中缓存,先把旧数据读出来后放到缓存中,然后更新操作更新了数据库。于是,在缓存中的数据还是旧数据,导致缓存中持续地产生脏数据....这里,我们先不讨论更新缓存更新数据这两个事是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况 更新缓存的的Design Pattern有四种 1 Cache Aside...,成功后,让缓存失效 一个查询操作,一个更新操作的并发 首先,没有了删除cache数据的操作,而是先更新数据库中的数据,此时,缓存依然有效,所以,并发的查询操作拿的是没有更新的数据,但是,更新操作马上让缓存的失效了...则用缓存服务自己来加载,从而对应用方是透明的 2.2 Write Through 和Read Through相仿,不过是在更新数据时发生 当有数据更新时 如果没有命中缓存,直接更新数据库,然后返回

    3.2K31

    缓存更新的套路

    看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。...试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。...一些了解Linux操作系统内核的同学对write back应该非常熟悉,这不就是Linux文件系统的Page Cache的算法吗?是的,你看基础这玩意全都是相通的。...Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。...再多唠叨一些 1)上面讲的这些Design Pattern,其实并不是软件架构里的mysql数据库和memcache/redis的更新策略,这些东西都是计算机体系结构里的设计,比如CPU的缓存,硬盘文件系统中的缓存

    1.3K130

    缓存更新的套路

    看到好些人在写更新缓存数据代码时,先删除缓存,然后再更新数据库,而后续的操作会把数据再装载的缓存中。然而,这个是逻辑是错误的。...试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。...一些了解Linux操作系统内核的同学对write back应该非常熟悉,这不就是Linux文件系统的Page Cache的算法吗?是的,你看基础这玩意全都是相通的。...Write Back套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。...再多唠叨一些 1)上面讲的这些Design Pattern,其实并不是软件架构里的mysql数据库和memcache/redis的更新策略,这些东西都是计算机体系结构里的设计,比如CPU的缓存,硬盘文件系统中的缓存

    2.2K70

    缓存更新的套路

    试想,两个并发操作,一个是更新操作,另一个是查询操作,更新操作删除缓存后,查询操作没有命中缓存,先把老数据读出来后放到缓存中,然后更新操作更新了数据库。...这里,我们先不讨论更新缓存更新数据这两个事是不是一个事务的事,或是会有失败的可能,我们先假设更新数据库和更新缓存都可以成功的情况(我们先把成功的代码逻辑先写对)。...一些了解 Linux 操作系统内核的同学对 write back 应该非常熟悉,这不就是Linux 文件系统的 Page Cache 的算法吗?是的,你看基础这玩意全都是相通的。...Write Back 套路,一句说就是,在更新数据的时候,只更新缓存,不更新数据库,而我们的缓存会异步地批量更新数据库。...,硬盘文件系统中的缓存,硬盘上的缓存,数据库中的缓存

    1.3K20

    缓存更新策略

    问题:项目中,Redis用了缓存热点数据,持久化数据在MySQL DB中;那么Redis缓存数据什么时候更新呢? 方法A: 步骤:1....删除缓存,2.更新DB , 3.下一次读操作没有命中缓存时,更新缓存; 存在的问题:如果另外一个读任务发生在"更新DB"之前,那么缓存就"更新DB"之前的“脏数据”; 方法B:...步骤:1.更新DB,2.更新缓存; 存在的问题:如果发生并发“更新数据”,程序不能保证“更新缓存”的先后顺序,存在“脏数据”的可能性; 方法C:...步骤:1.更新DB, 2....下一次读操作没有命中缓存时,更新缓存; 存在的问题:如果在步骤1“更新DB”之前,有一个并发读任务没有命中缓存,从DB读取到“老数据”,在步骤2之后才把“老数据”更新缓存,那么缓存中就是

    1.5K00

    Redis缓存雪崩、缓存穿透、缓存预热、缓存更新缓存降级等问题

    一、缓存雪崩 由于原有缓存失效,新缓存未到期间,比如我们设置缓存时采用了相同的过期时间,在同一时刻出现大面积的缓存过期,所有原本应该访 问缓存的请求都去查询数据库了,而对数据库CPU和内存造成巨大压力,...(2)还有一个简单方案就时将缓存失效时间分散开。 二、缓存穿透 缓存穿透是指用户查询数据,在数据库没有,自然在缓存中也不会有。...三、缓存预热 缓存预热这个应该是一个比较常见的概念,相信很多人都应该可以很容易的理解,缓存预热就是系统上线后,将相关的缓存数据直接加载到缓存系统。...用户直接查询事先被预热的缓存数据 解决办法 (1)直接写个缓存刷新页面,上线时手工操作下; (2)数据量不大,可以在项目启动的时候自动进行加载; (3)定时刷新缓存; 四、缓存更新 除了缓存服务器自带的缓存失效策略之外...,过期的话就去底层系统得到新数 据并更新缓存

    2.2K20

    网站漏洞修复对如何修复phpcms网站漏洞

    SINE安全公司在对phpcms2008网站代码进行安全检测与审计的时候发现该phpcms存在远程代码写入缓存文件的一个SQL注入漏洞,该phpcms漏洞危害较大,可以导致网站被黑,以及服务器遭受黑客的攻击...整个phpcms采用PHP+Mysql数据库作为架构,稳定,并发高,承载量大。 phpcms2008漏洞详情 在对代码的安全检测与审计当中,发现type.php文件代码存在漏洞,代码如下: <?...当需要更新缓存的时候就会先判断有没有变量注册,如果有就会进行更新缓存。 该漏洞利用的就是缓存更新,将网站木马代码插入到缓存文件当中去。...可以看出$template没有进行过滤就可以直接写入到缓存模板中,我们可以指定TAG内容,post提交过去,如下代码: 我们在自己的本地电脑搭建了一套phpcms2008系统的环境,进行漏洞测试,提交...phpcms漏洞修复与安全建议 目前phpcms官方已经修复该漏洞,请各大网站运营者尽快升级phpcms2008到最新版本,有些二次开发的网站可以针对缓存目录进行安全限制,禁止PHP脚本文件的执行,data

    5.7K20

    为什么是删除缓存,而不是更新缓存

    原因很简单,很多时候,在复杂点的缓存场景,缓存不单单是数据库中直接取出来的值。 比如可能更新了某个表的一个字段,然后其对应的缓存,是需要查询另外两个表的数据并进行运算,才能计算出缓存最新的值的。...另外更新缓存的代价有时候是很高的。是不是说,每次修改数据库的时候,都一定要将其对应的缓存更新一份?也许有的场景是这样,但是对于比较复杂的缓存数据计算的场景,就不是这样了。...如果你频繁修改一个缓存涉及的多个表,缓存也频繁更新。但是问题在于,这个缓存到底会不会被频繁访问到?...2)最初级的缓存不一致问题及解决方案 问题:先更新数据库,再删除缓存。如果删除缓存失败了,那么会导致数据库中是新数据,缓存中是旧数据,数据就出现了不一致。 解决思路:先删除缓存,再更新数据库。...如果数据库更新失败了,那么数据库中是旧数据,缓存中是空的,那么数据不会不一致。因为读的时候缓存没有,所以去读了数据库中的旧数据,然后更新缓存中。

    13110

    PHPCMS V9.6.0_前台任意文件上传

    影响范围 PHPCMS V9.6.0 攻击类型 任意文件上传 利用条件 影响范围应用 漏洞概述 2017年4月份左右PHPCMS V9.6被曝出注册页面存在任意文件上传漏洞,通过该漏洞攻击者可以在未授权的情况下上传任意文件...,甚至getshell 漏洞复现 利用方式1 首先打开用户注册页面,之后随意填写数据,同时使用burpsuite抓取数据包: http://192.168.174.138/phpcms/index.php..."phpcms/modules/member/index.php"中的register函数: 从上面的流程可以看到首先是获取用户的siteid,之后定义了站点的id并加载了用户模块和短信模块的配置,之后通过对...: 接下来函数执行$this->attachment->download函数进行下载,我们继续跟进,在phpcms/libs/classes/attachment.class.php中: 函数中先对...漏洞POC pocsuite3 POC完整脚本后台回复"PHPCMS"下载 修复建议 phpcms 发布了9.6.1版本,针对该漏洞的具体补丁如下,在获取文件扩展名后再对扩展名进行检测 参考链接

    68840

    缓存层场景实战读缓存,如何更新缓存+缓存的高可用设计+监控

    ◆ 如何更新缓存 更新缓存的步骤特别简单,共两步:更新数据库和更新缓存。但这简单的两步中需要考虑很多问题。 1)先更新数据库还是先更新缓存更新缓存时先删除还是直接更新?...◆ 组合1:先更新缓存,再更新数据库 对于这个组合,会遇到这种情况:假设第二步更新数据库失败了,要求回滚缓存更新,这时该怎么办呢?...2)线程A将缓存中的值更新成b,且保存了原来的值a,然后更新数据库。 3)线程B将缓存中的值更新成c,且保存了原来的值b,然后更新数据库。...◆ 组合5:先删除缓存更新数据库,再删除缓存 还有一个方案,就是先删除缓存,再更新数据库,再删除缓存。...程序员总是不愿意承认:写代码在公司里是一件并不太重要的事情 将 SQL Server 数据库恢复到不同的文件名和位置 985计算机系毕业找不到工作?

    79110

    文件缓存介绍

    为了解决这一问题,就需要合理分配资源,充分利用已有资源,缓存的工作实际就是资源的合理分配。 在web世界里,理论上每层都可以被缓存。 底层的cpu缓存,磁盘文件缓存。...应用层的虚拟机变量缓存,memcached缓存,apc基于字节码的缓存。...数据库层table cache,thread cache,queary cache. servlet 容器层有apache缓存 命中率衡量缓存机制的好坏和效率。...缓存更新策略 FIFO最先进缓存的数据在缓存空间不够的情况下,会首先清理出来。 LFU最少使用元素会被清理掉。这要求缓存元素有Hit属性,最小的先被清理掉。 LRU最近最少使用的元素被清理掉。...缓存元素有个时间戳,最早的元素会被清理掉。 文件缓存开元产品 Secache文件缓存解决方案。 无需任何扩展。 使用LRU算法自动清理过期内容。 最大支持1GB缓存文件

    1.4K90

    力作|phpcms_v9.6.1 任意文件下载漏洞

    前面咱们一起学习了phpcms_v9.6.0,任意文件上传漏洞复现的过程,不知道小伙伴们后面有没有想到如何进行批量检测呢?...创作背景: 上周发完phpcms_v9.6.0,任意文件上传漏洞复现的过程的文章后,有小伙伴们说phpcms_v9.6.1的任意文件下载一直复现不成功,于是就有了本文。...基础环境: 1、 phpcms_v9.6.1源码。 2、 web应用环境用于搭建phpcms。 需要工具: 1、 BurpSuite 或者hackBar等。...源码部署: 参考:phpcms_v9.6.0 任意文件上传漏洞的链接 : https://mp.weixin.qq.com/s/hApXD2cKG0a83fzkRTjAlA 0x01 同样的按照常规的源码部署流程先将...注:请求中标红的位置是想要要读取的文件路径,这里我读取的是数据连接文件。 0x03 获得到ogpin_att_json后访问以下连接地址其中a_k的值为0x02中的ogpin_att_json的值。

    2.1K80

    缓存层场景实战读缓存,如何更新缓存+缓存的高可用设计+监控

    如何更新缓存 更新缓存的步骤特别简单,共两步:更新数据库和更新缓存。但这简单的两步中需要考虑很多问题。 1)先更新数据库还是先更新缓存更新缓存时先删除还是直接更新?...组合1:先更新缓存,再更新数据库 对于这个组合,会遇到这种情况:假设第二步更新数据库失败了,要求回滚缓存更新,这时该怎么办呢?...2)线程A将缓存中的值更新成b,且保存了原来的值a,然后更新数据库。 3)线程B将缓存中的值更新成c,且保存了原来的值b,然后更新数据库。...组合3:先更新数据库,再更新缓存 对于组合3,同样需要考虑两个问题。 1)假设第一步(更新数据库)成功,第二步(更新缓存)失败了怎么办?...组合5:先删除缓存更新数据库,再删除缓存 还有一个方案,就是先删除缓存,再更新数据库,再删除缓存

    81830
    领券