Redis(九)Jedis
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.1.0</version>
</dependency>
</dependencies>
连接redis
//Redis连接IP
private static String host = "IP";
//端口号
private static int port = 6379;
public static void main(String[] args) {
Jedis jedis = new Jedis(host,port);
//测试连通性
String pong = jedis.ping();
System.out.println("pong = " + pong);
}
// 运行前:
// 1.关闭防火墙 systemctl stop firewalld.service
// 2.修改redis.conf [ bind 0.0.0.0 ] 允许任何ip访问,以这个redis.conf启动redis服务(重启redis)
// redis-server /opt/redis5.0.4/redis.conf
//Exception in thread "main" redis.clients.jedis.exceptions.JedisDataException: WRONGTYPE Operation against a key holding the wrong kind of value
//进入redis-cli,运行config set protected-mode "no"
常用API
public class Test2API {
//Redis连接IP
private static String host = "IP";
//端口号
private static int port = 6379;
public static void main(String[] args) {
Jedis jedis = new Jedis(host, port);
//执行前清空当前数据库,防止出现错误
jedis.flushDB();
//String类型
jedis.set("k1", "v1");
jedis.set("k2", "v2");
jedis.set("k3", "v3");
//获取全部键
Set<String> set = jedis.keys("*");
//通过键获取相对应的值
set.forEach(item -> System.out.println(item + " -> " + jedis.get(item)));
System.out.println("判断指定键是否存在:" + jedis.exists("k4"));
System.out.println("查看k1的过期时间:" + jedis.ttl("k1"));
//写入多个值
jedis.mset("k4","v4","k5","v5");
//获取多个值
System.out.println(jedis.mget("k1", "k2", "k3", "k4", "k5"));
System.out.println("***********************************************************");
//List类型
jedis.lpush("list01","l1", "l2", "l3", "l4", "l5");
//获取全部值
List<String> list01 = jedis.lrange("list01", 0, -1);
list01.forEach(item -> System.out.println(item));
System.out.println("***********************************************************");
//Set类型
jedis.sadd("order","jd001");
jedis.sadd("order","jd002");
jedis.sadd("order","jd003");
//获取set信息
Set<String> order = jedis.smembers("order");
order.forEach(item -> System.out.println(item));
//删除set某一个信息
jedis.srem("order","jd003");
System.out.println("Set长度:" + jedis.smembers("order").size());
System.out.println("***********************************************************");
//Hash类型
jedis.hset("user1","username","tom");
System.out.println("获取user1的username:" + jedis.hget("user1", "username"));
HashMap<String, String> map = new HashMap<>();
map.put("username","jack");
map.put("gender","boy");
map.put("address","beijing");
map.put("phone","11111111");
jedis.hmset("user2",map);
List<String> list = jedis.hmget("user2", "username", "phone");
list.forEach(item -> System.out.println(item));
System.out.println("***********************************************************");
//Zset类型
jedis.zadd("zset01",60d,"zs1");
jedis.zadd("zset01",70d,"zs2");
jedis.zadd("zset01",80d,"zs3");
jedis.zadd("zset01",90d,"zs4");
//获取全部值
Set<String> zset01 = jedis.zrange("zset01", 0, -1);
zset01.forEach(item -> System.out.println(item));
}
}
事务控制
初始化余额和支出
set yue 100
set zhichu 0
public class Test3Affair {
//Redis连接IP
private static String host = "IP";
//端口号
private static int port = 6379;
public static void main(String[] args) throws InterruptedException {
Jedis jedis = new Jedis(host, port);
int zhichu = 10;
//监控余额
jedis.watch("yue");
//模拟网络延迟
Thread.sleep(5000);
int yue = Integer.valueOf(jedis.get("yue"));
if (yue < zhichu){
//解除监控
jedis.unwatch();
System.out.println("余额不足!!!!");
} else {
//开启事务
Transaction transaction = jedis.multi();
//余额 - 支出
transaction.decrBy("yue",zhichu);
//支出 + 支出 累计消费
transaction.incrBy("zhichu",zhichu);
//执行事务
transaction.exec();
System.out.println("余额:" + jedis.get("yue"));
System.out.println("累计支出:" + jedis.get("zhichu"));
}
}
}
JedisPool(连接池)
public class JedisPoolUtil {
//Redis连接IP
private final static String HOST = "IP";
//端口号
private final static int PORT = 6379;
//声明连接池
private volatile static JedisPool jedisPool = null;
//数据对象
private volatile static Jedis jedis = null;
//私有化构造
private JedisPoolUtil(){
}
//私有化连接池对象
//返回一个连接池
private static JedisPool getInstance(){
//双层检查锁机制
//第一层锁检测
if (jedisPool == null){
//上锁,保证高并发情况
synchronized (JedisPoolUtil.class){
//二次检测
if (jedisPool == null){
JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
//设置连接池信息
jedisPoolConfig.setMaxTotal(1000); //最大连接数量
jedisPoolConfig.setMaxIdle(30); //最大等待数量
jedisPoolConfig.setMaxWaitMillis(60 * 1000); //最大等待时间
jedisPoolConfig.setTestOnBorrow(true); //后台运行
//获取连接池
jedisPool = new JedisPool(jedisPoolConfig,HOST,PORT);
}
}
}
return jedisPool;
}
//返回jedis对象
public static Jedis getJedis(){
//双重检测锁机制
if (jedis == null){
//在连接池获取连接对象
jedis = getInstance().getResource();
}
return jedis;
}
}
public class Test4JedisPool {
public static void main(String[] args) {
Jedis jedis1 = JedisPoolUtil.getJedis();
Jedis jedis2 = JedisPoolUtil.getJedis();
System.out.println(jedis1 == jedis2);
}
}