SpringBoot——整合Redis

简单介绍

redis是一款key-velue存储结构的内存级NoSQL数据库

    • 支持多种数存储格式
    • 支持持久化
    • 支持集群

简单理解成一个大Map,反正我就是这么理解的。当然他的内部有很多复杂的数据类型和操作,咱们在这里就不过多赘述了。

安装并简单的使用Redis

首先你要操作Redis你得先有Redis的服务,那么第一步就是安装Redis,在Ubuntu中操作如下:

sudo apt update
sudo apt install redis-server

操作完成之后,我们的Redis的服务就已经安装好了,然后就是查看Redis服务的运行状态:

sudo systemctl status redis-server

正常的情况下,你会看到这些提示信息: 这就表示你已经安装完成并且服务已经启动了。

关于Redis的操作,我们这里只介绍一下基本的增删查,要想更深入地学习Redis,那你不应该来这里。

首先我们在控制台上输入命令:redis-cli 就会进入Redis的客户端,在这里可以看到Redis的IP地址和端口号,这里都是保持默认状态的。然后我们在命令行里输入内容:

之前我们说Redis是以键值对的方式存储数据的,那么在这里,set表示插入数据的操作,Redis没有表这些概念,你可以直接开始就操作数据,第二个spring表示键,anythen表示值。也就是说在之后的操作中,我们可以根据spring查到到他对应的只anythen:

get表示获取,根据键获取对应的值,在这里我们用spring获取到了它对应的值anythen。

SpringBoot集成Redis

其实SpringBoot集成任何的第三方技术就那么几个步骤,首先导入坐标,然后编写配置,自动注入操作对象完成操作:

XML 复制代码
<dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency>

上面就是操作redis的坐标,我们在Pom文件中添加这个坐标就可以引入一个操作Redis的对象,然后我们去编写配置文件:

当我们在配置文件中敲上一个redis之后,会弹出很多的提示项,其中中间的redis在前面的都是关于Redis数据库的配置项,其他的不是,其他的都是第三方技术基于Redis的解决方案的配置项,并且我们主要用到的两个配置项host和port都有了默认的配置,也就是我们当前使用的默认配置,所以其实这里的配置不写也行,但是为了演示一下作用,我们现在先加上:

XML 复制代码
spring:
  redis:
    host: localhost
    port: 6379

配置就完成了,然后来到测试类中,对Redis进行一个增加数据和读写数据的测试:

java 复制代码
@SpringBootTest
public class RedisTest {
    @Test
    public void SetTest(@Autowired RedisTemplate redisTemplate){
        ValueOperations value = redisTemplate.opsForValue();
        value.set("springBoot","RedisOnSpringBoot");
    }
    @Test
    public void GetTest(@Autowired RedisTemplate redisTemplate){
        ValueOperations value = redisTemplate.opsForValue();
        Object o = value.get("springBoot");
        System.out.println(o);
    }
}

上面的代码就是通过RedisTemplate去操作Redis的测试代码,其实关键的就是通过自动注入的方式,获取操作Redis的对象RedisTemplate,然后再去获取Redis中不同数据结构的操作对象ops,之后通过ops去添加,查询对象,我们运行两个测试方法,会在控制台中查出我们刚才插入的数据:

在一大堆的配置文件中找到了数据,这个就是我们在测试方法中添加进入的数据。

总结

在SpringBoot集成Redis中,其实就是一个启动服务,然后导入坐标,编写配置,获取RedisTemplate对象操作Redis的过程,其他的操作由于我们没有Redis基础所有我们也没办法做过多的操作,但是最基础的SpringBoot对于Redis的集成到这里就完成了。

两个不同的API

之前我们在控制台里操作了一个数据,然后再SpringBoot环境下又操作了一个值,那么按照道理来想,我既然操作的是一个数据库,那么我无论在哪里应该都能获取到我写入的值对吧,我们在控制台里看一下:

当我想要获取springBoot这个键对应的值的时候,很不幸,查不到,并不是值写错了的问题,而是确确实实的查不到,那么再来SpringBoot中查找我们在控制台操作的值:

和不幸,也没有找到,也就是说我们明明操作的是一个数据库,但是操作的结果谁也查不到谁,那就很奇怪了,这是因为在操作Redis的时候,他提供了两个API供我们使用,一种是我们刚才使用的RedisTemplate,另一种就是专门为了操作字符串而出现的StringRedisTemplate:

java 复制代码
    @Test
    public void GetTest2(@Autowired StringRedisTemplate stringRedisTemplate){
        ValueOperations<String, String> ops = stringRedisTemplate.opsForValue();
        String spring = ops.get("spring");
        System.out.println(spring);
    }

也就是说,这个API才是和我们在控制台上操作的API是同一个,只有通过这个才能查询到刚才我们在控制台中设置的变量,现在我们运行这个新的测试类查看一下运行结果:

现在就能查询到刚才我们在控制台操作的数据了,其实这个API和刚才的API操作的ops是同一个,只不过区别在于两个类的泛型不同:

注意看这里的区别。在没有指定泛型的时候默认的泛型类型是Object也就是对象,只有指定了泛型的类型是String之后才能操作字符串,与控制台保持一致。

具体的区别就是如果你不指定泛型的话,在写入数据库的时候,会将字符当做对象进行序列化,到时候就不是看到的字符串了,而如果指定他为字符串的话,就会不进行序列化直接存储,与控制台的操作等效。

其实手动指定泛型的效果是一样的。

两个客户端

Redis提供了两个客户端,一个是比较老的jedis,以及一个比较新的lettuce,在当前的环境中默认使用的是lettuce,如果你想要切换成jedis,那么你需要进行以下几个方面的修改。

首先导入jedis客户端的坐标:

XML 复制代码
<dependency>
        <groupId>redis.clients</groupId>
        <artifactId>jedis</artifactId>
</dependency>

由于SpringBoot默认维护了jedis的最优的版本,所以在SpringBoot中不需要多写版本号。然后我们需要在配置文件中将客户端的类型修改成jedis:

XML 复制代码
spring:
  redis:
    host: localhost
    port: 6379
    client-type: jedis

然后我们其他的什么都不用改,直接启动刚才做的测试类即可:

如果测试通过,则说明当前操作的客户端已经修改成了jedis,并且运行成功了。

并且在修改了客户端类型之后,可以对相应的客户端进行更加丰富的配置,至于为什么会出现两个客户端,是因为jedis客户端作为早期的客户端,依然还有人在用,而lettcus作为新的客户端,实现的技术不一样,就容易导致在更换客户端技术的时候对老技术有不兼容的可能性,所以除了支持最新的客户端,对于老产品的兼容也是很重要的。

lettcus与jedis的区别:

jedis链接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个链接专用,这样整体性能就大受影响。

lettcus基于Netty框架与Redis服务器连接,底层设计中蚕蛹StatusFulRedisConnection。StatusFulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个链接可以被多线程复用。当然Lettcus也支持多连接实例一起工作。

相关推荐
Themberfue几秒前
Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
java·开发语言·线程·多线程·synchronized·
让学习成为一种生活方式17 分钟前
R包下载太慢安装中止的解决策略-R语言003
java·数据库·r语言
晨曦_子画23 分钟前
编程语言之战:AI 之后的 Kotlin 与 Java
android·java·开发语言·人工智能·kotlin
南宫生1 小时前
贪心算法习题其三【力扣】【算法学习day.20】
java·数据结构·学习·算法·leetcode·贪心算法
Heavydrink1 小时前
HTTP动词与状态码
java
ktkiko111 小时前
Java中的远程方法调用——RPC详解
java·开发语言·rpc
计算机-秋大田1 小时前
基于Spring Boot的船舶监造系统的设计与实现,LW+源码+讲解
java·论文阅读·spring boot·后端·vue
神里大人1 小时前
idea、pycharm等软件的文件名红色怎么变绿色
java·pycharm·intellij-idea
小冉在学习2 小时前
day53 图论章节刷题Part05(并查集理论基础、寻找存在的路径)
java·算法·图论