一、相关jar包主要用到的是jedis的核心包,笔者用到的是2.1.0版;另根据“池”的应用等还需要用到相关jar包。下图是笔者建立的简单的jedis测试project图:jar包
一、相关jar包
主要用到的是jedis的核心包,笔者用到的是2.1.0版;另根据“池”的应用等还需要用到相关jar包。下图是笔者建立的简单的jedis测试project图:
jar包的文档可参考:
二、简单是jedis实例
在引入相关jar包后,只要new一个jedis对象,就能做redis相关操作了。以下是一个简单的jedis实例:
package com.pptv.redis;import java.util.arraylist; import java.util.hashmap; import java.util.iterator; import java.util.list; import java.util.map; import java.util.set;import redis.clients.jedis.jedis;public class jedisdemo {public void test(){jedis redis = new jedis (172.0.0.1,6379);//连接redisredis.auth(redis);//验证密码,如果需要验证的话// string 操作//set key value将字符串值value关联到key。redis.set(name, wangjun1);redis.set(id, 123456);redis.set(address, guangzhou);//setex key seconds value将值value关联到key,并将key的生存时间设为seconds(以秒为单位)。redis.setex(foo, 5, haha);//mset key value [key value ...]同时设置一个或多个key-value对。redis.mset(haha,111,xixi,222);//redis.flushall();清空所有的keysystem.out.println(redis.dbsize());//dbsize是多少个key的个数//append key value如果key已经存在并且是一个字符串,append命令将value追加到key原来的值之后。redis.append(foo, 00);//如果key已经存在并且是一个字符串,append命令将value追加到key原来的值之后。//get key 返回key所关联的字符串值redis.get(foo);//mget key [key ...] 返回所有(一个或多个)给定key的值list list = redis.mget(haha,xixi);for(int i=0;i三、jedispool应用jedis使用commons-pool完成池化实现。
先做个配置文件(properties文件):
#最大分配的对象数redis.pool.maxactive=1024#最大能够保持idel状态的对象数redis.pool.maxidle=200#当池内没有返回对象时,最大等待时间redis.pool.maxwait=1000#当调用borrow object方法时,是否进行有效性检查redis.pool.testonborrow=true#当调用return object方法时,是否进行有效性检查redis.pool.testonreturn=true#ipredis.ip=172.0.0.1#portredis.port=6379 jedispool的相关详细配置可参考:
在静态代码段中完成初始化:
private static jedispool pool;static {resourcebundle bundle = resourcebundle.getbundle(redis);if (bundle == null) {throw new illegalargumentexception([redis.properties] is not found!);}jedispoolconfig config = new jedispoolconfig();config.setmaxactive(integer.valueof(bundle.getstring(redis.pool.maxactive)));config.setmaxidle(integer.valueof(bundle.getstring(redis.pool.maxidle)));config.setmaxwait(long.valueof(bundle.getstring(redis.pool.maxwait)));config.settestonborrow(boolean.valueof(bundle.getstring(redis.pool.testonborrow)));config.settestonreturn(boolean.valueof(bundle.getstring(redis.pool.testonreturn)));pool = new jedispool(config, bundle.getstring(redis.ip),integer.valueof(bundle.getstring(redis.port)));} 然后修改#2的简单实例,修改为jedis从pool中获得:
// 从池中获取一个jedis对象jedis jedis = pool.getresource();string keys = name;// 删数据jedis.del(keys);// 存数据jedis.set(keys, snowolf);// 取数据string value = jedis.get(keys);system.out.println(value);// 释放对象池pool.returnresource(jedis);四、jedis分布式(sharding/shared一致性哈希)
memcached完全基于分布式集群,而redis是master-slave,如果想把reids,做成集群模式,无外乎多做几套master-slave,每套master-slave完成各自的容灾处理,通过client工具,完成一致性哈希。(ps:memcached是在server端完成sharding,redis只能依靠各个client做sharding。可能会在redis 3.0系列支持server端sharding。)
shared一致性哈希采用以下方案:
sharded采用的hash算法:md5 和 murmurhash两种;默认采用64位的murmurhash算法;有兴趣的可以研究下,,murmurhash是一种高效,低碰撞的hash算法;参考地址:
https://sites.google.com/site/murmurhash/
保留前面的jedispoolconfig,新增两个redis的ip(redis1.ip,redis2.ip),完成两个jedisshardinfo实例,并将其丢进list中:
jedisshardinfo jedisshardinfo1 = new jedisshardinfo(bundle.getstring(redis1.ip), integer.valueof(bundle.getstring(redis.port)));jedisshardinfo jedisshardinfo2 = new jedisshardinfo(bundle.getstring(redis2.ip), integer.valueof(bundle.getstring(redis.port)));list list = new linkedlist();list.add(jedisshardinfo1);list.add(jedisshardinfo2); 初始化shardedjedispool代替jedispool:
shardedjedispool pool = new shardedjedispool(config, list); 改由shardedjedis,获取jedis对象:
// 从池中获取一个jedis对象shardedjedis jedis = pool.getresource();string keys = name;string value = snowolf;// 删数据jedis.del(keys);// 存数据jedis.set(keys, value);// 取数据string v = jedis.get(keys);system.out.println(v);// 释放对象池pool.returnresource(jedis); 通过以上方式,向redis进行set操作的key-value,会通过hash而均匀的分配到pool里的redis机器中。
