SrpingDataRedis是Spring集成了Redis几乎所有的操作!提供了RedisTemplate的API统一操作Redis https://docs.spring.io/spring-data/data-redis/docs/current/reference/html/

Java 学习Redis地址是:https://developer.redis.com/develop/java/

首先 SpringBoot 的 约定优于配置 在整合Redis的时候 就得到了充分的体现

我们几乎不需要手写什么配置,大部分的配置基于SpringBoot配置好的就行。

SpringDataRedis API快速入门

上述API 分开了Redis对不同数据类型的操作,如:我要操作String类型的命令,直接redisTemplate.opsForValue() 再去使用其子API!

首先 老规矩,加入 Maven的依赖

        <!-- Redis依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
        <!-- 连接池依赖-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
        </dependency>

依赖加入好后,刷新一下 Maven,编写我们的配置信息 .properties格式

# Redis基本信息
spring.redis.host=127.0.0.1
spring.redis.port=6380
spring.redis.password=
spring.redis.database=0
# Redis连接池配置(Spring默认Redis连接池是lettuce,如果使用jedis的连接池还需要引入其他依赖) 依次是:最大连接、最大空闲、最小连接数、连接等待时间
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
spring.redis.lettuce.pool.max-wait=100

然后开始写我们的测试用例了。

我们核心是 RedisTemplate 所有操作 ,都让他来干。

快速入门 Demo

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;

@SpringBootTest
class SpringDataRedisDemoApplicationTests {

    @Autowired
    RedisTemplate redisTemplate;

    @Test
    void contextLoads() {
        redisTemplate.opsForValue().set("name", "张三Aa123");
        System.out.println("插入成功!");
        String name = redisTemplate.opsForValue().get("name").toString();
        System.out.println("获取到了name是:" + name);
    }

}

注意:我们用RDM查看一下 我们的Key与Value没有序列化,需要我们看下文的RedisTemplate序列化

RedisTemplate 的序列化与反序列化

RedisTemplate默认使用的是JDK序列化工具,坏处是:可读性差、内存占用大,如快速入门执行后,RDM结果所示,本来就是 name = 张三Aa123,存储后,变成很长的字符了!

        <!-- Redis 序列化依赖-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
        </dependency>

添加一个配置类

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.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializer;

@Configuration
public class RedisConfig {
    @Bean
    public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory connectionFactory){
        RedisTemplate<String, Object> stringObjectRedisTemplate = new RedisTemplate<>();
        // 设置连接工厂
        stringObjectRedisTemplate.setConnectionFactory(connectionFactory);
        // 创建Json序列化工具
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        // 设置Key的序列化 这里只设置了String类型的,Hash类型的,其他类型,需要额外处理
        stringObjectRedisTemplate.setKeySerializer(RedisSerializer.string());
        stringObjectRedisTemplate.setHashKeySerializer(RedisSerializer.json());
        // 设置Value的序列化
        stringObjectRedisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        stringObjectRedisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        return stringObjectRedisTemplate;
    }
}

添加一个 User类 用来 下文 操作 JAVA 对象

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;

@Data
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class User implements Serializable {
    private String name;
    private int age;
    private boolean isman;
    private static final long serialVersionUID = 1L;
}

测试代码

    @Test
    void setObject() {
        User user = new User("张三", 21, true);
        redisTemplate.opsForValue().set("user", user);
        System.out.println("插入对象成功");
        User getUser = (User) redisTemplate.opsForValue().get("user");
        System.out.println("获取到的对象信息是:" + getUser);
    }

Redis Desktop Manager 发现存储后:出现了全限定类名了

Demo:去掉全限定类名

思路:去除掉全限定类名后,JDK不知道要反序列化到那个对象,我们唯一的解决办法就是:存储时使用如 fastjson工具 提前序列化好 Key与Value。

伪代码

存:
        Player player = new Player();
        player.setXXX();
        redisTemplate.opsForValue().set("我是Key", JSON.toJSON(player));


读:
        JSONObject obj = (JSONObject)redisTemplate.opsForValue().get("我是Key");
        Player player = JSON.toJavaObject(obj, Player.class);

StringRedisTemplate

StringRedisTemplate 只能对 key=String,value=String 的键值对进行操作。本质实现了RedisTemplate接口,然后添加了Key、Value的序列化而已!节省了手动添加的配置文件!

去参考这个吧:https://www.cnblogs.com/xuqing0422/p/13461281.html

发表评论

您的电子邮箱地址不会被公开。