SpringBoot集成Redis


Redis常用的java客户端:Jedis、lettuce、Redisson
三者区别: https://www.cnblogs.com/liyan492/p/9858548.html
目前最新版本的spring-boot-starter-data-redis同时整合了lettuce和jedis。

Spring Data Redis(SDR):RedisTemplate是Spring Data Redis的一个核心类,RedisTemplate提供一套与客户端无关的api供我们使用,spring-boot-data-redis 内部实现了对Lettuce和jedis两个客户端的封装,具体使用哪个客户端由我们通过配置来选择,但默认使用的是Lettuce【即实际依赖了Lettuce客户端】。如果使用Jedis客户端,就需要先排除Lettuce的jar包,再依赖jedis的jar包。https://www.jianshu.com/p/c7b4cd47ad65

  • RedisTemplate和StringRedisTemplate的区别:
    https://blog.youkuaiyun.com/yifanSJ/article/details/79513179
    (1)StringRedisTemplate继承RedisTemplate,且StringRedisTemplate只支持key和value为String类型
    (2)两者的数据是不共通的;也就是说StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
    (3)Spring Data Redis默认采用的序列化策略有两种,一种是String的序列化策略,一种是JDK的序列化策略。
    StringRedisTemplate默认采用的是String的序列化策略,保存的key和value都是采用此策略序列化保存的。
    RedisTemplate默认采用的是JDK的序列化策略,保存的key和value都是采用此策略序列化保存的。

    要实现JDK序列化策略必须要实现java.io.Serializable接口

Spring Data Redis源码分析

1. SpringBoot整合Jedis

RedisFactory–>RedisConfig–>RestTemplate
spring boot框架中已经集成了redis,在1.x.x的版本时默认使用的jedis客户端,现在是2.x.x版本默认使用的lettuce客户端

  • 添加依赖
<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <version>2.3.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <version>2.3.0.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
        <version>2.3.0.RELEASE</version>
        <exclusions>
            <!--排除lettuce客户端(默认使用lettuce客户端)-->
            <exclusion>
                <artifactId>lettuce-core</artifactId>
                <groupId>io.lettuce</groupId>
            </exclusion>
        </exclusions>
    </dependency>
    <!-- 引入jedis客户端,jedis整合了 -->
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
        <version>3.2.0</version>
    </dependency>
</dependencies>
  • 配置文件
spring:
  redis:
    database: 0
    host: www.onething.top
    port: 6379
    password: 123456
    #配置jedis客户端,这里也可以jedis替换为lettuce客户端,下级配置都一样
    jedis:
      pool:
        # 连接池中的最大空闲连接 默认8
        max-idle: 8
        # 连接池中的最小空闲连接 默认0
        min-idle: 0
        # 连接池最大连接数 默认8 ,负数表示没有限制
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1
        max-wait: -1
    timeout: 3000
  • 配置Redis序列化器
/**
     * @param redisConnectionFactory:配置不同的客户端,这里注入的redis连接工厂不同: JedisConnectionFactory、LettuceConnectionFactory
     * @功能描述 :配置Redis序列化,原因如下:
     * (1) StringRedisTemplate的序列化方式为字符串序列化,
     *      RedisTemplate的序列化方式默为jdk序列化(实现Serializable接口)
     * (2) RedisTemplate的jdk序列化方式在Redis的客户端中为乱码,不方便查看,
     *      因此一般修改RedisTemplate的序列化为方式为JSON方式【建议使用GenericJackson2JsonRedisSerializer】
     */
    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
        GenericJackson2JsonRedisSerializer genericJackson2JsonRedisSerializer = new GenericJackson2JsonRedisSerializer();
        RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
        // key采用String的序列化方式
        redisTemplate.setKeySerializer(StringRedisSerializer.UTF_8);
        // value序列化方式采用jackson
        redisTemplate.setValueSerializer(genericJackson2JsonRedisSerializer);
        // hash的key也采用String的序列化方式
        redisTemplate.setHashKeySerializer(StringRedisSerializer.UTF_8);
        //hash的value序列化方式采用jackson
        redisTemplate.setHashValueSerializer(genericJackson2JsonRedisSerializer);
        redisTemplate.setConnectionFactory(redisConnectionFactory);
        return redisTemplate;
    }

2.Spirng整合Lettuce

  • 添加依赖
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>
        <!-- spring-boot-starter-data-redis支持lettuce、jedis,默认提供了lettuce的依赖-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
            <version>2.3.0.RELEASE</version>
        </dependency>
        <!--配置连接池:使用对象池,每次创建的对象并不实际销毁,而是缓存在对象池中,
        下次使用的时候,不用再重新创建,直接从对象池的缓存中取即可-->
        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-pool2</artifactId>
            <version>2.8.0</version>
        </dependency>
    </dependencies>
  • 配置yml文件
spring:
  redis:
    database: 0
    host: www.onething.top
    port: 6379
    password: 123456nw
    #配置jedis客户端,这里也可以jedis替换为lettuce客户端,下级配置都一样
    jedis:
      pool:
        # 连接池中的最大空闲连接 默认8
        max-idle: 8
        # 连接池中的最小空闲连接 默认0
        min-idle: 0
        # 连接池最大连接数 默认8 ,负数表示没有限制
        max-active: 8
        # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认-1
        max-wait: -1
    timeout: 3000
  • 配置Redis的序列化方式【与jedis相同】

3. RedisTemplate中定义了对5种数据结构操作

redisTemplate.opsForValue();//操作字符串
redisTemplate.opsForHash();//操作hash
redisTemplate.opsForList();//操作list
redisTemplate.opsForSet();//操作set
redisTemplate.opsForZSet();//操作有序set

redis实现目录层级结构存储

在redis中set key的时候把目录层级用冒号连接
在这里插入图片描述

StringRedisTemplate和RedisTemplate的区别

(1)StringRedisTemplate继承了RedisTemplate
(2) 两者的数据是不共通,StringRedisTemplate只能管理StringRedisTemplate里面的数据,RedisTemplate只能管理RedisTemplate中的数据。
(3)StringRedisTemplate默认采用String的序列化策略,保存的key和value都采用此序列化策略序。RedisTemplate默认采用JDK序列化策略,保存的key和value都采用此序列化策略

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值