spring使用RedisTemplate的操作类访问Redis
事务需要开启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遇到的一些问题进行说明。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 记录php错误日志
推荐阅读
-
spring使用RedisTemplate的操作类访问Redis
-
spring整合redis以及使用RedisTemplate的方法
-
spring使用RedisTemplate的操作类访问Redis
-
spring整合redis以及使用RedisTemplate的方法
-
spring使用RedisTemplate操作Redis数据库
-
Redis使用RedisTemplate模板类的常用操作
-
Java语言mysql数据库的访问步骤,一个简单的实例——使用DAO(数据库操作类 Data Access Object ) 实现对mysql数据库的增删改查
-
PHP操作redis的自定义类及使用方法
-
PHP操作redis的自定义类及使用方法
-
spring使用RedisTemplate操作Redis数据库