使用springBoot+Redis实现分布式缓存
1. 添加redis框架 依赖
2. 配置redis连接信息
#redis 连接的配置信息
spring.redis.database=15
spring.redis.port=6379
spring.redis.host=82.157.236.116
# 可省略
spring.redis.lettuce.pool.min-idle=5
spring.redis.lettuce.pool.max-idle=10
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=1ms
spring.redis.lettuce.shutdown-timeout=100ms
3. 操作redis
3.1 代码式操作redis
@RestController
public class RedisController {
//引入redis模版
@Autowired
private StringRedisTemplate stringRedisTemplate;
@RequestMapping("/set")
public String setRedis(){
//redis写缓存的操作
stringRedisTemplate.opsForValue().set("username","zhangsan");
return "redis存储成功";
}
@RequestMapping("/get")
public String getRedis(){
String result = stringRedisTemplate.opsForValue().get("username");
return result;
}
}
3.2使用注解操作redis
- @Cacheable: 查询/添加;判断 redis 是否有缓存,如果没有那么就把当前方法返回值存到 redis; 如果存在缓存直接返回。
- @CachePut: 修改; 将方法返回值更新到 redis 缓存中。
- @CacheEvict:删除;将 redis 中对应的缓存删除。
在启动类中添加注解
@EnableCaching // 开启全局注解缓存
@RestController
public class RedisAnnController {
//存入或读取缓存
@RequestMapping("/ann-get")
@Cacheable(value = "spring.cache", key = "#name+'-'+#pnumber")
public String get(String name, String pnumber) {
if (!StringUtils.hasLength(name) || !StringUtils.hasLength(pnumber)) {
return null;
}
System.out.println("执行了 get 方法");
return "name=" + name + "|pnumber=" + pnumber;
}
//更新缓存
@RequestMapping("/put")
@CachePut(value = "spring.cache", key = "#name+'-'+#pnumber")
public String put(String name ,String pnumber){
if (!StringUtils.hasLength(name) || !StringUtils.hasLength(pnumber)) {
return null;
}
System.out.println("执行了 put 方法");
return "[name=" + name + "<->pnumber=" + pnumber + "]";
}
//redis 缓存删除
@RequestMapping("/del")
@CacheEvict(value = "spring.cache",key = "#name + '-' + #pnumber")
public void del(String name ,String pnumber){
System.out.println("执行了删除缓存");
}
}
4. 使用Redis存储Session
4.1 添加依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.session</groupId>
<artifactId>spring-session-data-redis</artifactId>
</dependency>
4.2 配置 redis 连接和 session 的相关信息
spring:
redis:
host: 82.157.236.116
port: 6379
database: 15
password: "XXXXXXXXXXXXX"
session:
store-type: redis
redis:
flush-mode: on_save
namespace: spring:session
servlet:
session:
timeout: 1800
经过上述操作有关session的信息都存储到了redis中的15号数据库,spring:session包中
4.3 redis存储对象
使用Spring Data Redis时,尝试将一个非序列化存储在redis中会产生错误。这个错误是由于在使用Spring Data Redis时,尝试将一个非序列化的对象(Userinfo类型)存储到Redis中导致的。要解决这个问题,你需要确保Userinfo类实现了Serializable接口。
在Userinfo类上添加@Serializable注解:
import java.io.Serializable;
public class Userinfo implements Serializable {
// ... 其他代码 ...
}