Redis的五种基本类型和业务场景和使用方式
Redis是非关系性数据库,Redis 是一个开源的高性能键值数据库,主要用于数据存储和缓存。
它支持多种数据结构,如字符串、哈希、列表、集合和有序集合等。
!-- SpringBoot Boot Redis -- dependency groupId org.springframework.boot /groupId artifactId spring-boot-starter-data-redis /artifactId /dependency dependency groupId redis.clients /groupId artifactId jedis /artifactId /dependency !-- Spring Boot Starter Test -- dependency groupId org.springframework.boot /groupId artifactId spring-boot-starter-test /artifactId scope test /scope /dependency !-- JUnit 5 -- dependency groupId org.junit.jupiter /groupId artifactId junit-jupiter-api /artifactId version 5.8.2 /version scope test /scope /dependency dependency groupId org.junit.jupiter /groupId artifactId junit-jupiter-engine /artifactId version 5.8.2 /version scope test /scope /dependency
spring: redis: host: 你的ip port: 6379
package com.bwie.common.config;import com.fasterxml.jackson.annotation.JsonAutoDetect;import com.fasterxml.jackson.annotation.PropertyAccessor;import com.fasterxml.jackson.databind.ObjectMapper;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.data.redis.connection.RedisConnectionFactory;import org.springframework.data.redis.core.RedisTemplate;import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer;import org.springframework.data.redis.serializer.StringRedisSerializer;@Configurationpublic class RedisConfig { @Bean public RedisTemplate String, Object redisTemplate(RedisConnectionFactory factory) { RedisTemplate String, Object template = new RedisTemplate (); template.setConnectionFactory(factory); Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class); ObjectMapper om = new ObjectMapper(); om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL); jackson2JsonRedisSerializer.setObjectMapper(om); StringRedisSerializer stringRedisSerializer = new StringRedisSerializer(); // key采用String的序列化方式 template.setKeySerializer(stringRedisSerializer); // hash的key也采用String的序列化方式 template.setHashKeySerializer(stringRedisSerializer); // value序列化方式采用jackson template.setValueSerializer(jackson2JsonRedisSerializer); // hash的value序列化方式采用jackson template.setHashValueSerializer(jackson2JsonRedisSerializer); template.afterPropertiesSet(); return template; }}
import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import static org.junit.jupiter.api.Assertions.assertEquals;@SpringBootTestpublic class StringExampleTest { @Autowired private RedisTemplate String, Object redisTemplate; @Test public void testString() { // 设置字符串值 redisTemplate.opsForValue().set("myStringKey", "Hello Redis!"); // 获取并验证字符串值 String value = (String) redisTemplate.opsForValue().get("myStringKey"); assertEquals("Hello Redis!", value); // 验证值是否正确 // 更新字符串值 redisTemplate.opsForValue().set("myStringKey", "Updated Value"); assertEquals("Updated Value", redisTemplate.opsForValue().get("myStringKey")); // 验证更新后的值 // 增加计数器值 redisTemplate.opsForValue().increment("myCounter", 1); assertEquals(1, redisTemplate.opsForValue().get("myCounter")); // 验证计数器值 // 设置带有过期时间的字符串 redisTemplate.opsForValue().set("tempKey", "I will expire soon", 10); // 验证过期时间是否小于10秒(实际过期时间可能略小于10秒) assertEquals(true, redisTemplate.getExpire("tempKey") 10L); }}
注意:
如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import java.util.List;import static org.junit.jupiter.api.Assertions.assertEquals;@SpringBootTestpublic class ListExampleTest { @Autowired private RedisTemplate String, Object redisTemplate; @Test public void testList() { // 向列表中添加元素 redisTemplate.opsForList().leftPush("myListKey", "item1"); redisTemplate.opsForList().leftPush("myListKey", "item2"); // 获取并验证列表中的所有元素 List Object list = redisTemplate.opsForList().range("myListKey", 0, -1); assertEquals(true, list.contains("item2")); // 验证列表包含 item2 assertEquals(true, list.contains("item1")); // 验证列表包含 item1 // 从列表中弹出元素 Object poppedItem = redisTemplate.opsForList().rightPop("myListKey"); assertEquals("item1", poppedItem); // 验证弹出的元素是 item1 // 获取列表长度 Long size = redisTemplate.opsForList().size("myListKey"); assertEquals(1L, size); // 验证列表长度为 1 // 在列表开头插入新元素 redisTemplate.opsForList().insert("myListKey", 0, "item0"); List Object updatedList = redisTemplate.opsForList().range("myListKey", 0, -1); assertEquals(true, updatedList.contains("item0")); // 验证列表包含 item0 assertEquals(true, updatedList.contains("item2")); // 验证列表仍包含 item2 }}
注意:
如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import java.util.Set;import static org.junit.jupiter.api.Assertions.assertEquals;import static org.junit.jupiter.api.Assertions.assertFalse;@SpringBootTestpublic class SetExampleTest { @Autowired private RedisTemplate String, Object redisTemplate; @Test public void testSet() { // 向集合中添加元素 redisTemplate.opsForSet().add("mySetKey", "member1", "member2", "member3"); // 获取并验证集合中的所有成员 Set Object members = redisTemplate.opsForSet().members("mySetKey"); assertEquals(true, members.contains("member1")); // 验证集合包含 member1 assertEquals(true, members.contains("member2")); // 验证集合包含 member2 assertEquals(true, members.contains("member3")); // 验证集合包含 member3 // 从集合中删除某个成员 redisTemplate.opsForSet().remove("mySetKey", "member2"); assertFalse(redisTemplate.opsForSet().members("mySetKey").contains("member2")); // 验证 member2 已被删除 // 检查某个成员是否在集合中 Boolean isMember = redisTemplate.opsForSet().isMember("mySetKey", "member1"); assertEquals(true, isMember); // 验证 member1 仍在集合中 }}
注意:
如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import java.util.HashMap;import java.util.Map;import static org.junit.jupiter.api.Assertions.assertEquals;import static org.junit.jupiter.api.Assertions.assertFalse;@SpringBootTestpublic class HashExampleTest { @Autowired private RedisTemplate String, Object redisTemplate; @Test public void testHash() { // 创建 HashMap 并存储到 Redis 中 Map String, Object myHash = new HashMap (); myHash.put("field1", "value1"); myHash.put("field2", "value2"); redisTemplate.opsForHash().putAll("myHashKey", myHash); // 获取并验证哈希字段值 String fieldValue = (String) redisTemplate.opsForHash().get("myHashKey", "field1"); assertEquals("value1", fieldValue); // 验证字段值 // 更新哈希字段 redisTemplate.opsForHash().put("myHashKey", "field1", "newValue"); assertEquals("newValue", redisTemplate.opsForHash().get("myHashKey", "field1")); // 验证更新后的值 // 删除哈希字段 redisTemplate.opsForHash().delete("myHashKey", "field2"); assertFalse(redisTemplate.opsForHash().hasKey("myHashKey", "field2")); // 验证字段是否已删除 // 获取所有字段及其值 Map Object, Object entries = redisTemplate.opsForHash().entries("myHashKey"); assertEquals(true, entries.containsKey("field1")); // 验证字段存在 assertEquals("newValue", entries.get("field1")); // 验证字段值 }}
注意:
如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的import org.junit.jupiter.api.Test;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.data.redis.core.RedisTemplate;import java.util.Set;import static org.junit.jupiter.api.Assertions.assertEquals;import static org.junit.jupiter.api.Assertions.assertFalse;@SpringBootTestpublic class ZSetExampleTest { @Autowired private RedisTemplate String, Object redisTemplate; @Test public void testZSet() { // 向有序集合中添加元素 redisTemplate.opsForZSet().add("myZSetKey", "member1", 1); redisTemplate.opsForZSet().add("myZSetKey", "member2", 2); // 获取并验证有序集合中的所有成员 Set Object zSetMembers = redisTemplate.opsForZSet().range("myZSetKey", 0, -1); assertEquals(true, zSetMembers.contains("member1")); // 验证 member1 存在 assertEquals(true, zSetMembers.contains("member2")); // 验证 member2 存在 // 更新元素的分数 redisTemplate.opsForZSet().incrementScore("myZSetKey", "member1", 3); Double score = redisTemplate.opsForZSet().score("myZSetKey", "member1"); assertEquals(4.0, score); // 验证 member1 的分数更新为 4.0 // 获取指定分数范围内的成员 Set Object rangeByScore = redisTemplate.opsForZSet().rangeByScore("myZSetKey", 1, 2); assertEquals(true, rangeByScore.contains("member2")); // 验证 member2 在分数范围内 // 从有序集合中删除某个成员 redisTemplate.opsForZSet().remove("myZSetKey", "member2"); assertFalse(redisTemplate.opsForZSet().range("myZSetKey", 0, -1).contains("member2")); // 验证 member2 已被删除 }}
注意:
如果说注入的时候泛型和配置类不一样的话,可能会导致使用不了配置类的相关配置,就会采用redisTemplate原有的配置,然后存储到的redis的数据就是一些乱码。一定要保证注入的泛型和配置类一样,这样存储到redis中的数据格式就是正确的以上为个人经验,希望能给大家一个参考,也希望大家多多支持8b8.cn。
Redis的五种基本类型和业务场景和使用方式