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遇到的一些问题进行说明。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • spring整合redis以及使用RedisTemplate的方法

    需要的jar包 spring-data-Redis-1.6.2.RELEASE.jar jedis-2.7.2.jar(依赖 commons-pool2-2.3.jar) commons-pool2-2.3.jar spring-redis.xml 配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/sc

  • spring使用RedisTemplate的操作类访问Redis

    事务需要开启enableTransactionSupport,然后使用@transactional注解,里面直接通过回调的connection,就不需要自己进行multi和exec的事务开启提交了.但是通过回调去获取connection,完全没有达到一个模版类的功能.所以这篇我们会讲下几种Operations接口提供的方法. private ValueOperations<K, V> valueOps; private ListOperations<K, V> listOps; p

  • spring使用RedisTemplate操作Redis数据库

    一.什么是Redis Redis是一个非关系型数据库,具有很高的存取性能,一般用作缓存数据库,减少正常存储数据库的压力. Redis可以存储键与5种不同数据结构类型之间的映射,这5种数据结构类型分别为String(字符串).List(列表).Set(集合).Hash(散列)和 Zset(有序集合). 下面来对这5种数据结构类型作简单的介绍: 二.RedisTemplate及其相关方法 1.RedisTemplate Spring封装了RedisTemplate对象来进行对Redis的各种操作,它

  • 详解Spring Boot 访问Redis的三种方式

    目录 前言 开始准备 RedisTemplate JPA Repository Cache 总结 前言 最近在极客时间上面学习丁雪丰老师的<玩转 Spring 全家桶>,其中讲到访问Redis的方式,我专门把他们抽出来,在一起对比下,体验一下三种方式开发上面的不同, 分别是这三种方式 RedisTemplate JPA Repository Cache 开始准备 开始之前我们需要有Redis安装,我们采用本机Docker运行Redis, 主要命令如下 docker pull redis doc

  • RedisTemplate访问Redis的更好方法

    目录 开始准备 RedisTemplate JPA Repository Cache 总结 开始准备 开始之前我们需要有Redis安装,我们采用本机Docker运行Redis, 主要命令如下 docker pull redis docker run --name my_redis -d -p 6379:6379 redis docker exec -it my_redis bash redis-cli 前面两个命令是启动redis docker, 后两个是连接到docker, 在使用redis-

  • Python访问Redis的详细操作

    1.连接 测试连接是否成功: import redis r = redis.Redis(host='192.168.136.102', port=6379, db=0,decode_responses=True) r.set('foo', 'bar') print(r.get('foo')) del r redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串. redis 提供两个类 Redis 和 StrictRedis, StrictRedis

  • Spring实战之搜索Bean类操作示例

    本文实例讲述了Spring实战之搜索Bean类操作.分享给大家供大家参考,具体如下: 一 配置文件 <?xml version="1.0" encoding="GBK"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:

  • spring mvc url匹配禁用后缀访问操作

    spring mvc url匹配禁用后缀访问 在spring mvc中默认 访问url 加任意后缀名都能访问 比如:你想访问 /login ,但是通过 /login.do /login.action /login.json 都能访问 通常来说可能没有影响,但对于权限控制,这就严重了. 权限控制通常有两种思路: 1)弱权限控制 允许所有url通过,仅对个别重要的url做权限控制.此种方式比较简单,不需要对所有url资源进行配置,只配置重要的资源. 2)强权限控制 默认禁止所有url请求通过,仅开放

  • Spring Security permitAll()不允许匿名访问的操作

    Spring Security permitAll()不允许匿名访问 修改前 http .addFilterBefore(muiltpartFilter, ChannelProcessingFilter.class) .addFilterBefore(cf, ChannelProcessingFilter.class) .authorizeRequests() .anyRequest() .authenticated() .and() .authorizeRequests() .antMatch

  • Spring中RedisTemplate的基本使用浅析

    目录 spring-data-redis项目 使用步骤 spring-data-redis项目   spring-data-redis提供了在Spring应用中通过简单的配置访问redis服务,封装了 RedisTemplate 对象来对Redis进行各种操作.异常处理及序列化,支持发布订阅.RedisTemplate对应于Redis五大数据类型的api: Api 返回值类型 说明 redisTemplate.opsForValue() ValueOperations 操作 String 类型数

  • Spring jdbc中数据库操作对象化模型的实例详解

    Spring jdbc中数据库操作对象化模型的实例详解 Spring Jdbc数据库操作对象化 使用面向对象方式表示关系数据库的操作,实现一个线程安全可复用的对象模型,其顶级父类接口RdbmsOperation. SqlOperation继承该接口,实现数据库的select, update, call等操作. 1.查询接口:SqlQuery 1) GenericSqlQuery, UpdatableSqlQuery, MappingSqlQueryWithParameter 2) SqlUpda

随机推荐