一文说透常见的缓存策略
商业正常的常见:三种类型:kawadad(文本缓存),读 /写(读 /写)和写入(读回)和写入(读回)。通过策略在实际发展中非常使用。
如果该应用程序无法直接从缓存和数据库中获得,则该应用程序在缓存中不可用,然后更新信息。
相反,当数据下雨时,数据库和cacheting数据库都应是同步数据库。
缓存说明并通过阅读政策和政策来制定政策。
在阅读指南中,该应用需要数据库中的数据,并在没有可用的情况下更新缓存。
策略策略恰恰相反,更新数据库,然后更新缓存。
即使文本策略可能无法提交数据纠纷,您也可以经常向主教更新浪费资源。
因此,建议首先更新数据库。
在商定的情况下删除数据库。
尽管不兼容的信息风险脆弱,但相对较小的可能性较小。
另一个工作是首先更新myql以更新myql,然后使用类似情况的杆。
该决议使用的是主要负责更新适合最终稠度的感冒的Binlolog。
阅读策略是覆盖范围,并覆盖了与数据库进行通信的覆盖范围,是为了减轻应用程序的负担。
根据缓存封面,它将调整到缓存层数据的数据库。
到当时,缓存和数据库已同时记录。
此方法适合业务处于缓存备份率的情况。
恢复策略会更新缓存,扩展数据库,并且不教脏量。
在很多情况下,文本返回策略可以很快响应,但这会导致困难和信息丢失。
因此,这是适当的,因为文本活动很高且不安全感。
选择武器策略时,您需要考虑使用武器策略的业务情况和数据一致的要求。
redis产生雪崩怎么解决
雪雪崩发生的原因:对缓存雪崩的简单理解是:因为原始缓存无效(或数据未加载到缓存中),所以新的高速缓存尚未达到该期间(缓存通常已获得。从图中,如图所示,如图所示,如图所示,如图所示,如图所示,如图所示,如图所示,如图所示图,如图所示,如图所示,如图所示,如图所示,如图所示,如下图所示)。
基本解决方案如下:首先,大多数系统设计人员考虑使用锁定或队列以确保没有大量线程读取和编写数据库,以避免在缓存 - 失败时对数据库的压力太大。
尽管它可以在某种程度上减轻数据库的压力,但也可以减少系统流量。
其次,分析用户的行为,并尝试均匀地分发高速缓存时间。
第三,如果缓存服务器关闭,请考虑创建预备基础,例如:重新准备基础,但双缓存涉及更新交易的问题。
Redis Avalanche效应的解决方案:1 您可以使用分布式锁,本地锁2 通过使用该机制,请确保它只是线程(请求)操作。
否则,您可以排队(群集分布式锁,免费的本地锁)。
减少服务器流量并无效。
添加到锁! 可以确保只有一个线程可以指定,实际上,只能使用一个请求来执行查询操作。
消息中间可以解决高度同时! !! !! 如果Redis访问大量请求时没有价值,则查询结果将存储在中间药物中(使用MQ异步功能)3 使用辅助缓存,A1 是原始缓存,A2 是Copids ,A2 是CopyBu。
时间尽可能。
有关REDIS的更多信息,请访问REDIS使用教程列!
windows缓存延迟写入失败
Windows缓存的主要文本被延迟(Windows未能以书面形式延迟)。实际上,Redis的缓存,缓存和数据库数据之间的一致性应该存在问题。
如果数据不一致,则从缓存中读取的数据并不是最新数据,这可能会导致严重错误。
如果产品的储备存储在Redis中,则库存金额不正确,则在提交请求时可能会出现错误,这是不可接受的。
1 缓存和DB之间的数据一致性是什么? 一致性包括以下情况:存储数据的值必须与无数据隐藏的数据相同。
2 缓存的读取和写作可以分为记忆读取和写作的内存,以及仅根据是否收到写作请求才能阅读的临时存储记忆。
2 .1 读写临时存储内存,如果要添加,删除和修改数据,则需要在缓存中执行此操作。
同时,基于采用的写作策略,决定是否同时写入数据库数据。
2 .1 .2 编写令人难以置信的缓存时,键入DB不对称。
使用此策略时,如果未再次将数据写入DB,则缓存将失败,目前,DB将没有最新数据。
因此,要读取和编写缓存,如果要确保缓存和数据库存储数据一致,则必须使用巧合直接写作。
如果采用了此策略,则应同时更新缓存和数据库存储。
因此,我们必须使用工作代码中的交易来确保缓存和规格更新的原子,即两者:一起更新或不更新,重新误差信息,然后再试一次,否则,我们无法实现巧合的直接写作。
在某些情况下,我们对数据一致性没有很高的要求。
2 .2 读取缓存只是添加了新数据,并将DB写入删除和删除数据。
没有数据的临时存储存储器。
此时,请阅读来自CACHE中DB的数据,因此当您访问数据时将来,直接阅读缓存。
让我们看一下我们将要面临的特定问题,以及如何仅解决它们以读取存储。
3 新数据直接写入数据库,没有缓存。
目前,尚无添加缓存本身的新数据,并且数据库是最新值,因此缓存和数据库存储数据目前是相同的。
4 此时删除和编辑数据,该应用必须同时更新数据库和缓存。
如果这两个操作无法保证玉米,则可能会发生数据矛盾。
4 .1 首先删除缓存,然后更新DB4 .2 ,然后首先删除缓存。
,客户会阅读它。
我应该怎么办? 看来这会导致数据缺乏一致性? 5 非固定数据解决方案5 .1 没有同时进行仿真,暂时保存:要删除要删除的高速缓存或将DB值更新为MQ。
当应用程序删除缓存或更新DB时:成功地将这些值从MQ中删除以避免频繁操作时,您可以确保DB和CACHE数据的一致性。
他未能再试一次。
从MQ读取这些值,然后再次删除或更新。
如果重新空调超过一定次,并且没有成功,则将发送错误消息到服务层。
在更新数据库和删除缓存值的过程中,其中一个操作失败了:首先更新数据库,然后删除缓存。
即使在实施第一个实现时,这些操作都没有失败,当有大量同时请求时,应用程序仍可能会读取不一致的数据。
根据删除和更新的各种订单,它们分为两种情况:5 .2 高Snight 5 .2 .1 首先删除缓存,然后更新DB的条件:Time T1
因此,t1 sleep时间大于读取T2 的时间,然后将其写入缓存。
您如何指定就寝时间? 运行业务程序时,计算操作互连指标的时间并编写估算。
确保阅读请求已经结束,并且可以暂时删除由阅读请求产生的存储数据。
该策略还考虑了缓存时间和数据库主奴隶时间的消费者同步。
序列时间在结尾写数据:根据阅读数据工作逻辑时间的时间,添加了几百秒。
这样,当其他互连指标读取数据时,他们会发现缓存丢失,因此他们读取了DB的最新值。
由于该解决方案第一次删除后会延迟临时存储存储器一段时间,因此称为“后期双删除”。
cache.delkey(x)db.update(x)thread.sleep(n)cache.delkey(x)由缓存TTL缓存TTL制备的是确保最终一致性的解决方案。
所有写作操作都在进行中。
除了[双重删除的策略] + [TTL暂时定居商店],最坏的情况是,在TTL时间内,数据存在矛盾,并增加了时间写作请求。
该计划运行DB后的缺点,由于某种原因,该缓存被删除。
问题的问题)和k删除它。
因此,计划2 中有2 个解决方案。
在应用程序中,启动了一个新程序,以获取从此订阅程序发送的信息,并实施删除缓存过程。
方案2 Schemen DB数据Schont DB Broond Songers to Binlog Concr提取所需的数据,并获得了另一个图标。
MQ再次来自MQ。
读取旧值的请求不多。
此外,ASE通常会迅速删除缓存的值。
因此,这种情况对工作的影响较低。
在此阶段,缓存和数据库数据之间存在矛盾的解决方案。
无法删除缓存或数据库更新会导致数据不一致的数据的重新模拟器,从而确保从删除缓存和DB更新的两个步骤的删除或更新,其他主题的同时读取过程,这会导致其他互连指示符。
读取旧值以延迟双重删除。
首先该数据库,然后删除缓存:您可以先删除缓存值,然后更新数据库,这可能导致需求。
在业务应用程序中,很难确定延迟的等待时间。
读取此一致的数据,然后我们需要在更新数据库时同时存储Redis Cache客户的读取请求,并等待更新数据库并删除缓存的值。
6 直接更新临时内存以删除数据并在存储内存中进行调整仅读取的临时性,应删除缓存中的相应缓存值。
如果此过程未删除缓存,而是直接更新临时存储内存,则该效果是什么? 该位置等于使用Redis作为阅读和写作的记忆,并在DB和CACHE上同时删除和修改过程。
6 .1 如果数据库首先更新而没有兼容性,则缓存将更新。
用于旧价值。
首先更新缓存,然后更新数据库。
获得最新值,这在短期内不会对工作产生一点影响。
但是,一旦缓存完成后,读取的请求将重新下载旧值从数据库中加载到缓存,然后随后的读取请求将接收旧值。
对于其中一个操作可能失败的情况,只能使用用于读取的临时存储方案。
将第二步放在MQ中,消费者从MQ中删除消息,然后更新新的缓存或新的计算机数据库,在成功后从消息列表中删除消息,然后重新启动以实现数据库之间的最终一致性和缓存。
6 .2 阅读和写作也将导致不一致,并分为接下来的四个双重写作方案。
在双写模式下,可以放置数据库值。
和A.案件。
首先更新数据库,然后破坏缓存 +读取同步。
它首先互连数据库,然后读取此时线程B。
获取最新价值。
目前,在主题A更新缓存之前,在此期间,阅读请求将简要介绍旧值,这将暂时影响工作。
首先更新缓存,然后更新数据库 +读取同步。
线程A.九月首先,然后读取键合索引B。
在这种情况下,尽管互连索引没有更新数据库,但数据库将暂时与缓存不一致,但是以前出现的读取请求可以直接按下缓存并获得最新值,因此对工作没有影响。
起来首先更新数据库,然后更新缓存写入 +写入并发。
线程A和线程B同时更新相同的数据。
临时存储内存。
首先更新缓存,然后更新写入数据库 +写作同步。
与场景3 相似,互连索引和线程B同时更新相同的数据。
在数据库和缓存之间。
1 和2 方案对工作有很小的影响,而3 个和4 个方案将导致数据库和缓存中的矛盾,这将产生更大的效果。
也就是说,在阅读和编写临时存储内存中,编写 +读取对工作没有影响的同步,而在编写 +写作同步时,它将导致数据库与临时存储内存之间的不一致。
零食解决方案3 和4 :对于编写请求,与分布式锁合作。
在编写订单时,首次添加分布式锁以运行供应商本身。
它将过程放入MQ并延迟治疗。
这确保了一个运行相同资源的多个消息传递系列的安排,从而确保了一致性。
简而言之,当使用读取和写作缓存同时运行数据库和缓存时,通过重新构图MQ也可以解决由其中一个操作引起的不一致问题。
在同步的情况下,它不是与阅读 +对工作的任何影响或没有显着影响的同步。
此外,用于读取和写作的安装内存将同时更新数据库和缓存:优势是缓存将始终具有数据。
如果更新后立即访问它,则可以直接在缓存上按下,这可以减少数据库请求的压力(删除缓存而无需阅读存储空间以进行读取的过程仅导致缺失和重新下载)。
之后很少访问它。
类似于阅读和写作。
7 Summary为您的项目选择合适的解决方案〜计算机
Redis 如何保持和 MySQL 数据一致
REDIS启动后,数据将从数据库加载。阅读请求:阅读不需要强大一致性的请求,转到Redis,然后直接从MySQL写入请求中阅读。
数据首先写入数据库,然后更新redis(首先写入mysql。
如果写入失败,交易回滚将导致REDIS中的脏数据。
)如果不是高度并发,则首选读取操作想要阅读redis,访问mySQL并将redis写回,您可以直接编写mysql并定义一个crud触发器。
触发CRUD操作后,将数据写入MySQL侧,Redis。
,您还可以在Redis侧分析BINLOG,然后执行相应的操作。
)对于高并发性,读取操作与上述相同,在写入Redis后返回。
然后,在更新特定产品的库存时,将数据更新时,将其定期写入MySQL1 目前,您需要更新为9 9 首先更新数据库并将其更改为9 9 ,然后删除缓存显示尚未删除缓存。
解决方案:如果您首先删除缓存,则如果删除了缓存,则删除了缓存,如果数据库更新,则可以使用数据库来维持数据库和缓存之间的一致性。
2 如果您在删除缓存时要更新数据库,如果尚未更新,则请查询其他请求,如果上述产品库存为1 00,则您已插入数据库。
插入。
数据库是9 9 ,它与数据库不一致。
在这种情况下,您可以使用队列解决此问题,创建队列,例如2 0,根据产品ID创建哈希值,以及在有更新数据请求时进行搜索。
首先,在更新期间遇到上述方案后,如果要更新相同的产品(如果有队列),则将其从队列中删除。
这是优化点。
如果您发现队列中有查询请求,请不要输入新的查询操作。
使用真正的循环,我查询大约2 00毫秒的缓存和循环。
如果您还没有缓存,则通常将是直接的,并且可以从数据库中检索旧数据。
1 读取期与读取不同步,因此必须返回读取请求的最大风险。
通常,许多更新操作都会缩小到队列。
之后,阅读请求将导致许多请求最终直接进入数据库。
在这种情况下,如果压力太高,则应进行彻底的应力测试。
您需要根据实际情况添加机器。
2 此处的并发请求数量太高。
您需要在压力测试方面做得很好,并更频繁地模拟真实场景。
添加更多机器的读率是多少? 由于可以通过此服务部署服务的请求,因此您必须确保路由执行数据更新和缓存更新操作的请求。
通过NGINX服务器在同一服务实例上读取某些产品的请求特别高,并且它们都在同一台计算机上击中了同一条线。
这可能会对某些服务器施加太大的压力,因为只有在更新产品数据时才能清除缓存。
然后,它导致读写和写作。
因此,如果更新频率不太高,则此问题不是很有影响力,但是可能会导致某些服务器的高负载。
IMG可以搜索微信帐户(ID:TARO源代码)并获取各种Java源代码分析。
此外,在回复[书]后,您将从作者推荐的建筑中收到各种Java书籍。