redis-cache中的callback

这个是mybatis/redis-cache中关键类  RedisCache  的源码

/**
 *    Copyright 2015 the original author or authors.
 *
 *    Licensed under the Apache License, Version 2.0 (the "License");
 *    you may not use this file except in compliance with the License.
 *    You may obtain a copy of the License at
 *
 *       http://www.apache.org/licenses/LICENSE-2.0
 *
 *    Unless required by applicable law or agreed to in writing, software
 *    distributed under the License is distributed on an "AS IS" BASIS,
 *    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 *    See the License for the specific language governing permissions and
 *    limitations under the License.
 */
package org.mybatis.caches.redis;

import java.util.Map;
import java.util.concurrent.locks.ReadWriteLock;

import org.apache.ibatis.cache.Cache;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

/**
 * Cache adapter for Redis.
 *
 * @author Eduardo Macarron
 */
public final class RedisCache implements Cache {

  private final ReadWriteLock readWriteLock = new DummyReadWriteLock();

  private String id;

  private static JedisPool pool;

  public RedisCache(final String id) {
    if (id == null) {
      throw new IllegalArgumentException("Cache instances require an ID");
    }
    this.id = id;
    RedisConfig redisConfig = RedisConfigurationBuilder.getInstance().parseConfiguration();
    pool = new JedisPool(redisConfig, redisConfig.getHost(), redisConfig.getPort(),
            redisConfig.getConnectionTimeout(), redisConfig.getSoTimeout(), redisConfig.getPassword(),
            redisConfig.getDatabase(), redisConfig.getClientName());
  }

  private Object execute(RedisCallback callback) {
    Jedis jedis = pool.getResource();
    try {
      return callback.doWithRedis(jedis);
    } finally {
      jedis.close();
    }
  }

  @Override
  public String getId() {
    return this.id;
  }

  @Override
  public int getSize() {
    return (Integer) execute(new RedisCallback() {
      @Override
      public Object doWithRedis(Jedis jedis) {
        Map<byte[], byte[]> result = jedis.hgetAll(id.toString().getBytes());
        return result.size();
      }
    });
  }

  @Override
  public void putObject(final Object key, final Object value) {
    execute(new RedisCallback() {
      @Override
      public Object doWithRedis(Jedis jedis) {
        jedis.hset(id.toString().getBytes(), key.toString().getBytes(), SerializeUtil.serialize(value));
        return null;
      }
    });
  }

  @Override
  public Object getObject(final Object key) {
    return execute(new RedisCallback() {
      @Override
      public Object doWithRedis(Jedis jedis) {
        return SerializeUtil.unserialize(jedis.hget(id.toString().getBytes(), key.toString().getBytes()));
      }
    });
  }

  @Override
  public Object removeObject(final Object key) {
    return execute(new RedisCallback() {
      @Override
      public Object doWithRedis(Jedis jedis) {
        return jedis.hdel(id.toString(), key.toString());
      }
    });
  }

  @Override
  public void clear() {
    execute(new RedisCallback() {
      @Override
      public Object doWithRedis(Jedis jedis) {
        jedis.del(id.toString());
        return null;
      }
    });

  }

  @Override
  public ReadWriteLock getReadWriteLock() {
    return readWriteLock;
  }

  @Override
  public String toString() {
    return "Redis {" + id + "}";
  }

}

可以看到其中大量使用了callback方法来操作redis, 但是调用本身是同步的, 其中能想到的唯一好处, 就是省下了每次调用之后的close() - 不知道是否还有别的优点.

时间: 2024-08-02 04:56:42

redis-cache中的callback的相关文章

Azure Redis Cache

将于 2014 年 9 月 1 日停止Azure Shared Cache服务,因此你需要在该日期前迁移到 Azure Redis Cache.Azure Redis Cache包含以下两个层级的产品. 基本版 – 单节点,多规格. 标准版 – 主/从双节点,多规格.标准层产品将具有 99.9% 的 SLA. 具体文档参看 http://azure.microsoft.com/zh-cn/documentation/articles/cache-dotnet-how-to-use-azure-r

spring redis cache使用思考

项目中使用spring redis cache做为cache客户端. spring redis cache中RedisCache是整个spring cache的领域模型,对应一个cache块的操作类. RedisCache中定义了put,get,clean,evict操作. 其中clean方法用于清除当前cache块中所有的元素,这里会加锁,而锁的实现是往redis服务器上存放一个key为:cache块名称加上~lock的元素.最后清除锁则是在clean方法执行完成后在finally中清除. p

Azure Redis Cache (3) 在Windows 环境下使用Redis Benchmark

<Windows Azure Platform 系列文章目录> 熟悉Redis环境的读者都知道,我们可以在Linux环境里,使用Redis Benchmark,测试Redis的性能. http://redis.io/topics/benchmarks 今天正好遇到一个情况,客户的开发不是很熟悉Linux环境.笔者从其他同事那里拿到了Redis Benchmark for windows工具,在这里简单分享一下. 下载地址是:http://files.cnblogs.com/files/thre

Azure Redis Cache (1) 入门

<Windows Azure Platform 系列文章目录> Microsoft Azure Redis Cache基于流行的开源Redis Cache. 1.功能 Redis 是一种高级的键值存储,其中,键可以包含数据结构,例如字符串.哈希.列表.集合和有序集合.Redis 支持针对这些数据类型的一组原子操作. Redis 还支持设置简单的主-从复制,具有非常快的非首先阻止同步.网络分割时自动重新连接等. 其他功能包括事务.发布/订阅.Lua 脚本.具有有限生存时间的键和配置设置,使 Re

Azure Redis Cache (2) 创建和使用Azure Redis Cache

<Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China. 注意: 截至今日2015年10月7日,国内由世纪互联运维的Azure China的Redis Cache功能还只是预览版本(Preview). 因为在Global Azure (www.windowsazure.com)可以通过新的Portal(https://portal.azure.com)来创建Azure Redis Cache. 但是这个新的Portal目前在Azu

深入理解jQuery中的callback

本文要讲的是jQuery.Callback() ,这是一个构造函数.在讲解这个之前,我们需要先讲讲javascript中的回调函数. 什么是回调? 所谓回调函数,我的理解:回头再调用,即:不是立刻运行,而是在特定时刻触发调用. js中的同步和异步 在javascript中,回调函数和同步 异步有很深的渊源,所以我们先来理解一下在js中的同步和异步的概念: 同步: 后一个任务等待前一个任务结束,然后再执行,程序的执行顺序与任务的排列顺序是一致的.同步的. 异步:,每一个任务有一个或多个回调函数(c

Windows Azure 系列-- Azure Redis Cache的配置和使用

如果还没有配置Azure Power shell 可以参照这里进行配置:http://blog.csdn.net/lan_liang/article/details/46850221 打开Azure Power Shell 1. 运行 Add-AzureAccount (如果已经添加就不用了) 2. 运行 New-AzureManagedCache -Name mycache -Location "South Central US" -Sku Basic -Memory 128MB 进

批量删除redis数据库中的key

在redis数据库中,如果大量以某些字段开头或结尾的key,一般都会用到命令keys进行模糊匹配.但是当我们想删除批量指定的keys,却犯愁了,因为redis没有提供相关的命令.那我们怎么操作能实现预期的效果呢? (1) 删除单个key 127.0.0.1:6379> del key 如果知道有限多个key的名字,以下操作也可以实现批量操作 127.0.0.1:6379> del key1 key2 key3 .... 当key的数量达到一定数量时,这个方法明显时不现实的. 注意:redis命

OpenResty--mysql,redis 项目中的应用

最近刚刚接手同事的OpenResty的项目,发现对mysql,redis的操作没有用连接池,故对此进行了改造. MYSQL 主要是通过mysql_pool.lua 和 dbutil.lua 来封装对数据库的操作 mysql_pool.lua: 1 module("mysql_pool", package.seeall) 2 3 local dbConfig = require"config" 4 local mysql = require("resty.m

将asp.net MVC导入 Azure Redis Cache

http://blogs.msdn.com/b/msdntaiwan/archive/2014/06/08/15-asp-net-mvc-movie-azure-redis-cache.aspx 将asp.net MVC导入 Azure Redis Cache