SpringDataRedis

SpringDataRedis

  • SpringDataRedis简介
  • RedisTemplate对Redis操作类型
  • SpringDataRedis快速入门
    • 1、引入spring-boot-starter-data-redis依赖
    • 2、在application.properties配置Redis信息
    • 3、注入RedisTemplate并测试
  • SpringDataRedis的序列化方式
    • 现象分析
    • SpringDataRedis的序列化方式
    • redisTemplate保存对象测试
  • 实际开发中使用redis方式(重要)
  • 项目源码

SpringDataRedis简介

SpringData是Spring中数据操作的模块,包含对各种数据库的集成,其中对Redis的集成模块就叫做SpringDataRedis,官网地址

  • 提供了对不同Redis客户端的整合(Lettuce和Jedis)
  • 提供了RedisTemplate统一API来操作Redis
  • 支持Redis的发布订阅模型
  • 支持Redis哨兵和Redis集群
  • 支持基于Lettuce的响应式编程
  • 支持基于JDK、JSON、字符串、Spring对象的数据序列化及反序列化
  • 支持基于Redis的JDKCollection实现

RedisTemplate对Redis操作类型

SpringDataRedis中提供了RedisTemplate工具类,其中封装了各种对Redis的操作。并且将不同数据类型的操作API封装到了不同的类型中:
SpringDataRedis_第1张图片

SpringDataRedis快速入门

SpringDataRedis的使用步骤:

1、引入spring-boot-starter-data-redis依赖
2、在application.yml配置Redis信息
3、注入RedisTemplate

1、引入spring-boot-starter-data-redis依赖

        <dependency>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-data-redisartifactId>
        dependency>
        
        <dependency>
            <groupId>org.apache.commonsgroupId>
            <artifactId>commons-pool2artifactId>
        dependency>

2、在application.properties配置Redis信息

server.port=8087
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=123456
#连接池最大连接数(使用负值表示没有限制)
spring.redis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.pool.max-wait=-1
#连接池中的最大空闲连接
spring.redis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.pool.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout=30000

3、注入RedisTemplate并测试

@SpringBootTest
class RedisTemplateApplicationTests {
    @Autowired
    private RedisTemplate redisTemplate;

    @Test
    void testString() {
        redisTemplate.opsForValue().set("name","李四");
        Object name = redisTemplate.opsForValue().get("name");
        System.out.println("name = " + name);
    }

}

SpringDataRedis_第2张图片

SpringDataRedis的序列化方式

现象分析

在控制台能够看见正常的key和value,但是我们通过redis客户端查看时发现结果是这样的。
SpringDataRedis_第3张图片
RedisTemplate可以接收任意Object作为值写入Redis,只不过写入前会把Object序列化为字节形式,默认是采用JDK序列化;

缺点:

  • 可读性差
  • 内存占用较大

查看源码RedisTemplate可以发现默认是采用JDK序列化;

SpringDataRedis_第4张图片

通过debug观察redisTemplate.opsForValue().set(“name”,“李四”);怎样将name进行jdk序列化的
SpringDataRedis_第5张图片

SpringDataRedis的序列化方式

我们希望在redis中存的,所见及所得,而不是进行jdk序列化之后的样子,所以我们需要改变序列化方式。
SpringDataRedis_第6张图片

StringRedisSerializer

如果key 或者hashkey都是字符串一般用它

GenericJackson2JsonRedisSerializer

value有可能是对象就用他,转json字符串的序列化方式

@Configuration
public class RedisConfig {

    /**
      * 描述信息: key和hashKey采用string序列化方式 alue和hashValue采用Json序列化方式
      *
      * @date  2023/05/17
      * @param redisConnectionFactory
      * @return org.springframework.data.redis.core.RedisTemplate
      **/
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        //创建Template
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        //设置连接工厂
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        //设置序列化工具
        GenericJackson2JsonRedisSerializer jsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        //key和hashKey采用string序列化方式
        redisTemplate.setKeySerializer(RedisSerializer.string());
        redisTemplate.setHashKeySerializer(RedisSerializer.string());
        //value和hashValue采用Json序列化方式
        redisTemplate.setValueSerializer(jsonRedisSerializer);
        redisTemplate.setHashValueSerializer(jsonRedisSerializer);
        return redisTemplate;
    }
}

平时开发中不用单独引入jackson依赖,springmvc自带jackson依赖;现在demo中没有引入mvc,需要手动添加一下jsckson

      
        <dependency>
            <groupId>com.fasterxml.jackson.coregroupId>
            <artifactId>jackson-databindartifactId>
        dependency>

再次测试
SpringDataRedis_第7张图片

redisTemplate保存对象测试

    @Test
    void testSaveUser() {
        redisTemplate.opsForValue().set("user:100",new User("小红",29));
        User user = (User) redisTemplate.opsForValue().get("user:100");
        System.out.println("user = " + user);
    }

SpringDataRedis_第8张图片
分析
尽管JSON的序列化方式可以满足我们的需求,但依然存在一些问题,如图:
SpringDataRedis_第9张图片为了在反序列化时知道对象的类型,JSON序列化器会将类的class类型写入json结果中,存入Redis,会带来额外的内存开销。

实际开发中使用redis方式(重要)

SpringDataRedis_第10张图片
那为了节约内存,我们在处理Value时不使用GenericJackson2JsonRedisSerializer序列化器,使用RedisSerializer.string序列化器。这样一下,我们只需要在存入数据时,手动的把JAVA对象转变为JSON格式字符串,然后取数据时,再把JSON转回JAVA对象就好了

而StringRedisTemplate它的key和Value默认就是String方式,我们不用自己再去定义RedisTemplate的配置类。
使用StringRedisTemplate详细案例,里面包含了生产项目中使用的工具类
StringRedisTemplate详细案例

项目源码

源码地址

案例来源
黑马程序员Redis入门到实战教程,深度透析redis底层原理

下一篇:springBoot整合redis使用介绍

你可能感兴趣的:(#,redis,redis,java,spring)