Redis - ⭐SpringDataRedis 应用 & 优化

SpringDataRedis 客户端

  1. 定义
    1. SpringData:Spring 中数据操作的模块,包含各种数据库的集成
    2. SpringDataRedis:SpringData 对 Redis 的集成模块,整合了 Jedis 和 lettuce 的一套 API 接口
  2. 功能
    1. 提供不同 Redis 客户端的整合
    2. 提供统一 API 操作 Redis
    3. 支持 Redis 发布订阅模型
    4. 支持 Redis 哨兵和 Redis 集群
    5. 支持基于 lettuce 的响应式编程
    6. 支持基于 JDK / JSON / String / Spring 对象的数据序列化和反序列化
    7. 支持基于 Redis 的 JDKCollection 实现

RedisTemplate 工具类

  1. 定义:封装对 Redis 各种数据类型的操作到不同的类中

  2. 常用方法

    API返回值类型说明
    redisTemplate通用命令
    redisTemplate.opsForValue()ValueOperations操作 String 类型数据
    redisTemplate.opsForHash()HashOperations操作 Hash 类型数据
    redisTemplate.opsForList()ListOperations操作 List 类型数据
    redisTemplate.opsForValue()SetOperations操作 Set 类型数据
    redisTemplate.opsForValue()ZSetOperations操作 SortedSet 类型数据

⭐StringRedisTemplate

  1. 定义:”RedisTemplate 类” 的子类,区别是 StringRedisTemplate 的 key-value 都只能是 String 类型的

  2. 缺点:key-value 都只能是 String 类型的,对于 “Object 对象” 需要手动序列化和反序列化

  3. 常用方法

    返回值类型方法value 类型功能
    voidstringRedisTemplate.opsForValue().set(“key”, “value”)String添加 key-value 键值对
    StringString stringRedisTemplate.opsForValue().get(“key”)String获取 key 对应的 value 值
    voidstringRedisTemplate.opsForHash().put(“hashKey”, “field”, “value”)HashMap<field, value>添加 key - HashSet<field, value> 的 field 字段
    Stringvalue = (String) stringRedisTemplate.opsForHash().get(“hash”, “field”)HashMap<field, value>获取 key - HashSet<field, value> 的 field 字段
    LongstringRedisTemplate.opsForList().leftPush(“listKey”, “value”)List添加 key - List 的 List 元素,返回添加后 list 的长度
    Stringvalue = stringRedisTemplate.opsForList().leftPop(“list”)List获取 key - List 的 List 元素
    LongstringRedisTemplate.opsForSet().add(“setKey”, “value”)HashSet添加 key - Set 的 set 元素,返回添加后 set 的大小
    StringSet values = stringRedisTemplate.opsForSet().members(“set”)HashSet获取 key - Set 的 set 元素

QuickStart

    1. 引入依赖
        <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>
    
    1. 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
    
    1. RedisTemplate 依赖注入
    @SpringBootTest
    class RedisStringTests {
    
        @Autowired
        private RedisTemplate redisTemplate;
    }
    
    1. 自定义序列化方式 (修改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;
        }
    }
    
    1. 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)

    1. 引入依赖
        <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>
    
    1. ⭐配置 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
    
    1. ⭐使用 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 缺点:**需要用户手动序列化和反序列化,数据和对象的绑定需要程序员使用代码逻辑解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值