package com.hanchao.testredis; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import com.alibaba.fastjson.JSON; import com.hanchao.entity.Person; import com.hanchao.util.SerializeUtil; 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.jedis.SortingParams; /** * redis客户端简单学习 * @author liweihan * @version 1.0 (2014年12月14日 下午5:26:08) */ public class RedisClent { private Jedis jedis; //非切片的客户端连接 private JedisPool jedisPool; //非切片连接池 private ShardedJedis shardedJedis;//切片的客户端连接 private ShardedJedisPool shardedJedisPool; //切片连接池 /** * 构造方法,初始化一些参数 */ public RedisClent() { initialPool(); initialShardedPool(); shardedJedis = shardedJedisPool.getResource(); jedis = jedisPool.getResource(); } /** * 初始化切片池 * http://yychao.iteye.com/blog/1751583 * 2014年12月14日 下午5:33:56 * liweihan */ private void initialShardedPool() { //池子基本配置 JedisPoolConfig config = new JedisPoolConfig(); //控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取; //如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。 config.setMaxActive(20); //控制一个pool最多有多少个状态为idle(空闲的)的jedis实例。 config.setMaxIdle(5); //表示当borrow(引入)一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛出JedisConnectionException; config.setMaxWait(10000L); ////在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; config.setTestOnBorrow(false); //slave链接-分布式 List<JedisShardInfo> shards = new ArrayList<JedisShardInfo>(); shards.add(new JedisShardInfo("10.10.78.208",6379,"master")); shards.add(new JedisShardInfo("10.10.52.141",6379,"slave")); //注意事项:此处的redis必须都是主的,不能是从的。如果是从的会报错的! //构造池 shardedJedisPool = new ShardedJedisPool(config, shards); } /** * 初始化非切片池 * 2014年12月14日 下午5:30:26 * liweihan */ private void initialPool() { //池子基本配置 JedisPoolConfig config = new JedisPoolConfig(); config.setMaxActive(20); config.setMaxIdle(5); config.setMaxWait(10000L); config.setTestOnBorrow(false); jedisPool = new JedisPool(config, "10.10.78.208",6379); } /** * 测试一下 * 2014年12月14日 下午5:41:05 * liweihan */ public void show() { System.out.println(" ----- redis学习开始:"); //keyOperater(); // stringOpeara(); // stringOpeara2(); // listOpeara(); // setOprera(); // sortedSetOperate(); // hashOperate(); // objOperate(); // objOperate2(); // objOperate3(); testOprera(); jedisPool.returnResource(jedis); //返还到连接池 shardedJedisPool.returnResource(shardedJedis); } }
下面是show()中测试的一些具体方法实现:
/** * 测试一下分布式 * * * 2014年12月16日 下午4:06:29 * liweihan */ private void testOprera() { for (int i = 0; i < 100; i++) { shardedJedis.set("22" + i, "cc" + i); } }
/** * 测试一下分布式 * * * 2014年12月16日 下午4:06:29 * liweihan */ private void testOprera() { for (int i = 0; i < 100; i++) { shardedJedis.set("22" + i, "cc" + i); } } /** * java性能比较【java序列化,json格式】 * 事实证明:两者的速度是差不多哦。下面的10万个插入,查几秒而已!json要快 * 有参考价值的文章:http://developer.51cto.com/art/201303/384162_all.htm * * 2014年12月16日 上午11:44:05 * liweihan */ private void objOperate3() { System.out.println("======================java序列化性能=========================="); //清空数据 jedis.select(2);//★选择某个数据库 System.out.println(jedis.flushDB()); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { Person person = new Person(); person.setId(i); person.setName("hanchao"+i); String result = jedis.set(("person"+i).getBytes(), SerializeUtil.serialize(person)); } long end = System.currentTimeMillis(); System.out.println("java序列化用时:: " + ((end - start)/1000.0) + " seconds"); System.out.println("======================java使用json序列化性能=========================="); //清空数据 System.out.println(jedis.flushDB()); long start1 = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { Person person = new Person(); person.setId(i); person.setName("hanchao"+i); String result = jedis.set("person"+i, JSON.toJSONString(person)); } long end1 = System.currentTimeMillis(); System.out.println("使用json字符串所用时间: " + ((end1 - start1)/1000.0) + " seconds"); }
/** * redis操作java对象 * * * 2014年12月16日 上午11:27:16 * liweihan */ private void objOperate2() { System.out.println("======================java-object=========================="); //清空数据 System.out.println(jedis.flushDB()); Person person = new Person(); person.setId(1); person.setName("hanchao"); jedis.set("person1", JSON.toJSONString(person)); Person personObj = JSON.parseObject(jedis.get("person1"),Person.class); System.out.println("从redis取得对象为:" + personObj.getId() + " : " + personObj.getName()); } /** * redis操作java对象[序列化|反序列化] * * * 2014年12月16日 上午11:08:55 * liweihan */ private void objOperate() { System.out.println("======================java-object=========================="); //清空数据 System.out.println(jedis.flushDB()); Person person1 = new Person(); person1.setId(1); person1.setName("hanchao"); System.out.println("存入序列化的对象1:" + jedis.set("person1".getBytes(), SerializeUtil.serialize(person1))); byte[] person11 = jedis.get(("person"+1).getBytes()); Person person11_obj = (Person) SerializeUtil.unserialize(person11); System.out.println("取得序列化对象1:" + person11_obj.getId() + "," + person11_obj.getName()); }
/** * hash的操作 * * * 2014年12月15日 下午4:41:47 * liweihan */ 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")); //1 System.out.println("hashs中添加key002和value002键值对:"+shardedJedis.hset("hashs", "key002", "value002")); //1 System.out.println("hashs中添加key003和value003键值对:"+shardedJedis.hset("hashs", "key003", "value003"));//1 System.out.println("新增key004和4的整型键值对:"+shardedJedis.hincrBy("hashs", "key004", 4l));//4 System.out.println("hashs中的所有值:"+shardedJedis.hvals("hashs"));//[value001, value002, value003, 4] System.out.println(); System.out.println("=============同时将多个键值对放到hash表中============="); Map<String, String> map = new HashMap<String, String>(); map.put("key1", "value1"); map.put("key2", "value2"); map.put("key3", "value3"); map.put("key4", "value4"); System.out.println("同时将多个键值对放到hash表中:" + shardedJedis.hmset("hashs", map));//OK System.out.println(shardedJedis.hget("hashs", "key2"));//value2 System.out.println("=============删============="); System.out.println("hashs中删除key002键值对:"+shardedJedis.hdel("hashs", "key002"));//1 System.out.println("hashs中的所有值:"+shardedJedis.hvals("hashs"));//[value001, value003, 4] System.out.println(); System.out.println("=============改============="); System.out.println("key004整型键值的值增加100:"+shardedJedis.hincrBy("hashs", "key004", 100l));//104 System.out.println("hashs中的所有值:"+shardedJedis.hvals("hashs"));//[value001, value003, 104] System.out.println(); System.out.println("=============查============="); System.out.println("判断key003是否存在:"+shardedJedis.hexists("hashs", "key003"));//true System.out.println("获取key004对应的值:"+shardedJedis.hget("hashs", "key004"));//104 System.out.println("批量获取key001和key003对应的值:"+shardedJedis.hmget("hashs", "key001", "key003"));//[value001, value003] System.out.println("获取hashs中所有的key:"+shardedJedis.hkeys("hashs"));//[key004, key003, key001] System.out.println("获取hashs中所有的value:"+shardedJedis.hvals("hashs"));//[value001, value003, 104] System.out.println(); Map<String,String> maps = shardedJedis.hgetAll("hashs"); for(Entry<String, String> entry: maps.entrySet()) { System.out.print(entry.getKey() + ":" + entry.getValue() + "\t"); } }
/** * SortedSet功能 * * * 2014年12月15日 下午4:22:54 * liweihan */ 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")); //1 System.out.println("zset中添加元素element002:"+shardedJedis.zadd("zset", 8.0, "element002")); //1 System.out.println("zset中添加元素element003:"+shardedJedis.zadd("zset", 2.0, "element003")); //1 System.out.println("zset中添加元素element004:"+shardedJedis.zadd("zset", 3.0, "element004"));//1 System.out.println("zset集合中的所有元素:"+shardedJedis.zrange("zset", 0, -1));//按照权重值排序 //[element003, element004, element001, element002] 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)); System.out.println(); }