Spring Data Redis的基本使用和应用场景

前言

近来在项目中有用到Spring Data Redis,顺便研究了一下API,中间仍是有些许坑的。因为前期有接触过Jedis和Reddison,因此对Redis的数据结构并不陌生,上手仍是很快的。本文主要是记录了本身研究API的一些单元测试以及一些须要注意的点,对Redis数据结构不太清晰的小伙伴得先补充数据结构这块的知识点。下面我将分别对String、Hash、List、Set、ZSet这五种数据结构操做的API进行讲解。git


PS:因为在RedisTemplate中,ValueOperationsBoundValueOperations这种都是一一对应的关系。BoundValueOperations只不过是先绑定key,再进行操做的,因此本文会着重分析ValueOperations这样的操做类的API。github

ValueOperations操做

从名字上来看,大概能够猜想出这个类是操做String数据类型的操做类。
这里我会介绍大部分API的使用,以及能够用在什么领域。我们先从set设置值这一块开始:redis

简单的set,还有包含过时时间的set,还有在JDK1.8中常常出现的xxxIfAbsent,我们在这里能够用其配合设置过时时间来实现分布式锁,存在即返回false,证实有线程持有锁,不存在则获取锁。spring

这个用来操做位Bit,值只能为boolean类型。Guava中能够实现单机部署的布隆过滤器。这里应该能够实现集群状况下的布隆过滤器。固然,这里只是个猜想,没有去实践,感兴趣的朋友能够自行实践一下。数据结构

同时,该API还为咱们提供了多键值对插入以及同时取出多个键对应的值的方法·multiSetmultiGet
app

下面介绍的set(key,value.offset)append(key,value)这两个方法必须得放到一块儿介绍,这也是在学习中踩到的第一个坑,这两个方法都是追加的意思,一个是在指定的偏移位置进行追加,一个直接在后面进行追加。
分布式


细心的同窗看到我上面的代码段,会发现多出了
redisTemplate.setKeySerializer(new StringRedisSerializer()); redisTemplate.setValueSerializer(new StringRedisSerializer());
这两个序列化的设置,若是你不设置,进行调用时会给你报一个没法进行反序列化的异常, org.springframework.data.redis.serializer.SerializationException: Cannot deserialize;....。经过去官网查询 append指令的使用,上面会介绍:

If key already exists and is a string, this command appends the value at the end of the string. If key does not exist it is created and set as an empty string, so APPEND will be similar to SET in this special case.单元测试

因此,使用的时候,须要加上String类型的序列化和反序列化设置。否则会默认使用JdkSerializationRedisSerializer进行序列化。学习

ValueOperations这个类的操做大概就介绍到这里,下面介绍一下ListOperations的一些基本操做。测试


ListOperations操做

测试的时候发现,这种链表结构在Redis中进行存储时,当链表中的元素所有被取出的时候,Redis是不会维护一个空队列的,它会将与list关联的key给移除掉。

首先是简单的存取操做,pushpop

接着是遍历操做,这里注意一下,也许会成为你的第二个坑,这里的遍历调用的是LRANGE指令,并非pop指令,因此,并不会移除队列中的数据。

接着介绍一下基操,indexsize,这里不用多介绍,基本和JDK中的List相似的操做。

最后介绍下Remove操做,这里比较有趣,先看一下移除操做的具体实现:

注意下我上面的注释,当第三个参数count > 0时,它会正向遍历去移除元素,即从head——>tail,当count < 0时,则会逆向遍历移除元素,即从tail——>head。而且这两种方法移除元素的数目为count值的大小。当count = 0时,则会直接移除全部等于value值的元素,这里默认是正向遍历。而后三个方法的返回都是移除元素的个数。这里你们本身试验一下就知道了,不是很复杂~~

这里介绍的不算太多,但基本覆盖了全部的使用,例如rightPushleftPush等等相似的API,相信你们只用看一个基本就能所有领会了。


HashOperations操做

这个操做类主要介绍一下设定值set方法和获得全部存储数据entrie以及批量查询multiGet,其实相似的API已经在ListOperations中有过介绍了,这里我们经过几个简单的单元测试一笔带过。




SetOperations操做

简单三部曲,增长add,取出pop以及获取数量size

支持求差集difference,能够用来实现本身特有的功能。例如甲乙都有兴趣爱好,要想获得甲单独的兴趣则能够用此API来实现。

求交集intersect,能够用来实现共同好友的功能,后面还有求并集union的API,使用起来和前两个并没有太大的区别。
转储这个功能在差集、交集、并集中都有相应的实现方法,即将结果存储到另外一个key中。

带有member这种相似的API和pop不太同样,这种都不会改变原队列。与之关联的几个方法我下面的截图上都有注释,不作过多解释。


ZSetOperations

这里主要介绍下rangerank这个方法,因为zset结构咱们在上面进行数据填充的时候都有指定一个score,这个score就是用来内部进行排序的。range能够供咱们去进行一个范围查询,rank则可让咱们知道须要查询的元素在队列中处于什么位置。同时还提供reverseRank让咱们查询反序后元素的具体位置。


总结

这些东西也不是很难理解,主要是熟悉一下基本的API操做,有些东西也没整理太全,好比scan方法,测试结果与预期不是很一致,过滤正则感受没生效,这里就暂时不作介绍了,后期有时间继续再研究一下。本文的测试案例都在github中。


END

相关文章
相关标签/搜索