Springboot ehcache/redis双缓存问题
问题1:两个CacheManager 会报两个相同的实现类错误
需要继承CachingConfigurerSupport 重写cacheManager方法,指定默认一个返回缓存提供者
@Configuration
@DependsOn({"springContextHolder","ehCacheCacheManager"})//这里是关键,要先初始化这两个,因为下面用到了,只有DependsOn能实现,其它的尝试都失败
public class CacheConfigDefinition extends CachingConfigurerSupport {
/**
* 根据application 配置的缓存类型,返回自定义默认的缓存实现对象,如果不覆盖这个方法根据顺序返回
* @return
*/
@Override
public CacheManager cacheManager() {
if(Constant.CACHE_TYPE_REDIS.equals(ShiroConfig.cacheType)){
return SpringContextHolder.getBean(RedisCacheManager.class);
}else{
try{
return SpringContextHolder.getBean(EhCacheCacheManager.class);
}catch (Exception ex){
ex.printStackTrace();
}
}
return null;
}
} 另外配置RedisCacheManager和EhCacheCacheManager的类,需要明确指定EhCacheManagerFactoryBean、EhCacheCacheManager的@Bean方法,
public class CacheManagerConfig { @Value("${spring.cache.ehcache.config}")
public String ehcacheConfig; /**
* cacheManager名字
*/
public interface CacheManagerNames {
/**
* redis
*/
String REDIS_CACHE_MANAGER = "redisCacheManager";
/**
* ehCache
*/
String EHCACHE_CACHE_MAANGER = "ehCacheCacheManager";
} @Resource
private RedisTemplate<String, Object> redisTemplate;
@Bean(name = "redisTemplate")
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
//设置序列化
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jackson2JsonRedisSerializer.setObjectMapper(om); // 配置redisTemplate
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<String, Object>();
redisTemplate.setConnectionFactory(factory);
RedisSerializer stringSerializer = new StringRedisSerializer();
redisTemplate.setKeySerializer(stringSerializer); // key序列化
redisTemplate.setValueSerializer(jackson2JsonRedisSerializer); // value序列化
redisTemplate.setHashKeySerializer(stringSerializer); // Hash key序列化
redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer); // Hash value序列化
redisTemplate.afterPropertiesSet();
return redisTemplate; } /**
* 针对自动配置类型添加自己的Bean,它将取代默认的,网上大部分把redisTemplate写在方法参数,但是行不通
* RedisTemplate带泛型注入,需要指定名称,不能按照默认的类型搜索,要根据名字装配,拿出去什么变量用@Resource
* 管理缓存
* @return
*/
@Bean
public RedisCacheManager redisCacheManager() {
RedisCacheManager cacheManager = new RedisCacheManager(redisTemplate);
//设置redis缓存过期时间
//cacheManager.setDefaultExpiration(redisTimeout);
return cacheManager;
} @Bean
public EhCacheManagerFactoryBean ehCacheManagerFactoryBean() {
EhCacheManagerFactoryBean cacheManagerFactoryBean = new EhCacheManagerFactoryBean();
String path[] = ehcacheConfig.split(":");
ClassPathResource classPathResource = new ClassPathResource(path.length == 2 ? path[1] : ehcacheConfig); cacheManagerFactoryBean.setConfigLocation(classPathResource);
cacheManagerFactoryBean.setShared(true);
return cacheManagerFactoryBean;
} /**
* 创建ehCacheCacheManager
*/
@Bean
public EhCacheCacheManager ehCacheCacheManager(EhCacheManagerFactoryBean bean) {
return new EhCacheCacheManager(bean.getObject());
} }
PS:码云springboot2.0通用权限系统脚手架同步更新 https://gitee.com/shenxingping/XPBoot
Springboot ehcache/redis双缓存问题的更多相关文章
- springBoot整合redis(作缓存)
springBoot整合Redis 1,配置Redis配置类 package org.redislearn.configuration; import java.lang.reflect.Method ...
- springboot mybatis redis 二级缓存
前言 什么是mybatis二级缓存? 二级缓存是多个sqlsession共享的,其作用域是mapper的同一个namespace. 即,在不同的sqlsession中,相同的namespace下,相同 ...
- SpringBoot集成Redis实现缓存处理(Spring AOP实现)
第一章 需求分析 计划在Team的开源项目里加入Redis实现缓存处理,因为业务功能已经实现了一部分,通过写Redis工具类,然后引用,改动量较大,而且不可以实现解耦合,所以想到了Spring框架的A ...
- Ehcache/Redis/Tair缓存性能对比[转载]
FW : http://xulingbo.net/?p=434 版权归许令波所有.此处只是一个转载. 后面介绍的不同方式都有测试数据,这些测试数据都是在同一的测试环境下得出的测试结果: 测试机器的配置 ...
- springboot中redis的缓存穿透问题
什么是缓存穿透问题?? 我们使用redis是为了减少数据库的压力,让尽量多的请求去承压能力比较大的redis,而不是数据库.但是高并发条件下,可能会在redis还没有缓存的时候,大量的请求同时进入,导 ...
- spring-boot和redis的缓存使用
1.运行环境 开发工具:intellij idea JDK版本:1.8 项目管理工具:Maven 4.0.0 2.Maven Plugin管理 pom.xml配置代码: <?xml versio ...
- springboot中redis做缓存时的配置
import com.google.common.collect.ImmutableMap;import org.slf4j.Logger;import org.slf4j.LoggerFactory ...
- SpringBoot 配置 Redis 多缓存名(不同缓存名缓存失效时间不同)
import com.google.common.collect.ImmutableMap; import org.springframework.cache.CacheManager; import ...
- 05【掌握】 SpringBoot 清空Redis所有缓存
package top.yangbuyi.system.controller; import org.springframework.beans.factory.annotation.Autowire ...
- 06[笔记] SpringBoot 删除Redis指定缓存
/* ******************************************载入缓存开始************************************************* ...
随机推荐
- PyMySQL插入
title: PyMySQL插入 author: 杨晓东 permalink: PyMySQL插入 date: 2021-10-02 11:27:04 categories: - 投篮 tags: - ...
- Java课后总结2
特殊之处:有两个名称一摸一样的方法square(),但是两种方法的返回值的数据类型以及参数的数据类型都是不同的,一个为int一个为double. 运行结果:The square of integer ...
- java问题解答
因为子类继承自父类,会沿用父类的东西(没被覆盖的函数以及可见的成员变量等),而这些东西子类是没有的,需要先初始化父类才能被使用 子类构造方法中调用父类构造方法,一个作用是可以给父类构造方法传递实参,给 ...
- android手机无线调试
1.手机与电脑先通过usb链接2.adb devices查看是否链接成功(链接成功会显示设备列表)3.adb tcpip 5555(0-65535之间取值,默认5555输进去)5:断开数据线,查看手机 ...
- 打卡node day05 mongodb
1.安装 [官网]https://www.mongodb.com/download-center/community?jmp=nav 配置环境变量 配置完环境变量坚持是否成功 在所在位置新建文件夹 启 ...
- mysql8.0修改密码
把密码设置为空:UPDATE mysql.user SET authentication_string='' WHERE user='root' and host='localhost'; 查看USE ...
- C#新语法
C#新语法 NET6新特性以及C#新语法 1.顶级语句(C#9.0) (1):直接在C#文件中直接编写入口方法的代码,不用类,不用Main.经典写法仍然支持,反编译可以查看到,编译器依旧为我们生成了一 ...
- nginx 工作流程
NGINX 把http请求处理流程划分为11个阶段,逻辑细分,以模块为单位进行处理.各个阶段可以包含多个http模块,每个阶段以流水线的形式处理请求.这样的分层处理模式与计算机网络的7层模式类似,每个 ...
- python菜鸟学习: 2.列表操作
# -*- coding: utf-8 -*-# 列表操作names = ["LiSi", "ZhangSan", "WangWu"]pri ...
- 配置windows server多个用户同时使用一个账户远程服务器
首先,需要服务器开启远程桌面连接: 右键点击"这台电脑"弹出菜单栏,选择"属性" 弹出系统窗口,点击"远程设置" 弹出系统属性窗口, ...