redis是一款key-velue存储结构的内存级NoSQL数据库
简单理解成一个大Map,反正我就是这么理解的。当然他的内部有很多复杂的数据类型和操作,咱们在这里就不过多赘述了。
首先你要操作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集成任何的第三方技术就那么几个步骤,首先导入坐标,然后编写配置,自动注入操作对象完成操作:
org.springframework.boot spring-boot-starter-data-redis
上面就是操作redis的坐标,我们在Pom文件中添加这个坐标就可以引入一个操作Redis的对象,然后我们去编写配置文件:
当我们在配置文件中敲上一个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); } }
上面的代码就是通过RedisTemplate去操作Redis的测试代码,其实关键的就是通过自动注入的方式,获取操作Redis的对象RedisTemplate,然后再去获取Redis中不同数据结构的操作对象ops,之后通过ops去添加,查询对象,我们运行两个测试方法,会在控制台中查出我们刚才插入的数据:
在一大堆的配置文件中找到了数据,这个就是我们在测试方法中添加进入的数据。
在SpringBoot集成Redis中,其实就是一个启动服务,然后导入坐标,编写配置,获取RedisTemplate对象操作Redis的过程,其他的操作由于我们没有Redis基础所有我们也没办法做过多的操作,但是最基础的SpringBoot对于Redis的集成到这里就完成了。
之前我们在控制台里操作了一个数据,然后再SpringBoot环境下又操作了一个值,那么按照道理来想,我既然操作的是一个数据库,那么我无论在哪里应该都能获取到我写入的值对吧,我们在控制台里看一下:
当我想要获取springBoot这个键对应的值的时候,很不幸,查不到,并不是值写错了的问题,而是确确实实的查不到,那么再来SpringBoot中查找我们在控制台操作的值:
和不幸,也没有找到,也就是说我们明明操作的是一个数据库,但是操作的结果谁也查不到谁,那就很奇怪了,这是因为在操作Redis的时候,他提供了两个API供我们使用,一种是我们刚才使用的RedisTemplate,另一种就是专门为了操作字符串而出现的StringRedisTemplate:
@Test public void GetTest2(@Autowired StringRedisTemplate stringRedisTemplate){ ValueOperationsops = stringRedisTemplate.opsForValue(); String spring = ops.get("spring"); System.out.println(spring); }
也就是说,这个API才是和我们在控制台上操作的API是同一个,只有通过这个才能查询到刚才我们在控制台中设置的变量,现在我们运行这个新的测试类查看一下运行结果:
现在就能查询到刚才我们在控制台操作的数据了,其实这个API和刚才的API操作的ops是同一个,只不过区别在于两个类的泛型不同:
注意看这里的区别。在没有指定泛型的时候默认的泛型类型是Object也就是对象,只有指定了泛型的类型是String之后才能操作字符串,与控制台保持一致。
具体的区别就是如果你不指定泛型的话,在写入数据库的时候,会将字符当做对象进行序列化,到时候就不是看到的字符串了,而如果指定他为字符串的话,就会不进行序列化直接存储,与控制台的操作等效。
其实手动指定泛型的效果是一样的。
Redis提供了两个客户端,一个是比较老的jedis,以及一个比较新的lettuce,在当前的环境中默认使用的是lettuce,如果你想要切换成jedis,那么你需要进行以下几个方面的修改。
首先导入jedis客户端的坐标:
redis.clients jedis
由于SpringBoot默认维护了jedis的最优的版本,所以在SpringBoot中不需要多写版本号。然后我们需要在配置文件中将客户端的类型修改成jedis:
spring: redis: host: localhost port: 6379 client-type: jedis
然后我们其他的什么都不用改,直接启动刚才做的测试类即可:
如果测试通过,则说明当前操作的客户端已经修改成了jedis,并且运行成功了。
并且在修改了客户端类型之后,可以对相应的客户端进行更加丰富的配置,至于为什么会出现两个客户端,是因为jedis客户端作为早期的客户端,依然还有人在用,而lettcus作为新的客户端,实现的技术不一样,就容易导致在更换客户端技术的时候对老技术有不兼容的可能性,所以除了支持最新的客户端,对于老产品的兼容也是很重要的。
jedis链接Redis服务器是直连模式,当多线程模式下使用jedis会存在线程安全问题,解决方案可以通过配置连接池使每个链接专用,这样整体性能就大受影响。
lettcus基于Netty框架与Redis服务器连接,底层设计中蚕蛹StatusFulRedisConnection。StatusFulRedisConnection自身是线程安全的,可以保障并发访问安全问题,所以一个链接可以被多线程复用。当然Lettcus也支持多连接实例一起工作。