springboot 整合redis
原创
©著作权归作者所有:来自51CTO博客作者Marydon的原创作品,请联系作者获取转载授权,否则将追究法律责任
整合前提:安装redis(教程见文末推荐)
1.jar包引入
<!-- redis -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-redis</artifactId>
<version>1.4.7.RELEASE</version>
</dependency>
2.连接池配置
spring:
###redis配置
redis:
# Redis数据库索引(默认为0)
database: 0
# Redis服务器地址
host: localhost
# Redis服务器连接端口
port: 6379
# Redis服务器连接密码(默认为空)
password:
jedis:
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 10
# 连接池最大阻塞等待时间(单位毫秒,使用负值表示没有限制)
max-wait: -1ms
# 连接池中的最大空闲连接
max-idle: 10
# 连接池中的最小空闲连接
min-idle: 0
# 连接超时时间(毫秒)
timeout: 2000ms
3.注解配置Java类
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.data.redis.serializer.JdkSerializationRedisSerializer;
import org.springframework.data.redis.serializer.StringRedisSerializer;
/**
* redis的通用化配置
* @description:
* @author: Marydon
* @date: 2020-12-10 10:26
* @version: 1.0
* @email: marydon20170307@
*/
@Configuration
public class RedisConfig {
@Autowired
private RedisConnectionFactory redisConnectionFactory;
@Bean
public RedisTemplate<String,Object> redisTemplate(){
RedisTemplate<String,Object> redisTemplate=new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
// 指定Key、Value的序列化策略
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new JdkSerializationRedisSerializer());
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
return redisTemplate;
}
@Bean
public StringRedisTemplate stringRedisTemplate(){
StringRedisTemplate stringRedisTemplate=new StringRedisTemplate();
stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
return stringRedisTemplate;
}
}
4.如何使用?
在需要使用redis缓存的java类,注入对象:
@Autowired
private StringRedisTemplate stringRedisTemplate;
或者用注解:@Resource
往缓存存数据:
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
valueOperations.setIfAbsent(key, value);
从缓存取数据:
ValueOperations valueOperations = stringRedisTemplate.opsForValue();
valueOperations.get(key);
从缓存中删除数据:
方式一:正规删除
stringRedisTemplate.delete(key);
方式二:立即过期
stringRedisTemplate.expire(key, Duration.ZERO);
虽然过期了,但是并不会立刻被删除,Redis对于过期键有三种清除策略,安装教程里我有介绍。
5.启动redis服务
双击运行:redis.bat文件,即可。
说明:
你肯定是没有这个文件的,想看实现方法的见文末推荐:redis安装教程;
不想看的,按照自己之前的方式启动redis就行。
6.测试
我们按照上面的方法,在springboot的启动测试类来亲手尝试一下:

写好后,点击图片上的绿三角,就能快速启动测试类啦。执行结果如下:

注意:点击contextLoads()才能看到测试类执行结果。
可以来查看一下,redis数据库:

需要打开redis-cli.exe。
7.关于redis的数据存储类型问题
在实际开发过程中,我们之所以使用redis缓存库,就是为了减少数据库访问次数,减轻数据库压力,为此,通常我们会选择把需要频繁查询的数据存入缓存当中。
那么,我们现在来测试一下实体类能不能放到缓存当中:

执行结果如下:

无法将java对象存入redis当中。
随后,百度结果如下:
Redis 只能支持六种数据类型(string/hash/list/set/zset/hyperloglog)的操作,但在 Java 中我们却通常以类对象为主,怎么办?
见文末推荐
8.springboot启动项目清空redis缓存
我们知道:使用spring内部集成的缓存,在项目停止运行后,缓存也会随之消失;
但是,redis不会,除非你设置了有效期或者调用删除方法,不然,即使你重启项目或者重启redis,缓存仍在;
这种方式好也不好,就看具体使用场景啦,下面看一下具体实现办法:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.ApplicationArguments;
import org.springframework.boot.ApplicationRunner;
import org.springframework.core.annotation.Order;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Component;
import java.util.Set;
/**
* springboot启动后自动执行方法
* @description:
* @author: Marydon
* @date: 2020-12-10 11:19
* @version: 1.0
* @email: marydon20170307@
*/
@Component
// 当有多个类实现ApplicationRunner接口时,可以指定其执行顺序,值越小优先级越高
@Order(value = 1)
public class AliApplicationRunner implements ApplicationRunner {// 或者实现CommandLineRunner接口
@Autowired
private StringRedisTemplate stringRedisTemplate;
/*
* 启动结束后会立即执行的方法
* @attention:
* @date: 2020年12月10日 0010 11:21
* @param: args
* @return: void
*/
@Override
public void run(ApplicationArguments args) {
// 获取缓存中所有的key
Set<String> keys = stringRedisTemplate.keys("*");
// 清空redis缓存数据库
stringRedisTemplate.delete(keys);
}
}
写在最后
哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!
作者:Marydon