@primary注解_springboot整合redis分别实现手动缓存和注解缓存
一、前期准备
1、一个构建好的springboot系统2、下载redis安装包,去redis官网下载3、启动redis服务,windows下双击bin目录下的redis-service.exe
二、环境构建
1、在项目的pom.xml
中引入redis依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-redisartifactId>
dependency>
2、在项目配置文件application.yml
中添加redis配置
spring:
#redis缓存
redis:
open: true # 是否开启redis缓存 true开启 false关闭
database: 0
host: 127.0.0.1
port: 6379
password: # 密码(默认为空)
timeout: 60000ms # 连接超时时长(毫秒)
jedis:
pool:
max-active: 1000 # 连接池最大连接数(使用负值表示没有限制)
max-wait: -1ms # 连接池最大阻塞等待时间(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
三、redis手动缓存
缓存配置
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.time.Duration;
/**
* 缓存配置类
* @author 谢小鱼
* @Date 2019-11-20 11:00
**/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new StringRedisSerializer());
redisTemplate.setConnectionFactory(factory);
return redisTemplate;
}
@Bean
public HashOperations<String, String, Object> hashOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForHash();
}
@Bean
public ValueOperations<String, String> valueOperations(RedisTemplate<String, String> redisTemplate) {
return redisTemplate.opsForValue();
}
@Bean
public ListOperations<String, Object> listOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForList();
}
@Bean
public SetOperations<String, Object> setOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForSet();
}
@Bean
public ZSetOperations<String, Object> zSetOperations(RedisTemplate<String, Object> redisTemplate) {
return redisTemplate.opsForZSet();
}
}
四、redis注解缓存
import com.fasterxml.jackson.annotation.JsonAutoDetect;
import com.fasterxml.jackson.annotation.PropertyAccessor;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cache.interceptor.KeyGenerator;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.*;
import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.RedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.time.Duration;
/**
* 缓存配置类
* @author 谢小鱼
* @Date 2019-11-20 11:00
**/
@Configuration
@EnableCaching
public class RedisConfig extends CachingConfigurerSupport {
private static final Logger logger = LoggerFactory.getLogger(RedisConfig.class);
@Autowired
private RedisConnectionFactory factory;
/**
* 默认两小时
*/
private static final long DURATION_SECOND_7200 = 7200L;
private static final long DURATION_SECOND_300 = 300L;
@Override
@Bean
public KeyGenerator keyGenerator() {
return new KeyGenerator() {
@SuppressWarnings("rawtypes")
@Override
public Object generate(Object target, Method method, Object... params) {
StringBuilder sb = new StringBuilder(RedisAutoCacheValue.AUTO_KEY_PREFIX);
if(target instanceof Proxy) {
//如果是代理类
Class[] i = target.getClass().getInterfaces();
if(i != null && i.length > 0) {
//取第一个即可
sb.append(i[0].getName());
}else {
sb.append(target.getClass().getName());
}
} else if(target instanceof org.springframework.cglib.proxy.Factory){
//如果是cglib代理,需要手动去除 $$ 后面的
String className = target.getClass().getName();
sb.append(className, 0, className.indexOf("$$"));
} else {
sb.append(target.getClass().getName());
}
sb.append(".");
sb.append(method.getName());
sb.append("_");
for (Object obj : params) {
if (obj != null) {
Class cls = obj.getClass();
if (cls.isArray()) {
//对于基础数据处理
logger.info("keyGenerator : {}", cls.getComponentType());
if (cls.isAssignableFrom(long.class)) {
long[] ay = (long[]) obj;
for (long o : ay) {
sb.append(o).append("");
}
} else if (cls.isAssignableFrom(int.class)) {
int[] ay = (int[]) obj;
for (int o : ay) {
sb.append(o).append("");
}
} else if (cls.isAssignableFrom(float.class)) {
float[] ay = (float[]) obj;
for (float o : ay) {
sb.append(o).append("");
}
} else if (cls.isAssignableFrom(double.class)) {
double[] ay = (double[]) obj;
for (double o : ay) {
sb.append(o).append("");
}
} else if (cls.isAssignableFrom(String.class)) {
String[] ay = (String[]) obj;
for (String o : ay) {
sb.append(o).append("");
}
} else {
sb.append(obj.toString());
}
//TODO 对其他类型数组处理
} else {
sb.append(obj.toString());
}
} else {
sb.append("null");
}
sb.append("_");
//sb.append(obj == null ? "null" : obj.toString());
}
sb.delete(sb.length()-1, sb.length());
return sb.toString();
}
};
}
/**
* 默认的缓存管理,存放时效较长的缓存
* @param redisTemplate
* @return
*/
@SuppressWarnings({"rawtypes", "Duplicates"})
@Primary
@Bean
public CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheConfiguration config = RedisCacheConfiguration
.defaultCacheConfig()
//过期时间
.entryTtl(Duration.ofSeconds(DURATION_SECOND_7200))
//不缓存null值
//.disableCachingNullValues()
//明确manager中的序列化与template一样,防止莫名其妙的问题
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(this.keySerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(this.valueSerializer()));
RedisCacheManager rcm = RedisCacheManager.builder(redisTemplate.getConnectionFactory()).cacheDefaults(config).transactionAware().build();
return rcm;
}
/**
* 存放时效较短的缓存(5分钟)
* @param redisTemplate
* @return
*/
@SuppressWarnings({"rawtypes", "Duplicates"})
@Bean
public CacheManager cacheManagerIn5Minutes(RedisTemplate redisTemplate) {
RedisCacheConfiguration config = RedisCacheConfiguration
.defaultCacheConfig()
//过期时间
.entryTtl(Duration.ofSeconds(DURATION_SECOND_300))
//不缓存null值
//.disableCachingNullValues()
//明确manager中的序列化与template一样,防止莫名其妙的问题
.serializeKeysWith(RedisSerializationContext.SerializationPair.fromSerializer(this.keySerializer()))
.serializeValuesWith(RedisSerializationContext.SerializationPair.fromSerializer(this.valueSerializer()));
RedisCacheManager rcm = RedisCacheManager.builder(redisTemplate.getConnectionFactory()).cacheDefaults(config).transactionAware().build();
return rcm;
}
private RedisSerializerkeySerializer() {
return new StringRedisSerializer();
}
private RedisSerializer valueSerializer() {
Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
//略过不匹配的属性
om.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
jackson2JsonRedisSerializer.setObjectMapper(om);
return jackson2JsonRedisSerializer;
}
}
自动缓存key:
/**
* 自动缓存value集中在此
* @author Leon
* @Date 2019-11-19 12:38
**/
public class RedisAutoCacheValue {
/**
* 自动生成key前缀
*/
public static final String AUTO_KEY_PREFIX = "AUTO:";
}
推荐使用注解的方式操作redis,便于维护
公众号ID:程序小鱼
欢迎扫码关注
有哪些老鸟程序员知道而新手不知道的小技巧?
程序不等于数据结构加算法,而等于搜索引擎加英语。
@primary注解_springboot整合redis分别实现手动缓存和注解缓存相关推荐
- @builder注解_SpringBoot 整合SpringSecurity示例实现前后分离权限注解+JWT登录认证
一.说明 SpringSecurity是一个用于Java 企业级应用程序的安全框架,主要包含用户认证和用户授权两个方面.相比较Shiro而言,Security功能更加的强大,它可以很容易地扩展以满足更 ...
- 猿创征文 | 微服务 Spring Boot 整合Redis 实战开发解决高并发数据缓存
文章目录 一.什么是 缓存? ⛅为什么用缓存? ⚡如何使用缓存 二.实现一个商家缓存 ⌛环境搭建 ♨️核心源码 ✅测试接口 三.采用 微服务 Spring Boot 注解开启缓存 ✂️@CacheEn ...
- maven整合@data注解_springboot整合spring Cache(redis)
前言 前面有介绍过spring整合redis和redis的一些注意点,在实际开发中,spring cache方便简化的缓存操作的大部分内容.通过注解的方式实现缓存. 缓存抽象的核心是将缓存应用于Jav ...
- springboot整合redis分别实现手动缓存和注解缓存
一.前期准备 一个构建好的springboot系统 下载redis安装包,去redis官网下载 启动redis服务,windows下双击bin目录下的redis-service.exe 二.环境构建 ...
- maven整合@data注解_SpringBoot 整合 Dubbo实践(实用文章)
作者:Cott 来源:https://www.cnblogs.com/cott/p/12373043.html 1.选择ZooKeeper作为注册中心 在linux环境中使用docker安装ZooKe ...
- redis缓存原理与实现_SpringBoot整合Redis缓存,手把手教你一步一步实现
推荐学习 分布式大全:反向代理/Redis/中间件/MySQL/消息,挑战阿里P7必备 都是"Redis惹的祸",害我差点挂在美团三面,真是"虚惊一场" 微服务 ...
- nodejs redis 发布订阅_SpringBoot整合Redis,怎么实现发布/订阅?
一.简介 1.发布订阅 SUBSCRIBE, UNSUBSCRIBE 和 PUBLISH 实现了 发布/订阅消息范例,发送者 (publishers) 不用编程就可以向特定的接受者发送消息 (subs ...
- redis 连接池_SpringBoot整合redis
闲来没事,把之前自己搭建的SpringBoot集成Redis整理了一下,相信网上有很多,我只是写一下搭建的文章,能帮到就好,不能帮助,也是自己整理的文档罢了.文章开始: 开发工具用的IDEA 2018 ...
- redis序列化_SpringBoot整合redis
redis是最常用的缓存数据库,常用于存储用户登录token.临时数据.定时相关数据等. redis是单线程的,所以redis的操作是原子性的,这样可以保证不会出现并发问题. redis基于内存,速度 ...
最新文章
- Linux查看多核CPU利用率
- 记一次金士顿DT100 G3 32G修复
- 常数乘以无穷大等于多少_电气知识知多少?第一弹
- python mpl_toolkits.mplot3d.axes3d.Axes3D()使用 介绍
- 基于java的网上花店销售系统_基于web的花店销售系统的设计与实现
- yum 安装 sun java,CentOS yum安装sun Java jre jdk和openjdk
- MyBatis SQL注入隐患及防范
- Axure模板库(1)-常见网站
- 【华为浏览器如何安装扩展程序】
- 小微企业智能名片管理小程序
- 【DeepExploit】基于强化学习的自动渗透工具
- python you-get 下载视频
- 从超融合到混合云,深信服有了哪些新“畅想”?
- VUE踩坑——this.$nextTick、头条小程序组件传值报错问题
- java自定义日历控件_【无私分享】修订版干货!!!一个炫酷的自定义日历控件,摆脱日历时间选择烦恼,纯福利~...
- 如何用好erp系统【ERP】
- pythonturtle写字_python用turtle写字
- win10下安装cuda和cudnn
- Java业务系统配置管理设计方案实现
- 使用SimpleUpdater实现WinForm自动升级
热门文章
- Gstreamer之gst_buffer_map()用法(十七)
- Android6.0 dump h264/h265编码裸流(二)
- Ubuntu修改su和sudo密码
- 嵌入式系统下对GPIO的简单操作
- ipv6单播地址包括哪两种类型_探秘联接|技术小课堂之BRAS设备IPv6地址分配方式...
- 云服务器网站301重定向跳转有什么作用?
- 计算机对团队合作的重要性,最新研究表明:计算机+协作完败面对面协作、计算机独立工作...
- feign整合sential_Sentinel 和 Feign 集成时,方法名称写错
- python中自定义类中的self_学习python第52天
- 如何远程linux服务器桌面,LINUX操作系统如何远程登录桌面