redis快取一致性延時雙刪程式碼實現方式詳解

roc_guo發表於2022-09-09
redis快取一致性延時雙刪程式碼

不廢話、、、如下

1、自定義註解
/**
*@author caoyue
*延時雙刪
**/
@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;
    //宣告一個用於延時的定時執行緒池代替執行緒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;
        //如果清除註解開啟了
        if (annotation.open()) {
            //上下文獲取資訊
            IPubUser user = MsySecurityContextHolder.getUser();
            if (Objects.nonNull(user)) {
                //執行清除快取的動作
                userService._clearCache(user);
                //業務處理
                proceed = proceeds.proceed();
                //延時兩秒後再刪
                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快取延遲雙刪問題

高併發場景使用redis作為快取儲存資料,當資料更新時,如何保證快取一致性,

延遲雙刪的策略:

先刪除快取,然後更新資料庫資料,休眠sleep,最後再次刪除快取資料。

休眠的時間略微大於從資料庫查詢資料的時間。

當讀寫分離時,考慮到主從資料同步延遲,休眠時間約1s。

休眠時間不能太大,否則會影響更新的速度。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2914090/,如需轉載,請註明出處,否則將追究法律責任。

相關文章