返回介绍

12.3.2 使用 RedisTemplate

发布于 2024-08-17 00:45:49 字数 6615 浏览 0 评论 0 收藏 0

顾名思义,Redis连接工厂会生成到Redis key-value存储的连接(以RedisConnection的形式)。借助RedisConnection,可以存储和读取数据。例如,我们可以获取连接并使用它来保存一个问候信息,如下所示:

与之类似,我们还可以使用RedisConnection来获取之前存储的问候信息:

毫无疑问,这可以正常运行,但是你难道真的愿意使用字节数组吗?

与其他的Spring Data项目类似,Spring Data Redis以模板的形式提供了较高等级的数据访问方案。实际上,Spring Data Redis提供了两个模板:

RedisTemplate

StringRedisTemplate

RedisTemplate可以极大地简化Redis数据访问,能够让我们持久化各种类型的key和value,并不局限于字节数组。在认识到key和value通常是String类型之后,StringRedisTemplate扩展了RedisTemplate,只关注String类型。

假设我们已经有了RedisConnectionFactory,那么可以按照如下的方式构建RedisTemplate:

注意,RedisTemplate使用两个类型进行了参数化。第一个是key的类型,第二个是value的类型。在这里所构建的RedisTemplate中,将会保存Product对象作为value,并将其赋予一个String类型的key。

如果你所使用的value和key都是String类型,那么可以考虑使用StringRedisTemplate来代替RedisTemplate:

注意,与RedisTemplate不同,StringRedisTemplate有一个接受RedisConnectionFactory的构造器,因此没有必要在构建后再调用setConnectionFactory()。

尽管这并非必须的,但是如果你经常使用RedisTemplate或StringRedisTemplate的话,你可以考虑将其配置为bean,然后注入到需要的地方。如下就是一个声明RedisTemplate的简单@Bean方法:

如下是声明StringRedisTemplate bean的@Bean方法:

有了RedisTemplate(或StringRedisTemplate)之后,我们就可以开始保存、获取以及删除key-value条目了。RedisTemplate的大多数操作都是表12.5中的子API提供的。

表12.5 RedisTemplate的很多功能是以子API的形式提供的,它们区分了单个值和集合值的场景

方  法

子API接口

描  述

opsForValue()

ValueOperations<K, V>

操作具有简单值的条目

opsForList()

ListOperations<K, V>

操作具有list值的条目

opsForSet()

SetOperations<K, V>

操作具有set值的条目

opsForZSet()

ZSetOperations<K, V>

操作具有ZSet值(排序的set)的条目

opsForHash()

HashOperations<K, HK, HV>

操作具有hash值的条目

boundValueOps(K)

BoundValueOperations<K,V>

以绑定指定key的方式,操作具有简单值的条目

boundListOps(K)

BoundListOperations<K,V>

以绑定指定key的方式,操作具有list值的条目

boundSetOps(K)

BoundSetOperations<K,V>

以绑定指定key的方式,操作具有set值的条目

boundZSet(K)

BoundZSetOperations<K,V>

以绑定指定key的方式,操作具有ZSet值(排序的set)的条目

boundHashOps(K)

BoundHashOperations<K,V>

以绑定指定key的方式,操作具有hash值的条目

我们可以看到,表12.5中的子API能够通过RedisTemplate(和StringRedis-Template)进行调用。其中每个子API都提供了使用数据条目的操作,基于value中所包含的是单个值还是一个值的集合它们会有所差别。

这些子API中,包含了很多从Redis中存取数据的方法。我们没有足够的篇幅介绍所有的方法,但是会介绍一些最为常用的操作。

使用简单的值

假设我们想通过RedisTemplate<String, Product>保存Product,其中key是sku属性的值。如下的代码片段展示了如何借助opsForValue()方法完成该功能:

类似地,如果你希望获取sku属性为123456的产品,那么可以使用如下的代码片段:

如果按照给定的key,无法获得条目的话,将会返回null。

使用List类型的值

使用List类型的value与之类似,只需使用opsForList()方法即可。例如,我们可以在一个List类型的条目尾部添加一个值:

通过这种方式,我们向列表的尾部添加了一个Product,所使用的这个列表在存储时key为cart。如果这个key尚未存在列表的话,将会创建一个。

rightPush()会在列表的尾部添加一个元素,而leftPush()则会在列表的头部添加一个值:

我们有很多方式从列表中获取元素,可以通过leftPop()或rightPop()方法从列表中弹出一个元素:

除了从列表中获取值以外,这两个方法还有一个副作用就是从列表中移除所弹出的元素。如果你只是想获取值的话(甚至可能要在列表的中间获取),那么可以使用range()方法:

range()方法不会从列表中移除任何元素,但是它会根据指定的key和索引范围,获取范围内的一个或多个值。前面的样例中,会获取11个元素,从索引为2的元素到索引为12的元素(不包含)。如果范围超出了列表的边界,那么只会返回索引在范围内的元素。如果该索引范围内没有元素的话,将会返回一个空的列表。

在Set上执行操作

除了操作列表以外,我们还可以使用opsForSet()操作Set。最为常用的操作就是向Set中添加一个元素:

在我们有多个Set并填充值之后,就可以对这些Set进行一些有意思的操作,如获取其差异、求交集和求并集:

当然,我们还可以移除它的元素:

我们甚至还可以随机获取Set中的一个元素:

因为Set没有索引和内部的排序,因此我们无法精准定位某个点,然后从Set中获取元素。

绑定到某个key上

表12.5包含了五个子API,它们能够以绑定key的方式执行操作。这些子API与其他的API是对应的,但是关注于某一个给定的key。

为了举例阐述这些子API的用法,我们假设将Product对象保存到一个list中,并且key为cart。在这种场景下,假设我们想从list的右侧弹出一个元素,然后在list的尾部新增三个元素。我们此时可以使用boundListOps()方法所返回的BoundListOperations:

注意,我们只在一个地方使用了条目的key,也就是调用boundListOps()的时候。对返回的BoundListOperations执行的所有操作都会应用到这个key上。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文