美文网首页java全栈技术总结技术Code
SpringBoot 整合 Redis,一篇解决“缓存”的所有问

SpringBoot 整合 Redis,一篇解决“缓存”的所有问

作者: 废柴程序员 | 来源:发表于2021-07-20 14:49 被阅读0次

    前言

    这篇博文我们介绍SpringBoot如何整合Redis来访问非关系型数据库,带你深入了解Redis的自动原理,并结合具体案例进行实操,分享所有的源码。

    01 为什么选择Spring Data Redis?

    Spring Data Redis是Spring Data家族中最重要的一分子,它提供了从Spring应用程序轻松配置并访问Redis的功能。它提供了用于与存储交互的低级和高级抽象,使用户摆脱了对基础设施的担忧。

    Spring Framework 是领先的全栈 Java/JEE 应用程序框架。它通过使用依赖注入、AOP 和可移植服务抽象提供了一个轻量级容器和一个非侵入式编程模型。

    Spring Data Redis (SDR) 框架通过 Spring 出色的基础架构支持消除了与存储交互所需的冗余任务和样板代码,从而可以轻松编写使用 Redis 键值存储的 Spring 应用程序。

    image.png

    02 Spring Boot整合Redis

    2.1 导入依赖项

     <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
     </dependency>
    

    自动引入的依赖,如图所示:

    image.png

    2.2 自动配置原理

    自动配置类RedisAutoConfiguration

    image.png
    • RedisProperties属性类,用于对Redis的基本属性配置
    • LettuceConnectionConfiguration、JedisConnectionConfiguration,Redis的客户端类型,其中配置了连接工厂,连接池等,默认为Lettuce,底层引入了Lettuce客户端jar包
    • 自动注入了RedisTemplate**<Object, **Object> : xxxTemplate;自动注入了StringRedisTemplate;k:v都是String

    底层只要我们使用StringRedisTemplate、RedisTemplate就可以操作redis

    2.3 默认整合Lettuce

    2.3.1 添加配置

    server:
      port: 8083
    
    spring:
      application:
        name: springboot-redis
      redis:
        # Redis服务器地址
        host: localhost
        # Redis服务器连接端口
        port: 6379
        # Redis服务器连接密码(默认为空)
        password:
        # Redis数据库索引(默认为0)
        database: 0
      # 连接超时时间(毫秒)
        timeout : 300
        client-type: lettuce #切换jedis客户端,改成jedis
        lettuce: #切换jedis客户端,改成jedis
          pool:
            # 连接池最大连接数(使用负值表示没有限制)
            max-active: 8
            # 连接池最大阻塞等待时间(使用负值表示没有限制)
            max-wait: -1
            # 连接池中的最大空闲连接
            max-idle: 8
            # 连接池中的最小空闲连接
            min-idle: 0
    

    2.4 切换至Jedis

    2.4.1 导入jar

    <!--导入jedis-->        
    <dependency>            
        <groupId>redis.clients</groupId>            
        <artifactId>jedis</artifactId>        
    </dependency>
    

    注意:配置基本同上,只需要将lettuce换成jedis即可。

    2.5 配置序列化方式

    RedisTemplate默认的序列化方式为JdkSerializationRedisSerializer,会把对象序列化存储到Redis中(二进制形式),StringRedisTemplate的默认序列化方式为StringRedisSerializer。绝大多数情况下,不推荐使用 JdkSerializationRedisSerializer 进行序列化,主要是不方便人工排查数据。所以我们需要切换序列化方式。

    Spring Data底层为我们实现了七种不同的序列化方式,大家可以根据需要进行选择,如下图所示:

    image.png

    我们以Jackson2JsonRedisSerializer为例,展示如何切换序列化方式。

    @Configuration
    public class RedisConfig {
    
        /**
         * 默认是JDK的序列化策略,这里配置redisTemplate采用的是Jackson2JsonRedisSerializer的序列化策略
         * @param redisConnectionFactory
         * @return
         */
        @Bean
        public RedisTemplate<String,Object> redisTemplate(RedisConnectionFactory redisConnectionFactory){
            //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值(默认使用JDK的序列化方式)
            Jackson2JsonRedisSerializer<Object> jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer<>(Object.class);
            RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
            // 配置连接工厂
            redisTemplate.setConnectionFactory(redisConnectionFactory);
            //使用StringRedisSerializer来序列化和反序列化redis的key值
            //redisTemplate.setKeySerializer(new StringRedisSerializer());
            redisTemplate.setKeySerializer(jackson2JsonRedisSerializer);
            // 值采用json序列化
            redisTemplate.setValueSerializer(jackson2JsonRedisSerializer);
            redisTemplate.setHashKeySerializer(jackson2JsonRedisSerializer);
            redisTemplate.setHashValueSerializer(jackson2JsonRedisSerializer);
            redisTemplate.afterPropertiesSet();
            return redisTemplate;
        }
    
        /***
         * stringRedisTemplate默认采用的是String的序列化策略
         * @param redisConnectionFactory
         * @return
         */
        @Bean
        public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory){
            StringRedisTemplate stringRedisTemplate = new StringRedisTemplate();
            stringRedisTemplate.setConnectionFactory(redisConnectionFactory);
            return stringRedisTemplate;
        }
    
    }
    

    03 代码示例

    我为广大粉丝朋友提供了详细使用案例,以便更好地学习Redis。只展示其中一部分的代码,更加详细的代码,大家可以通过源码地址来查看。

    @SpringBootTest
    public class RedisApplicationTests {
    
        @Autowired
        private RedisTemplate redisTemplate;
    
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
    
        @Test
        void testRedis(){
            ValueOperations<String, String> operations = redisTemplate.opsForValue();
    
            operations.set("hello","world");
    
            String hello = operations.get("hello");
            System.out.println(hello);
        }
    
        /**
         * 操作字符串
         */
        @Test
        public void testString() {
            //设置值
            stringRedisTemplate.opsForValue().set("String", "Mao");
            //获取值
            String string = stringRedisTemplate.opsForValue().get("String");
            System.out.println(string);
    
            //设置值且设置超时时间
            stringRedisTemplate.opsForValue().set("Middle", "Yu", 3, TimeUnit.MINUTES);
            String middle = stringRedisTemplate.opsForValue().get("Middle");
            System.out.println(middle);
    
            //删除数据
            Boolean isDelete = stringRedisTemplate.delete("String");
            Assert.isTrue(isDelete, "删除失败");
        }
    
        /**
         * 操作列表
         */
        @Test
        public void testList() {
            ListOperations listOp = redisTemplate.opsForList();
            //往 List 左侧插入一个元素
            listOp.leftPush("nameList", "mike");
            listOp.leftPush("nameList", "kim");
            //往 List 右侧插入一个元素
            listOp.rightPush("nameList", "jimmy");
            listOp.rightPush("nameList", "chuck");
            //List 大小
            Long size = listOp.size("nameList");
            //遍历整个List
            List nameList1 = listOp.range("nameList", 0, size);
            System.out.println(JSON.toJSONString(nameList1));
            //遍历整个List,-1表示倒数第一个即最后一个
            List nameList = listOp.range("nameList", 0, -1);
            System.out.println(JSON.toJSONString(nameList));
            //从 List 左侧取出第一个元素,并移除
            Object name1 = listOp.leftPop("nameList", 200, TimeUnit.MILLISECONDS);
            System.out.println("is kim:" + name1.equals("kim"));
            //从 List 右侧取出第一个元素,并移除
            Object name2 = listOp.rightPop("nameList");
            System.out.println("is chuck:" + name2.equals("chuck"));
        }
    
        。。。。。。开源项目中还有内容哦。。。。。。
    
    }
    
    

    本文示例读者可以通过查看下面仓库中的项目,如下所示:

    <module>springboot-redis</module>
    

    作者:程序猿小亮
    原文链接:https://blog.csdn.net/jiuqiyuliang/article/details/118677483?spm=1001.2014.3001.5502

    相关文章

      网友评论

        本文标题:SpringBoot 整合 Redis,一篇解决“缓存”的所有问

        本文链接:https://www.haomeiwen.com/subject/lqtrmltx.html