redis緩存一致性延時雙刪代碼實現方式
更新時間:2022年08月26日 14:13:23 作者:彼的貓
這篇文章主要介紹了redis緩存一致性延時雙刪代碼實現方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
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)) {
//執(zhí)行清除緩存的動作
userService._clearCache(user);
//業(yè)務處理
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緩存延遲雙刪問題
高并發(fā)場景使用redis作為緩存存儲數據,當數據更新時,如何保證緩存一致性,
延遲雙刪的策略:
先刪除緩存,然后更新數據庫數據,休眠sleep,最后再次刪除緩存數據。
休眠的時間略微大于從數據庫查詢數據的時間。
當讀寫分離時,考慮到主從數據同步延遲,休眠時間約1s。
休眠時間不能太大,否則會影響更新的速度。
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
詳解Redis中的簡單動態(tài)字符串和C字符串的區(qū)別
簡單動態(tài)字符串(SDS)和?C?字符串在實現和特性上存在一些區(qū)別,這些區(qū)別使得?SDS?更適合作為?Redis?中字符串對象的內部表示,本文給大家介紹一下Redis中的簡單動態(tài)字符串和C字符串的區(qū)別,需要的朋友可以參考下2023-12-12

