jedis 是 java 的 redis 客户端实现要使用 jedis 须要加入 jedis 的 maven 依赖:
- <dependency>
- <groupId>redis.clients</groupId>
- <artifactId>jedis</artifactId>
- <version>2.4.2</version>
</dependency>redis 最简单的使用: Jedis jedis = new Jedis("localhost");// 使用 redis 默认端口 6379
jedis.set("foo", "bar");
String value = jedis.get("foo"); 可是 jedis 对象不是线程安全的在多线程环境下会傻逼, 所以官方提供了一个线程安全的连接池: JedisPool pool = new JedisPool(new JedisPoolConfig(), "localhost"); 能够直接设置成静态的全局变量由于一直使用 spring 配置一个:<bean id="jedisPoolConfig" class="redis.clients.jedis.JedisPoolConfig">
- <property name="maxTotal" value="${redis.maxTotal}" />
- <property name="maxIdle" value="${redis.maxIdle}" />
- <property name="maxWaitMillis" value="${redis.maxWaitMillis}" />
- <property name="testOnBorrow" value="true" />
- <property name="testOnReturn" value="true" />
- </bean>
- <bean id="jedisPool" class="redis.clients.jedis.JedisPool">
- <constructor-arg index="0" ref="jedisPoolConfig" />
- <constructor-arg index="1" value="${redis.hostname}" />
- <constructor-arg index="2" value="${redis.port}" />
</bean>ok 能够開始干活了: Jedis jedis = jedisPool.getResource();
- try {
- /// ... do stuff here ... for example
- jedis.set("foo", "bar");
- String foobar = jedis.get("foo");
- jedis.zadd("sose", 0, "car");
- jedis.zadd("sose", 0, "bike");
- Set < String > sose = jedis.zrange("sose", 0, -1);
- } catch(JedisConnectionException e) {
- // returnBrokenResource when the state of the object is unrecoverable
- if (null != jedis) {
- pool.returnBrokenResource(jedis);
- jedis = null;
- }
- } finally {
- /// ... its important to return the Jedis instance to the pool once youve finished using it
- if (null != jedis) pool.returnResource(jedis);
- }
- /// ... when closing your application:
- pool.destroy(); // 假设不 destroy 的话连接池中的 connection 将会一直连着直到超时为止所以在 spring 容器写一个 destroy 方法还是有必要的 redis 事务支持 (transactions) 说白了就是: 我要同一时候干好几件事, 期间不能干别的, 我就把这几件事放同一个事物里 Transaction t = jedis.multi();
- t.set("aaa", "111");
- t.set("bbb", "222");
t.exec(); 分布式客户端 (ShardedJedis) 我个人理解这东西就是个负载均衡, 利用 xxx 哈希算法, 均匀的把 key 存到不同 redisserver 上 jedisPoolConfig 与上面的一样, 第二个參数是 redisserver 的列表 < bean id="shardedJedisPool" class="redis.clients.jedis.ShardedJedisPool">
- <constructor-arg index="0" ref="jedisPoolConfig" />
- <constructor-arg index="1">
- <list>
- <bean class="redis.clients.jedis.JedisShardInfo">
- <constructor-arg index="0" value="${redis.hostname}" />
- <constructor-arg index="1" value="${redis.port}" />
- </bean>
- </list>
- </constructor-arg>
</bean > 使用: ShardedJedis jedis = pool.getResource();
- jedis.set("a", "foo");
- .... // do your work here
- pool.returnResource(jedis);
- .... // a few moments later
- ShardedJedis jedis2 = pool.getResource();
- jedis.set("z", "bar");
- pool.returnResource(jedis);
pool.destroy(); 由于事务是在 server 端实现而在分布式中, 每批次的调用对象都可能訪问不同的机器所以, 没法进行事务 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 test1() {
- Jedis redis = new Jedis("192.168.10.64", 6379); // 连接 redis
- redis.auth("redis"); // 验证 password
- /* ----------------------------------------------------------------------------------------------------------- */
- /** KEY 操作
- //KEYS
- Set keys = redis.keys("*");// 列出全部的 key, 查找特定的 key 如: redis.keys("foo")
- Iterator t1=keys.iterator() ;
- while(t1.hasNext()){
- Object obj1=t1.next();
- System.out.println(obj1);
- }
- //DEL 移除给定的一个或多个 key 假设 key 不存在, 则忽略该命令
- redis.del("name1");
- //TTL 返回给定 key 的剩余生存时间(time to live)(以秒为单位)
- redis.ttl("foo");
- //PERSIST key 移除给定 key 的生存时间
- redis.persist("foo");
- //EXISTS 检查给定 key 是否存在
- redis.exists("foo");
- //MOVE key db 将当前数据库 (默觉得 0) 的 key 移动到给定的数据库 db 其中假设当前数据库 (源数据库) 和给定数据库 (目标数据库) 有同样名字的给定 key, 或者 key 不存在于当前数据库, 那么 MOVE 没有不论什么效果
- redis.move("foo", 1);// 将 foo 这个 key, 移动到数据库 1
- //RENAME key newkey 将 key 改名为 newkey 当 key 和 newkey 同样或者 key 不存在时, 返回一个错误
- 当 newkey 已经存在时, RENAME 命令将覆盖旧值
- redis.rename("foo", "foonew");
- //TYPE key 返回 key 所储存的值的类型
- System.out.println(redis.type("foo"));//none(key 不存在),string(字符串),list(列表),set(集合),zset(有序集),hash(哈希表)
- //EXPIRE key seconds 为给定 key 设置生存时间当 key 过期时, 它会被自己主动删除
- redis.expire("foo", 5);//5 秒过期
- //EXPIREAT EXPIREAT 的作用和 EXPIRE 一样, 都用于为 key 设置生存时间
- 不同在于 EXPIREAT 命令接受的时间參数是 UNIX 时间戳(unix timestamp)
- // 一般 SORT 用法 最简单的 SORT 用法是 SORT key
- redis.lpush("sort", "1");
- redis.lpush("sort", "4");
- redis.lpush("sort", "6");
- redis.lpush("sort", "3");
- redis.lpush("sort", "0");
- List list = redis.sort("sort");// 默认是升序
- for(int i=0;i<list.size();i++){
- System.out.println(list.get(i));
- }
- */
- /* ----------------------------------------------------------------------------------------------------------- */
- /** 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(); 清空全部的 key
- System.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<list.size();i++){
- System.out.println(list.get(i));
- }
- //DECR key 将 key 中储存的数字值减一
- //DECRBY key decrement 将 key 所储存的值减去减量 decrement
- //INCR key 将 key 中储存的数字值增一
- //INCRBY key increment 将 key 所储存的值加上增量 increment
- */
- /* ----------------------------------------------------------------------------------------------------------- */
- /** Hash 操作
- //HSET key field value 将哈希表 key 中的域 field 的值设为 value
- redis.hset("website", "google", "www.google.cn");
- redis.hset("website", "baidu", "www.baidu.com");
- redis.hset("website", "sina", "www.sina.com");
- //HMSET key field value [field value ...] 同一时候将多个 field - value(域 - 值)对设置到哈希表 key 中
- Map map = new HashMap();
- map.put("cardid", "123456");
- map.put("username", "jzkangta");
- redis.hmset("hash", map);
- //HGET key field 返回哈希表 key 中给定域 field 的值
- System.out.println(redis.hget("hash", "username"));
- //HMGET key field [field ...]返回哈希表 key 中, 一个或多个给定域的值
- List list = redis.hmget("website","google","baidu","sina");
- for(int i=0;i<list.size();i++){
- System.out.println(list.get(i));
- }
- //HGETALL key 返回哈希表 key 中, 全部的域和值
- Map<String,String> map = redis.hgetAll("hash");
- for(Map.Entry entry: map.entrySet()) {
- System.out.print(entry.getKey() + ":" + entry.getValue() + "\t");
- }
- //HDEL key field [field ...]删除哈希表 key 中的一个或多个指定域
- //HLEN key 返回哈希表 key 中域的数量
- //HEXISTS key field 查看哈希表 key 中, 给定域 field 是否存在
- //HINCRBY key field increment 为哈希表 key 中的域 field 的值加上增量 increment
- //HKEYS key 返回哈希表 key 中的全部域
- //HVALS key 返回哈希表 key 中的全部值
- */
- /* ----------------------------------------------------------------------------------------------------------- */
- /** LIST 操作
- //LPUSH key value [value ...]将值 value 插入到列表 key 的表头
- redis.lpush("list", "abc");
- redis.lpush("list", "xzc");
- redis.lpush("list", "erf");
- redis.lpush("list", "bnh");
- //LRANGE key start stop 返回列表 key 中指定区间内的元素, 区间以偏移量 start 和 stop 指定
- 下标 (index) 參数 start 和 stop 都以 0 为底, 也就是说, 以 0 表示列表的第一个元素, 以 1 表示列表的第二个元素, 以此类推你也能够使用负数下标, 以 - 1 表示列表的最后一个元素,-2 表示列表的倒数第二个元素, 以此类推
- List list = redis.lrange("list", 0, -1);
- for(int i=0;i<list.size();i++){
- System.out.println(list.get(i));
- }
- //LLEN key 返回列表 key 的长度
- //LREM key count value 依据參数 count 的值, 移除列表中与參数 value 相等的元素
- */
- /* ----------------------------------------------------------------------------------------------------------- */
- /** SET 操作
- //SADD key member [member ...]将 member 元素加入到集合 key 其中
- redis.sadd("testSet", "s1");
- redis.sadd("testSet", "s2");
- redis.sadd("testSet", "s3");
- redis.sadd("testSet", "s4");
- redis.sadd("testSet", "s5");
- //SREM key member 移除集合中的 member 元素
- redis.srem("testSet", "s5");
- //SMEMBERS key 返回集合 key 中的全部成员
- Set set = redis.smembers("testSet");
- Iterator t1=set.iterator() ;
- while(t1.hasNext()){
- Object obj1=t1.next();
- System.out.println(obj1);
- }
- //SISMEMBER key member 推断 member 元素是否是集合 key 的成员是(true), 否则(false)
- System.out.println(redis.sismember("testSet", "s4"));
- //SCARD key 返回集合 key 的基数(集合中元素的数量)
- //SMOVE source destination member 将 member 元素从 source 集合移动到 destination 集合
- //SINTER key [key ...]返回一个集合的全部成员, 该集合是全部给定集合的交集
- //SINTERSTORE destination key [key ...]此命令等同于 SINTER, 但它将结果保存到 destination 集合, 而不是简单地返回结果集
- //SUNION key [key ...]返回一个集合的全部成员该集合是全部给定集合的并集
- //SUNIONSTORE destination key [key ...]此命令等同于 SUNION, 但它将结果保存到 destination 集合, 而不是简单地返回结果集
- //SDIFF key [key ...]返回一个集合的全部成员, 该集合是全部给定集合的差集
- //SDIFFSTORE destination key [key ...]此命令等同于 SDIFF 但它将结果保存到 destination 集合, 而不是简单地返回结果集
- */
- }
- /**
- * @param args
- */
- public static void main(String[] args) {
- JedisDemo t1 = new JedisDemo();
- t1.test1();
- } ?
来源: http://www.bubuko.com/infodetail-2499242.html