springboot项目中经常会用到redis作为缓存数据库,而springboot又带有cache缓存机制。怎么不用springboot自带的cache,而仅仅只用redis功能呢?
关于springboot cache介绍可以参考:https://mrbird.cc/Spring-Boot%20cache.html
其他参考博客:
1.https://www.jianshu.com/p/5596c3a4978d
2.
Jedis和Lettuce的区别在哪?
1、Jedis 是直连模式,在多个线程间共享一个 Jedis 实例时是线程不安全的,每个线程都去拿自己的 Jedis 实例,当连接数量增多时,物理连接成本就较高了。
2、Lettuce的连接是基于Netty的,连接实例可以在多个线程间共享,如果你不知道Netty也没事,大致意思就是一个多线程的应用可以使用同一个连接实例,而不用担心并发线程的数量。通过异步的方式可以让我们更好地利用系统资源。
参考:https://www.cnblogs.com/gaoquanquan/p/11278333.html
https://blog.csdn.net/wangpf2011/article/details/106451782
既然有这么大的好处,干脆就用了这个,跟上时代的变化。下面新建一个SpringBootRedis项目,开始整合。
1.添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-pool2</artifactId>
</dependency>
2.application.yml配置文件
spring:
redis:
database: 0
host: 127.0.0.1
port: 6379
password: 123456
lettuce:
pool:
max-active: 8
max-wait: -1ms
max-idle: 8
min-idle: 0
3.新建config包,创建RedisConfig类
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(LettuceConnectionFactory factory){
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(factory);
//使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
Jackson2JsonRedisSerializer jacksonSeial = new Jackson2JsonRedisSerializer(Object.class);
ObjectMapper om = new ObjectMapper();
// 指定要序列化的域,field,get和set,以及修饰符范围,ANY是都有包括private和public
om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
// 指定序列化输入的类型,类必须是非final修饰的,final修饰的类,比如String,Integer等会跑出异常
om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
jacksonSeial.setObjectMapper(om);
// 值采用json序列化
template.setValueSerializer(jacksonSeial);
//使用StringRedisSerializer来序列化和反序列化redis的key值
template.setKeySerializer(new StringRedisSerializer());
// 设置hash key 和value序列化模式
template.setHashKeySerializer(new StringRedisSerializer());
template.setHashValueSerializer(jacksonSeial);
template.afterPropertiesSet();
return template;
}
}
因为不用cache,所以这里并没用@EnableCaching注解,也没继承CachingConfigurerSupport类
这里自定义序列化器,是因为默认的JdkSerializationRedisSerializer中文会乱码
问题:
template.afterPropertiesSet();
此方法是应该是初始化参数和初始化工作
但注释后测试了下,好像也没报错,敢问各位看官有谁知道的?
4.测试
@Autowired
private RedisTemplate<String, Object> template;
@RequestMapping("/usertest")
@ResponseBody
public String test(){
User user = new User();
user.setUsername("allen");
user.setPhone("123123");
String key = "key";
template.opsForValue().set(key, user);
return template.opsForValue().get(key).toString();
}
序列化器
这里先说一下Spring提供了那些序列化器(各自作用自行百度,这里不再赘述)
- Jackson2JsonRedisSerializer
- JdkSerializationRedisSerializer
- OxmSerializer
- StringRedisSerializer
- GenericToStringRedisSerializer
- GenericJackson2JsonRedisSerializer
然后以下是一些问题需要搞清楚
- 为什么需要序列化?
你要记住一句话,在JAVA中,一切皆对象,而将对象的状态信息转为存储或传输的形式需要序列化。 - 默认的序列化器
对于String类型,默认选择的StringRedisSerializer序列化器;而对象,默认是JdkSerializationRedisSerializer
RedisTemplate
Spring Boot 的 spring-boot-starter-data-redis 为 Redis 的相关操作提供了一个高度封装的 RedisTemplate 类,而且对每种类型的数据结构都进行了归类,将同一类型操作封装为 operation 接口。RedisTemplate 对五种数据结构分别定义了操作,如下所示:
- 操作字符串:redisTemplate.opsForValue()
- 操作 Hash:redisTemplate.opsForHash()
- 操作 List:redisTemplate.opsForList()
- 操作 Set:redisTemplate.opsForSet()
- 操作 ZSet:redisTemplate.opsForZSet()
redis工具类
参考https://blog.csdn.net/mengxiangxingdong/article/details/88419976
redis集群配置
yml配置文件
spring:
redis:
timeout: 6000ms
password:
cluster:
max-redirects: 3 # 获取失败 最大重定向次数
nodes: 192.168.3.222:7000,192.168.3.222:7001,192.168.3.222:7002,192.168.3.223:7003,192.168.3.223:7004,192.168.3.223:7005
lettuce:
pool:
max-active: 1000 #连接池最大连接数(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
若没有cluster配置,则redis默认是单机连接;加了cluster,可以不用host配置
RedisConfig类不用做改变,springboot会默认帮我们配置好
redis 连接池
默认使用lettuce连接池,在配置文件显示声明,如
redis:
lettuce:
pool:
max-active: 1000 #连接池最大连接数(使用负值表示没有限制)
max-idle: 10 # 连接池中的最大空闲连接
min-idle: 5 # 连接池中的最小空闲连接
max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制)
如果使用jedis则显示声明:
redis:
jedis:
pool:
....