redis緩存一致性延時(shí)雙刪代碼實(shí)現(xiàn)方式
redis緩存一致性延時(shí)雙刪代碼
不廢話、、、如下
1、自定義注解
/** *@author caoyue *延時(shí)雙刪 **/ @Retention(RetentionPolicy.RUNTIME) @Documented @Target(ElementType.METHOD) public @interface ClearCache { ? ? boolean open() default true; }
2、刪除邏輯
/** * @author caoyue */ @Component @Aspect @Slf4j public class DoubleClearCacheAop { @Autowired private UserService userService; //聲明一個(gè)用于延時(shí)的定時(shí)線程池代替線程sleep ScheduledExecutorService task = new ScheduledThreadPoolExecutor(10, new BasicThreadFactory. Builder().namingPattern("clearCache-schedule-pool-%d").build()); @Pointcut("@annotation(com.inspur.henan.uac.modules.open.util.ClearCache)") private void clearCachePoint() { } @Around("clearCachePoint()") public Object clearCacheAop(ProceedingJoinPoint proceeds) throws Throwable { Method method = ((MethodSignature) proceeds.getSignature()).getMethod(); ClearCache annotation = method.getAnnotation(ClearCache.class); Object proceed = null; //如果清除注解開(kāi)啟了 if (annotation.open()) { //上下文獲取信息 IPubUser user = MsySecurityContextHolder.getUser(); if (Objects.nonNull(user)) { //執(zhí)行清除緩存的動(dòng)作 userService._clearCache(user); //業(yè)務(wù)處理 proceed = proceeds.proceed(); //延時(shí)兩秒后再刪 task.schedule(() -> { userService._clearCache(user); if (log.isInfoEnabled()) { log.info(Thread.currentThread().getName() + ":double delete cache completed"); } }, 2L, TimeUnit.SECONDS); } else { proceed = proceeds.proceed(); } } return proceed; } }
redis緩存延遲雙刪問(wèn)題
高并發(fā)場(chǎng)景使用redis作為緩存存儲(chǔ)數(shù)據(jù),當(dāng)數(shù)據(jù)更新時(shí),如何保證緩存一致性,
延遲雙刪的策略:
先刪除緩存,然后更新數(shù)據(jù)庫(kù)數(shù)據(jù),休眠sleep,最后再次刪除緩存數(shù)據(jù)。
休眠的時(shí)間略微大于從數(shù)據(jù)庫(kù)查詢數(shù)據(jù)的時(shí)間。
當(dāng)讀寫(xiě)分離時(shí),考慮到主從數(shù)據(jù)同步延遲,休眠時(shí)間約1s。
休眠時(shí)間不能太大,否則會(huì)影響更新的速度。
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
- 詳解redis緩存與數(shù)據(jù)庫(kù)一致性問(wèn)題解決
- 面試常問(wèn):如何保證Redis緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性
- 淺談一下如何保證Redis緩存與數(shù)據(jù)庫(kù)的一致性
- MySQL數(shù)據(jù)庫(kù)和Redis緩存一致性的更新策略
- redis分布式鎖解決緩存雙寫(xiě)一致性
- redis緩存與數(shù)據(jù)庫(kù)一致性的問(wèn)題及解決
- Redis解決緩存一致性問(wèn)題
- Spring?Boot與Redis的緩存一致性問(wèn)題解決
- Redis緩存和數(shù)據(jù)庫(kù)的數(shù)據(jù)一致性的問(wèn)題解決
- Redis+Caffeine多級(jí)緩存數(shù)據(jù)一致性解決方案
- Redis 緩存雙寫(xiě)一致性的解決方案
相關(guān)文章
詳解Redis中的簡(jiǎn)單動(dòng)態(tài)字符串和C字符串的區(qū)別
簡(jiǎn)單動(dòng)態(tài)字符串(SDS)和?C?字符串在實(shí)現(xiàn)和特性上存在一些區(qū)別,這些區(qū)別使得?SDS?更適合作為?Redis?中字符串對(duì)象的內(nèi)部表示,本文給大家介紹一下Redis中的簡(jiǎn)單動(dòng)態(tài)字符串和C字符串的區(qū)別,需要的朋友可以參考下2023-12-12redis實(shí)現(xiàn)分布式的方法總結(jié)
在本篇文章中小編給大家整理了關(guān)于redis分布式怎么做的具體內(nèi)容以及知識(shí)點(diǎn)總結(jié),有興趣的朋友們參考下。2019-06-06Redis分布式鎖方案設(shè)計(jì)之防止訂單重復(fù)提交或支付
這篇文章主要為大家介紹了Redis分布式鎖之防止訂單重復(fù)提交或支付方案設(shè)計(jì)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09