Jedis的使用

àì夳堔傛蜴生んèń 2022-02-02 18:17 388阅读 0赞

1、引入依赖

  1. <dependencies>
  2. <dependency>
  3. <groupId>redis.clients</groupId>
  4. <artifactId>jedis</artifactId>
  5. <version>2.1.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>commons-pool</groupId>
  9. <artifactId>commons-pool</artifactId>
  10. <version>1.6</version>
  11. </dependency>
  12. </dependencies>

2、测试连接

  1. public class TestPing {
  2. public static void main(String[] args) {
  3. Jedis jedis = new Jedis("192.168.106.130",6379);
  4. jedis.auth("root");
  5. System.out.println(jedis.ping());
  6. }
  7. }

在这里插入图片描述
3、基本操作

  1. public class TestAPI {
  2. public static void main(String[] args) {
  3. Jedis jedis = new Jedis("192.168.106.130",6379);
  4. jedis.auth("root");
  5. jedis.set("k1","v1");
  6. jedis.set("k2","v2");
  7. jedis.set("k3","v3");
  8. jedis.set("k4","v4");
  9. System.out.println(jedis.get("k3"));
  10. Set<String> sets = jedis.keys("*");
  11. System.out.println(sets.size());
  12. }
  13. }

在这里插入图片描述

  1. public class Test02 {
  2. public static void main(String[] args) {
  3. Jedis jedis = new Jedis("192.168.106.130",6379);
  4. jedis.auth("root");
  5. //key
  6. Set<String> keys = jedis.keys("*");
  7. for (Iterator iterator = keys.iterator(); iterator.hasNext();) {
  8. String key = (String) iterator.next();
  9. System.out.println(key);
  10. }
  11. System.out.println("jedis.exists====>"+jedis.exists("k2"));
  12. System.out.println(jedis.ttl("k1"));
  13. //String
  14. jedis.append("k1","myreids");
  15. System.out.println(jedis.get("k1"));
  16. jedis.set("k4","k4_redis");
  17. jedis.mset("str1","v1","str2","v2","str3","v3");
  18. System.out.println(jedis.mget("str1","str2","str3"));
  19. //list
  20. jedis.lpush("mylist","v1","v2","v3","v4","v5");
  21. List<String> list = jedis.lrange("mylist",0,-1);
  22. for (String element : list) {
  23. System.out.println(element);
  24. }
  25. //set
  26. jedis.sadd("orders","jd001");
  27. jedis.sadd("orders","jd002");
  28. jedis.sadd("orders","jd003");
  29. Set<String> set1 = jedis.smembers("orders");
  30. for (Iterator iterator = set1.iterator(); iterator.hasNext();) {
  31. String string = (String) iterator.next();
  32. System.out.println(string);
  33. }
  34. jedis.srem("orders","jd002");
  35. System.out.println(jedis.smembers("orders").size());
  36. //hash
  37. jedis.hset("hash1","userName","lisi");
  38. System.out.println(jedis.hget("hash1","userName"));
  39. Map<String,String> map = new HashMap<String,String>();
  40. map.put("telphone","13811814763");
  41. map.put("address","atguigu");
  42. map.put("email","abc@163.com");
  43. jedis.hmset("hash2",map);
  44. List<String> result = jedis.hmget("hash2", "telphone","email");
  45. for (String element : result) {
  46. System.out.println(element);
  47. }
  48. //zset
  49. jedis.zadd("zset01",60d,"v1");
  50. jedis.zadd("zset01",70d,"v2");
  51. jedis.zadd("zset01",80d,"v3");
  52. jedis.zadd("zset01",90d,"v4");
  53. Set<String> s1 = jedis.zrange("zset01",0,-1);
  54. for (Iterator iterator = s1.iterator(); iterator.hasNext();) {
  55. String string = (String) iterator.next();
  56. System.out.println(string);
  57. }
  58. }
  59. }

控制台输出:

  1. hash2
  2. str3
  3. hash1
  4. k1
  5. str1
  6. mylist
  7. k2
  8. str2
  9. k3
  10. k4
  11. zset01
  12. orders
  13. jedis.exists====>true
  14. -1
  15. v1myreidsmyreids
  16. [v1, v2, v3]
  17. v5
  18. v4
  19. v3
  20. v2
  21. v1
  22. v5
  23. v4
  24. v3
  25. v2
  26. v1
  27. jd001
  28. jd003
  29. jd002
  30. 2
  31. lisi
  32. 13811814763
  33. abc@163.com
  34. v1
  35. v2
  36. v3
  37. v4

4、事务

  1. public class Test03 {
  2. public static void main(String[] args) {
  3. Jedis jedis = new Jedis("192.168.106.130",6379);
  4. jedis.auth("root");
  5. Transaction transaction = jedis.multi();
  6. transaction.set("balance","100");
  7. transaction.set("debt","0");
  8. transaction.exec();
  9. //transaction.discard();
  10. }
  11. }
  12. public class TestTX {
  13. public boolean transMethod() throws InterruptedException {
  14. Jedis jedis = new Jedis("192.168.106.130", 6379);
  15. jedis.auth("root");
  16. int balance;// 可用余额
  17. int debt;// 欠额
  18. int amtToSubtract = 10;// 实刷额度
  19. jedis.watch("balance");
  20. jedis.set("balance","5");//模拟其他程序已经修改可用余额
  21. Thread.sleep(7000);
  22. balance = Integer.parseInt(jedis.get("balance"));
  23. if (balance < amtToSubtract) {
  24. jedis.unwatch();
  25. System.out.println("可用余额被修改");
  26. return false;
  27. } else {
  28. System.out.println("开启事务");
  29. Transaction transaction = jedis.multi();
  30. transaction.decrBy("balance", amtToSubtract);
  31. transaction.incrBy("debt", amtToSubtract);
  32. transaction.exec();
  33. balance = Integer.parseInt(jedis.get("balance"));
  34. debt = Integer.parseInt(jedis.get("debt"));
  35. System.out.println("可用余额:" + balance);
  36. System.out.println("欠额:" + debt);
  37. return true;
  38. }
  39. }
  40. /**
  41. * 通俗点讲,watch命令就是标记一个键,如果标记了一个键,
  42. * 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中
  43. * 重新再尝试一次。
  44. * 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减;
  45. * 足够的话,就启动事务进行更新操作,
  46. * 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错,
  47. * 程序中通常可以捕获这类错误再重新执行一次,直到成功。
  48. * @throws InterruptedException
  49. */
  50. public static void main(String[] args) throws InterruptedException {
  51. TestTX test = new TestTX();
  52. boolean retValue = test.transMethod();
  53. System.out.println("操作是否成功: " + retValue);
  54. }
  55. }

在这里插入图片描述
5、主从复制

  1. public class TestMS {
  2. public static void main(String[] args) {
  3. Jedis jedis_M = new Jedis("192.168.106.130",6379);
  4. jedis_M.auth("root");
  5. Jedis jedis_S = new Jedis("192.168.106.130",6380);
  6. jedis_S.auth("root");
  7. jedis_S.slaveof("192.168.106.130",6379);
  8. jedis_M.set("class","1122V2");
  9. String result = jedis_S.get("class");
  10. System.out.println(result);
  11. }
  12. }

6、JedisPool

  1. public class JedisPoolUtil {
  2. private static volatile JedisPool jedisPool = null;
  3. private JedisPoolUtil(){}
  4. public static JedisPool getJedisPoolInstance() {
  5. if(null == jedisPool) {
  6. synchronized (JedisPoolUtil.class) {
  7. if(null == jedisPool) {
  8. JedisPoolConfig poolConfig = new JedisPoolConfig();
  9. poolConfig.setMaxActive(1000);
  10. poolConfig.setMaxIdle(32);
  11. poolConfig.setMaxWait(100*1000);
  12. poolConfig.setTestOnBorrow(true);
  13. jedisPool = new JedisPool(poolConfig,"192.168.106.130",6379);
  14. }
  15. }
  16. }
  17. return jedisPool;
  18. }
  19. public static void release(JedisPool jedisPool,Jedis jedis) {
  20. if(null != jedis) {
  21. jedisPool.returnResourceObject(jedis);
  22. }
  23. }
  24. }
  25. public class TestPool {
  26. public static void main(String[] args) {
  27. JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
  28. JedisPool jedisPool2 = JedisPoolUtil.getJedisPoolInstance();
  29. System.out.println(jedisPool == jedisPool2);
  30. Jedis jedis = null;
  31. try {
  32. jedis = jedisPool.getResource();
  33. jedis.set("aa","bb");
  34. } catch (Exception e) {
  35. e.printStackTrace();
  36. }finally{
  37. JedisPoolUtil.release(jedisPool, jedis);
  38. }
  39. }
  40. }

在这里插入图片描述
常用配置:
 JedisPool的配置参数大部分是由JedisPoolConfig的对应项来赋值的。
maxActive:控制一个pool可分配多少个jedis实例,通过pool.getResource()来获取;如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted。
maxIdle:控制一个pool最多有多少个状态为idle(空闲)的jedis实例;
whenExhaustedAction:表示当pool中的jedis实例都被allocated完时,pool要采取的操作;默认有三种:
  WHEN_EXHAUSTED_FAIL —> 表示无jedis实例时,直接抛出NoSuchElementException。
  WHEN_EXHAUSTED_BLOCK —> 则表示阻塞住,或者达到maxWait时抛出JedisConnectionException。
  WHEN_EXHAUSTED_GROW —> 则表示新建一个jedis实例,也就说设置的maxActive无用。
maxWait:表示当borrow一个jedis实例时,最大的等待时间,如果超过等待时间,则直接抛JedisConnectionException。
testOnBorrow:获得一个jedis实例的时候是否检查连接可用性(ping());如果为true,则得到的jedis实例均是可用的。
testOnReturn:return 一个jedis实例给pool时,是否检查连接可用性(ping())。
testWhileIdle:如果为true,表示有一个idle object evitor线程对idle object进行扫描,如果validate失败,此object会被从pool中drop掉;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义。
timeBetweenEvictionRunsMillis:表示idle object evitor两次扫描之间要sleep的毫秒数。
numTestsPerEvictionRun:表示idle object evitor每次扫描的最多的对象数。
minEvictableIdleTimeMillis:表示一个对象至少停留在idle状态的最短时间,然后才能被idle object evitor扫描并驱逐;这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义。
softMinEvictableIdleTimeMillis:在minEvictableIdleTimeMillis基础上,加入了至少minIdle个对象已经在pool里面了。如果为-1,evicted不会根据idle time驱逐任何对象。如果minEvictableIdleTimeMillis>0,则此项设置无意义,且只有在timeBetweenEvictionRunsMillis大于0时才有意义。
lifo:borrowObject返回对象时,是采用DEFAULT_LIFO(last in first out,即类似cache的最频繁使用队列),如果为False,则表示FIFO队列。

其中JedisPoolConfig对一些参数的默认设置如下:
 testWhileIdle=true
 minEvictableIdleTimeMills=60000
 timeBetweenEvictionRunsMillis=30000
 numTestsPerEvictionRun=-1

发表评论

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

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

相关阅读

    相关 Jedis使用总结

    Jedis使用总结 前段时间细节的了解了Jedis的使用,Jedis是redis的java版本的客户端实现。 本文做个总结,主要分享如下内容:

    相关 jedis使用

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

    相关 Jedis使用示例

      Jedis 是 Redis 官方首选的 Java 客户端开发包。 工作过程总结的一个示例,贴出来,如下: Java代码   ![收藏代码][icon_star.png