【Redis Jedis联通 04】
一、jedis依赖的jar包:jedis,commons-pool
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>3.3.0</version> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-pool2</artifactId> <version>2.9.0</version> </dependency>
二、连接redis
Jedis jedis = new Jedis("172.16.203.152",6379);
测试连接时,容易报“连接拒绝/连接超时”的错误
解决办法:
修改redis.conf,修改如下内容为:
bind 127.0.0.1 改为 0.0.0.0
并关闭防火墙
systemctl stop firewalld.service //停止firewall systemctl disable firewalld.service #禁止firewall开机启动
三、常用API
其实就是五大类型+key
// 1、String类型 jedis.set("k1","v1"); jedis.set("k2","v2"); jedis.set("k3","v3"); //单独获取一个key System.out.println(jedis.get("k1")); //获取多个key Set<String> keys = jedis.keys("*"); Iterator<String> it = keys.iterator(); while (it.hasNext()){ System.out.print(it.next()+" "); } //验证一个key是否存在 System.out.println(jedis.exists("k2")); //设置key的有效时间 jedis.expire("k1",10); System.out.println(jedis.ttl("k1")); //设置多个key和value jedis.mset("k4","v4","k5","v5"); System.out.println(jedis.keys("*")); System.out.println(jedis.mget("k2","k3","k4","k5")); // 2、list类型 jedis.lpush("list1","l1","l2","l3"); jedis.rpush("list2","rl1","rl2","rl3"); List<String> list1 = jedis.lrange("list1", 0, -1); for(String element: list1){ System.out.print(element+","); }
上面的代码只写了String类型和list类型,set、hash、zset类型基本写法一直
四、事务提交
package com.wufq.redis; import redis.clients.jedis.Jedis; import redis.clients.jedis.Transaction; /** * @Description 事务 * @Author wufq * @Version * @Date 2021/5/31 14:25 */ public class TranctionTest { public static void main(String[] args){ TranctionTest test = new TranctionTest(); Boolean retValue=test.transMonth(); System.out.println("retValue --------> "+retValue); } /* * 通俗点讲,watch命令就是标记一个键,如果标记了一个键, 在提交事务前如果该键被别人修改过,那事务就会失败,这种情况通常可以在程序中 * 重新再尝试一次。 * 首先标记了键balance,然后检查余额是否足够,不足就取消标记,并不做扣减; 足够的话,就启动事务进行更新操作, * 如果在此期间键balance被其它人修改, 那在提交事务(执行exec)时就会报错, 程序中通常可以捕获这类错误再重新执行一次,直到成功。 * */ private Boolean transMonth() { Jedis jedis = new Jedis("172.16.203.152", 6379); int balabce; //可用余额 int detb; //欠额 int amtToSubtract =10;//实刷额度 jedis.set("balance","100"); jedis.set("detb","0"); //监控key jedis.watch("balance"); balabce = Integer.parseInt(jedis.get("balance")); detb = Integer.parseInt(jedis.get("detb")); if(balabce<amtToSubtract){ //取消key的监控 jedis.unwatch(); System.out.println("modify..."); return false; }else { System.out.println("tranction start--------->"); //开启事务 Transaction trans = jedis.multi(); //decrBy按照设置数字成倍相减,incrBy按照设置的数字成倍相加 trans.decrBy("balance",amtToSubtract); trans.incrBy("detb",amtToSubtract); //执行事务 trans.exec(); System.out.println("balance ------> "+balabce); System.out.println("debt ------> "+detb); return true; } } }
五、主从复制
设置主从命令:SLAVEOF 主机ip 主机port
取消准备:SLAVEOF no one
package com.wufq.redis; import redis.clients.jedis.Jedis; /** * @Description 主从复制 * @Author wufq * @Version * @Date 2021/5/31 15:16 */ public class SlaveOfTest { public static void main(String[] args){ Jedis jedis_M = new Jedis("172.16.203.152", 6379); Jedis jedis_S1 = new Jedis("172.16.203.152", 6380); Jedis jedis_S2 = new Jedis("172.16.203.152", 6381); jedis_S1.slaveof("172.16.203.152",6379); jedis_S2.slaveof("172.16.203.152",6379); jedis_M.set("test","testNu"); System.out.println(jedis_S1.get("test")+"::"+jedis_S2.get("test")); } }