文章目录
在Springboot项目中使用Redis需先确保服务器(或主机)已安装Redis并开启端口。
在业务层中使用Redis有两种装配方式,两者任选其一即可。
- RedisTemplate装配:需要先创建配置类,指定序列化策略,再在业务层中使用,获取数据时接收类型为实体类集合。
- StringRedisTemplate装配:默认所有数据都是字符串形式,在取得数据后再解析为相应实体类集合。
第一步:导入依赖
<!--spring-boot-redis所需依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>
第二步:配置application.yml
# 配置数据库连接参数
spring:
redis: # redis数据库配置
host: 192.168.xxx.xxx # ip
port: 6379 # 默认端口
第三步:在业务层中使用Redis(两种方式任选一即可)
方式1:RedisTemplate装配
先 · 创建配置类RedisConfig
注意:对应的实体类需要可序列化
@Configuration// 该注解表示该类为springboot的配置类,会被自动解析,本类为固定写法
public class RedisConfig {
@Bean// 将该方法的返回值加入到容器
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
// 1.创建一个redis模板对象
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);// 设置连接器
// 2.配置redis模板的普通键值对的序列化策略
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new Jackson2JsonRedisSerializer<Object>(Object.class));
// 3.配置redis模板的Hash键值对的序列化策略
redisTemplate.setHashKeySerializer(new StringRedisSerializer());
redisTemplate.setHashValueSerializer(new StringRedisSerializer());
// 4.返回该redis模板对象,加入到spring容器中
return redisTemplate;
}
}
再 · RedisTemplate父类装配
@Service
public class RedisServiceImpl extends ServiceImpl<RedisDao, BookType> implements RedisService {
// 引入redis模板类,该类是一个父类,其可用于设置序列化策略、获取操作redis的接口对象、设置key的有效时间等
@Resource// 需使用@Resource注解装填
private RedisTemplate<String, BookType> redisTemplate;
@Override// 注意使用RedisTemplate对象需要写redis配置类 配置序列化策略
public List<BookType> getTypes() {
// 1.通过redisTemplate获取操作redis的接口对象
ListOperations<String, BookType> listOperations = redisTemplate.opsForList();
// 2.通过接口对象listOperations获取redis中的数据 key为book_type 直接用List<BookType>接收
List<BookType> types = listOperations.range("book_type", 0, -1);
// 3.如果不为null 表示存在数据 直接return即可
if(!ObjectUtils.isEmpty(types)) return types;
// 4.如果为null 表示redis中不存在该数据 需要查询mysql并将其保存到redis中
List<BookType> bookTypes = this.list();
listOperations.leftPushAll("book_type", bookTypes);
// redisTemplate.expire("book_type", 20L, TimeUnit.SECONDS);// 设置20秒过期
return bookTypes;
}
}
方式2:StringRedisTemplate装配
@Service
public class StringRedisServiceImpl extends ServiceImpl<RedisDao, BookType> implements StringRedisService {
@Autowired// 引入StringRedis模板 StringRedisTemplate是RedisTemplate的子类 故不带泛型 可使用@Autowired装配
private StringRedisTemplate redisTemplate;
@Autowired// 该对象来自spring-boot-starter-web依赖 用于字符串转和List集合互转
private ObjectMapper objectMapper;
@Override// 使用StringRedisTemplate不需要进行序列化配置
public List<BookType> getTypes() throws JsonProcessingException {
// 1.通过redisTemplate获取操作redis的接口对象 该对象只操作字符串
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
// 2.通过接口对象valueOperations获取redis中的数据 key为book_type 接受类型为String
String types = valueOperations.get("book_type");
// 3.如果不是空字符串 表示存在数据 转换为List后返回 转换时指定泛型为实体类
if (StringUtils.hasLength(types))
return objectMapper.readValue(types, new TypeReference<List<BookType>>() {});
// 4.如果是空字符串 表示redis中不存在该数据 需要查询mysql并将其保存到redis中
List<BookType> bookTypes = this.list();
String typesStr = objectMapper.writeValueAsString(bookTypes);// 列表转字符串
valueOperations.set("book_type", typesStr);
// valueOperations.set("book_type", typesStr, 20L, TimeUnit.SECONDS);// 存值并设置20秒过期
return bookTypes;
}
}
附:本文示例中的实体类
// 实体类 图书类型 可序列化
public class BookType implements Serializable {
private static final long serialVersionUID = 1L;
private Integer typeId;
private String typeName;
private Integer parentId;
private Integer typeState;
private Integer typeSelf;
}