(待完善)
redis是什么
(* @Cacheable一类的注解自动缓存,要么使用RedisTemplate手动缓存)
特点:支持网络,基于内存,可持续化,日志型,nosql,键值数据库,支持多种类型存储,线程安全
为什么要用:
学习记录用,后续对redis的学习将继续更新在本篇
1.pom.xml文件中导入redis依赖
导入相关依赖后,就可以在配置文件中,配置连接redis的相关信息
org.springframework.boot
spring-boot-starter-data-redis
2.application.yml配置文件中配置redis相关信息(未使用连接池)
spring:
redis:
# 选择Redis数据库(默认为0),redis默认有16个数据库
database: 0
# Redis服务器地址 本地localhost/127.0.0.1
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# 连接超时时长(毫秒)
timeout: 6000
# Redis服务器连接密码(默认为空)
password:
3.redis配置文件config(如果是简单使用字符串类型可跳过这一步)
默认情况下,Spring Boot自动配置使用的RedisTemplate,
RedisTemplate
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate redisTemplate(LettuceConnectionFactory
connectionFactory) {
RedisTemplate redisTemplate = new RedisTemplate<>();
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
redisTemplate.setConnectionFactory(connectionFactory);
return redisTemplate;
}
4.简单使用redis
通过注入RedisTemplate来完成对redis的存储读取等操作
@Resource
private RedisTemplate redisTemplate;
redisTemplate相关操作
简单的字符串(对象)存/读取
@Resource
private RedisTemplate redisTemplate;
....
//存字符串
redisTemplate.opsForValue().set(key,"str");
//读字符串
redisTemplate.opsForValue().get(key);
@Resource
private RedisTemplate redisTemplate;
...
//此对象需要进行序列化
Apple apple = new Apple();
//存对象
redisTemplate.opsForVlaue.set("apple_key",apple)
//读对象,一般会通过强制类型转换,转换为对应的值类型
Apple apple = (Apple)redisTemplate.opsForValue.get("apple_key");
5.设置序列化
上方提到对象需要序列化,如果不序列化则请求后报错如图
在对应的实体类加上 implements Serializable
public class Apple implements Serializable
,但当对象存储至redis中时候,会发现,存储内容出现乱码
【为什么需要序列化】
在java中,一切都是以对象的形式存在,而将对象的信息进行传输就需要序列化,没序列化的对象是不能存进数据库,当使用@AutoWired注入时,IOC容器默认选择StringRedisTemplate类进行注入
而StringRedisTemplate默认选择StringRedisSerializer序列化器
如果将RedisTemplate
RedisTemplate默认选择JdkSerializationRedisSerializer序列化器,故出现如上情况,如果需要存储在redis中的数据以json形式存在,则需要配置序列化器,把默认序列化器顶替掉
=》需要配置config
【法1】
@Resource
private RedisTemplate redisTemplate;
......
redisTemplate.setKeySerializer(RedisSerializer.string());
//redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.opsForValue().set("apple_key","apple");
法2配置文件
@Configuration
public class RedisConfig{
@Bean
public RedisTemplate redisTemplate(RedisConnectionFactory
redisConnectionFactory){
RedisTemplate template = new RedisTemplate<>();
//关联
template.setConnectionFactory(redisConnectionFactory);
//设置key的序列化器
template.setKeySerializer(new StringRedisSerializer());
//设置value的序列化器 此处特定为Apple 后续可考虑如何做到通用
template.setValueSerializer(new Jackson2JsonRedisSerializer(Apple.class));
return template;
}
}
则通过对key跟value的序列化,即可获得正常所需的存储形式了
使用redis连接池
redis连接池springboot2.0 集成redis服务详解,以及 (Lettuce & Jedis)_zzhongcy的博客-CSDN博客_spring.redis.lettuce.pool
jedis/lettuce 区别
*连接池(jedis/lettuce选择)采用连接池的话,需要加上如下依赖
springboot2.X redis依赖默认引入lettuce,如果要采用jedis连接池,则需手动引入jedis相关依赖,排除自带lettuce依赖,以此引入需要用到的jedis包
org.springframework.boot
spring-boot-starter-data-redis
io.lettuce
lettuce-core
redis.clients
jedis
使用jedis还需要JedisConnectionFactory
spring:
redis:
# 选择Redis数据库(默认为0),redis默认有16个数据库
database: 0
# Redis服务器地址 本地localhost/127.0.0.1
host: 127.0.0.1
# Redis服务器连接端口
port: 6379
# 连接超时时长(毫秒)
timeout: 6000
# Redis服务器连接密码(默认为空)
password:
# Redis连接池 jedis同
lettuce:
pool:
# 连接池最大连接数(使用负值表示没有限制)
max-active: 1000
# 连接池最大阻塞等待时间(使用负值表示没有限制)
max-wait: -1
# 连接池中的最大空闲连接
max-idle: 500
# 连接池中的最小空闲连接
min-idle: 5
shutdown-timeout: 0
5.实际中应用
5.序列化问题
6.周期问题
参考redis击穿,穿透,雪崩以及解决方案_坑里水库的博客-CSDN博客_redis击穿
SpringBoot(十一): Spring Boot集成Redis - 申来来 - 博客园