IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> SpringBoot整合Redis,一篇解决缓存的所有问题 -> 正文阅读

[Java知识库]SpringBoot整合Redis,一篇解决缓存的所有问题

前言

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

为什么选择Spring Data Redis

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

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

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

Spring Boot整合Redis

导入依赖项

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

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

在这里插入图片描述

自动配置原理

自动配置类RedisAutoConfiguration

在这里插入图片描述

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

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

默认整合Lettuce

添加配置

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

切换至Jedis

导入jar

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

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

配置序列化方式

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

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

在这里插入图片描述

我们以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;
    }

}

代码示例

我为广大粉丝朋友提供了详细使用案例,以便更好的学习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>
  • CodeChina: https://codechina.csdn.net/jiuqiyuliang/springboot-learning

如果您对这些感兴趣,欢迎star、follow、收藏、转发给予支持!


作者:程序猿小亮

博主写作不易,加个关注呗

求关注、求点赞,加个关注不迷路,感谢

点赞是对我最大的鼓励
↓↓↓↓↓↓

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2021-07-16 21:56:32  更:2021-07-16 21:56:36 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/18 17:46:44-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码