SpringDataRedis 客户端
定义
- SpringData:Spring 中数据操作的模块,包含各种数据库的集成
- SpringDataRedis:SpringData 对 Redis 的集成模块,整合了 Jedis 和 lettuce 的一套 API 接口
功能
- 提供不同 Redis 客户端的整合
- 提供统一 API 操作 Redis
- 支持 Redis 发布订阅模型
- 支持 Redis 哨兵和 Redis 集群
- 支持基于 lettuce 的响应式编程
- 支持基于 JDK / JSON / String / Spring 对象的数据序列化和反序列化
- 支持基于 Redis 的 JDKCollection 实现
RedisTemplate 工具类
-
定义:封装对 Redis 各种数据类型的操作到不同的类中
-
常用方法
API 返回值类型 说明 redisTemplate 通用命令 redisTemplate.opsForValue() ValueOperations 操作 String 类型数据 redisTemplate.opsForHash() HashOperations 操作 Hash 类型数据 redisTemplate.opsForList() ListOperations 操作 List 类型数据 redisTemplate.opsForValue() SetOperations 操作 Set 类型数据 redisTemplate.opsForValue() ZSetOperations 操作 SortedSet 类型数据
⭐StringRedisTemplate
-
定义:”RedisTemplate 类” 的子类,区别是 StringRedisTemplate 的 key-value 都只能是 String 类型的
-
缺点:key-value 都只能是 String 类型的,对于 “Object 对象” 需要手动序列化和反序列化
-
常用方法
返回值类型 方法 value 类型 功能 void stringRedisTemplate.opsForValue().set(“key”, “value”) String 添加 key-value 键值对 String String stringRedisTemplate.opsForValue().get(“key”) String 获取 key 对应的 value 值 void stringRedisTemplate.opsForHash().put(“hashKey”, “field”, “value”) HashMap<field, value> 添加 key - HashSet<field, value> 的 field 字段 String value = (String) stringRedisTemplate.opsForHash().get(“hash”, “field”) HashMap<field, value> 获取 key - HashSet<field, value> 的 field 字段 Long stringRedisTemplate.opsForList().leftPush(“listKey”, “value”) List 添加 key - List 的 List 元素,返回添加后 list 的长度 String value = stringRedisTemplate.opsForList().leftPop(“list”) List 获取 key - List 的 List 元素 Long stringRedisTemplate.opsForSet().add(“setKey”, “value”) HashSet 添加 key - Set 的 set 元素,返回添加后 set 的大小 String Set values = stringRedisTemplate.opsForSet().members(“set”) HashSet 获取 key - Set 的 set 元素
QuickStart
-
- 引入依赖
<dependencies> <!--redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--common-pool--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!--Jackson依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
-
- Redis 配置文件 /src/main/resources/application.yaml
spring: redis: host: 192.168.150.101 port: 6379 password: 123321 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: 100ms
-
- RedisTemplate 依赖注入
@SpringBootTest class RedisStringTests { @Autowired private RedisTemplate redisTemplate; }
-
- 自定义序列化方式 (修改Spring配置中的RedisTemplate类)
@Configuration public class RedisConfig { // 创建一个接受<String, Object>类型的RedisTemplate对象, 添加到Configuration的Bean中,实现依赖注入 @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory connectionFactory){ // 创建RedisTemplate对象 RedisTemplate<String, Object> template = new RedisTemplate<>(); // 设置连接工厂 template.setConnectionFactory(connectionFactory); // 创建JSON序列化工具 GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer(); // 设置Key的序列化 template.setKeySerializer(RedisSerializer.string()); template.setHashKeySerializer(RedisSerializer.string()); // 设置Value的序列化 template.setValueSerializer(jsonRedisSerializer); template.setHashValueSerializer(jsonRedisSerializer); // 返回 return template; } }
-
- Redis 测试
@SpringBootTest class RedisStringTests { @Autowired private RedisTemplate redisTemplate; @Test void testString() { // 写入一条String数据 redisTemplate.opsForValue().set("name", "alec"); // 获取string数据 Object name = stringRedisTemplate.opsForValue().get("name"); System.out.println("name = " + name); } }
⭐优化方案 (推荐)(StringRedisTemplate)
-
- 引入依赖
<dependencies> <!--redis依赖--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <!--common-pool--> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> </dependency> <!--Jackson依赖--> <dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
-
- ⭐配置 Redis 服务器(/src/main/resources/application.yaml)
spring: redis: host: 192.168.150.101 port: 6379 password: 123321 lettuce: pool: max-active: 8 max-idle: 8 min-idle: 0 max-wait: 100ms
-
- ⭐使用
StringRedisTemplate
(需要手动序列化和反序列化)
@SpringBootTest class RedisStringTests { @Autowired private StringRedisTemplate stringRedisTemplate; @Test void testString() { stringRedisTemplate.opsForValue().set("verify:phone:13600527634", "124143"); // 写入一条String数据 Object name = stringRedisTemplate.opsForValue().get("name"); // 获取string数据 System.out.println("name = " + name); } private static final ObjectMapper mapper = new ObjectMapper(); @Test void testSaveUser() throws JsonProcessingException { // 创建对象 User user = new User("虎哥", 21); // 手动序列化 String json = mapper.writeValueAsString(user); // 写入数据 stringRedisTemplate.opsForValue().set("user:200", json); // 获取数据 String jsonUser = stringRedisTemplate.opsForValue().get("user:200"); // 手动反序列化 User user1 = mapper.readValue(jsonUser, User.class); System.out.println("user1 = " + user1); } }
- ⭐使用
**StringRedisTemplate 优点:**存入 Redis 的数据中没有标记数据类的属性,更加节省空间
**StringRedisTemplate 缺点:**需要用户手动序列化和反序列化,数据和对象的绑定需要程序员使用代码逻辑解决