Redis_java中使用Jedis

素颜马尾好姑娘i 2022-05-17 07:13 317阅读 0赞

一、Redis在java中使用——Jedis常用操作

1、依赖

  1. <!--使用Redis-->
  2. <dependency>
  3. <groupId>commons-pool</groupId>
  4. <artifactId>commons-pool</artifactId>
  5. <version>1.6</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>redis.clients</groupId>
  9. <artifactId>jedis</artifactId>
  10. <version>2.9.0</version>
  11. </dependency>

2、测试连通性

  1. public class RedisTest {
  2. @Test
  3. public void redisTest(){
  4. //连接本地Redis服务
  5. Jedis jedis = new Jedis("localhost",6379);
  6. //查看服务是否运行,打出pong表示OK
  7. System.out.println(jedis.ping());
  8. }
  9. }

出现pong表示连通成功。

3、五大数据类型

  1. @Test
  2. public void redisTest2(){
  3. //连接本地服务
  4. Jedis jedis = new Jedis("localhost",6379);
  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(keys.contains("k2")+" "+jedis.ttl("k2")+" "+jedis.get("k2"));
  12. //String
  13. jedis.set("m1","v1");
  14. System.out.println(jedis.get("m1"));
  15. jedis.mset("str1","v1","str2","v2","str3","v3");
  16. System.out.println(jedis.mget("str1","str2","str3"));
  17. //List
  18. jedis.lpush("myList","v1","v2","v3","v4","v5");
  19. List<String> list = jedis.lrange("myList",0,-1);
  20. for (String element:list) {
  21. System.out.println(element);
  22. }
  23. //Set
  24. jedis.sadd("orders","jd001");
  25. jedis.sadd("orders","jd002");
  26. jedis.sadd("orders","jd003");
  27. Set<String> set = jedis.smembers("orders");
  28. for (Iterator iterator = set.iterator();iterator.hasNext();){
  29. String string = (String) iterator.next();
  30. System.out.println(string);
  31. }
  32. //Hash
  33. jedis.hset("hash","username","lisi");
  34. System.out.println(jedis.hget("hash","username"));
  35. Map<String,String> map = new HashMap<String,String>();
  36. map.put("telphone","13811814763");
  37. map.put("address","atguigu");
  38. map.put("email","abc@163.com");
  39. jedis.hmset("hash2",map);
  40. List<String> result = jedis.hmget("hash2","telephone","email");
  41. for (String str : result) {
  42. System.out.println(str);
  43. }
  44. //Zset
  45. jedis.zadd("zset1",10,"v1");
  46. jedis.zadd("zset1",20,"v2");
  47. jedis.zadd("zset1",30,"v3");
  48. Set<String> s1 = jedis.zrange("zset1",0,-1);
  49. for (Iterator iterator = s1.iterator();iterator.hasNext();){
  50. String str = (String) iterator.next();
  51. System.out.println(str);
  52. }
  53. }

4、事务提交

加锁:

  1. /**
  2. * 通俗点讲,watch命令就是标记一个键,如果标记了一个键,在提交事务前如果该键被别人修改过,
  3. * 那事务就会失败,这种情况可以在程序中重新再尝试一次
  4. *
  5. * 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减;足够的话就启动事务进行更新操作
  6. *
  7. * 如果在此期间键balance被其他人修改,那在提交事务(执行exec)时就会报错,
  8. * 程序通常可以捕获这类错误再重新执行一次,直到成功
  9. *
  10. */
  11. @Test
  12. public void ClassTest(){
  13. Jedis jedis = new Jedis("127.0.0.1",6379);
  14. int balance;//可用余额
  15. int debt;//欠额
  16. int amtToSubtract = 10;//实刷额度
  17. jedis.watch("balance");
  18. jedis.set("balance", "5");//模拟其他程序修改了该条目
  19. balance = Integer.parseInt(jedis.get("balance"));
  20. if (balance<amtToSubtract){
  21. jedis.unwatch();
  22. System.out.println("modify");
  23. //return false;
  24. }else {
  25. System.out.println("*************transaction");
  26. Transaction transaction = jedis.multi();
  27. transaction.decrBy("balance", amtToSubtract);
  28. transaction.incrBy("debt",amtToSubtract );
  29. transaction.exec();
  30. balance = Integer.parseInt(jedis.get("balance"));
  31. debt = Integer.parseInt(jedis.get("debt"));
  32. System.out.println("*********"+balance);
  33. System.out.println("*********"+debt);
  34. //return true;
  35. }
  36. }
  37. }

5、主从复制

其中,6379,6380启动,先各自独立,主写,从读

  1. public void CopyTest(){
  2. Jedis jedis_M = new Jedis("127.0.0.1",6379);
  3. Jedis jedis_S = new Jedis("127.0.0.1",6380);
  4. jedis_S.slaveof("127.0.0.1",6379 );
  5. jedis_M.set("k6", "v6");
  6. try {
  7. Thread.sleep(500);
  8. } catch (InterruptedException e) {
  9. e.printStackTrace();
  10. }
  11. System.out.println(jedis_S.get("k6"));
  12. }

二、JedisPool

获取Jedis实例需要从JedisPool中获取,用完Jedis实例需要返回给JedisPool。如果Jedis在使用过程中出错,则也需要还给JedisPool。

实例

连接池工具类

  1. //单例模式
  2. public class JedisPoolUtil {
  3. private static volatile JedisPool jedisPool = null;
  4. private JedisPoolUtil(){ }
  5. public static JedisPool getJedisPoolInstance(){
  6. if (jedisPool == null){
  7. synchronized (JedisPoolUtil.class){
  8. if (null == jedisPool){
  9. JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
  10. jedisPoolConfig.setMaxTotal(1000);
  11. jedisPoolConfig.setMaxIdle(32);
  12. jedisPoolConfig.setMaxWaitMillis(100*1000);
  13. jedisPoolConfig.setTestOnBorrow(true);
  14. jedisPool = new JedisPool(jedisPoolConfig,"127.0.0.1",6379);
  15. }
  16. }
  17. }
  18. return jedisPool;
  19. }
  20. public static void release(JedisPool jedisPool , Jedis jedis){
  21. //释放
  22. if (null == jedis){
  23. jedisPool.returnResource(jedis);
  24. }
  25. }
  26. }
  27. @Test
  28. public void redisTest4(){
  29. JedisPool jedisPool = JedisPoolUtil.getJedisPoolInstance();
  30. Jedis jedis = null;
  31. try {
  32. jedis = jedisPool.getResource();
  33. jedis.set("aa", "bb");
  34. System.out.println( jedis.get("aa"));
  35. } catch (Exception e) {
  36. e.printStackTrace();
  37. } finally {
  38. JedisPoolUtil.release(jedisPool,jedis );
  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 条评论,317人围观)

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

相关阅读

    相关 jedis使用

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