• 【SpringBoot整合NoSql】-----Redis篇


    本专栏将从基础开始,循序渐进,以实战为线索,逐步深入SpringBoot相关知识相关知识,打造完整的SpringBoot学习步骤,提升工程化编码能力和思维能力,写出高质量代码。希望大家都能够从中有所收获,也请大家多多支持。
    专栏地址:SpringBoot专栏
    本文涉及的代码都已放在gitee上:gitee地址
    如果文章知识点有错误的地方,请指正!大家一起学习,一起进步。
    专栏汇总:专栏汇总

    SpringBoot整合Redis

    ​ Redis是一款采用key-value数据存储格式的内存级NoSQL数据库,重点关注数据存储格式,是key-value格式,也就是键值对的存储形式。与MySQL数据库不同,MySQL数据库有表、有字段、有记录,Redis没有这些东西,就是一个名称对应一个值,并且数据以存储在内存中使用为主。什么叫以存储在内存中为主?其实Redis有它的数据持久化方案,分别是RDB和AOF,但是Redis自身并不是为了数据持久化而生的,主要是在内存中保存数据,加速数据访问的,所以说是一款内存级数据库。

    ​ Redis支持多种数据存储格式,比如可以直接存字符串,也可以存一个map集合,list集合,后面会涉及到一些不同格式的数据操作,这个需要先学习一下才能进行整合,所以在基本操作中会介绍一些相关操作。下面就先安装,再操作,最后说整合

    安装

    ​ windows版安装包下载地址:https://github.com/tporadowski/redis/releases

    ​ 下载的安装包有两种形式,一种是一键安装的msi文件,还有一种是解压缩就能使用的zip文件,哪种形式都行,这里就不介绍安装过程了,本课程采用的是msi一键安装的msi文件进行安装的。

    ​ 啥是msi,其实就是一个文件安装包,不仅安装软件,还帮你把安装软件时需要的功能关联在一起,打包操作。比如如安装序列、创建和设置安装路径、设置系统依赖项、默认设定安装选项和控制安装过程的属性。说简单点就是一站式服务,安装过程一条龙操作一气呵成,就是为小白用户提供的软件安装程序。

    ​ 安装完毕后会得到如下文件,其中有两个文件对应两个命令,是启动Redis的核心命令,需要再cmd命令行模式执行。
    在这里插入图片描述

    启动服务器

    redis-server.exe redis.windows.conf
    
    • 1

    ​ 初学者无需调整服务器对外服务端口,默认6379。

    启动客户端

    redis-cli.exe
    
    • 1

    ​ 如果启动redis服务器失败,可以先启动客户端,然后执行shutdown操作后退出,此时redis服务器就可以正常执行了。

    基本操作

    ​ 服务器启动后,使用客户端就可以连接服务器,类似于启动完MySQL数据库,然后启动SQL命令行操作数据库。

    ​ 放置一个字符串数据到redis中,先为数据定义一个名称,比如name,age等,然后使用命令set设置数据到redis服务器中即可

    以下操作在redis-cli中操作:

    set name hashnode
    set age 12
    
    • 1
    • 2

    ​ 从redis中取出已经放入的数据,根据名称取,就可以得到对应数据。如果没有对应数据就会得到(nil)

    get name
    get age
    
    • 1
    • 2

    ​ 以上使用的数据存储是一个名称对应一个值,如果要维护的数据过多,可以使用别的数据存储结构。例如hash,它是一种一个名称下可以存储多个数据的存储模型,并且每个数据也可以有自己的二级存储名称。向hash结构中存储数据格式如下:

    hset a a1 aa1		#对外key名称是a,在名称为a的存储模型中,a1这个key中保存了数据aa1
    hset a a2 aa2
    
    • 1
    • 2

    ​ 获取hash结构中的数据命令如下

    hget a a1			#得到aa1
    hget a a2			#得到aa2
    
    • 1
    • 2

    ​ 有关redis的基础操作就普及到这里。

    整合

    ​ 在进行整合之前先梳理一下整合的思想,springboot整合任何技术其实就是在springboot中使用对应技术的API。如果两个技术没有交集,就不存在整合的概念了。所谓整合其实就是使用springboot技术去管理其他技术,几个问题是躲不掉的。

    ​ 第一,需要先导入对应技术的坐标,而整合之后,这些坐标都有了一些变化

    ​ 第二,任何技术通常都会有一些相关的设置信息,整合之后,这些信息如何写,写在哪是一个问题

    ​ 第三,没有整合之前操作如果是模式A的话,整合之后如果没有给开发者带来一些便捷操作,那整合将毫无意义,所以整合后操作肯定要简化一些,那对应的操作方式自然也有所不同

    ​ 按照上面的三个问题去思考springboot整合所有技术是一种通用思想,在整合的过程中会逐步摸索出整合的套路,而且适用性非常强,经过若干种技术的整合后基本上可以总结出一套固定思维。

    ​ 下面就开始springboot整合redis,操作步骤如下:

    步骤①:导入springboot整合redis的starter坐标

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4

    ​ 上述坐标可以在创建模块的时候通过勾选的形式进行选择,归属NoSQL分类中

    在这里插入图片描述

    步骤②:进行基础配置

    spring:
      redis:
        host: localhost
        port: 6379
    
    • 1
    • 2
    • 3
    • 4

    ​ 操作redis,最基本的信息就是操作哪一台redis服务器,所以服务器地址属于基础配置信息,不可缺少。但是即便你不配置,目前也是可以用的。因为以上两组信息都有默认配置,刚好就是上述配置值。

    步骤③:使用springboot整合redis的专用客户端接口操作,此处使用的是RedisTemplate

    @SpringBootTest
    class Springboot16RedisApplicationTests {
        @Autowired
        private RedisTemplate redisTemplate;
        @Test
        void set() {
            ValueOperations ops = redisTemplate.opsForValue();
            ops.set("age",41);
        }
        @Test
        void get() {
            ValueOperations ops = redisTemplate.opsForValue();
            Object age = ops.get("name");
            System.out.println(age);
        }
        @Test
        void hset() {
            HashOperations ops = redisTemplate.opsForHash();
            ops.put("info","b","bb");
        }
        @Test
        void hget() {
            HashOperations ops = redisTemplate.opsForHash();
            Object val = ops.get("info", "b");
            System.out.println(val);
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28

    ​ 在操作redis时,需要先确认操作何种数据,根据数据种类得到操作接口。例如使用opsForValue()获取string类型的数据操作接口,使用opsForHash()获取hash类型的数据操作接口,剩下的就是调用对应api操作了。各种类型的数据操作接口如下:
    在这里插入图片描述

    总结

    1. springboot整合redis步骤
      1. 导入springboot整合redis的starter坐标
      2. 进行基础配置
      3. 使用springboot整合redis的专用客户端接口RedisTemplate操作

    StringRedisTemplate

    ​ 由于redis内部不提供java对象的存储格式,因此当操作的数据以对象的形式存在时,会进行转码,转换成字符串格式后进行操作。也就是说RedisTemplate会将key进行序列化,如下图所示:

    image-20220620192650700

    为了方便开发者使用基于字符串为数据的操作,springboot整合redis时提供了专用的API接口StringRedisTemplate,你可以理解为这是RedisTemplate的一种指定数据泛型的操作API。

    @SpringBootTest
    public class StringRedisTemplateTest {
        @Autowired
        private StringRedisTemplate stringRedisTemplate;
        @Test
        void get(){
            ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
            String name = ops.get("name");
            System.out.println(name);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    redis客户端选择

    springboot整合redis技术提供了多种客户端兼容模式,默认提供的是lettucs客户端技术,也可以根据需要切换成指定客户端技术,例如jedis客户端技术,切换成jedis客户端技术操作步骤如下:

    步骤①:导入jedis坐标,排除默认的lettuce

            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis-reactive</artifactId>
    
                <!-- 对于 SpringBoot 2.4.1以前的版本,如果要使用jedis,则去掉默认的lettuce,再引入redis client,这样就会默认使用jedis
    			在 SpringBoot 2.4.1以后,在yml中用client-type进行指定即可,后面会进行讲解-->
                <exclusions>
                    <exclusion>
                        <groupId>io.lettuce</groupId>
                        <artifactId>lettuce-core</artifactId>
                    </exclusion>
                </exclusions>
    
            </dependency>
    
    <dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
    </dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    ​ jedis坐标受springboot管理,无需提供版本号

    步骤②:配置客户端技术类型,设置为jedis

    spring:
      redis:
        host: localhost
        port: 6379
         # SpringBoot 2.4.1 后才有client-type
        client-type: jedis
    #    client-type: lettuce
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    步骤③:根据需要设置对应的配置

    spring:
      application:
        name: springboot_0015_redis_test
      redis:
        host: localhost
        port: 6379
        client-type: jedis
        jedis:
          pool:
            max-active: 16
    #    client-type: lettuce
    #    lettuce:
    #      pool:
    #        max-active: 16
    
    server:
      port:
        8080
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    lettcus与jedis区别

    • jedis连接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个连接专用,这样整体性能就大受影响
    • lettcus基于Netty框架进行与Redis服务器连接,底层设计中采用StatefulRedisConnection。 StatefulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个连接可以被多线程复用。当然lettcus也支持多连接实例一起工作

    总结

    1. springboot整合redis提供了StringRedisTemplate对象,以字符串的数据格式操作redis
    2. 如果需要切换redis客户端实现技术,可以通过配置的形式进行
  • 相关阅读:
    Excel大量表格选择,快速定位表格
    智慧运维解决方案-最新全套文件
    低代码会使初级码农失业吗?
    ESP32-SPI接口bl0942驱动
    SPI 协议学习
    java健身房管理系统源码(springboot)
    Django设置中文
    三分钟了解TMS系统和WMS仓库管理软件,教你玩转供应链
    js实现PDF 预览和文件下载
    阿里云e实例服务器3M固定带宽40G ESSD entry系统盘99元/年
  • 原文地址:https://blog.csdn.net/Learning_xzj/article/details/125433127