Jedis使用

Posted PigeonNoir

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Jedis使用相关的知识,希望对你有一定的参考价值。

Jedis是java调用Redis的接口。

一。Maven中的jedis依赖包

1 <!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
2         <dependency>
3             <groupId>redis.clients</groupId>
4             <artifactId>jedis</artifactId>
5             <version>2.9.0</version>
6         </dependency>

二。配置redis.properties.xml

 1 # *************** jedis connection parameters setting ************** #
 2 # redis server ip #
 3 redis.ip=127.0.0.1
 4 # redis server port #
 5 redis.port=6379
 6 # password
 7 redis.password=redis123
 8 
 9 # *************** jedis pool parameters setting ************** #
10 # jedis‘s max connected objects #
11 redis.pool.maxTotal=1000
12 # jedis‘s max saved idel objects #
13 redis.pool.maxIdle=10
14 # jedis‘s max waiting time when no object returnd #
15 redis.pool.maxWaitMillis=5000
16 # whether test when jedis is calling borrowObject() #
17 redis.pool.testOnBorrow=true
18 # whether test when jedis is calling returnObject() #
19 redis.pool.testOnReturn=true

三。编写JAVA类获取Jedis连接池

 1 import redis.clients.jedis.Jedis;
 2 import redis.clients.jedis.JedisPool;
 3 import redis.clients.jedis.JedisPoolConfig;
 4 
 5 import java.io.IOException;
 6 import java.util.Properties;
 7 
 8 /**
 9  * Created by XA on 2017/11/6.
10  */
11 public class MyJedisPool {
12 
13     private volatile static JedisPool pool;
14     private static Jedis jedis;
15 
16     private static JedisPool getJedisPool() {
17         if(pool==null) {
18             synchronized (MyJedisPool.class) {
19                 if(pool==null) {
20                     try{
21                         Properties props = new Properties();
22                         props.load(MyJedisPool.class.getClassLoader().getResourceAsStream("config/redis.properties"));
23                         // create jedis pool instance
24                         JedisPoolConfig config = new JedisPoolConfig();
25                         // set property items of jedis pool
26                         config.setMaxTotal(Integer.valueOf(props.getProperty("redis.pool.maxTotal")));
27                         config.setMaxIdle(Integer.valueOf(props.getProperty("redis.pool.maxIdle")));
28                         config.setMaxWaitMillis(Integer.valueOf(props.getProperty("redis.pool.maxWaitMillis")));
29                         config.setTestOnBorrow(Boolean.valueOf(props.getProperty("redis.pool.testOnBorrow")));
30                         config.setTestOnReturn(Boolean.valueOf(props.getProperty("redis.pool.testOnReturn")));
31                         // instance
32                         pool = new JedisPool(config, props.getProperty("redis.ip"), Integer.valueOf(props.getProperty("redis.port")), 5000, props.getProperty("redis.password"));
33 
34                     }catch (IOException e) {
35                         e.printStackTrace();
36                     }
37                 }
38             }
39         }
40         return pool;
41     }
42 
43     // get jedis
44     public static Jedis getJedis() {
45         return getJedisPool().getResource();
46     }
47 
48     // recycle jedis
49     public synchronized static void recycleJedis(Jedis jedis) {
50         if(jedis!=null) {
51             jedis.close();
52         }
53     }
54 }

四。使用jedis的常用示例

public static void main(String[] args){
        try{
            Jedis jedis = MyJedisPool.getJedis();
            Set<String> keys = jedis.keys("*");
            System.out.println(keys.size());
        }catch (Exception e) {
            e.printStackTrace();
        }finally {
            MyJedisPool.recycleJedis(jedis);
        }
        
    }

注意:1. 不要忘记调用recycleJedis()回收jedis示例

   2. 实际调用recycleJedis()后发现,jedis仍然有效。原因暂时未知。

 

五。使用反射和泛型封装jedis的申请和回收

 1 @SuppressWarnings("unchecked")
 2     public static <T> T invokeJedisMethod(String methodName, Object[] args) {
 3         Jedis jedis = MyJedisPool.getJedis();
 4 
 5         T returnObject = null;
 6         try {
 7             Class[] argsTypes = new Class[args.length];
 8             for (int i = 0; i < args.length; i++) {
 9                 Class argClazz = args[i].getClass();
10                 if (argClazz.equals(HashMap.class)) {
11                     argsTypes[i] = Map.class;
12                 } else {
13                     argsTypes[i] = argClazz;
14                 }
15 
16             }
17             Method method = jedis.getClass().getDeclaredMethod(methodName, argsTypes);
18 
19             returnObject = (T) method.invoke(jedis, args);
20         } catch (Exception e) {
21             System.out.print(e.getStackTrace()[1].getClassName() + " --> " +
22                     e.getStackTrace()[1].getMethodName() + " --> " +
23                     e.getClass().getName() + "\n");
24             e.printStackTrace();
25         } finally {
26             MyJedisPool.recycleJedis(jedis);
27         }
28         return returnObject;
29     }

运行测试:


 1 import org.junit.Assert;
 2 import org.junit.Test;
 3 import org.springframework.test.annotation.Rollback;
 4 import org.springframework.transaction.annotation.Transactional;
 5 
 6 import java.util.HashMap;
 7 import java.util.List;
 8 import java.util.Map;
 9 import java.util.Set;
10 
11 public class JedisServiceTest {
12 
13     public enum CommonAPI {
14         // keys
15         keys("keys", 1), del("del", 20), exists("exists", 22),
16         // hash
17         hget("hget", 2), hgetAll("hgetAll", 3), hset("hset", 4), hmset("hmset", 5), hlen("hlen", 6), hexists("hexists", 7), hdel("hdel", 8), hkeys("hkeys", 9), hmget("hmget", 23),
18         // zsort
19         zadd("zadd", 10), zrem("zrem", 11), zrange("zrange", 12), zcard("zcard", 13), zcount("zcount", 14),
20         // list
21         linsert("linsert", 15), llen("llen", 16), lpop("lpop", 17), lpush("lpush", 18), lrange("lrange", 19),
22         // sub-pub
23         subscribe("subscribe", 21);
24 
25         private String name;
26         private int index;
27 
28         CommonAPI(String name, int index) {
29             this.name = name;
30             this.index = index;
31         }
32 
33         public String getName() {
34             return name;
35         }
36     }
37 
38     /**
39      * 事务回滚无效,redis并不支持可回滚的事务
40      */
41     @Test
42     @Transactional
43     @Rollback
44     public void invokeJedisMethod() {
45 
46         // 1
47         JedisService.invokeJedisMethod(JedisService.CommonAPI.hset.getName(),  new Object[]{"key1", "hkey1", "value1"});
48         Assert.assertTrue(JedisService.invokeJedisMethod(JedisService.CommonAPI.exists.getName(), "key1"));
49         Set<String> keys = JedisService.invokeJedisMethod(JedisService.CommonAPI.keys.getName(), "key1");
50         Assert.assertTrue(keys.contains("key1"));
51 
52         Assert.assertTrue(JedisService.invokeJedisMethod(JedisService.CommonAPI.hexists.getName(), new Object[] {"key1", "hkey1"}));
53         Set<String> hkeys = JedisService.invokeJedisMethod(JedisService.CommonAPI.hkeys.getName(), "key1");
54         Assert.assertTrue(hkeys.contains("hkey1"));
55 
56         Assert.assertEquals(JedisService.invokeJedisMethod(JedisService.CommonAPI.hget.getName(), new Object[] {"key1", "hkey1"}), "value1");
57 
58         JedisService.invokeJedisMethod(JedisService.CommonAPI.hdel.getName(), new Object[] {"key1", new String[]{"hkey1"}});
59         Assert.assertFalse(JedisService.invokeJedisMethod(JedisService.CommonAPI.hexists.getName(), new Object[] {"key1", "hkey1"}));
60 
61         JedisService.invokeJedisMethod(JedisService.CommonAPI.del.getName(), "key1");
62         Assert.assertFalse(JedisService.invokeJedisMethod(JedisService.CommonAPI.exists.getName(), "key1"));
63 
64         // 2
65         Map<String, String> map = new HashMap<String, String>();
66         map.put("hkey1", "hvalue1");map.put("hkey2", "hvalue2");
67         JedisService.invokeJedisMethod(JedisService.CommonAPI.hmset.getName(), new Object[] {"key2", map});
68         Assert.assertTrue(JedisService.invokeJedisMethod(JedisService.CommonAPI.exists.getName(), "key2"));
69         Assert.assertTrue(JedisService.invokeJedisMethod(JedisService.CommonAPI.hexists.getName(), new Object[] {"key2", "hkey2"}));
70         Assert.assertEquals(JedisService.invokeJedisMethod(JedisService.CommonAPI.hget.getName(), new Object[] {"key2", "hkey2"}), "hvalue2");
71         Assert.assertEquals((long)JedisService.invokeJedisMethod(JedisService.CommonAPI.hlen.getName(), "key2"), map.size());
72 
73         Map<String, String> res = JedisService.invokeJedisMethod(JedisService.CommonAPI.hgetAll.getName(), "key2");
74         Assert.assertEquals(res.size(), map.size());
75 
76         List<String> hvalues = JedisService.invokeJedisMethod(JedisService.CommonAPI.hmget.getName(), new Object[] {"key2", map.keySet().toArray(new String[map.size()])});
77         Assert.assertEquals(hvalues.size(), 2);
78         Assert.assertTrue(hvalues.contains("hvalue1"));
79         Assert.assertTrue(hvalues.contains("hvalue2"));
80 
81         JedisService.invokeJedisMethod(JedisService.CommonAPI.del.getName(), "key2");
82         Assert.assertFalse(JedisService.invokeJedisMethod(JedisService.CommonAPI.exists.getName(), "key2"));
83 
84     }
85 
86 }

 


测试全部通过。

 

以上是关于Jedis使用的主要内容,如果未能解决你的问题,请参考以下文章

Jedis工具类

Jedis 源代码阅读一 —— Jedis

使用jedis操作redis

Redis使用 Jedis 操作 Redis 数据库 ② ( Jedis API 规律 | Redis 命令与 Jedis 函数名称基本一致 | Jedis API 使用示例 )

使用Jedis连接Redis

Hadoop Java-Maven使用Jedis操作Redis