ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

redis数据同步

2020-03-18 17:00:26  阅读:208  来源: 互联网

标签:同步 return list redis key new 数据 public redisTemplate


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

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

  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更新效果。

 

 


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


    

标签:同步,return,list,redis,key,new,数据,public,redisTemplate
来源: https://www.cnblogs.com/lzphu/p/12518438.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有