Spring-data-redis
在 Spring 中整合 Redis
jedis : 采用的直连,多个线程操作的话,是不安全的,如果想要避免不安全的,使用 jedis pool 连接池
lettuce : 采用netty,实例可以再多个线程中进行共享,不存在线程不安全的情况!可以减少线程数据了
一、配置步骤
-
加入 Redis 相关依赖
properties<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency>
-
在 application.properties 中加入 Redis 相关配置
properties# Redis数据库索引(默认为0) spring.redis.database=0 # Redis服务器地址 spring.redis.host=192.168.0.24 # Redis服务器连接端口 spring.redis.port=6379 # Redis服务器连接密码(默认为空) spring.redis.password= # 连接池最大连接数(使用负值表示没有限制) spring.redis.pool.max-active=200 # 连接池最大阻塞等待时间(使用负值表示没有限制) spring.redis.pool.max-wait=-1 # 连接池中的最大空闲连接 spring.redis.pool.max-idle=10 # 连接池中的最小空闲连接 spring.redis.pool.min-idle=0 # 连接超时时间(毫秒) spring.redis.timeout=1000
二、Spring-data-redis相关功能
(1)模板类
- RedisTemplate key value 泛型都是object
- StringRedisTemplate key value 泛型都是String
(2)注意
-
两者数据 各自存、各自取,数据互不相通
- RedisTemplate不能取StringRedisTemplate存入的数据
- StringRedisTemplate不能取RedisTemplate存入的数据
-
序列化策略不同
-
RedisTemplate采用JDK的序列化策略(JdkSerializationRedisSerializer)保存的key和value 都是是采用此策略序列化保存的
- 存储时,先将数据序列化为字节数组,再存入 Redis 数据库
- 查看 Redis 会发现,是字节数组的形式,类似乱码
- 读取时,会将数据当做字节数组转化为我们需要的数据,用来存储对象,但要实现 Serializable 接口
-
StringRedisTemplate采用String的序列化策略(StringRedisSerializer)保存的key和
value都是String类型,存储和读取,都为可读的数据,采用此策略序列化保存的当存入对象时,会报错:can not cast into String
-
-
两者的关系是 StringRedisTemplate 继承 RedisTemplate
-
使用场景
- 当你的 redis 数据库里面本来存的是字符串数据或者要存取的数据就是字符串类型数据的时候,那么就使用StringRedisTemplate
- 如果数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对 象,那么使用RedisTemplate是更好的选择
-
五大数据类型
- redisTemplate.opsForValue();//操作字符串
- redisTemplate.opsForList();//操作List
- redisTemplate.opsForSet();//操作Set
- redisTemplate.opsForZSet();//操作ZSet
- redisTemplate.opsForHash();//操作Hash
(3)序列化策略
改变序列化策略
默认序列化方式存储到redis的数据人工不可读
不同策略序列化的过程有性能高低的
spring-data-redis 提供如下几种序列化策略
java
GenericToStringSerializer: //可以将任何对象泛化为字符串并序列化
Jackson2JsonRedisSerializer: //跟JacksonJsonRedisSerializer实际上是一样的
JacksonJsonRedisSerializer: //序列化object对象为json字符串
JdkSerializationRedisSerializer: //序列化java对象
StringRedisSerializer: //简单的字符串序列化