- 作者简介
- 内容提要
- 关于本书
- 路线图
- 代码规范与下载
- 作者在线
- 封面插图简介
- 前言
- 译者序
- 致谢
- 第1部分 Spring 的核心
- 第1章 Spring 之旅
- 第2章 装配 Bean
- 第3章 高级装配
- 第4章 面向切面的 Spring
- 第2部分 Web 中的 Spring
- 第5章 构建 Spring Web 应用程序
- 第6章 渲染 Web 视图
- 第7章 Spring MVC 的高级技术
- 第8章 使用 Spring Web Flow
- 第9章 保护 Web 应用
- 第3部分 后端中的 Spring
- 第10章 通过 Spring 和 JDBC 征服数据库
- 第11章 使用对象-关系映射持久化数据
- 第12章 使用 NoSQL 数据库
- 第13章 缓存数据
- 第14章 保护方法应用
- 第4部分 Spring 集成
- 第15章 使用远程服务
- 第16章 使用 Spring MVC 创建 REST API
- 第17章 Spring消息
- 第18章 使用 WebSocket 和 STOMP 实现消息功能
- 第19章 使用 Spring 发送 Email
- 第20章 使用 JMX 管理 Spring Bean
- 第21章 借助 Spring Boot 简化 Spring 开发
12.3.2 使用 RedisTemplate
顾名思义,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 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论