SpringBoot集成Redis并实现主从架构

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: SpringBoot集成Redis并实现主从架构

hello,你好呀,我是灰小猿,一个超会写bug的程序猿!

今天这篇文章来和大家分享一下在springboot中如何集成redis,并实现主从架构,进行数据的简单存储。

在这里插入图片描述

我的Redis是部署在Windows系统下面的,所以在这里附上Redis在Windows环境下的安装地址和安装说明。

一、Windows环境下安装Redis

首先去官网下载Redis的安装包,官方下载地址:
https://github.com/tporadowski/redis/releases
在其中选择当前版本即可。

下载之后解压压缩包,得到这样的文件目录:

打开cmd命令行,切换到该redis的文件目录下。运行:

redis-server.exe redis.windows.conf

输入之后,显示这样的页面就说明Redis服务器运行成功了!

这个时候这个命令行窗口不要关闭,一旦关闭,Redis服务就停止了!这一点以后在开发的时候也是一样的,需要注意!
现在打开一个新的cmd窗口,同样定位到Redis的目录下,
运行如下命令:
redis-cli.exe -h 127.0.0.1 -p 6379

运行这个命令的原因是连接到redis的服务器,其中的地址为本地地址,6379为redis的默认端口号,

设置键值对

因为我们知道Redis中数据的存储都是以键值对的形式来到的,所以我们可以以键值对的形式来在Redis中存储一个数据,书写格式如下

set key value

比如存储key为Mykey,value为huixiaoyuan的内容,则输入

set Mykey huixiaoyuan

根据key获取value

根据key来获取value,我们可以直接以get的形式获取。
如获取我们刚才设置的key为Mykey的value值,那么直接:

get Mykey

就可以获取到对应的value值了,

这样在Windows环境下Redis的安装就算是完成了,以后在使用的过程中记得,Redis的窗口不要关闭就可以了。

二、SpringBoot连接Redis

springboot连接Redis时需要在pom文件中导入所需的jar包依赖,依赖如下:

        <!-- 加入jedis依赖 -->
        <dependency>
            <groupId>redis.clients</groupId>
            <artifactId>jedis</artifactId>
            <version>2.9.0</version>
        </dependency>

(1)使用Jedis类直接连接Redis服务器

在springboot环境下连接redis的方法有很多,首先最简单的就是直接通过jedis类来连接,

jedis类就相当于是redis的客户端表示。

连接方法如下:

    /**
     * redis连接测试01
     */
    @Test
    public void redisTest01() {
        //连接本地的 Redis 服务
        Jedis jedis = new Jedis("localhost");
        // 如果 Redis 服务设置了密码,需要用下面这行代码输入密码
        // jedis.auth("123456"); 
        System.out.println("连接成功");
        //查看服务是否运行
        System.out.println("服务正在运行: "+jedis.ping());
    }

运行后结果:


通过这种方式进行连接时,springboot会自动的去本地寻找redis服务器进行连接,如果没有找到那么就会报错,

如果你去阅读jedis的底层源码,你会发现Jedis类有多种构造方法,
常用的几个是

使用默认地址和端口

//不传值,那么使用默认的127.0.0.1地址,6379端口就访问
public Jedis()

使用指定地址和默认端口

//只传入目的地址,那么使用指定的地址和默认的端口号去访问
public Jedis(String host)

使用指定地址和端口

//传入目的地址和端口号,那么使用指定的地址和端口号去访问
public Jedis(String host, int port)

(2)通过配置文件进行连接

在springboot中,当然是可以通过配置文件的形式来设置各种连接参数了,Redis也是一样的,


在yml文件中进行如下配置:

注意:这是没有使用连接池的,如果使用连接池,需要在下边增加配置,关于使用连接池的可以继续往下看。
##redis配置信息
spring:
  redis:
    database: 0 #redis数据库索引,默认为0
    host: 127.0.0.1 #redis服务器地址
    port: 6379 #redis服务器连接端口
    password: #redis服务器连接密码,默认为null
    timeout: 5000 #redis连接超时时间

通过配置文件来进行配置之后,我们就可以使用springboot中的一个工具类来操作Redis的操作了,springboot会自动读取配置文件中的配置信息,然后通过该配置信息去连接Redis服务器,springboot中提供操作Redis的工具类有两个,分别是:StringRedisTemplate和RedisTemplate,

StringRedisTemplate和RedisTemplate的区别如下

  • 在进行序列化时,RedisTemplate使用的是 JdkSerializationRedisSerializer,而StringRedisTemplate使用的是StringRedisSerializer
  • StringRedisTemplate继承了RedisTemplate<String,String>,而RedisTemplate 定义为 RedisTemplate<K, V>,所有StringRedisTemplate就限定了K,V为String类型的

相同处体现在他们对Redis的操作上,

RedisTemplate和StringRedisSerializer都定义了五种对Redis的操作,分别对应这Redis中的五种数据类型。

redisTemplate.opsForValue();  //操作字符串
redisTemplate.opsForHash();   //操作hash
redisTemplate.opsForList();   //操作list
redisTemplate.opsForSet();    //操作set
redisTemplate.opsForZSet();   //操作有序set
那么在使用的时候,这两个类应该如何选择呢?

如果你的redis数据库里面本来存的是字符串数据,或者你要存取的数据就是字符串类型数据的时候,那么你就使用StringRedisTemplate即可,

》但是如果你的数据是复杂的对象类型,而取出的时候又不想做任何的数据转换,直接从Redis里面取出一个对象,那么使用RedisTemplate是更好的选择。

接下来我以StringRedisSerializer为例子,来给大家演示一下使用StringRedisSerializer操作Redis的方法,

    /**
     * springboot主从连接测试,
     * 使用springRedisTemplate操作
     */
    @Test
    public void redisTest06() {
//        操作字符型
        stringRedisTemplate.opsForValue().set("test06","Test06");
        System.out.println(stringRedisTemplate.opsForValue().get("test06"));

//        设置key的过期时间,30秒
        stringRedisTemplate.expire("test06", 30 * 1000, TimeUnit.MILLISECONDS);

//        根据key获取过期时间
        Long test06ExpireTime = stringRedisTemplate.getExpire("test06");
        System.out.println("根据key获取过期时间:" + test06ExpireTime);

//        根据key获取过期时间,并且换算成指定单位
        Long test06ExpireTimeToUnit = stringRedisTemplate.getExpire("test06", TimeUnit.SECONDS);
        System.out.println("根据key获取过期时间,并且换算成指定单位:" + test06ExpireTimeToUnit);

//        检查key是否存在,返回布尔类型
        Boolean test06IsExist = stringRedisTemplate.hasKey("test06");
        System.out.println("检查key是否存在,返回布尔类型:" + test06IsExist);

    }

在上面的操作中,有一点关于获取和设置key过期时间的操作,当时在操作的时候对其进行了一下探究,在这里分享给大家

stringRedisTemplate中获取过期时间的getExpire()方法的说明

如果最开始没有设置过期时间,那么就返回-1,数据在没有达到Redis数据最大限额的情况下会一直存在.

如果设置了过期时间,但是数据还未过期,就返回剩余时间,如果到了过期时间,那么数据会被删除
如果数据被删除或者不存在,那么就返回-2.

三、使用连接池操作Redis

和使用mysql数据库一样,Redis在springboot中也是有连接池的,上面在yml中写入配置文件的时候,我有和大家说过可以在yml配置文件中写入连接池参数,那么配置如下:

##redis配置信息
spring:
  redis:
    database: 0 #redis数据库索引,默认为0
    host: 127.0.0.1 #redis服务器地址
    port: 6379 #redis服务器连接端口
    password: #redis服务器连接密码,默认为null
    timeout: 5000 #redis连接超时时间
    jedis:
      pool: #连接池配置
        max-active: 8 #连接池最大连接数
        max-wait: -1 #连接池最大阻塞等待时间
        max-idle: 8 #连接池中的最大空闲连接数
        min-idle: 0 #连接池中的最小空闲连接数

使用连接池时还有一种不需要写入配置文件的方法,使用这种方法就需要在构造函数中传入参数。
并且将配置信息写入到配置类中,

当然,在进行实际的项目开发的时候,还是将配置信息写入到配置文件中会好一点。

    /**
     * redis连接测试01
     * 建立简单主从架构
     */
    @Test
    public void redisTest02() {
//        配置redis连接池
        JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//        在指定时刻通过连接池能够获取到的最大的jedis的数量
        jedisPoolConfig.setMaxTotal(20);
//        最大空闲jedis的数量
        jedisPoolConfig.setMaxIdle(10);
//        最小空闲jedis的数量
        jedisPoolConfig.setMinIdle(5);

//        建立redis连接池,设置本地地址,端口号,连接超时时间和读写超时时间,如果没有连接密码,那么久为null
        JedisPool jedisPool = new JedisPool(jedisPoolConfig, "127.0.0.1", 6379, 300, null);

//        新建一个jedis,jedis:redis在Java中的客户端实现
        Jedis jedis = null;
        try {
//            从连接池中获取到一个jedis资源
            jedis = jedisPool.getResource();
//            设置key-value,并获取value
            System.out.println(jedis.set("hxy", "888"));
            System.out.println(jedis.get("hxy"));
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
//            注意!!这里不是关闭连接,只是将jedis归还到连接池
            if (jedis != null) {
                jedis.close();
            }
        }

    }

以上是不使用配置文件的情况下,将参数传入到Jdispool类中来实现连接池的,如果使用了配置文件,那么直接调用Jdispool的无参构造即可了,其他的操作和上面代码的都是一样的,我就不重复写了。


最后在操作完的时候,别忘了使用jedis.close();将jedis归还到连接池即可!

关于springboot连接Redis的操作,就先分享这些,当然Redis的操作肯定远远不止这些,之后小猿慢慢和大家分享吧!


**一键三连加关注,灰小猿带你上高速!

我是灰小猿,我们下期见呀!**

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
22天前
|
存储 缓存 NoSQL
深入理解Django与Redis的集成实践
深入理解Django与Redis的集成实践
46 0
|
15天前
|
缓存 Devops jenkins
专家视角:构建可维护的测试架构与持续集成
【10月更文挑战第14天】在现代软件开发过程中,构建一个可维护且易于扩展的测试架构对于确保产品质量至关重要。本文将探讨如何设计这样的测试架构,并将单元测试无缝地融入持续集成(CI)流程之中。我们将讨论最佳实践、自动化测试部署、性能优化技巧以及如何管理和扩展日益增长的测试套件规模。
38 3
|
29天前
|
NoSQL Java Redis
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
这篇文章介绍了Redis的基本命令,并展示了如何使用Netty框架直接与Redis服务器进行通信,包括设置Netty客户端、编写处理程序以及初始化Channel的完整示例代码。
37 1
redis的基本命令,并用netty操作redis(不使用springboot或者spring框架)就单纯的用netty搞。
|
29天前
|
缓存 NoSQL Java
springboot的缓存和redis缓存,入门级别教程
本文介绍了Spring Boot中的缓存机制,包括使用默认的JVM缓存和集成Redis缓存,以及如何配置和使用缓存来提高应用程序性能。
77 1
springboot的缓存和redis缓存,入门级别教程
|
14天前
|
缓存 NoSQL Java
Spring Boot与Redis:整合与实战
【10月更文挑战第15天】本文介绍了如何在Spring Boot项目中整合Redis,通过一个电商商品推荐系统的案例,详细展示了从添加依赖、配置连接信息到创建配置类的具体步骤。实战部分演示了如何利用Redis缓存提高系统响应速度,减少数据库访问压力,从而提升用户体验。
40 2
|
23天前
|
JSON NoSQL Java
springBoot:jwt&redis&文件操作&常见请求错误代码&参数注解 (九)
该文档涵盖JWT(JSON Web Token)的组成、依赖、工具类创建及拦截器配置,并介绍了Redis的依赖配置与文件操作相关功能,包括文件上传、下载、删除及批量删除的方法。同时,文档还列举了常见的HTTP请求错误代码及其含义,并详细解释了@RequestParam与@PathVariable等参数注解的区别与用法。
|
1天前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
16 0
|
22天前
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
21 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
1月前
|
缓存 NoSQL Java
Springboot自定义注解+aop实现redis自动清除缓存功能
通过上述步骤,我们不仅实现了一个高度灵活的缓存管理机制,还保证了代码的整洁与可维护性。自定义注解与AOP的结合,让缓存清除逻辑与业务逻辑分离,便于未来的扩展和修改。这种设计模式非常适合需要频繁更新缓存的应用场景,大大提高了开发效率和系统的响应速度。
46 2
|
2月前
|
JSON NoSQL Java
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)
这篇文章介绍了在Java中使用Redis客户端的几种方法,包括Jedis、SpringDataRedis和SpringBoot整合Redis的操作。文章详细解释了Jedis的基本使用步骤,Jedis连接池的创建和使用,以及在SpringBoot项目中如何配置和使用RedisTemplate和StringRedisTemplate。此外,还探讨了RedisTemplate序列化的两种实践方案,包括默认的JDK序列化和自定义的JSON序列化,以及StringRedisTemplate的使用,它要求键和值都必须是String类型。
redis的java客户端的使用(Jedis、SpringDataRedis、SpringBoot整合redis、redisTemplate序列化及stringRedisTemplate序列化)