Jedis简单使用

r囧r小猫 2022-05-25 03:52 284阅读 0赞

Redis在Java中的实现是Jedis,需要导入jedis.jar、commons-net.jar(具体版本自己选择)以及commons-pool2x.jar(commons-pool用于Jedis连接池的创建,如果使用了连接池commons-pool包的版本不能低于2x,这是因为使用了org.apache.commons.pool2下面的类,这个包在2x版本才有)。

一、创建Jedis连接池生成Jedis连接

1、连接池的配置,可以放在单独的properties文件,便于修改

JedisPool.properties:

  1. #服务器IP
  2. ADDR=127.0.0.1
  3. #redis端口号
  4. PORT=6379
  5. #访问密码
  6. AUTH=
  7. #可用最大连接数
  8. MAX_TOTAL=1000
  9. #最大空闲连接数
  10. MAX_IDLE=100
  11. #最长等待时间
  12. MAX_WAIT=10000
  13. #超时时间
  14. TIMEOUT=60000
  15. #在获取redis连接时,自动检测连接是否有效
  16. TEST_ON_BORROW=true

2、创建生成Jedis连接的类

redis.clients.jedis.JedisPoolConfig:存放配置信息

redis.clients.jedis.JedisPool:加载配置信息创建连接池

RedisClient.java:

  1. import java.io.BufferedInputStream;
  2. import java.io.FileInputStream;
  3. import java.io.InputStream;
  4. import java.util.Properties;
  5. import redis.clients.jedis.Jedis;
  6. import redis.clients.jedis.JedisPool;
  7. import redis.clients.jedis.JedisPoolConfig;
  8. public class RedisClient
  9. {
  10. //连接池
  11. private static JedisPool jedisPool;
  12. static{
  13. try
  14. {
  15. InputStream is=new BufferedInputStream(new FileInputStream("src/com/teriste/resources/JedisPool.properties"));
  16. Properties properties=new Properties();
  17. properties.load(is);
  18. JedisPoolConfig config=new JedisPoolConfig();
  19. config.setMaxTotal(Integer.parseInt(properties.getProperty("MAX_TOTAL")));
  20. config.setMaxIdle(Integer.parseInt(properties.getProperty("MAX_IDLE")));
  21. config.setMaxWaitMillis(Integer.parseInt(properties.getProperty("MAX_WAIT")));
  22. config.setTestOnBorrow(Boolean.getBoolean(properties.getProperty("TEST_ON_BORROW")));
  23. //这里我的redis数据库没有设置密码所以不需要密码参数,否则可以添加密码参数
  24. //jedisPool=new JedisPool(config,ADDR,PORT,TIMEOUT,AUTH);
  25. jedisPool=new JedisPool(config,properties.getProperty("ADDR"),Integer.parseInt(properties.getProperty("PORT")),Integer.parseInt(properties.getProperty("TIMEOUT")));
  26. }
  27. catch (Exception e)
  28. {
  29. e.printStackTrace();
  30. }
  31. }
  32. //获取Redis资源
  33. public synchronized static Jedis getJedis(){
  34. try
  35. {
  36. if (jedisPool!=null)
  37. {
  38. Jedis jedis=jedisPool.getResource();
  39. return jedis;
  40. }else {
  41. return null;
  42. }
  43. }
  44. catch (Exception e)
  45. {
  46. e.printStackTrace();
  47. }
  48. return null;
  49. }
  50. //释放redis资源
  51. @SuppressWarnings("deprecation")
  52. public synchronized static void releaseConn(Jedis jedis){
  53. if (jedisPool!=null)
  54. {
  55. jedisPool.returnResource(jedis);
  56. }
  57. }
  58. }

二、Jedis操作Redis基本数据类型

  1. import java.util.HashMap;
  2. import java.util.Iterator;
  3. import java.util.List;
  4. import java.util.Map;
  5. import java.util.Set;
  6. import redis.clients.jedis.Jedis;
  7. import redis.clients.jedis.BinaryClient.LIST_POSITION;
  8. import redis.clients.jedis.Tuple;
  9. public class TestJedis
  10. {
  11. public static void main(String[] args)
  12. {
  13. System.out.println("********操作String类型************");
  14. //操作String类型
  15. operateString();
  16. System.out.println("********操作Hash类型************");
  17. //操作Hash类型
  18. operateHash();
  19. System.out.println("********操作List类型************");
  20. //操作List类型
  21. operateList();
  22. System.out.println("********操作Set类型数据************");
  23. //操作Set类型数据
  24. operateSet();
  25. System.out.println("********操作ZSet类型数据************");
  26. //操作有序集合类型
  27. operateSortedSet();
  28. System.out.println("********Jedis事务处理************");
  29. //Jedis事务处理
  30. jedisTransaction();
  31. }
  32. }

操作String类型数据:

  1. /**
  2. * String类型基本操作
  3. */
  4. public static void operateString(){
  5. Jedis jedis=RedisClient.getJedis();
  6. try
  7. {
  8. //清空数据库(谨慎操作),这里只是为了便于观察输出结果
  9. //jedis.flushDB();
  10. //设置键值
  11. jedis.set("test", "testString");
  12. System.out.println("Save test value="+jedis.get("test"));
  13. //在键值后追加内容
  14. jedis.append("test", " this is append string");
  15. System.out.println("Append string to test:"+jedis.get("test"));
  16. //根据键获取值
  17. String test=jedis.get("test");
  18. System.out.println("find string test:"+test);
  19. //删除指定键
  20. jedis.del("test");
  21. System.out.println("delete string test:"+jedis.get("test"));
  22. //判断键是否存在
  23. boolean isNotExists=jedis.exists("test");
  24. System.out.println("test is Exists?:"+(isNotExists?"是":"否"));
  25. //如果键值是整数可以进行加减操作,否则会报错
  26. jedis.set("testInt", "0");
  27. jedis.incr("testInt");
  28. System.out.println("new testInt:"+jedis.get("testInt"));
  29. jedis.del("testInt");
  30. //设置键的生存时间
  31. jedis.set("testtest", "testTTL");
  32. jedis.expire("testtest", 30);
  33. Thread.sleep(10000);
  34. //获取键的剩余生存时间
  35. System.out.println(jedis.ttl("testtest"));
  36. }
  37. catch (Exception e)
  38. {
  39. e.printStackTrace();
  40. }
  41. finally{
  42. RedisClient.releaseConn(jedis);
  43. }
  44. }

输出结果如下:

  1. ********操作String类型************
  2. Save test value=testString
  3. Append string to test:testString this is append string
  4. find string test:testString this is append string
  5. delete string test:null
  6. test is Exists?:否
  7. new testInt:1
  8. 20

操作Hash数据类型:

  1. public static void operateHash(){
  2. Jedis jedis=RedisClient.getJedis();
  3. try
  4. {
  5. //清空数据库(谨慎操作),这里只是为了便于观察输出结果
  6. //jedis.flushDB();
  7. Map<String, String> map=new HashMap<String, String>();
  8. map.put("name", "张三");
  9. map.put("sex", "男");
  10. map.put("age", "24");
  11. //添加hash类型数据
  12. jedis.hmset("person", map);
  13. //获取该键包含的所有键值对
  14. System.out.println("add hash map to jedis:"+jedis.hgetAll("person"));
  15. //获取该键包含的指定键值
  16. System.out.println("get key's value:"+jedis.hget("person", "name"));
  17. //判断键是否存在
  18. boolean isExists=jedis.hexists("person", "professional");
  19. System.out.println("Key professional is in name?"+(isExists?"是":"否"));
  20. //获取该散列包含的键的个数
  21. long hlen=jedis.hlen("person");
  22. System.out.println("key person's length is:"+hlen);
  23. //向散列中添加键值
  24. jedis.hset("person", "professional", "软件工程师");
  25. System.out.println("get updated persion:"+jedis.hgetAll("person"));
  26. //如果键值是整型,可以加减该键值
  27. jedis.hincrBy("person", "age",2);
  28. System.out.println("get updated age:"+jedis.hget("person","age"));
  29. //删除散列中的键
  30. jedis.hdel("person", "professional");
  31. isExists=jedis.hexists("person", "professional");
  32. System.out.println("person's professional is exists?"+(isExists?"是":"否"));
  33. }
  34. catch (Exception e)
  35. {
  36. e.printStackTrace();
  37. }
  38. finally{
  39. RedisClient.releaseConn(jedis);
  40. }
  41. }

输出结果如下:

  1. ********操作Hash类型************
  2. add hash map to jedis:{sex=男, name=张三, age=24}
  3. get key's value:张三
  4. Key professional is in name?否
  5. key person's length is:3
  6. get updated persion:{professional=软件工程师, sex=男, name=张三, age=24}
  7. get updated age:26
  8. person's professional is exists?否

操作List类型:

  1. public static void operateList(){
  2. Jedis jedis=RedisClient.getJedis();
  3. try
  4. {
  5. //清空数据库(谨慎操作),这里只是为了便于观察输出结果
  6. //jedis.flushDB();
  7. //先删除之前创建的List避免之前存入的值影响输出结果
  8. jedis.del("redisList");
  9. //从列表左侧增加元素,lpush()方法参数列表是可变参数
  10. jedis.lpush("redisList","Redis","Mysql");
  11. jedis.lpushx("redisList", "Oracle");
  12. //lpushx()和rpushx()方法只能插入已存在的List中,如果键不存在就不进行任何操作
  13. jedis.lpushx("RedisList", "Oracle");
  14. System.out.println("------"+jedis.lrange("redisList", 0, -1));
  15. //从列表右侧插入元素
  16. jedis.rpush("redisList", "Mongodb");
  17. jedis.rpushx("redisList", "DB2");
  18. //linsert()可以在指定值后插入元素,如果该元素有多个,只在第一个后面插入
  19. jedis.linsert("redisList", LIST_POSITION.AFTER, "Mysql", "Mysql");
  20. jedis.linsert("redisList", LIST_POSITION.AFTER, "Mysql", "DB2");
  21. System.out.println(jedis.lrange("redisList", 0, -1));
  22. //lrange()方法可以遍历List中的元素返回list,当开始坐标是0结束坐标是-1时表示遍历整个redisList
  23. List<String>redisList=jedis.lrange("redisList", 0, -1);
  24. System.out.print("Element in redisList:[");
  25. for (int i = 0; i < redisList.size(); i++ )
  26. {
  27. System.out.print(redisList.get(i)+" ");
  28. }
  29. System.out.println("]");
  30. //根据指定索引获取值,索引为正从左往右获取,索引为负从右向左获取
  31. String index2=jedis.lindex("redisList", 2);
  32. String index_2=jedis.lindex("redisList", -2);
  33. System.out.println("from left to right the index 2 is:"+index2);
  34. System.out.println("from right to left the index 2 is:"+index_2);
  35. //修改列表指定索引元素,若不存在则报错
  36. jedis.lset("redisList", 1, "updateValue");
  37. System.out.println("update index 1 value:"+jedis.lindex("redisList", 1));
  38. //删除列表左侧头部元素
  39. String lrem=jedis.lpop("redisList");
  40. System.out.println("Remove left top element:"+lrem);
  41. //删除列表右侧头部元素
  42. String rrem=jedis.rpop("redisList");
  43. System.out.println("Remove right top element:"+rrem);
  44. //去除索引范围外的元素
  45. String ltrim=jedis.ltrim("redisList", 1, 3);
  46. System.out.println("trim redisList 1-3 other element:"+ltrim);
  47. System.out.println("find redisList:"+jedis.lrange("redisList", 0, -1));
  48. //移出指定值的索引位置,如果count>0从左往右删除count个该元素,如果count=0删除列表中全部该元素,如果count<0从右往左删除count个该元素
  49. jedis.lrem("redisList", 1, "DB2");
  50. System.out.println("remove from left to right DB2 in redisList:"+jedis.lrange("redisList", 0, -1));
  51. }
  52. catch (Exception e)
  53. {
  54. e.printStackTrace();
  55. }
  56. finally{
  57. RedisClient.releaseConn(jedis);
  58. }
  59. }

输出结果如下:

  1. ********操作List类型************
  2. ------[Oracle, Mysql, Redis]
  3. [Oracle, Mysql, DB2, Mysql, Redis, Mongodb, DB2]
  4. Element in redisList:[Oracle Mysql DB2 Mysql Redis Mongodb DB2 ]
  5. from left to right the index 2 is:DB2
  6. from right to left the index 2 is:Mongodb
  7. update index 1 value:updateValue
  8. Remove left top element:Oracle
  9. Remove right top element:DB2
  10. trim redisList 1-3 other element:OK
  11. find redisList:[DB2, Mysql, Redis]
  12. remove from left to right DB2 in redisList:[Mysql, Redis]

操作Set类型数据:

  1. public static void operateSet(){
  2. Jedis jedis=RedisClient.getJedis();
  3. try
  4. {
  5. //清空数据库(谨慎操作)
  6. //jedis.flushDB();
  7. //添加元素,注意与List类型的区别,Set不会存储重复元素,比较适合做博客标签等应用场景
  8. jedis.sadd("redisSet", "Redis");
  9. jedis.sadd("redisSet", "Redis","Mysql");
  10. jedis.sadd("redisSet", "Redis","Mysql","Oracle","DB2");
  11. //查询
  12. Set<String> redisSet=jedis.smembers("redisSet");
  13. System.out.print("Element in set:[");
  14. Iterator<String> iterator=redisSet.iterator();
  15. while (iterator.hasNext())
  16. {
  17. System.out.print(iterator.next()+" ");
  18. }
  19. System.out.println("]");
  20. //Set集合元素个数
  21. long slen=jedis.scard("redisSet");
  22. System.out.println("redisSet's size is:"+slen);
  23. //判断元素是否存在于集合内
  24. boolean isExists=jedis.sismember("redisSet", "Mysql");
  25. System.out.println("Mysql is in redisSet?"+(isExists?"是":"否"));
  26. //集合运算
  27. //并集
  28. jedis.sadd("redisSet2", "Redis","Mysql","SqlServer");
  29. Set<String> unionSet=jedis.sunion("redisSet","redisSet2");
  30. System.out.println("union result:"+unionSet);
  31. //并集结果存入redisSet集合
  32. System.out.println("unionSet in Redis:"+jedis.sunionstore("unionSet", "redisSet","redisSet2"));
  33. //交集
  34. Set<String> interSet=jedis.sinter("redisSet","redisSet2");
  35. System.out.println("interSet result:"+interSet);
  36. //交集结果存入redisSet集合
  37. System.out.println("interSet in Redis:"+jedis.sinterstore("interSet", "redisSet","redisSet2"));
  38. //差集
  39. Set<String> diffSet=jedis.sdiff("redisSet","redisSet2");
  40. System.out.println("diffSet result:"+diffSet);
  41. //差集结果存入redisSet集合
  42. System.out.println("diffSet in Redis:"+jedis.sdiffstore("diffSet","redisSet","redisSet2"));
  43. //自交就相当于去除集合中所以元素
  44. interSet=jedis.sinter("interSet","interSet");
  45. //删除指定集合元素
  46. jedis.srem("redisSet", "Mysql");
  47. //将一个集合中的元素移入另一个集合中
  48. jedis.smove("redisSet", "redisSet2", "DB2");
  49. System.out.println("Element in redisSet is:"+jedis.smembers("redisSet"));
  50. System.out.println("Element in redisSet2 is:"+jedis.smembers("redisSet2"));
  51. }
  52. catch (Exception e)
  53. {
  54. e.printStackTrace();
  55. }
  56. finally{
  57. RedisClient.releaseConn(jedis);
  58. }
  59. }

输出结果如下:

  1. ********操作Set类型数据************
  2. Element in set:[DB2 Mysql Oracle Redis ]
  3. redisSet's size is:4
  4. Mysql is in redisSet?是
  5. union result:[SqlServer, DB2, Mysql, Oracle, Redis]
  6. unionSet in Redis:5
  7. interSet result:[DB2, Redis, Mysql]
  8. interSet in Redis:3
  9. diffSet result:[Oracle]
  10. diffSet in Redis:1
  11. Element in redisSet is:[Oracle, Redis]
  12. Element in redisSet2 is:[SqlServer, DB2, Redis, Mysql]

操作有序集合类型:

  1. public static void operateSortedSet(){
  2. Jedis jedis=RedisClient.getJedis();
  3. try
  4. {
  5. //清空数据库(谨慎操作),这里只是为了便于观察输出结果
  6. //jedis.flushDB();
  7. //增加
  8. jedis.zadd("scores", 69,"zhangsan");
  9. jedis.zadd("scores", 83,"lisi");
  10. jedis.zadd("scores", 73,"wanger");
  11. //zadd()方法也有重载的传入map类型,分数是Double类型
  12. Map<String, Double> scoresMap=new HashMap<String, Double>();
  13. scoresMap.put("zhaosi", new Double(59));
  14. scoresMap.put("qianyi", new Double(99));
  15. jedis.zadd("scores",scoresMap);
  16. //查询
  17. System.out.println("按照分数从低到高查询zrange:"+jedis.zrange("scores", 0, -1));
  18. System.out.println("按照分数从高到低查询zrange:"+jedis.zrevrange("scores", 0, -1));
  19. //使用Set存储元组遍历元组内分数和元素
  20. Set<Tuple> sortSet=jedis.zrangeWithScores("scores", 0, -1);
  21. Iterator<Tuple>iterator=sortSet.iterator();
  22. while(iterator.hasNext()){
  23. Tuple tuple=iterator.next();
  24. System.out.println(tuple.getScore()+":"+tuple.getElement());
  25. }
  26. //根据分数范围查询元素(60<=score<=100)
  27. Set<String> zrangeByScore=jedis.zrangeByScore("scores", new Double(60), new Double(100));
  28. System.out.print("zrangeByScore(60-100):");
  29. for (Iterator<String> it=zrangeByScore.iterator();it.hasNext();)
  30. {
  31. System.out.print(it.next()+" ");
  32. }
  33. System.out.println();
  34. //查询指定zset键的元素个数
  35. long setcount=jedis.zcard("scores");
  36. //查询指定分数范围内(60<=score<=100)zset键的元素个数
  37. long rangeCount=jedis.zcount("scores", 60, 100);
  38. //查询指定元素的下标,不存在则返回null
  39. long zrank=jedis.zrank("scores", "zhangsan");
  40. //查询指定元素的分数,不存在则返回null
  41. Double zscore=jedis.zscore("scores", "zhangsan");
  42. System.out.println("scores's size:"+setcount+"\nrangeCount(60-100):"+rangeCount+"\nzrank(zhangsan):"+zrank+"\nzscore(zhangsan):"+zscore);
  43. //修改分数
  44. Double zincrby=jedis.zincrby("scores", 99, "zhangsan");
  45. System.out.println("zincrby:"+zincrby);
  46. //删除指定元素
  47. jedis.zrem("scores", "zhangsan");
  48. //根据分数删除
  49. jedis.zremrangeByScore("scores", 60, 80);
  50. System.out.println("scores's elements:"+jedis.zrange("scores", 0, -1));
  51. }
  52. catch (Exception e)
  53. {
  54. e.printStackTrace();
  55. }
  56. finally{
  57. RedisClient.releaseConn(jedis);
  58. }
  59. }

输出结果如下:

  1. ********操作ZSet类型数据************
  2. 按照分数从低到高查询zrange:[zhaosi, zhangsan, wanger, lisi, qianyi]
  3. 按照分数从高到低查询zrange:[qianyi, lisi, wanger, zhangsan, zhaosi]
  4. 59.0:zhaosi
  5. 69.0:zhangsan
  6. 73.0:wanger
  7. 83.0:lisi
  8. 99.0:qianyi
  9. zrangeByScore(60-100):zhangsan wanger lisi qianyi
  10. scores's size:5
  11. rangeCount(60-100):4
  12. zrank(zhangsan):1
  13. zscore(zhangsan):69.0
  14. zincrby:168.0
  15. scores's elements:[zhaosi, lisi, qianyi]

Jedis事务处理:

使用MULTI开启事务,EXEC提交事务。

20180508103648139

在执行事务期间使用discard可以回滚事务

20180508103719240

使用watch可以监视键,如果在事务之前和事务期间都修改同一键值,那么在事务之前的修改生效,事务期间的修改无效。

20180508103754553

2018050810395544

  1. /**
  2. * 执行逻辑:Jedis事务开始后,如果是Jedis内部方法错误,执行exec不影响其他正常语句的执行结果,执行成功的结果仍能提交到数据库。
  3. * 如果是Java语法错误比如被零除,就进入catch异常处理段,执行Jedis的discard()方法回滚所有事务
  4. * @see
  5. */
  6. public static void jedisTransaction(){
  7. Jedis jedis=RedisClient.getJedis();
  8. //开始事务,在执行exec之前都属于事务范围内
  9. Transaction tx=jedis.multi();
  10. boolean errFlag=false;
  11. try
  12. {
  13. tx.set("test1", "value1");
  14. tx.set("test2", "value2");
  15. //对字符串进行算术运算,Jedis内部方法异常
  16. tx.incrBy("test1",2);
  17. //下面的运行时异常会导致程序进入catch段,然后执行discard()回滚所有事务
  18. //int x=10/0; 可以解注这条语句查看执行结果,别忘了清空数据库测试
  19. System.out.println("提交事务");
  20. //Jedis内部方法异常,提交事务执行成功的结果会存入redis数据库,执行失败的不执行
  21. List<Object> list=tx.exec();
  22. //每条语句执行结果存入list中
  23. for (int i = 0; i < list.size(); i++ )
  24. {
  25. System.out.println("list:"+list.get(i));
  26. }
  27. }
  28. catch (Exception e)
  29. {
  30. errFlag=true;
  31. //discard()方法在发生异常时可以回滚事务
  32. tx.discard();
  33. e.printStackTrace();
  34. }
  35. finally{
  36. if (errFlag==true)
  37. {
  38. System.out.println("发生异常时提交事务");
  39. tx.exec();
  40. }
  41. RedisClient.releaseConn(jedis);
  42. }
  43. }

输出结果如下:

  1. ********Jedis事务处理************
  2. 提交事务
  3. list:OK
  4. list:OK
  5. list:redis.clients.jedis.exceptions.JedisDataException: ERR value is not an integer or out of range

发表评论

表情:
评论列表 (有 0 条评论,284人围观)

还没有评论,来说两句吧...

相关阅读

    相关 jedis使用

    一、Redis Client介绍 1.1、简介 Jedis Client是Redis官网推荐的一个面向java客户端,库文件实现了对各类API进行封装调用。 Jedis源