【Redis】redis集群与非集群环境下的jedis客户端通用开发

非集群环境下

package com.chiwei.redis;

import java.util.ArrayList;
import java.util.List;

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import redis.clients.jedis.JedisShardInfo;
import redis.clients.jedis.ShardedJedis;
import redis.clients.jedis.ShardedJedisPool;
import redis.clients.util.Pool;

public class RedisSingleClient {

	//未分片客户端连接
	private Jedis jedis;
	//未分片客户端连接池
	private JedisPool jedisPool;
	//分片客户端连接
	private ShardedJedis shardedJedis;
	//分片客户端连接池
	private ShardedJedisPool shardedJedisPool;
	//jedispool配置
	private JedisPoolConfig config;

	public void initJedisPoolConfig() {
		config = new JedisPoolConfig();
		config.setMaxTotal(100);
		config.setMaxIdle(10);
		config.setMaxWaitMillis(1000L);
		config.setTestOnBorrow(true);
		config.setTestOnReturn(true);
	}

	public void initJedisPool() {
		initJedisPoolConfig();
		jedisPool = new JedisPool(config,"192.168.11.176",7379);
	}

	public void initShardedJedisPool() {
		initJedisPoolConfig();
		List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>();
		shards.add(new JedisShardInfo("192.168.11.176",7379));
		shards.add(new JedisShardInfo("192.168.11.177",7379));
		shards.add(new JedisShardInfo("192.168.11.178",7379));
		shardedJedisPool = new ShardedJedisPool(config,shards);
	}

	public Jedis getJedis() {
		jedis = this.jedisPool.getResource();
		return jedis;
	}

	public ShardedJedis getShardedJedis() {
		shardedJedis = this.shardedJedisPool.getResource();
		return shardedJedis;
	}

	@SuppressWarnings({ "unchecked", "rawtypes" })
	public void returnResource(Pool pool, Object redis) {
		if (redis != null) {
			pool.returnResourceObject(redis);
		}
	}

	public void set(String key, String value) {
		try {
			jedis = getJedis();
			shardedJedis = getShardedJedis();
			jedis.set(key, value);
			shardedJedis.getShard("chiwei").set("chiwei", "lining");
		} catch (Exception e) {
			e.printStackTrace();
			jedisPool.returnBrokenResource(jedis);
			shardedJedisPool.returnBrokenResource(shardedJedis);
		} finally {
			returnResource(jedisPool, jedis);
			returnResource(shardedJedisPool, shardedJedis);
		}
	}

	public String get(String key) {
        String value = null;
        try {
            jedis = getJedis();
            value = jedis.get(key);
        } catch (Exception e) {
            e.printStackTrace();
            // 释放资源
            jedisPool.returnBrokenResource(jedis);
        } finally {
            returnResource(jedisPool, jedis);
        }
        return value;
    } 

	public String getShardValue(String key) {
        String value = null;
        try {
        	shardedJedis = getShardedJedis();
            value = shardedJedis.getShard(key).get(key);
        } catch (Exception e) {
            e.printStackTrace();
            // 释放资源
            shardedJedisPool.returnBrokenResource(shardedJedis);
        } finally {
        	returnResource(shardedJedisPool, shardedJedis);
        }
        return value;
    } 

	@Test
	public void test() {
		initJedisPool();
		initShardedJedisPool();
		jedis = getJedis();
		shardedJedis = getShardedJedis();
		jedis.set("momo", "nono");
		//shardedJedis.set("chiwei", "lining");
		System.out.println(jedis.get("momo"));
		//System.out.println(shardedJedis.get("chiwei"));
		shardedJedis.getShard("chiwei").set("chiwei", "lining");
		System.out.println(shardedJedis.getShard("chiwei").get("chiwei"));
	}

}

分片Shard的目的就是将数据均匀分布到多台redis实例中

以上的测试实例是简单的key-value,下面试试复杂的key

List

shardedJedis.lpush("chiwei", "one");
		shardedJedis.lpush("chiwei", "two");
		shardedJedis.lpush("chiwei", "three");
		shardedJedis.lpush("chiwei", "three");
		System.out.println(shardedJedis.llen("chiwei"));
		String str = shardedJedis.lpop("chiwei");
		System.out.println(str);

list添加的元素可重复

Set不能重复

shardedJedis.sadd("chiwei", "one");
		shardedJedis.sadd("chiwei", "one");

其它各种类型,请读者自行尝试,http://www.redis.cn/commands.html

集群环境

package com.chiwei.redis;

import java.util.HashSet;
import java.util.Set;

import org.junit.Test;

import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;

public class RedisClusterClient {

	private String serverInfo = "172.30.129.145:7379,172.30.129.145:7380,172.30.129.146:7379,172.30.129.146:7380,172.30.129.147:7379,172.30.129.147:7380";

	private Set<HostAndPort> getClusterInfo(String serverInfo) {
		Set<HostAndPort> set = new HashSet<HostAndPort>();
		if(serverInfo==null||"".equals(serverInfo.length())) {
			throw new RuntimeException("The serverInfo can not be empty");
		}
		String ipPort[] = serverInfo.split(",");
		int len = ipPort.length;
		for(int i=0;i<len;i++) {
			String server[] = ipPort[i].split(":");
			set.add(new HostAndPort(server[0], Integer.parseInt(server[1])));
		}
		return set;
	}

	@Test
	public void test() {

		Set<HostAndPort> jedisClusterNodes = getClusterInfo(serverInfo);
		// Jedis Cluster will attempt to discover cluster nodes automatically
		JedisCluster jc = new JedisCluster(jedisClusterNodes);
		jc.set("foo", "bar");
		String value = jc.get("foo");
		System.out.println(value);
	}

}

通过JedisCluster对象来操作redis缓存。

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>2.7.0</version>
</dependency>
时间: 2024-08-06 17:48:11

【Redis】redis集群与非集群环境下的jedis客户端通用开发的相关文章

MySql集群讲解(二)Mysql Liunx环境下搭建

MySql集群讲解(二) MySQL Linux环境下搭建 A:下载: wget https://cdn.mysql.com/Downloads/MySQL-5.7/mysql-5.7.18-linux-glibc2.5-x86_64.tar.gz B:安装前环境检查: 1.检查Linux是否安装了mariadb数据库,mariadb数据库是mysql的分支,执行命令: yum list installed | grep mariadb rpm -qa | grep mariadb 2.若Lin

Dynamics CRM2015 非基础语言环境下产品无法新建的问题

该现象出如今2015版本号上,之前从没注意过这个问题不知道曾经的版本号是否存在. 我的安装包的基础语言是中文.第一张图有加入产品的button,切换到英文环境下后就没有了,一開始以为是系统做了隐藏处理.但用工具查看home列表却发现没那3个button,那我们仅仅能手工加了. 在home列表加入自己定义button,然后分别加入Action和EnableRule,这个地方之所以用EnableRule是由于我们要用到CustomRule在js脚本中用代码进行控制(其它的displayrule和en

【Redis】redis的安装、配置运行及Jedis客户端的开发使用

定义: Redis is an open source, BSD licensed, advanced key-value cache and store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets,sorted sets, bitmaps and hyperloglogs. 下载: http://redis.io/download

redis服务及其配置与应用(window 环境下)

一.redis简介:Redis是一个开源的使用ANSI?C语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API(源自百度百科),个人更喜欢下面的解释:我们不用在面对功能单调的数据库时,把精力放在如何把大象放进冰箱这样的问题上,而是利用Redis灵活多变的数据结构和数据操作,为不同的大象构建不同的冰箱. ? ? 二.redis安装: 先下载redis包,根据自己电脑操作系统的属性选择X86还是X64的版本 ,解压到指定目录,如:C:\software\

Dynamics CRM2015 非基础语言环境下产品无法新建的问题的解决方法

该现象出现在2015版本上,之前从没注意过这个问题不知道以前的版本是否存在. 我的安装包的基础语言是中文,第一张图有添加产品的按钮,切换到英文环境下后就没有了,一开始以为是系统做了隐藏处理,但用工具查看home列表却发现没那3个按钮,那我们只能手工加了. 在home列表添加自定义按钮,然后分别添加Action和EnableRule,这个地方之所以用EnableRule是因为我们要用到CustomRule在js脚本中用代码进行控制(其他的displayrule和enablerule做不到这点),然

Redis集群的高可用测试(含Jedis客户端的使用)

Redis集群的使用测试(Jedis客户端的使用) 1.  Jedis客户端建议升级到最新版(当前为2.7.3),这样对3.0.x集群有比较好的支持. https://github.com/xetorthio/jedis http://mvnrepository.com/artifact/redis.clients/jedis 2.  直接在Java代码中链接Redis集群: // 数据库链接池配置 JedisPoolConfig config = new JedisPoolConfig();

Hadoop2.0集群、Hbase集群、Zookeeper集群、Hive工具、Sqoop工具、Flume工具搭建总结

实验开发环境所用软件: [[email protected] local]# ll total 320576 -rw-r--r-- 1 root root 52550402 Mar 6 10:34 apache-flume-1.6.0-bin.tar.gz drwxr-xr-x 7 root root 4096 Jul 15 10:46 flume drwxr-xr-x. 11 root root 4096 Jul 10 21:04 hadoop -rw-r--r--. 1 root root

Windows环境下使用Redis缓存工具的图文详细方法

网上找了两篇关于Redis的博客,记录下! Java 使用Redis缓存工具的图文详细方法 Windows环境下使用Redis缓存工具的图文详细方法

Windows PHP 环境下 Redis开发环境搭建

1.redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set --有序集合)和hashs(哈希类型).这些数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的.在此基础上,redis支持各种不同方式的排序.与memcached一样,为了保证效率,数据都是缓存在内存中.区别的是redi