上一篇说了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的更多相关文章

  1. 使用RedisTemplate的操作类访问Redis(转)

    深入理解Spring Redis的使用 (三).使用RedisTemplate的操作类访问Redis 事务需要开启enableTransactionSupport,然后使用@transactional ...

  2. 使用RedisTemplate的操作类访问Redis(转载)

    原文地址:http://www.cnblogs.com/luochengqiuse/p/4641256.html private ValueOperations<K, V> valueOp ...

  3. SpringBoot整合Redis、mybatis实战,封装RedisUtils工具类,redis缓存mybatis数据 附源码

    创建SpringBoot项目 在线创建方式 网址:https://start.spring.io/ 然后创建Controller.Mapper.Service包 SpringBoot整合Redis 引 ...

  4. redis系列(三):python操作redis

    1.安装包 pip install redis 2.使用 # -*- coding: utf-8 -*- # @Time : 18-12-7 下午4:33 # @Author : Felix Wang ...

  5. Util应用程序框架公共操作类(三):数据类型转换公共操作类(扩展篇)

    上一篇以TDD方式介绍了数据类型转换公共操作类的开发,并提供了单元测试和实现代码,本文将演示通过扩展方法来增强公共操作类,以便调用时更加简化. 下面以字符串转换为List<Guid>为例进 ...

  6. 分布式缓存技术redis学习—— 深入理解Spring Redis的使用

    关于spring redis框架的使用,网上的例子很多很多.但是在自己最近一段时间的使用中,发现这些教程都是入门教程,包括很多的使用方法,与spring redis丰富的api大相径庭,真是浪费了这么 ...

  7. 深入理解Spring注解机制(一):注解的搜索与处理机制

    前言 众所周知,spring 从 2.5 版本以后开始支持使用注解代替繁琐的 xml 配置,到了 springboot 更是全面拥抱了注解式配置.平时在使用的时候,点开一些常见的等注解,会发现往往在一 ...

  8. 封装php redis缓存操作类

    封装php redis缓存操作类,集成了连接redis并判断连接是否成功,redis数据库选择,检测redis键是否存在,获取值,写入值,设置生存时间和删除清空操作. php redis类代码: &l ...

  9. 模拟安装redis5.0集群并通过Java代码访问redis集群

    在虚拟机上模拟redis5.0的集群,由于redis的投票机制,一个集群至少需要3个redis节点,如果每个节点设置一主一备,一共需要六台虚拟机来搭建集群,此处,在一台虚拟机上使用6个redis实例来 ...

随机推荐

  1. 如何配置adb环境变量

    如何配置adb环境变量? 1.我的电脑---控制面板---高级系统设置 2.点击[高级系统设置],弹出系统属性的弹框, 3.点击[环境变量],弹出环境变量弹框,新建一个系统变量,命名为Android ...

  2. iOS端临近封包时要做哪些事情?

    iOS封包前的注意事项: 0.功能测试,打点测试都已OK 1.创建case,使用master执行此轮case,修改版本号 2.建议使用各个系统的机型,如8,9,10,11,12, iPad等 3.ma ...

  3. 基于tkinter的GUI编程

    tkinter:tkinter是绑定了Python的TKGUI工具集,就是Python包装的Tcl代码,通过内嵌在Python解释器内部的Tcl解释器实现的,它是Python标准库的一部分,所以使用它 ...

  4. SpringBoot 动态切换多数据源

    1. 配置文件application-dev.properties 2. 动态切换数据源核心 A. 数据源注册器 B. 动态数据源适配器 C. 自定义注解 D. 动态数据源切面     E. 数据源路 ...

  5. 对Inode、Hard Link以及Soft Link的理解

    一.EXT2/EXT3等文件系统的分区格式 Linux的文件系统从EXT2开始将文件的属性和文件的实际内容分开存储,文件的属性由inode存储,文件的内容由block存储. 系统在对磁盘进行分区格式化 ...

  6. SOUI新组件SIpcObject介绍

    SIpcObject是一个基于Windows消息及共享内存的一个IPC(跨进程函数调用)的组件. GITHUB上有很多IPC模块,我这里又造了一个轮子,不一定比现有的IPC更好,不过我觉得已经足够简单 ...

  7. html_Dom

    Document: 每个载入浏览器的HTML文档都会成为一个Document对象. Document 对象使我们可以从脚本中对 HTML 页面中的所有元素进行访问. 并且Document 对象是 Wi ...

  8. leetcode刷题四<寻找两个有序数组的中位数>

    给定两个大小为 m 和 n 的有序数组 nums1 和 nums2. 请你找出这两个有序数组的中位数,并且要求算法的时间复杂度为 O(log(m + n)). 你可以假设 nums1 和 nums2 ...

  9. 微信小程序,转盘抽奖

    微信小程序大转盘 代码源码:https://github.com/yewook/Lottery-turntable

  10. Java EE ----- Container/Injection

    容器(container)是一个类,实际上是component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其他组件和容器. 对于开发人员,需要引入复杂的代码解决事务以及 ...