SpringBoot——整合Redis
作者:mmseoamin日期:2023-12-20

简单介绍

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

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

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

    SpringBoot——整合Redis,第2张

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

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

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

    SpringBoot集成Redis

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

    
            org.springframework.boot
            spring-boot-starter-data-redis
    

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

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

    spring:
      redis:
        host: localhost
        port: 6379

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

    @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);
        }
    }

    SpringBoot——整合Redis,第6张

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

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

    总结 

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

    两个不同的API

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

    SpringBoot——整合Redis,第8张

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

    SpringBoot——整合Redis,第9张

    SpringBoot——整合Redis,第10张

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

        @Test
        public void GetTest2(@Autowired StringRedisTemplate stringRedisTemplate){
            ValueOperations ops = stringRedisTemplate.opsForValue();
            String spring = ops.get("spring");
            System.out.println(spring);
        }

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

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

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

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

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

    两个客户端

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

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

    
            redis.clients
            jedis
    

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

    spring:
      redis:
        host: localhost
        port: 6379
        client-type: jedis

    然后我们其他的什么都不用改,直接启动刚才做的测试类即可:SpringBoot——整合Redis,第14张

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

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

    lettcus与jedis的区别:

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

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