數據庫 redis 一致性問題

場景:數據庫更新,redis 沒有更新,查到的數據不一致,而且redis的值來自於幾張表表的邏輯組合,因此任何一張表的增刪改都影響redis 數據庫一致性的問題。

            但是因爲併發量小,redis 的值邏輯較多,因此,只需要在更新數據庫之後,刪除redis緩存的值,爲了可以適用其他場景,做了一個切面封裝,通過註解方式統一處理redis值的問題

 

採取springboot 自定義註解方式

1.創建自定義註解類:

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UpdateRedis {
	String redisKey() default "";
}

 

2. 切面方法配置

創建方法類RedisAspect

@Aspect
@Component
public class RedisAspect {
	    Logger log = LoggerFactory.getLogger(RedisAspect.class);
	
	    @Pointcut("@annotation(cn.com.citydo.supervise.dal.annotation.UpdateRedis)")
	    public void redisUpdateCut() {

	    }
	    
	    @After("redisUpdateCut()")
	    public void dataFilter(JoinPoint point) throws Throwable {
	        MethodSignature signature = (MethodSignature) point.getSignature();
	        UpdateRedis updateRedis = signature.getMethod().getAnnotation(UpdateRedis.class);
	        String redisKey = updateRedis.redisKey();
	    	updateRedis(redisKey);
	    	log.info("清空redis:"+redisKey);
	    }
	    
	    public void updateRedis(String redisKey){
	    	 RedisUtils.del(redisKey);
	    }

}

3. 切面作用於service  類

@UpdateRedis(redisKey="redis_source_table_class")
	public ResponseObject save(SourceTableClassSaveRequest sourceTableClassSaveRequest) {
		String sourceCalssParentId = sourceTableClassSaveRequest.getSourceCalssParentId();
		String parentSourceName = sourceTableClassSaveRequest.getParentSourceName();
		if(StringUtils.isEmpty(sourceCalssParentId)&&StringUtils.isEmpty(parentSourceName)){
			return ResponseObject.fail("請選擇一級分類");
		}
		

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章