深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis
上一篇说了RedisTemplate对注解事务的支持,以及提供的序列化器。
事务需要开启enableTransactionSupport,然后使用@transactional注解,里面直接通过回调的connection,就不需要自己进行multi和exec的事务开启提交了。但是通过回调去获取connection,完全没有达到一个模版类的功能。所以这篇我们会讲下几种Operations接口提供的方法。
private ValueOperations<K, V> valueOps;
private ListOperations<K, V> listOps;
private SetOperations<K, V> setOps;
private ZSetOperations<K, V> zSetOps;
1. RedisOperations接口说明
这个接口的实现类就是RedisTemplate本身,主要提供了一些对Redis键,事务,运行脚本等命令的支持,不负责数据的读写。
我们选一段代码看下:
public void watch(K key) {
final byte[] rawKey = rawKey(key);
execute(new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) {
connection.watch(rawKey);
return null;
}
}, true);
}
这个是事务的监视命令,可以看出,里面的实现也是用的回调RedisCallback。这些api都是通过connection的api来进行了封装。
2. ValueOperations接口说明
这个接口的实现类为DefaultValueOperations,default这个类同时继承AbstractOperation,我们来看下这个类的构造函数:
DefaultValueOperations(RedisTemplate<K, V> template) {
super(template);
}
非公开的,需要传入template来构造。但是我们是无法访问的。不过不要急,在RedisTemplate中,已经提供了一个工厂方法:opsForValue()。这个方法会返回一个默认的操作类。另外,我们可以直接通过注解@Resource(name = "redisTemplate")来进行注入。
@Resource(name = "redisTemplate")
private ValueOperations<String, Object> vOps;
是不是很奇怪,毫无父子兄弟关系的两个类,怎么能互相注入呢?这个是Spring的Editor机制,搜索下ValueOperationsEditor这个类就知道了,Spring在注入的时候调用了Editor的setValue方法。了解Spring源码的应该知道。我也是看别人的文章才理解的。文章地址
其实除了可以通过template注入ValueOperations,还可以注入 上面的其他几种operations以及HashOperations.
DefaultValueOperations提供了所有Redis字符串类型的操作api。比如set,get,incr等等。使用这些方法,可以方便的直接存储任意的java类型,而不需要自己去将存储的东西序列化以及反序列化。
注意:泛型的类型,以及序列化器都是来自RedisTemplate。如果要自行进行json或者其他的序列化,就需要在RedisTemplate中进行更改。
另外,对于成员listOps,setOps,zSetOps这接个操作类,就不再赘述,原理同ValueOperations,是其他几种数据类型的实现。
3. HashOperations接口说明
这个接口并没有定义成员变量,猜测是因为对于Hash来说,又增加了额外的Key和Value,泛型无法在成员前额外定义,所以直接提供了方法。不过所幸里面用的是JdkSerializer,所以这个定义了什么类型的泛型都不会产生运行异常。
public void put(K key, HK hashKey, HV value) {
final byte[] rawKey = rawKey(key);
final byte[] rawHashKey = rawHashKey(hashKey);
final byte[] rawHashValue = rawHashValue(value);
execute(new RedisCallback<Object>() {
public Object doInRedis(RedisConnection connection) {
connection.hSet(rawKey, rawHashKey, rawHashValue);
return null;
}
}, true);
}
这个是基本的put方法,可以看出key和hashkey这两个,调用了不同的序列化方法。进行方法查看,看到序列化hashkey用的是template里的hashkeyserializer,默认是jdkserializer,这个会导致在redis控制台,看不出来存了什么key。如果不喜欢,可以通过redistemplate.sethashkeyserializer()来进行设置。
对于hash结构所有的api,也都在这个类里进行了封装,比如hset变为了put,hget变为get。需要自行去查看api。不要被误导。
4. 总结
到这里为止,已经把基本的使用都说完了。说的很粗糙,只是把我觉得容易出现误解的点进行了重点说明,基础的操作还需要大家自己稍微看下。权作一个抛砖引玉的作用吧。接下来,可能会总结下在这两个月用Redis遇到的一些问题进行说明。
我把代码放在了git上,地址是https://github.com/55375829/learn,里面spjedis就是当时自己学习时候建的项目。
深入理解Spring Redis的使用 (三)、使用RedisTemplate的操作类访问Redis的更多相关文章
- 使用RedisTemplate的操作类访问Redis(转)
深入理解Spring Redis的使用 (三).使用RedisTemplate的操作类访问Redis 事务需要开启enableTransactionSupport,然后使用@transactional ...
- 使用RedisTemplate的操作类访问Redis(转载)
原文地址:http://www.cnblogs.com/luochengqiuse/p/4641256.html private ValueOperations<K, V> valueOp ...
- SpringBoot整合Redis、mybatis实战,封装RedisUtils工具类,redis缓存mybatis数据 附源码
创建SpringBoot项目 在线创建方式 网址:https://start.spring.io/ 然后创建Controller.Mapper.Service包 SpringBoot整合Redis 引 ...
- redis系列(三):python操作redis
1.安装包 pip install redis 2.使用 # -*- coding: utf-8 -*- # @Time : 18-12-7 下午4:33 # @Author : Felix Wang ...
- Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)
上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...
- 分布式缓存技术redis学习—— 深入理解Spring Redis的使用
关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...
- 深入理解Spring注解机制(一):注解的搜索与处理机制
前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...
- 封装php redis缓存操作类
封装php redis缓存操作类,集成了连接redis并判断连接是否成功,redis数据库选择,检测redis键是否存在,获取值,写入值,设置生存时间和删除清空操作. php redis类代码: &l ...
- 模拟安装redis5.0集群并通过Java代码访问redis集群
在虚拟机上模拟redis5.0的集群,由于redis的投票机制,一个集群至少需要3个redis节点,如果每个节点设置一主一备,一共需要六台虚拟机来搭建集群,此处,在一台虚拟机上使用6个redis实例来 ...
随机推荐
- 在后台启动Redis
1.下载Redis包,解压到指定位置(这里不再赘述) 2.按“Win +R” 在输入框中输入“cmd” 3.在cmd中打开Redis所在的文件夹,如下图(这是我电脑上的) 4.执行“redis-ser ...
- Django组件之用户认证组件
一.auth模块 from django.contrib import auth django.contrib.auth中提供了许多方法,这里主要介绍其中的三个: 1.1 .authenticate( ...
- java日期间相隔年月日计算
/** * 获取date1相距date2多少天, date2>date1 * @param date1 * @param date2 * @return ...
- nginx 平滑更新
1.更新nginx源 #centos6的nginx源 #centos7的话吧url 的6改为7就行了 vim /etc/yum.repos.d/nginx.repo [nginx] name=ngin ...
- 大数据ssh疑点跟踪
相信运维的对ssh免密登陆应该是对这个再清楚不过的吧,由于我们大数据对于安全这方便管控的很严格,单独找一台物理机作为跳板机,其他的机器都必须要从这个跳板机免密登陆,由于机器比较的多,其中dn30这个域 ...
- having使用
啰嗦点: where子句用来筛选 from子句中指定的操作所产生的行. group by 子句用来分组 where子句的输出. having子句用来从分组的结果中筛选行. 对于可以在分组操作之前或之后 ...
- P1522 牛的旅行 Cow Tours floyed
题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...
- [Tips]vim设置
临时设置 在vim中输入 :set nu! 若显示行号时,它的功能时取消行号:若不显示行号时,它的功能是显示行号. 固定设置 在~/.vimrc中进行设置. 添加注释: 双引号是注释 ” this i ...
- 接口测试——postman & jmeter
新名词: 自动化测试:写代码帮你测试 接口:是一个抽象的概念,一种交互关系. 抓包:拦截请求. 接口测试:就是功能测试,比后者还简单. 需要有测试文档,包括项目.模块.URL.请求方式.参数.参数说明 ...
- kubernates使用kubeadm安装
kubeadm是Kubernetes官方提供的用于快速安装Kubernetes集群的工具,伴随Kubernetes每个版本的发布都会同步更新,kubeadm会对集群配置方面的一些实践做调整,通过实验k ...