springboot整合redis(注解形式)
springboot整合redis(注解形式)
准备工作
springboot通常整合redis,采用的是RedisTemplate的形式,除了这种形式以外,还有另外一种形式去整合,即采用spring支持的注解进行访问缓存.
- pom.xml
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.7.3</version> </dependency> <dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-redis</artifactId> <version>1.7.2.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>RELEASE</version> </dependency>
- application.properties
1234567891011121314151617
# REDIS (RedisProperties)
# Redis数据库索引(默认为
0
)
spring.redis.database=
0
# Redis服务器地址
spring.redis.host=
127.0
.
0.1
# Redis服务器连接端口
spring.redis.port=
6379
# 连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=
8
# 连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-
1
# 连接池中的最大空闲连接
spring.redis.pool.max-idle=
8
# 连接池中的最小空闲连接
spring.redis.pool.min-idle=
0
# 连接超时时间(毫秒)
spring.redis.timeout=
0
Redis配置类
123456789101112131415161718192021222324252627282930313233/**
* @author hulonghai
* redis配置类
*/
@Configuration
@EnableCaching
public
class
CacheConfig
extends
CachingConfigurerSupport{
@SuppressWarnings
(
"rawtypes"
)
@Bean
public
CacheManager cacheManager(RedisTemplate redisTemplate) {
RedisCacheManager rcm =
new
RedisCacheManager(redisTemplate);
// 多个缓存的名称,目前只定义了一个
rcm.setCacheNames(Arrays.asList(
"thisredis"
));
//设置缓存过期时间(秒)
rcm.setDefaultExpiration(
600
);
return
rcm;
}
@Bean
public
RedisTemplate<String, String> redisTemplate(RedisConnectionFactory factory) {
StringRedisTemplate template =
new
StringRedisTemplate(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);
template.setValueSerializer(jackson2JsonRedisSerializer);
template.afterPropertiesSet();
return
template;
}
}
可以看出,我们这里主要配置了两个东西,cacheManager方法配置了一个缓存名称,它的名字叫做thisredis,当我们要在方法注解里面使用到它的时候,就要根据名称进行区分不同缓存.同时设置了缓
存的过期时间.redisTemplate则是比较常见的,我们设置了RedisTemplate,因此在代码里面,我们也可以通过@Autowired注入RedisTemplate来操作redis. -
使用
接下来就是如何使用注解啦,这一步反而是最简单的.其实只用到了两个注解,@Cacheable和@CacheEvict.第一个注解代表从缓存中查询指定的key,如果有,从缓存中取,不再执行方法.如果没有则执
行方法,并且将方法的返回值和指定的key关联起来,放入到缓存中.而@CacheEvict则是从缓存中清除指定的key对应的数据.使用的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | @Cacheable (value= "thisredis" , key= "'users_'+#id" ) public User findUser(Integer id) { User user = new User(); user.setUsername( "hlhdidi" ); user.setPassword( "123" ); user.setUid(id.longValue()); System.out.println( "log4j2坏啦?" ); logger.info( "输入user,用户名:{},密码:{}" ,user.getUsername(),user.getPassword()); return user; } @CacheEvict (value= "thisredis" , key= "'users_'+#id" ,condition= "#id!=1" ) public void delUser(Integer id) { // 删除user System.out.println( "user删除" ); } |
可以看出,我们用@Cacheable的value属性指定具体缓存,并通过key将其放入缓存中.这里key非常灵活,支持spring的el表达式,可以通过方法参数产生可变的key(见findUser方法),也可以通过其指定在
什么情况下,使用/不使用缓存(见delUser方法).
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话