前言:Redis的测试有一些讲究,如果你是先安装集群再来测试会出现很多意想不到的问题。单个redis-server测试很简单 就是照着API搞就行,但是如果是先搭建集群环境而使用集群节点(单个IP和端口)来操作就不适用了。集群的特点就是分担服务端的压力,此时采用Redis一般的操作API就不适用了,因为集群节点会发生转移(MOVED)到另一个节点上去,所以API操作要对应模式——集群应当使用与cluster API进行操作。Redis访问是建立的c/s模式的socket连接,所以不同的节点要么主机(Host)IP不同要么端口(port)不同,redis以此绑定(bind)IP和port (ip:port)。
Connection
package com.boonya.redis.samles; import redis.clients.jedis.Jedis; public class RedisTest { public static void main(String[] args) { //Connecting to Redis server on 192.168.28.194 Jedis jedis = new Jedis("192.168.28.194",6379,1000); System.out.println("Connection to server sucessfully"); //check whether server is running or not System.out.println("Server is running: "+jedis.ping()); jedis.quit(); jedis.disconnect(); } }
package com.boonya.redis.samles; import java.util.Iterator; import java.util.Set; import redis.clients.jedis.Jedis; public class RedisKeyTest { public static void main(String[] args) { // Connecting to Redis server on 192.168.28.194 Jedis jedis = new Jedis("192.168.28.194",6379,1000); System.out.println("Connection to server sucessfully"); // store data in redis list // Get the stored data and print it Set<String> set = jedis.keys("*"); Iterator<String> it=set.iterator(); while (it.hasNext()) { String key = it.next(); System.out.println("List of stored keys:: " + key); } System.out.println("It's ready to work."); jedis.quit(); jedis.disconnect(); } }
package com.boonya.redis.samles; import java.util.List; import redis.clients.jedis.Jedis; public class RedisListTest { public static void main(String[] args) { // Connecting to Redis server on 192.168.28.194 Jedis jedis = new Jedis("192.168.28.194",6379,1000); System.out.println("Connection to server sucessfully"); // store data in redis list jedis.lpush("tutorial-list", "Redis"); jedis.lpush("tutorial-list", "Mongodb"); jedis.lpush("tutorial-list", "Mysql"); // Get the stored data and print it List<String> list = jedis.lrange("tutorial-list", 0, 5); for (int i = 0; i < list.size(); i++) { System.out.println("Stored string in redis:: " + list.get(i)); } System.out.println("It's ready to work."); jedis.quit(); jedis.disconnect(); } }
package com.boonya.redis.samles; import redis.clients.jedis.Jedis; public class RedisStringTest { public static void main(String[] args) { // Connecting to Redis server on 192.168.28.194 Jedis jedis = new Jedis("192.168.28.194", 6379, 1000); System.out.println("Connection to server sucessfully"); // set the data in redis string jedis.set("tutorial-name", "Redis tutorial"); // Get the stored data and print it System.out.println("Stored string in redis:: " + jedis.get("tutorial-name")); jedis.quit(); jedis.disconnect(); } }
package com.boonya.redis.samles; import org.junit.After; import org.junit.Before; import org.junit.Test; import redis.clients.jedis.Jedis; public class RedisServerTest { private Jedis jedis; @Before public void testBeforeClass(){ jedis = new Jedis("192.168.28.194",6379,1000); jedis.clientSetname("boonya-pc"); jedis.flushAll(); } @After public void release(){ jedis.quit(); jedis.disconnect(); } @Test public void testKillClient(){ String clientGetname=jedis.clientGetname(); System.out.println("clientGetname="+clientGetname); String clientList=jedis.clientList(); System.out.println("clientList="+clientList); } }
package com.boonya.redis.singlenode; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.Set; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import redis.clients.jedis.JedisShardInfo; import redis.clients.jedis.Pipeline; import redis.clients.jedis.ShardedJedis; import redis.clients.jedis.ShardedJedisPipeline; import redis.clients.jedis.ShardedJedisPool; import redis.clients.jedis.SortingParams; import redis.clients.jedis.Transaction; public class RedisClient { private String host="192.168.28.194"; private Jedis jedis;// 非切片额客户端连接 private JedisPool jedisPool;// 非切片连接池 private ShardedJedis shardedJedis;// 切片额客户端连接 private ShardedJedisPool shardedJedisPool;// 切片连接池 private ShardedJedis sharded; public RedisClient() { initialPool(); initialShardedPool(); shardedJedis = shardedJedisPool.getResource(); jedis = jedisPool.getResource(); System.out.println("initial completed!"); } /** * 初始化非切片池 */ private void initialPool() { // 池基本配置 JedisPoolConfig config = new JedisPoolConfig(); // config.setMaxActive(20); config.setMaxIdle(5); // config.setMaxWait(1000l); config.setMaxWaitMillis(1000); config.setTestOnBorrow(false); jedisPool = new JedisPool(config, host, 6379); } /** * 初始化切片池 */ private void initialShardedPool() { // 池基本配置 JedisPoolConfig config = new JedisPoolConfig(); // config.setMaxActive(20); config.setMaxIdle(5); // /config.setMaxWait(1000l); config.setMaxWaitMillis(1000); config.setTestOnBorrow(false); // slave链接 List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); shards.add(new JedisShardInfo(host, 6379, "master")); // socket模式测试对象初始化 sharded=new ShardedJedis(shards); // 构造池 shardedJedisPool = new ShardedJedisPool(config, shards); } private void KeyOperate() { System.out .println("======================key=========================="); // 清空数据 System.out.println("清空库中所有数据:" + jedis.flushDB()); // 判断key否存在 System.out.println("判断key999键是否存在:" + shardedJedis.exists("key999")); System.out.println("新增key001,value001键值对:" + shardedJedis.set("key001", "value001")); System.out.println("判断key001是否存在:" + shardedJedis.exists("key001")); // 输出系统中所有的key System.out.println("新增key002,value002键值对:" + shardedJedis.set("key002", "value002")); System.out.println("系统中所有键如下:"); Set<String> keys = jedis.keys("*"); Iterator<String> it = keys.iterator(); while (it.hasNext()) { String key = it.next(); System.out.println(key); } // 删除某个key,若key不存在,则忽略该命令。 System.out.println("系统中删除key002: " + jedis.del("key002")); System.out.println("判断key002是否存在:" + shardedJedis.exists("key002")); // 设置 key001的过期时间 System.out.println("设置 key001的过期时间为5秒:" + jedis.expire("key001", 5)); try { Thread.sleep(2000); } catch (InterruptedException e) { } // 查看某个key的剩余生存时间,单位【秒】.永久生存或者不存在的都返回-1 System.out.println("查看key001的剩余生存时间:" + jedis.ttl("key001")); // 移除某个key的生存时间 System.out.println("移除key001的生存时间:" + jedis.persist("key001")); System.out.println("查看key001的剩余生存时间:" + jedis.ttl("key001")); // 查看key所储存的值的类型 System.out.println("查看key所储存的值的类型:" + jedis.type("key001")); /* * 一些其他方法:1、修改键名:jedis.rename("key6", "key0"); * 2、将当前db的key移动到给定的db当中:jedis.move("foo", 1) */ } private void StringOperate() { System.out .println("======================String_1=========================="); // 清空数据 System.out.println("清空库中所有数据:" + jedis.flushDB()); System.out.println("=============增============="); jedis.set("key001", "value001"); jedis.set("key002", "value002"); jedis.set("key003", "value003"); System.out.println("已新增的3个键值对如下:"); System.out.println(jedis.get("key001")); System.out.println(jedis.get("key002")); System.out.println(jedis.get("key003")); System.out.println("=============删============="); System.out.println("删除key003键值对:" + jedis.del("key003")); System.out.println("获取key003键对应的值:" + jedis.get("key003")); System.out.println("=============改============="); // 1、直接覆盖原来的数据 System.out.println("直接覆盖key001原来的数据:" + jedis.set("key001", "value001-update")); System.out.println("获取key001对应的新值:" + jedis.get("key001")); // 2、直接覆盖原来的数据 System.out.println("在key002原来值后面追加:" + jedis.append("key002", "+appendString")); System.out.println("获取key002对应的新值" + jedis.get("key002")); System.out.println("=============增,删,查(多个)============="); /** * mset,mget同时新增,修改,查询多个键值对 等价于: jedis.set("name","ssss"); * jedis.set("jarorwar","xxxx"); */ System.out.println("一次性新增key201,key202,key203,key204及其对应值:" + jedis.mset("key201", "value201", "key202", "value202", "key203", "value203", "key204", "value204")); System.out.println("一次性获取key201,key202,key203,key204各自对应的值:" + jedis.mget("key201", "key202", "key203", "key204")); System.out.println("一次性删除key201,key202:" + jedis.del(new String[] { "key201", "key202" })); System.out.println("一次性获取key201,key202,key203,key204各自对应的值:" + jedis.mget("key201", "key202", "key203", "key204")); System.out.println(); // jedis具备的功能shardedJedis中也可直接使用,下面测试一些前面没用过的方法 System.out .println("======================String_2=========================="); // 清空数据 System.out.println("清空库中所有数据:" + jedis.flushDB()); System.out.println("=============新增键值对时防止覆盖原先值============="); System.out.println("原先key301不存在时,新增key301:" + shardedJedis.setnx("key301", "value301")); System.out.println("原先key302不存在时,新增key302:" + shardedJedis.setnx("key302", "value302")); System.out.println("当key302存在时,尝试新增key302:" + shardedJedis.setnx("key302", "value302_new")); System.out.println("获取key301对应的值:" + shardedJedis.get("key301")); System.out.println("获取key302对应的值:" + shardedJedis.get("key302")); System.out.println("=============超过有效期键值对被删除============="); // 设置key的有效期,并存储数据 System.out.println("新增key303,并指定过期时间为2秒" + shardedJedis.setex("key303", 2, "key303-2second")); System.out.println("获取key303对应的值:" + shardedJedis.get("key303")); try { Thread.sleep(3000); } catch (InterruptedException e) { } System.out.println("3秒之后,获取key303对应的值:" + shardedJedis.get("key303")); System.out.println("=============获取原值,更新为新值一步完成============="); System.out.println("key302原值:" + shardedJedis.getSet("key302", "value302-after-getset")); System.out.println("key302新值:" + shardedJedis.get("key302")); System.out.println("=============获取子串============="); System.out.println("获取key302对应值中的子串:" + shardedJedis.getrange("key302", 5, 7)); } private void ListOperate() { System.out .println("======================list=========================="); // 清空数据 System.out.println("清空库中所有数据:" + jedis.flushDB()); System.out.println("=============增============="); shardedJedis.lpush("stringlists", "vector"); shardedJedis.lpush("stringlists", "ArrayList"); shardedJedis.lpush("stringlists", "vector"); shardedJedis.lpush("stringlists", "vector"); shardedJedis.lpush("stringlists", "LinkedList"); shardedJedis.lpush("stringlists", "MapList"); shardedJedis.lpush("stringlists", "SerialList"); shardedJedis.lpush("stringlists", "HashList"); shardedJedis.lpush("numberlists", "3"); shardedJedis.lpush("numberlists", "1"); shardedJedis.lpush("numberlists", "5"); shardedJedis.lpush("numberlists", "2"); System.out.println("所有元素-stringlists:" + shardedJedis.lrange("stringlists", 0, -1)); System.out.println("所有元素-numberlists:" + shardedJedis.lrange("numberlists", 0, -1)); System.out.println("=============删============="); // 删除列表指定的值 ,第二个参数为删除的个数(有重复时),后add进去的值先被删,类似于出栈 System.out.println("成功删除指定元素个数-stringlists:" + shardedJedis.lrem("stringlists", 2, "vector")); System.out.println("删除指定元素之后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1)); // 删除区间以外的数据 System.out.println("删除下标0-3区间之外的元素:" + shardedJedis.ltrim("stringlists", 0, 3)); System.out.println("删除指定区间之外元素后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1)); // 列表元素出栈 System.out.println("出栈元素:" + shardedJedis.lpop("stringlists")); System.out.println("元素出栈后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1)); System.out.println("=============改============="); // 修改列表中指定下标的值 shardedJedis.lset("stringlists", 0, "hello list!"); System.out.println("下标为0的值修改后-stringlists:" + shardedJedis.lrange("stringlists", 0, -1)); System.out.println("=============查============="); // 数组长度 System.out .println("长度-stringlists:" + shardedJedis.llen("stringlists")); System.out .println("长度-numberlists:" + shardedJedis.llen("numberlists")); // 排序 /* * list中存字符串时必须指定参数为alpha,如果不使用SortingParams,而是直接使用sort("list"), * 会出现"ERR One or more scores can't be converted into double" */ SortingParams sortingParameters = new SortingParams(); sortingParameters.alpha(); sortingParameters.limit(0, 3); System.out.println("返回排序后的结果-stringlists:" + shardedJedis.sort("stringlists", sortingParameters)); System.out.println("返回排序后的结果-numberlists:" + shardedJedis.sort("numberlists")); // 子串: start为元素下标,end也为元素下标;-1代表倒数一个元素,-2代表倒数第二个元素 System.out.println("子串-第二个开始到结束:" + shardedJedis.lrange("stringlists", 1, -1)); // 获取列表指定下标的值 System.out.println("获取下标为2的元素:" + shardedJedis.lindex("stringlists", 2) + "\n"); } private void SetOperate() { System.out .println("======================set=========================="); // 清空数据 System.out.println("清空库中所有数据:" + jedis.flushDB()); System.out.println("=============增============="); System.out.println("向sets集合中加入元素element001:" + jedis.sadd("sets", "element001")); System.out.println("向sets集合中加入元素element002:" + jedis.sadd("sets", "element002")); System.out.println("向sets集合中加入元素element003:" + jedis.sadd("sets", "element003")); System.out.println("向sets集合中加入元素element004:" + jedis.sadd("sets", "element004")); System.out.println("查看sets集合中的所有元素:" + jedis.smembers("sets")); System.out.println(); System.out.println("=============删============="); System.out.println("集合sets中删除元素element003:" + jedis.srem("sets", "element003")); System.out.println("查看sets集合中的所有元素:" + jedis.smembers("sets")); /* * System.out.println("sets集合中任意位置的元素出栈:"+jedis.spop("sets"));//注:出栈元素位置居然不定 * ?--无实际意义 * System.out.println("查看sets集合中的所有元素:"+jedis.smembers("sets")); */ System.out.println(); System.out.println("=============改============="); System.out.println(); System.out.println("=============查============="); System.out.println("判断element001是否在集合sets中:" + jedis.sismember("sets", "element001")); System.out.println("循环查询获取sets中的每个元素:"); Set<String> set = jedis.smembers("sets"); Iterator<String> it = set.iterator(); while (it.hasNext()) { Object obj = it.next(); System.out.println(obj); } System.out.println(); System.out.println("=============集合运算============="); System.out.println("sets1中添加元素element001:" + jedis.sadd("sets1", "element001")); System.out.println("sets1中添加元素element002:" + jedis.sadd("sets1", "element002")); System.out.println("sets1中添加元素element003:" + jedis.sadd("sets1", "element003")); System.out.println("sets1中添加元素element002:" + jedis.sadd("sets2", "element002")); System.out.println("sets1中添加元素element003:" + jedis.sadd("sets2", "element003")); System.out.println("sets1中添加元素element004:" + jedis.sadd("sets2", "element004")); System.out.println("查看sets1集合中的所有元素:" + jedis.smembers("sets1")); System.out.println("查看sets2集合中的所有元素:" + jedis.smembers("sets2")); System.out.println("sets1和sets2交集:" + jedis.sinter("sets1", "sets2")); System.out.println("sets1和sets2并集:" + jedis.sunion("sets1", "sets2")); System.out.println("sets1和sets2差集:" + jedis.sdiff("sets1", "sets2"));// 差集:set1中有,set2中没有的元素 } private void SortedSetOperate() { System.out .println("======================zset=========================="); // 清空数据 System.out.println(jedis.flushDB()); System.out.println("=============增============="); System.out.println("zset中添加元素element001:" + shardedJedis.zadd("zset", 7.0, "element001")); System.out.println("zset中添加元素element002:" + shardedJedis.zadd("zset", 8.0, "element002")); System.out.println("zset中添加元素element003:" + shardedJedis.zadd("zset", 2.0, "element003")); System.out.println("zset中添加元素element004:" + shardedJedis.zadd("zset", 3.0, "element004")); System.out .println("zset集合中的所有元素:" + shardedJedis.zrange("zset", 0, -1));// 按照权重值排序 System.out.println(); System.out.println("=============删============="); System.out.println("zset中删除元素element002:" + shardedJedis.zrem("zset", "element002")); System.out .println("zset集合中的所有元素:" + shardedJedis.zrange("zset", 0, -1)); System.out.println(); System.out.println("=============改============="); System.out.println(); System.out.println("=============查============="); System.out.println("统计zset集合中的元素中个数:" + shardedJedis.zcard("zset")); System.out.println("统计zset集合中权重某个范围内(1.0——5.0),元素的个数:" + shardedJedis.zcount("zset", 1.0, 5.0)); System.out.println("查看zset集合中element004的权重:" + shardedJedis.zscore("zset", "element004")); System.out.println("查看下标1到2范围内的元素值:" + shardedJedis.zrange("zset", 1, 2)); } private void HashOperate() { System.out .println("======================hash=========================="); // 清空数据 System.out.println(jedis.flushDB()); System.out.println("=============增============="); System.out.println("hashs中添加key001和value001键值对:" + shardedJedis.hset("hashs", "key001", "value001")); System.out.println("hashs中添加key002和value002键值对:" + shardedJedis.hset("hashs", "key002", "value002")); System.out.println("hashs中添加key003和value003键值对:" + shardedJedis.hset("hashs", "key003", "value003")); System.out.println("新增key004和4的整型键值对:" + shardedJedis.hincrBy("hashs", "key004", 4l)); System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs")); System.out.println(); System.out.println("=============删============="); System.out.println("hashs中删除key002键值对:" + shardedJedis.hdel("hashs", "key002")); System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs")); System.out.println(); System.out.println("=============改============="); System.out.println("key004整型键值的值增加100:" + shardedJedis.hincrBy("hashs", "key004", 100l)); System.out.println("hashs中的所有值:" + shardedJedis.hvals("hashs")); System.out.println(); System.out.println("=============查============="); System.out.println("判断key003是否存在:" + shardedJedis.hexists("hashs", "key003")); System.out.println("获取key004对应的值:" + shardedJedis.hget("hashs", "key004")); System.out.println("批量获取key001和key003对应的值:" + shardedJedis.hmget("hashs", "key001", "key003")); System.out.println("获取hashs中所有的key:" + shardedJedis.hkeys("hashs")); System.out.println("获取hashs中所有的value:" + shardedJedis.hvals("hashs")); System.out.println(); } private void simpleSetGet() { jedis.set("key001", "value001"); jedis.set("key002", "value002"); jedis.set("key003", "value003"); System.out.println("已新增的3个键值对如下:"); System.out.println(jedis.get("key001")); System.out.println(jedis.get("key002")); System.out.println(jedis.get("key003")); } @SuppressWarnings("deprecation") public void show() { simpleSetGet(); KeyOperate(); StringOperate(); ListOperate(); SetOperate(); SortedSetOperate(); HashOperate(); jedisPool.returnResource(jedis); shardedJedisPool.returnResource(shardedJedis); } /************************************Socket模式连接测试******************开始**************/ private void test1Normal() { // 设置值 long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { jedis.set("k" + i, "v" + i); } long end = System.currentTimeMillis(); System.out.println("Simple SET: " + ((end - start) / 1000.0) + " seconds"); // 获取值 for (int i = 0; i < 10; i++) { String result = jedis.get("n" + i); System.out.println("Simple GET: " + "k" + i + "=" + result); } } private void test2Trans() { long start = System.currentTimeMillis(); Transaction tx = jedis.multi(); for (int i = 0; i < 10; i++) { tx.set("t" + i, "t" + i); } // System.out.println(tx.get("t1000").get()); @SuppressWarnings("unused") List<Object> results = tx.exec(); long end = System.currentTimeMillis(); System.out.println("Transaction SET: " + ((end - start) / 1000.0) + " seconds"); } private void test3Pipelined() { Pipeline pipeline = jedis.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { pipeline.set("p" + i, "p" + i); } // System.out.println(pipeline.get("p1000").get()); @SuppressWarnings("unused") List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined SET: " + ((end - start) / 1000.0) + " seconds"); } private void test4combPipelineTrans() { long start = System.currentTimeMillis(); Pipeline pipeline = jedis.pipelined(); pipeline.multi(); for (int i = 0; i < 10; i++) { pipeline.set("" + i, "" + i); } pipeline.exec(); @SuppressWarnings("unused") List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined transaction: " + ((end - start) / 1000.0) + " seconds"); } @SuppressWarnings("unused") private void test5shardNormal() { long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { String result = sharded.set("sn" + i, "n" + i); } long end = System.currentTimeMillis(); System.out.println("Simple@Sharing SET: " + ((end - start) / 1000.0) + " seconds"); } @SuppressWarnings("unused") private void test6shardpipelined() { ShardedJedisPipeline pipeline = sharded.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { pipeline.set("sp" + i, "p" + i); } List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); System.out.println("Pipelined@Sharing SET: " + ((end - start) / 1000.0) + " seconds"); } @SuppressWarnings("deprecation") private void test7shardSimplePool() { ShardedJedis one = shardedJedisPool.getResource(); long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { @SuppressWarnings("unused") String result = one.set("spn" + i, "n" + i); } long end = System.currentTimeMillis(); shardedJedisPool.returnResource(one); System.out.println("Simple@Pool SET: " + ((end - start) / 1000.0) + " seconds"); } @SuppressWarnings("deprecation") private void test8shardPipelinedPool() { ShardedJedis one = shardedJedisPool.getResource(); ShardedJedisPipeline pipeline = one.pipelined(); long start = System.currentTimeMillis(); for (int i = 0; i < 10; i++) { pipeline.set("sppn" + i, "n" + i); } @SuppressWarnings("unused") List<Object> results = pipeline.syncAndReturnAll(); long end = System.currentTimeMillis(); shardedJedisPool.returnResource(one); System.out.println("Pipelined@Pool SET: " + ((end - start) / 1000.0) + " seconds"); } public void testSockets(){ test1Normal(); test2Trans(); test3Pipelined(); test4combPipelineTrans(); test5shardNormal(); test6shardpipelined(); test7shardSimplePool(); test8shardPipelinedPool(); } /************************************Socket模式连接测试******************结束**************/ public static void main(String[] args) { RedisClient client = new RedisClient(); client.show(); client.testSockets(); } }
Test
package com.boonya.redis.singlenode; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import org.junit.Before; import org.junit.Test; import com.boonya.redis.util.RedisPoolUtil; import redis.clients.jedis.Jedis; public class RedisTest { private Jedis jedis; @Before public void setup() { // 连接redis服务器,192.168.28.194:6379 jedis = new Jedis("192.168.28.194", 6379,1000); // 权限认证 // jedis.auth("boonya"); } @Test public void testStringSetAndGet() { jedis.set("name", "boonya"); System.out.println("name=" + jedis.get("name")); } /** * redis存储字符串 */ @Test public void testString() { // -----添加数据---------- jedis.set("name", "niuniu"); System.out.println(jedis.get("name")); jedis.append("name", " is my lover"); // 拼接 System.out.println(jedis.get("name")); jedis.del("name"); // 删除某个键 System.out.println(jedis.get("name")); // 设置多个键值对 jedis.mset("name", "boonya", "age", "23", "qq", "476777XXX"); jedis.incr("age"); // 进行加1操作 System.out.println(jedis.get("name") + "-" + jedis.get("age") + "-" + jedis.get("qq")); } /** * redis操作Map */ @Test public void testMap() { // -----添加数据---------- Map<String, String> map = new HashMap<String, String>(); map.put("name", "niuniu"); map.put("age", "22"); map.put("qq", "123456"); jedis.hmset("user", map); // 取出user中的name,执行结果:[minxr]-->注意结果是一个泛型的List // 第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数 List<String> rsmap = jedis.hmget("user", "name", "age", "qq"); System.out.println(rsmap); // 删除map中的某个键值 jedis.hdel("user", "age"); System.out.println(jedis.hmget("user", "age")); // 因为删除了,所以返回的是null System.out.println(jedis.hlen("user")); // 返回key为user的键中存放的值的个数2 System.out.println(jedis.exists("user"));// 是否存在key为user的记录 返回true System.out.println(jedis.hkeys("user"));// 返回map对象中的所有key System.out.println(jedis.hvals("user"));// 返回map对象中的所有value Iterator<String> iter = jedis.hkeys("user").iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + ":" + jedis.hmget("user", key)); } } /** * jedis操作List */ @Test public void testList() { // 开始前,先移除所有的内容 jedis.del("java framework"); System.out.println(jedis.lrange("java framework", 0, -1)); // 先向key java framework中存放三条数据 jedis.lpush("java framework", "spring"); jedis.lpush("java framework", "struts"); jedis.lpush("java framework", "hibernate"); // 再取出所有数据jedis.lrange是按范围取出, // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有 System.out.println(jedis.lrange("java framework", 0, -1)); jedis.del("java framework"); jedis.rpush("java framework", "spring"); jedis.rpush("java framework", "struts"); jedis.rpush("java framework", "hibernate"); System.out.println(jedis.lrange("java framework", 0, -1)); } /** * jedis操作Set */ @Test public void testSet() { // 添加 jedis.sadd("user", "boonya"); jedis.sadd("user", "niuniu"); jedis.sadd("user", "ling"); jedis.sadd("user", "guoniuniu"); jedis.sadd("user", "who"); // 移除noname jedis.srem("user", "who"); System.out.println(jedis.smembers("user"));// 获取所有加入的value System.out.println(jedis.sismember("user", "who"));// 判断 who // 是否是user集合的元素 System.out.println(jedis.srandmember("user")); System.out.println(jedis.scard("user"));// 返回集合的元素个数 } @Test public void test() throws InterruptedException { // jedis 排序 // 注意,此处的rpush和lpush是List的操作。是一个双向链表(但从表现来看的) jedis.del("a");// 先清除数据,再加入数据进行测试 jedis.rpush("a", "1"); jedis.lpush("a", "6"); jedis.lpush("a", "3"); jedis.lpush("a", "9"); System.out.println(jedis.lrange("a", 0, -1));// [9, 3, 6, 1] System.out.println(jedis.sort("a")); // [1, 3, 6, 9] //输入排序后结果 System.out.println(jedis.lrange("a", 0, -1)); } @Test public void testRedisPool() { RedisPoolUtil.getJedis().set("username", "boonya"); System.out.println(RedisUtil.getJedis().get("username")); } }
RedisPoolUtil
package com.boonya.redis.util; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; /** * @packge com.boonya.redis.util.RedisUtil * @date 2015年10月27日 下午2:13:12 * @author wlyd * @comment Redis工具类 * @update */ public class RedisPoolUtil { //Redis服务器IP private static String ADDR = "192.168.28.194"; //Redis的端口号(用于单个redis节点而非集群模式) private static int PORT = 6379; //访问密码,Redis默认没有密码 private static String AUTH = ""; //可用连接实例的最大数目,默认值为8; //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 private static int MAX_ACTIVE = 1024; //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。 private static int MAX_IDLE = 200; //等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException; private static int MAX_WAIT = 10000; private static int TIMEOUT = 10000; //在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; private static boolean TEST_ON_BORROW = true; private static JedisPool jedisPool = null; /** * 初始化Redis连接池 */ static { try { JedisPoolConfig config = new JedisPoolConfig(); //config.setMaxActive(MAX_ACTIVE); config.setMaxIdle(MAX_IDLE); //config.setMaxWait(MAX_WAIT); config.setMaxWaitMillis(MAX_WAIT); config.setTestOnBorrow(TEST_ON_BORROW); jedisPool = new JedisPool(config, ADDR, PORT, TIMEOUT);//, AUTH); } catch (Exception e) { e.printStackTrace(); } } /** * 获取Jedis实例 * @return */ public synchronized static Jedis getJedis() { try { if (jedisPool != null) { Jedis resource = jedisPool.getResource(); return resource; } else { return null; } } catch (Exception e) { e.printStackTrace(); return null; } } /** * 释放jedis资源 * @param jedis */ @SuppressWarnings("deprecation") public static void returnResource(final Jedis jedis) { if (jedis != null) { jedisPool.returnResource(jedis); } } }
package com.boonya.redis.cluster; import java.util.HashMap; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; import org.junit.Test; import redis.clients.jedis.HostAndPort; import redis.clients.jedis.JedisCluster; import junit.framework.TestCase; /** * * @packge com.boonya.redis.RedisClusterTest * @date 2015年10月21日 下午2:31:38 * @author pengjunlin * @comment jedis客户端的坑. 1)cluster环境下redis的slave不接受任何读写操作, 2)client端不支持keys批量操作,不支持select dbNum操作,只有一个db:select 0 3)JedisCluster 的info()等单机函数无法调用,返回(No way to dispatch this command to Redis Cluster)错误,. * @update * @from http://blog.csdn.net/myrainblues/article/details/25881535 */ public class ClusterTest extends TestCase { private static String host="192.168.28.194"; private static JedisCluster cluster; static { // 只给集群里一个实例就可以 Set<HostAndPort> jedisClusterNodes = new HashSet<HostAndPort>(); jedisClusterNodes.add(new HostAndPort(host, 7000)); jedisClusterNodes.add(new HostAndPort(host, 7001)); jedisClusterNodes.add(new HostAndPort(host, 7002)); jedisClusterNodes.add(new HostAndPort(host, 7003)); jedisClusterNodes.add(new HostAndPort(host, 7004)); jedisClusterNodes.add(new HostAndPort(host, 7005)); cluster = new JedisCluster(jedisClusterNodes); } @Test public void testSetString(){ cluster.set("username", "boonya"); System.out.println("set username "+cluster.get("username")); } @Test public void testAppendString(){ cluster.append("username", " peng"); System.out.println("append username "+cluster.get("username")); } @Test public void testDelString(){ cluster.set("username", "boonya xnn"); System.out.println("del-get username "+cluster.get("username")); cluster.del("username"); System.out.println("del-did username "+cluster.get("username")); } @Test public void testMap(){ // -----添加数据---------- Map<String, String> map = new HashMap<String, String>(); map.put("name", "boonya"); map.put("age", "88"); map.put("qq", "123456"); cluster.hmset("user", map); // 第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数 List<String> rsmap = cluster.hmget("user", "name", "age", "qq"); System.out.println(rsmap); // 删除map中的某个键值 cluster.hdel("user", "age"); System.out.println(cluster.hmget("user", "age")); // 因为删除了,所以返回的是null System.out.println(cluster.hlen("user")); // 返回key为user的键中存放的值的个数2 System.out.println(cluster.exists("user"));// 是否存在key为user的记录 返回true System.out.println(cluster.hkeys("user"));// 返回map对象中的所有key System.out.println(cluster.hvals("user"));// 返回map对象中的所有value Iterator<String> iter = cluster.hkeys("user").iterator(); while (iter.hasNext()) { String key = iter.next(); System.out.println(key + ":" + cluster.hmget("user", key)); } } @Test public void testList() { // 开始前,先移除所有的内容 cluster.del("java framework"); System.out.println(cluster.lrange("java framework", 0, -1)); // 先向key java framework中存放三条数据 cluster.lpush("java framework", "spring"); cluster.lpush("java framework", "struts"); cluster.lpush("java framework", "hibernate"); // 再取出所有数据jedis.lrange是按范围取出, // 第一个是key,第二个是起始位置,第三个是结束位置,jedis.llen获取长度 -1表示取得所有 System.out.println(cluster.lrange("java framework", 0, -1)); cluster.del("java framework"); cluster.rpush("java framework", "spring"); cluster.rpush("java framework", "struts"); cluster.rpush("java framework", "hibernate"); System.out.println(cluster.lrange("java framework", 0, -1)); } @Test public void testSet() { // 添加 cluster.sadd("user","boonya"); cluster.sadd("user", "niuniu"); cluster.sadd("user", "ling"); cluster.sadd("user", "guoniuniu"); cluster.sadd("user", "who"); //cluster.sadd("user",new String []{ "boonya","niuniu","ling","guoniuniu","who"}); // 移除noname cluster.srem("user", "who"); System.out.println(cluster.smembers("user"));// 获取所有加入的value System.out.println(cluster.sismember("user", "who"));// 判断 who // 是否是user集合的元素 System.out.println(cluster.srandmember("user")); System.out.println(cluster.scard("user"));// 返回集合的元素个数 } @Test public void testUserSession(){ // -----添加数据---------- Map<String, String> map = new HashMap<String, String>(); map.put("zhangsan", "zhangsan-v"); map.put("lisi", "lisi-v"); map.put("wangwu", "wangwu-v"); cluster.hmset("usersession", map); // 第一个参数是存入redis中map对象的key,后面跟的是放入map中的对象的key,后面的key可以跟多个,是可变参数 List<String> rsmap = cluster.hmget("usersession","zhangsan","lisi"); System.out.println(rsmap); } }
错误栈内信息:
redis.clients.jedis.exceptions.JedisDataException: ERR Client sent AUTH, but no password is set at redis.clients.jedis.Protocol.processError(Protocol.java:117) at redis.clients.jedis.Protocol.process(Protocol.java:151) at redis.clients.jedis.Protocol.read(Protocol.java:205) at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297) at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:196) at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:85) at redis.clients.jedis.Connection.sendCommand(Connection.java:100) at redis.clients.jedis.Connection.sendCommand(Connection.java:91) at redis.clients.jedis.BinaryClient.auth(BinaryClient.java:538) at redis.clients.jedis.BinaryJedis.auth(BinaryJedis.java:2012) at com.boonya.redis.MyJedisTest.setup(MyJedisTest.java:24) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:47) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:44) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:24) at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:271) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:70) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:50) at org.junit.runners.ParentRunner$3.run(ParentRunner.java:238) at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:63) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:236) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:53) at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:229) at org.junit.runners.ParentRunner.run(ParentRunner.java:309) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)
因为redis默认没有设置密码,所以在访问的时候可以不设置auth.若要使用密码方式访问,需要在redis.conf中设置requirepass yourpass.
redis.clients.jedis.exceptions.JedisClusterException: CLUSTERDOWN The cluster is down
Exception in thread "main" redis.clients.jedis.exceptions.JedisMovedDataException: MOVED 5474 192.168.28.194:7001 at redis.clients.jedis.Protocol.processError(Protocol.java:108) at redis.clients.jedis.Protocol.process(Protocol.java:151) at redis.clients.jedis.Protocol.read(Protocol.java:205) at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297) at redis.clients.jedis.Connection.getStatusCodeReply(Connection.java:196) at redis.clients.jedis.Jedis.hmset(Jedis.java:644) at com.boonya.redis.samles.RedisMapJava.main(RedisMapJava.java:19)MOVED indicates that you're using Redis Cluster. ShardedJedis is not for Redis Cluster, so you should use JedisCluster instead. 不应该调用集群节点,API调用方式错误。
3.4错误的数据类型
redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value at redis.clients.jedis.Protocol.processError(Protocol.java:117) at redis.clients.jedis.Protocol.process(Protocol.java:151) at redis.clients.jedis.Protocol.read(Protocol.java:205) at redis.clients.jedis.Connection.readProtocolWithCheckingBroken(Connection.java:297) at redis.clients.jedis.Connection.getIntegerReply(Connection.java:222) at redis.clients.jedis.Jedis.sadd(Jedis.java:1048) at redis.clients.jedis.JedisCluster$49.execute(JedisCluster.java:559) at redis.clients.jedis.JedisCluster$49.execute(JedisCluster.java:556) at redis.clients.jedis.JedisClusterCommand.runWithRetries(JedisClusterCommand.java:56) at redis.clients.jedis.JedisClusterCommand.run(JedisClusterCommand.java:29) at redis.clients.jedis.JedisCluster.sadd(JedisCluster.java:556) at com.boonya.redis.cluster.ClusterTest.testSet(ClusterTest.java:120) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at junit.framework.TestCase.runTest(TestCase.java:176) at junit.framework.TestCase.runBare(TestCase.java:141) at junit.framework.TestResult$1.protect(TestResult.java:122) at junit.framework.TestResult.runProtected(TestResult.java:142) at junit.framework.TestResult.run(TestResult.java:125) at junit.framework.TestCase.run(TestCase.java:129) at junit.framework.TestSuite.runTest(TestSuite.java:255) at junit.framework.TestSuite.run(TestSuite.java:250) at org.junit.internal.runners.JUnit38ClassRunner.run(JUnit38ClassRunner.java:84) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192)