首页 > 其他 > 详细

redis数据同步

时间:2020-03-18 17:36:50      阅读:61      评论:0      收藏:0      [点我收藏+]

  数据同步,一直是个头痛的问题。

  看过很多代码,很多实现都是在业务层众,先操作数据库,然后顺便更新缓存。达到同步的作用。

  1、没有解耦

    服务之间应该是解耦的

     spring提供的AOP,就是用来干这个的。spring中的cache包,提供了一系列缓存更新的方法。

    重点:

    @Cacheable @CacheEvict   

    注:@CachePut本人用的少,这里不写例子了。

    

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-cache</artifactId>
</dependency>

1、我们需要一个缓存config类
  
@EnableCaching
@Configuration
public class CacheConfig {

@Bean
public CacheManager cacheManager(RedisConnectionFactory redisConnectionFactory) {

RedisCacheManager redisCacheManager = new RedisCacheManager(
RedisCacheWriter.nonLockingRedisCacheWriter(redisConnectionFactory),
// 默认策略,未配置的 key 会使用这个
this.getRedisCacheConfigurationWithTtl(3600),
// 指定 key 策略
this.getRedisCacheConfigurationMap()
);
redisCacheManager.setTransactionAware(true);
return redisCacheManager;
}

private Map<String, RedisCacheConfiguration> getRedisCacheConfigurationMap() {
Map<String, RedisCacheConfiguration> redisCacheConfigurationMap = new HashMap<>(16);
// redisCacheConfigurationMap.put("UserInfoList", this.getRedisCacheConfigurationWithTtl(3000));
// redisCacheConfigurationMap.put("UserInfoListAnother", this.getRedisCacheConfigurationWithTtl(18000));

return redisCacheConfigurationMap;
}

private RedisCacheConfiguration getRedisCacheConfigurationWithTtl(Integer seconds) {

FstRedisSerializer kryoRedisSerializer = new FstRedisSerializer();

RedisCacheConfiguration redisCacheConfiguration = RedisCacheConfiguration.defaultCacheConfig();
redisCacheConfiguration = redisCacheConfiguration.serializeValuesWith(
RedisSerializationContext
.SerializationPair
.fromSerializer(kryoRedisSerializer)
).entryTtl(Duration.ofSeconds(seconds));

return redisCacheConfiguration;
}

@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new FstRedisSerializer());
redisTemplate.setHashValueSerializer(new FstRedisSerializer());
redisTemplate.afterPropertiesSet();
return redisTemplate;
}
}

这里测试就不连接数据库了,原理是一样的。
@RestController
@RequestMapping("/cache")
public class CacheController {

@GetMapping("/")
@Cacheable(cacheNames = "str",key = "‘num‘")
public String getStr() {
return "200";
}

@GetMapping("/2")
@Cacheable(cacheNames = "str2",key = "‘num‘")
public String getStr2() {
return "300";
}

@GetMapping("/3")
@Cacheable(cacheNames = "str",key = "‘nummm‘")
public String getStr3() {
return "500";
}

@PatchMapping("/4")
@CachePut(cacheNames = "str",key = "‘num‘")
public String updateStr() {
return "111111";
}

@GetMapping("/5")
@Cacheable(cacheNames = "list",key = "‘num‘")
public List<BlogModel> getList() {
List<BlogModel> list = new ArrayList<>();

BlogModel model1 = new BlogModel();
model1.setAge(20);
model1.setName("asasasasa");
list.add(model1);

BlogModel model2 = new BlogModel();
model2.setName("sasaasasa");
model2.setAge(22);
list.add(model2);

return list;
}


@DeleteMapping("/6")
@CacheEvict(cacheNames = "list",key = "‘num‘")
public void deleteList() {

}

}


BlogModel 类自己去建。

可以看出redis更新效果。

技术分享图片

 

 


  可以看到,请求接口后,果然有效果了!
这样做,就可以保证在操作数据库时候,同时更新缓存。


    

redis数据同步

原文:https://www.cnblogs.com/lzphu/p/12518438.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!