springboot关闭redisson springboot redis配置开关 |
您所在的位置:网站首页 › redis开关 › springboot关闭redisson springboot redis配置开关 |
springboot启用redis缓存1、加入maven依赖
org.springframework.boot
spring-boot-starter-data-redis
org.apache.commons
commons-pool2
2、添加配置文件# Redis数据库索引(默认为0)
spring.redis.database=0
# Redis服务器地址
spring.redis.host=localhost
# Redis服务器连接端口
spring.redis.port=6379
# Redis服务器连接密码(默认为空)
spring.redis.password=
# 连接池最大连接数(使用负值表示没有限制) 默认 8
spring.redis.lettuce.pool.max-active=8
# 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
spring.redis.lettuce.pool.max-wait=-1
# 连接池中的最大空闲连接 默认 8
spring.redis.lettuce.pool.max-idle=8
# 连接池中的最小空闲连接 默认 0
spring.redis.lettuce.pool.min-idle=03、添加 cache 的配置类@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport{
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder();
sb.append(target.getClass().getName());
sb.append(method.getName());
for (Object obj : params) {
sb.append(obj.toString());
}
return sb.toString();
}
};
}
}5、自动根据方法生成缓存//@Cacheable的value参数实际上就是hset命令的key字段
//@Cacheable的key参数是hset的field字段,
//最后@Cacheable注解所在的函数返回值是hset命令的value字段
@RestController
public class UserController {
@RequestMapping("/getUser")
@Cacheable(value="user-key")
public User getUser() {
User user=new User("[email protected]", "aa", "aa123456", "aa","123");
System.out.println("若下面没出现“无缓存的时候调用”字样且能打印出数据表示测试成功");
return user;
}
}
//也可以自己指定hash的field字段
@GetMapping("page")
@Cacheable(value="report-week", key = "#params.get(\"department_id\")+'-'+#params.get(\"date_type\")+'-'+#params.get(\"target_id\")+'-'" +
"+#params.get(\"search_type\")+'-'+#params.get(\"page\")+'-'+#params.get(\"limit\")+'-'+#params.get(\"order\")+'-'+#params.get(\"export\")" +
"+'-'+#params.get(\"statistic_type\")+'-'+#params.get(\"date_time\")")
public Result page(@ApiIgnore @RequestParam Map params, HttpServletResponse response) {
。。。
}
//也可以自己指定缓存条件
@Cacheable(value = "UnitStatistical", key = "#unitStatisticalPayload.disasterId"+"-"+"#unitStatisticalPayload.type", condition="'5150'.equals(#unitStatisticalPayload.disasterId)")6、使用@CacheEvict清除缓存//@CacheEvict在方法上使用,默认方法成功执行完后调用,失败不调用,使用beforeInvocation可以改变触发清除操作的时间,当我们指定该属性值为true时,Spring会在调用该方法之前清除缓存中的指定元素
@CacheEvict(value="report-week", beforeInvocation=true)
public void deleteUserById(Integer id) {
//在这里执行删除操作, 删除是去数据库中删除
}
//有时候@CacheEvict不起作用,需要添加参数allEntries = true,指定Cache清除该value的所有的元素
@CacheEvict(value="report-week", allEntries = true)
public void deleteUserById(Integer id) {
//在这里执行删除操作, 删除是去数据库中删除
}
//一个方式同时删除多条条目
@Caching(evict = {
@CacheEvict(value = "report-week", allEntries = true),
@CacheEvict(value = "report-month", allEntries = true),
@CacheEvict(value = "report-year", allEntries = true),
@CacheEvict(value = "report-halfweek", allEntries = true)
})
public void deleteUserById(Integer id) {
//在这里执行删除操作, 删除是去数据库中删除
}7、使用@CachePut更新缓存//这个注解一般加在更新方法上,当数据库中的数据更新后,缓存中的数据也要跟着更新,使用该注解,可以将方法的返回值自动更新到已经存在的key上,示例代码如下:
@CachePut(key = "#user.id")
public User updateUserById(User user) {
return user;
}7、分部署系统中使用session共享解决缓存公用的问题#参考
http://www.ityouknow.com/springboot/2016/03/06/spring-boot-redis.html8、 使用方法参数作为key之外,Spring还为我们提供了一个root对象可以用来生成key。通过该root对象我们可以获取到以下信息 属性名称 属性名称 描述 示例 methodName 当前方法名 #roothodName method 当前方法 #roothod.name target 当前被调用的对象 #root.target targetclass 当前被调用的对象的class #root.targetclass args 当前方法参数组成的数组 #root.args[0] caches 当前被调用的方法使用的Cache #root.caches[0].name 当我们要使用root对象的属性作为key时我们也可以将“#root”省略,因为Spring默认使用的就是root对象的属性 如果要调用当前类里面的方法: @Override @Cacheable(value={"TeacherAnalysis_public_chart"}, key="#root.target.getDictTableName() + '_' + #root.target.getFieldName()") public List getChartList(Map paramMap) { } public String getDictTableName(){ return ""; } public String getFieldName(){ return "";9、在使用@Cacheable注解对查询数据进行缓存时,使用cacheNames属性指定了缓存名称。下面我们就针对不同的cacheNames来设置失效时间添加Redis配置类RedisConfig.java,代码如下: @Configuration @EnableCaching public class RedisConfig extends CachingConfigurerSupport{ /** * 自定义缓存管理器 */ @Bean public RedisCacheManager cacheManager(RedisConnectionFactory factory) { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig(); Set cacheNames = new HashSet(); cacheNames.add("car"); cacheNames.add("distributor"); ConcurrentHashMap configMap = new ConcurrentHashMap(); configMap.put("car", config.entryTtl(Duration.ofMinutes(6L))); configMap.put("distributor", config); //需要先初始化缓存名称,再初始化其它的配置。 RedisCacheManager cacheManager = RedisCacheManager.builder(factory).initialCacheNames(cacheNames).withInitialCacheConfigurations(configMap).build(); return cacheManager; } }RedisConfig.java中加入value序列化: @Configuration @EnableCaching public class MyRedisConfig extends CachingConfigurerSupport { /** * 自定义缓存管理器 */ @Bean public RedisCacheManager cacheManager(RedisConnectionFactory factory) { //value 序列化 RedisSerializer redisSerializer = new StringRedisSerializer(); GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(redisSerializer)) .serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(genericJackson2JsonRedisSerializer)) .disableCachingNullValues(); Set cacheNames = new HashSet(); cacheNames.add("report-week"); ConcurrentHashMap configMap = new ConcurrentHashMap(); configMap.put("report-week", config.entryTtl(Duration.ofHours(1L))); //需要先初始化缓存名称,再初始化其它的配置。 RedisCacheManager cacheManager = RedisCacheManager.builder(factory).initialCacheNames(cacheNames).withInitialCacheConfigurations(configMap).cacheDefaults(config).build(); return cacheManager; } }**注意:**JacksonJsonRedisSerializer和GenericJackson2JsonRedisSerializer,两者都能系列化成json,但是后者会在json中加入@class属性,类的全路径包名,方便反系列化(json—>user对象过程)。前者如果存放了List则在反系列化的时候如果没指定TypeReference则会报错java.util.LinkedHashMap cannot be cast to 如果报错Could not read JSON: Cannot construct instance of’'类名""(no Creators, like default construct, exist),是因为redis的这些序列化方式,使用的是无参构造函数进行创建对象set方法进行赋值,方法中存在有参的构造函数,默认存在的无参构造函数是不存在的(继承自object),必须显示的去重写,在实体类中加入@NoArgsConstructor
|
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |