`

redis-cluster整合mybaits

阅读更多
import java.util.HashSet;
import java.util.Set;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

import org.apache.ibatis.cache.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import redis.clients.jedis.BinaryJedisCluster;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisPoolConfig;
  
/**
 * mybatis整合redis-cluster
 * @author zaqzaq
 * 2015年2月5日
 *
 */
public class MybatisRedisCache implements Cache {  
      
    private static Logger logger = LoggerFactory.getLogger(MybatisRedisCache.class);  
    private static BinaryJedisCluster redisClient=createReids();  
     /** The ReadWriteLock. */    
    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();   
      
    private String id;  
    
    private Set<String> keys=new HashSet<String>();
    
    public MybatisRedisCache(final String id) {    
        if (id == null) {  
            throw new IllegalArgumentException("Cache instances require an ID");  
        }  
        logger.debug("redis>>>>MybatisRedisCache:id="+id);  
        this.id = id;  
    }    
    @Override  
    public String getId() {  
        return this.id;  
    }  
  
    @Override  
    public int getSize() {  
    	//在集群情况下只返回当前主机下的dbsize 
    	// int i=Integer.valueOf(redisClient.dbSize().toString());
    	
    	logger.debug("mybatis cache redis>>>>getSize:"+keys.size());  
        return keys.size();  
    }  
  
    @Override  
    public void putObject(Object key, Object value) {  
        logger.debug("redis>>>>putObject:"+key+"="+value);  
        redisClient.set(key.toString(), SerializeUtil.serialize(value));  
        
        if (!keys.contains(key.toString())){  
        	keys.add(key.toString());  
        }  
        
    }  
  
    @Override  
    public Object getObject(Object key) {  
        Object value = SerializeUtil.unserialize(redisClient.getBytes(key.toString()));  
        logger.debug("redis>>>>getObject:"+key+"="+value);  
        if (!keys.contains(key.toString())){  
        	keys.add(key.toString());  
        }  
        return value;  
    }  
  
    @Override  
    public Object removeObject(Object key) {  
    	logger.debug("redis>>>>removeObject:"+key);  
    	keys.remove(key.toString());
        return redisClient.expire(key.toString(),0);  
    }  
  
    @Override  
    public void clear() {  
    	logger.debug("redis>>>>clearObject:"+id);  
    	//清除namespace下的所有缓存
    	for(String key:keys){
    		redisClient.expire(key.toString(),0);  
    	}
    	keys.clear();
//禁止使用          redisClient.flushDB();  
    }  
    @Override  
    public ReadWriteLock getReadWriteLock() {  
        return readWriteLock;  
    }  
    protected  static BinaryJedisCluster createReids(){  
//        
        JedisPoolConfig config = new JedisPoolConfig();
        //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;
        //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。
        config.setMaxTotal(500);
        //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。
        config.setMaxIdle(5);
        //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException;
        config.setMaxWaitMillis(1000 * 100);
        //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的;
        config.setTestOnBorrow(true);
        
        int time_out=12*1000;
        
        Set<HostAndPort> hostAndPorts=new HashSet<HostAndPort>();
        hostAndPorts.add(new HostAndPort("zaqzaq1", 6379));
        hostAndPorts.add(new HostAndPort("zaqzaq2", 6379));
        hostAndPorts.add(new HostAndPort("zaqzaq3", 6379));
        
        
       return new BinaryJedisCluster(hostAndPorts,time_out,config); 
    }  
}

 

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class SerializeUtil {
	public static byte[] serialize(Object object) {
		ObjectOutputStream oos = null;
		ByteArrayOutputStream baos = null;
		try {
			// 序列化
			baos = new ByteArrayOutputStream();
			oos = new ObjectOutputStream(baos);
			oos.writeObject(object);
			byte[] bytes = baos.toByteArray();
			return bytes;
		} catch (Exception e) {
			e.printStackTrace();
		}
		return null;
	}

	public static Object unserialize(byte[] bytes) {
		ByteArrayInputStream bais = null;
		try {
			// 反序列化
			bais = new ByteArrayInputStream(bytes);
			ObjectInputStream ois = new ObjectInputStream(bais);
			return ois.readObject();
		} catch (Exception e) {

		}
		return null;
	}
}

 

	<settings>
	    <!-- 这个配置使全局的映射器启用或禁用缓存 -->
	    <setting name="cacheEnabled" value="true" />
	    <!-- 对于未知的SQL查询,允许返回不同的结果集以达到通用的效果 -->    
	    <setting name="multipleResultSetsEnabled" value="true"/>
	    <!-- 配置默认的执行器。SIMPLE 执行器没有什么特别之处。REUSE 执行器重用预处理语句。BATCH 执行器重用语句和批量更新 -->
	    <setting name="defaultExecutorType" value="REUSE" />
	    <!-- 全局启用或禁用延迟加载。当禁用时,所有关联对象都会即时加载。 -->
	    <setting name="lazyLoadingEnabled" value="false" />
	    <setting name="aggressiveLazyLoading" value="true" />
	    <!-- <setting name="enhancementEnabled" value="true"/> -->
	    <!-- 设置超时时间,它决定驱动等待一个数据库响应的时间。 -->
	    <setting name="defaultStatementTimeout" value="25000" />
	</settings>

 

 <!-- 缓存 -->
    <cache eviction="LRU" type="com.cloud.core.cache.MybatisRedisCache" readOnly="false" />

sql语句上特殊配置的属性有useCache,flushCache

 我的jedis地址:  https://github.com/zaqzaq/jedis

1
1
分享到:
评论

相关推荐

    PyPI 官网下载 | redis-py-cluster-1.1.0.tar.gz

    《Redis-Py-Cluster:Python中的Redis集群库详解》 Redis-Py-Cluster是一个Python库,专门用于在Python环境中操作Redis分布式集群。该库为开发者提供了便捷的方式与Redis集群进行交互,支持各种数据结构,如字符串...

    redis-cluster-5.0.7.tar.gz

    在本压缩包“redis-cluster-5.0.7.tar.gz”中,我们将探讨Redis Cluster的配置和使用。 首先,`redis-cluster`这个标签指的是Redis的集群模式。集群的核心概念是数据分片(sharding),即将数据分散存储在多个节点...

    redis-py-cluster-1.3.5.tar.gz

    而`redis-py-cluster`是Python连接Redis集群的一个库,它允许Python开发者方便地与Redis集群进行交互。`redis-py-cluster-1.3.5.tar.gz`这个压缩包文件包含了该库的源代码和相关资源,版本号为1.3.5。 首先,让我们...

    redis-cluster.tar.gz

    `redis-cluster.tar.gz` 文件包含了实现 Redis 集群所需的相关脚本和配置。 Redis 集群通过将数据分散到多个节点来实现扩展,每个节点负责一部分键空间。当客户端对某键进行操作时,会根据哈希槽(Hash Slot)映射...

    windows一键Redis-Cluster集群工具(32位Redis-v3.0.504)原忘记配置文件了

    windows一键Redis-Cluster集群工具(32位Redis-v3.0.504),资源包括:ruby安装包,rubygem,32位Redis-v3.0.504,一键Redis-Cluster集群工具等,64位请自行替换相关资源包即可,相关文章见:...

    redis-py-cluster-1.3.6.tar.gz

    《Python操作Redis集群:redis-py-cluster详解》 在Python中与Redis进行交互,我们通常会使用`redis-py`库,然而,当涉及到Redis集群(Redis Cluster)时,`redis-py`的标准版本可能无法满足需求。为了解决这个问题...

    Redis集群管理工具redis-cluster-tool.zip

    redis-cluster-tool 是一个非常便利的 Redis 集群管理工具。help   Usage: redis-cluster-tool [-?hVds] [-v verbosity level] [-o output file] [-c conf file] [-a addr] [-i interval] [-p pid file] [-C ...

    Windows环境Redis-Cluster配置

    Redis-Cluster是Redis的一个分布式实现,它允许在多个节点之间分散数据,提供高可用性和可扩展性。在Windows环境中配置Redis-Cluster,首先需要理解其基本概念和工作原理,然后按照步骤进行安装和配置。 一、Redis-...

    nginx+ tomcat + redis-cluster 实现session同步所需的jar包

    总的来说,通过整合Nginx、Tomcat和Redis-Cluster,我们可以实现高效的分布式环境下的Session同步,保证用户体验的连续性和一致性,同时降低了单点故障的风险。提供的jar包是实现这一目标的关键组件,它们共同确保了...

    tomcat9+tomcat-cluster-redis-session-manager_4.0.zip

    "tomcat9+tomcat-cluster-redis-session-manager_4.0.zip"这个文件组合涉及到的是在Tomcat 9上实现负载均衡以及使用Redis作为Session管理器的高级配置。 首先,Tomcat 9是Apache Tomcat服务器的一个版本,它是Java ...

    spring redis-cluster 整合

    当业务需求涉及分布式环境时,Redis集群(redis-cluster)就显得尤为重要。本文将深入探讨如何在Spring MVC项目中整合Spring与Redis集群。 首先,让我们理解什么是Redis集群。Redis集群是一种分布式解决方案,通过...

    redis-cluster工具包(64位).7z

    在Windows环境下配置Redis Cluster,你需要一系列工具,这个"redis-cluster工具包(64位).7z"就提供了这些必备组件。下面将详细介绍其中每个文件的作用以及如何使用它们来搭建Redis Cluster。 1. `rubyinstaller-...

    redis-stack-server 7.2.0 安装包合集

    redis-stack-server-7.2.0-v9.arm64.snap redis-stack-server-7.2.0-v9.bionic.arm64.tar.gz redis-stack-server-7.2.0-v9.bionic.x86_64.tar.gz redis-stack-server-7.2.0-v9.bullseye.x86_64.tar.gz redis-stack-...

    redis-cluster开箱即用作者已经实验

    这个压缩包“redis-cluster”应该是包含了一组配置好的Redis Cluster环境,可以快速部署,省去了手动安装和配置的繁琐过程。 在Redis Cluster中,每个节点都是一个独立的Redis服务器,它们共同构成了一个集群。集群...

    redis-cluster集群部署

    logfile "/usr/local/redis-cluster/log/redis-7000.log" //修改日志文件名称,以端口号为目录来区分 databases 16 save 900 1 save 300 10 save 60 10000 stop-writes-on-bgsave-error yes rdbcompression yes ...

    redis-3.0.0.tar和redis-3.0.0.gem.rar

    5. **初始化集群**:使用`redis-cli --cluster create`命令,指定所有节点的IP和端口,创建集群。 6. **分配槽**:集群会自动分配槽,或者可以通过`--cluster-replicas`参数手动设置副本节点数量。 7. **客户端连接*...

    redis-go-cluster, 在Go中,redis集群客户端实现.zip

    redis-go-cluster, 在Go中,redis集群客户端实现 redis-go-clusterredis-go-cluster是基于 burd burd burd的客户端的一个golang实现的。 它在本地缓存 slot 信息,并在集群更改时自动更新。 客户端管理每个 node的...

    redis-py-cluster-1.3.4.tar.gz

    `redis-py-cluster`是这个客户端的一个扩展,专门为处理Redis Cluster提供支持。在本文中,我们将深入探讨`redis-py-cluster`的1.3.4版本,并讨论其关键特性和使用方法。 **1. Redis Cluster** Redis Cluster是...

    redis5离线安装文件包,包含redis-5.0.14.tar.gz和redis-4.6.0.gem

    redis-5.0.14/src/redis-cli --cluster create 192.168.129.98:7000 192.168.129.99:7003 192.168.129.99:7002 192.168.129.126:7005 192.168.129.126:7004 192.168.129.98:7001 --cluster-replicas

Global site tag (gtag.js) - Google Analytics