spring boot 引入redis
前言:
Spring Redis requires Redis 2.6 or above and Spring Data Redis integrates with Lettuce and Jedis, two popular open-source Java libraries for Redis.Spring Redis 需要 Redis 2.6 或更高版本,Spring Data Redis 已经集成了Lettuce和Jedis,这是用于连接redis服务端的,比较流行的两个Java开源库。
1. 引入依赖
通过spring boot构建项目时,如果pom继承自spring-boot-starter-parent
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.5.1</version>
<relativePath/>
</parent>
那么可以不用加版本号,直接引入就行
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-redis</artifactId>
<!-- <version>2.5.1</version> -->
</dependency>
2. yml配置
spring:
redis:
host: localhost
port: 6379
password: admin123root
database: 1
如果只使用RedisTemplate或StringRedisTemplate,那么以上的配置就足够使用了。
3. 设置配置类(缺省)
redis连接工厂在spring boot2.x版本后,默认使用LettuceConnectionFactory来创建与redis的连接(这个类的作用将在下一篇文章详细阐述),因此不用设置如下的配置类也能获取到RedisTemplate等相关bean。
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory) {
RedisTemplate<String, Object> template = new RedisTemplate<>();
template.setConnectionFactory(connectionFactory);
return template;
}
}
4. 扩展功能:Redis Repository
作用:
Redis Repositories 可以让我们在Redis哈希类型中转换和存储Java实体,支持自定义映射策略和二级索引。
注意:
- 使用该功能,需要保证Redis服务器版本在2.8.0之上
- 该功能并不支持Spring事务(RedisTemplate同样也不参与Spring事务,不过RedisTemplate可以用过在配置类添加@EnableTransactionManagement以启用事务支持)
- Redis Repositories的存储结构为<String, Hash>
- Redis Repositories的键构成形式:keyspace:id
RedisTemplate与Redis Repository的使用差异
一般来说,我们都是通过注入RedisTemplate<String, Object>或其派生类来CRUD redis数据的,如下:
@Resource
private StringRedisTemplate redisTemplate;
public String redisGetString(String id) {
String name = redisTemplate.opsForValue().get(id);
redisTemplate.opsForValue().set(id, "new name");
return name;
}
RedisTemplate类使用的都是redis内部的数据结构,string、list、hash等等。
所以每次保存数据时,还需要开发者进行额外的转换操作,将值类型转为redis的底层支持,如下所示:
redisTemplate.opsForValue();
redisTemplate.opsForList();
redisTemplate.opsForSet();
redisTemplate.opsForZSet();
redisTemplate.opsForHash();
而通过使用Redis Repository功能,我们无须做这些工作(其默认就是以hash的数据结构来实现),也能更方便的使用redis的CRUD功能。
使用方式:
A. 设置实体类
import lombok.Data;
import org.springframework.data.annotation.Id;
import org.springframework.data.redis.core.RedisHash;
@Data
@RedisHash("User")
public class User {
@Id
private String id;
private String name;
}
注意事项:
- @Id标注了用于组成redis键的属性,当然如果实体中有名为id的属性,那么也可以不用设置@Id
- redis中保存的键的形式为:keyspace:id,RedisHash中设置的值即是keyspace,若id="5"的话,那么redis的键可能为User:5。因此不同的实体尽量不要使用重复的keyspace。
B. 设置User的持久化存储接口
我们的自定义接口UserRedis并不需要自己的实现,在继承CrudRepository之后,UserRedis就拥有了基础的CRUD功能
@Repository
public interface UserRedis extends CrudRepository<User, String> {
}
CrudRepository<T, ID>:
- T:值(value)
- ID:键(key)
C. 在redis配置类中启用和扫描持久化存储接口
@Configuration
// 扫描CrudRepository实现类
@EnableRedisRepositories(basePackages = "cn.test.redis")
public class RedisConfig {
// ………………
D. 注入并使用
@Resource
private UserRedis userRedis;
public Back<String> redisOps(String name) {
User user = new User();
String uuid = IdUtil.simpleUUID();
user.setId(uuid);
user.setName(name);
// 新增or修改
User save = userRedis.save(user);
// id查询
User orElse = userRedis.findById(uuid).orElse(null);
// 删除
userRedis.deleteById(uuid);
// 计数:根据keyspace统计可用总数
long count = userRedis.count();
Iterable<User> all = userRedis.findAll();
}
关于操作问题:
- save:当user为null时,会生成一个随机的key,来组成完整的id — keyspace:key,并将值设为null。
上述是redis集成到spring boot的最简单配置,在redis没有做主从分离、哨兵、或者分布式集群的情况下,spring boot的默认功能已经满足需求。
但如果redis做了主从、集群,那么就需要通过RedisConnectionFactory配置,选择LettuceConnectionFactory或JedisConnectionFactory,来进行相应的读写分离设置、主从读写设置。
下一篇博客将着重描述这些内容
❤❤redis相关的其它文章❤❤
参考: