美文网首页
Spring Data Redis的基本使用和应用场景

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

作者: marsjhe | 来源:发表于2019-03-30 13:24 被阅读0次

    前言

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


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

    ValueOperations操作

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

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

    这个用来操作位Bit,值只能为boolean类型。Guava中可以实现单机部署的布隆过滤器。这里应该可以实现集群情况下的布隆过滤器。当然,这里只是个猜测,没有去实践,感兴趣的朋友可以自行实践一下。

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

    下面介绍的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

    相关文章

      网友评论

          本文标题:Spring Data Redis的基本使用和应用场景

          本文链接:https://www.haomeiwen.com/subject/kgmhbqtx.html