- java和redis打交道的API客户端
- 可以想象,操作关系型数据库比如 MySQL 我们可以使用 JDBC,而操作 Redis 我们可以使用 Jedis
2.2 编写 Java 代码 2.2.1 初始化 Jedis 连接对象redis.clients jedis 3.1.0
public class JedisDemo1 {
// 获取 Jedis 对象
private Jedis jedis = new Jedis("192.168.159.133", 6379);
}
2.2.2 测试Redis连接是否成功
public void ping(){
String ping = jedis.ping();
System.out.println("Redis 连接状态:" + ping);
}
2.2.3 Redis 通用基础操作
public void basicMethod(){
// 查询所有
System.out.println("=========[查询所有]=========");
Set keys = jedis.keys("jedis*");
for (String key : keys) {
System.out.println("键:" + key + ", 键的类型:" + jedis.type(key) + ", 值:" + jedis.get(key));
}
// 设置键值对
System.out.println("=========[设置键值对]=========");
jedis.set("jedis1", "1");
jedis.set("jedis2", "2");
jedis.set("jedis3", "3");
keys = jedis.keys("jedis*");
for (String key : keys) {
System.out.println("键:" + key + ", 键的类型:" + jedis.type(key) + ", 值:" + jedis.get(key));
}
// 判断键值对是否存在
System.out.println("=========[判断键值对是否存在]=========");
Boolean jedis1 = jedis.exists("jedis1");
System.out.println("jedis1 键是否存在:" + jedis1);
// 设置有效期限的键,获取 ttl 值
System.out.println("=========[设置有效期限的键,获取 ttl 值]=========");
jedis.set("expire1", "ttl key");
jedis.expire("expire1", 60);
try {
Thread.sleep(5000); // 休眠 5 秒钟
} catch (Exception e){
System.out.println(e.getMessage());
}
System.out.println("休眠 5 秒钟之后,ttl 值为:" + jedis.ttl("expire1"));
// 获取键的数量
System.out.println("=========[获取键的数量]=========");
Long aLong = jedis.dbSize();
System.out.println("当前数据库中键的数量为:" + aLong);
// 删除元素
System.out.println("=========[删除元素]=========");
jedis.del("jedis1", "jedis2", "jedis3");
}
2.2.4 String 类型操作方法
public void stringMethod(){
// 设置有效时间的 string 键
System.out.println("=========[设置有效时间的 string 键]=========");
jedis.setex("string-ttl-1", 60, "string key");
System.out.println("=========[键不存在设置,存在则失败]=========");
Long setnx = jedis.setnx("string-ttl-1", "string key");
if (setnx == 1L){
System.out.println("setnx 设置键成功");
} else {
System.out.println("setnx 键设置失败");
}
// 同时设置多个键值对,并获取
System.out.println("=========[同时设置多个键值对,并获取]=========");
jedis.mset("string-1", "1", "string-2", "2", "string-3", "3");
List mget = jedis.mget("string-1", "string-2", "string-3");
System.out.println("获取到的多个值:" + mget.toString());
// 对 数值型的 键值对进行增减操作
System.out.println("=========[对 数值型的 键值对进行增减操作]=========");
jedis.incr("string-1"); // 自增
jedis.decr("string-2"); // 自减
jedis.incrBy("string-3", 3L); // 指定自增
mget = jedis.mget("string-1", "string-2", "string-3");
System.out.println("获取到的多个值:" + mget.toString());
// 返回旧的数据,更新新的数据
System.out.println("=========[返回旧的数据,更新新的数据]=========");
String new_data = jedis.getSet("string-ttl-1", "new data");
System.out.println("string-ttl-1 键旧的数据为:" + new_data);
// 对值进行字符串操作
System.out.println("=========[对值进行字符串操作]=========");
jedis.append("string-1", "-aaa"); // 追加内容
Long strlen = jedis.strlen("string-1"); // 获取值的长度
jedis.setrange("string-1", strlen - 1, "-set"); // 修改指定索引开始位置
System.out.println("string-1 键的值为:" + jedis.get("string-1"));
// 删除实验数据
System.out.println("=========[删除实验数据]=========");
jedis.del("string-1", "string-2", "string-3");
}
2.2.5 List 类型操作方法
public void listMethod(){
// 从左侧和右侧 添加元素
System.out.println("=========[从左侧和右侧 添加元素]=========");
jedis.lpush("list-java-1", "Mike", "John", "Jack", "John", "Peter");
jedis.rpush("list-java-1", "Jack", "Smith", "John");
// 根据索引获取元素
System.out.println("=========[根据索引获取元素]=========");
String lindex = jedis.lindex("list-java-1", 1L);
System.out.println("索引为 1 的元素为:" + lindex);
// 更改对应索引的元素
System.out.println("=========[更改对应索引的元素]=========");
jedis.lset("list-java-1", 1L, "Amy");
lindex = jedis.lindex("list-java-1", 1L);
System.out.println("索引为 1 的元素为:" + lindex);
// 根据元素在之前和之后插入元素
System.out.println("=========[根据元素在之前和之后插入元素]=========");
jedis.linsert("list-java-1", ListPosition.AFTER, "Amy", "list-after"); // 后插
jedis.linsert("list-java-1", ListPosition.BEFORE, "Amy", "list-before"); // 前插
// 获取所有元素
System.out.println("=========[获取所有元素]=========");
List lrange = jedis.lrange("list-java-1", 0, -1);
System.out.println("元素数量:" + jedis.llen("list-java-1") + ", 所有元素:" + lrange.toString());
// 删除指定数量的某元素
System.out.println("=========[删除指定数量的某元素]=========");
jedis.lrem("list-java-1", 2, "John");
lrange = jedis.lrange("list-java-1", 0, -1);
System.out.println("元素数量:" + jedis.llen("list-java-1") + ", 所有元素:" + lrange.toString());
// 删除全部元素
System.out.println("=========[删除全部元素]=========");
jedis.ltrim("list-java-1", 0, 0); // 删除除第一个元素之外的所有元素
jedis.lpop("list-java-1"); // 出栈最后一个元素
lrange = jedis.lrange("list-java-1", 0, -1);
System.out.println("元素数量:" + jedis.llen("list-java-1") + ", 所有元素:" + lrange.toString());
}
2.2.6 Set 集合操作方法
public void setMethod(){
// 添加元素
System.out.println("=========[添加元素]=========");
jedis.sadd("set-java-user", "Mike", "John", "Jack", "John");
jedis.sadd("set-java-user-2", "Amy", "John", "Jack", "Peter");
jedis.sadd("set-java-address", "Beijing", "Shanghai", "Dalian", "Shenzhen");
// 查询元素
System.out.println("=========[查询元素]=========");
Set userSet = jedis.smembers("set-java-user");
System.out.println("用户set元素数量:" + userSet.size() + "用户的所有元素:" + userSet.toString());
userSet = jedis.smembers("set-java-user-2");
System.out.println("用户set 2 元素数量:" + userSet.size() + "用户的所有元素:" + userSet.toString());
Set addressSet = jedis.smembers("set-java-address");
System.out.println("地址set元素数量:" + addressSet.size() + "地址的所有元素:" + addressSet.toString());
// 判断元素是否在 set 中
System.out.println("=========[判断元素是否在 set 中]=========");
System.out.println(jedis.sismember("set-java-user", "Smith")? "Smith 存在": "Smith 不存在");
System.out.println(jedis.sismember("set-java-address", "Beijing")? "Beijing 存在": "Beijing 不存在");
// 交集,并集,差集的计算
System.out.println("=========[交集,并集,差集的计算]=========");
Set sinter = jedis.sinter("set-java-user", "set-java-user-2"); // 交集
Set sunion = jedis.sunion("set-java-user", "set-java-user-2"); // 并集
Set sdiff = jedis.sdiff("set-java-user", "set-java-user-2"); // 差集
System.out.println("交集:" + sinter.toString());
System.out.println("并集:" + sunion.toString());
System.out.println("差集:" + sdiff.toString());
// 删除元素
System.out.println("=========[删除元素]=========");
jedis.srem("set-java-user-2", "Amy"); // 删除指定元素
jedis.smove("set-java-user", "set-java-user-2", "Mike"); // 将元素进行移动
jedis.spop("set-java-user", jedis.scard("set-java-user"));// 删除所有元素
jedis.spop("set-java-user-2", jedis.scard("set-java-user-2")); // 删除所有元素
jedis.spop("set-java-address", jedis.scard("set-java-address")); // 删除所有元素
}
2.2.7 sort set 操作方法(有序集合)
public void sortSet(){
// 添加元素
System.out.println("=========[添加元素]=========");
Map hashMap = new LinkedHashMap<>();
hashMap.put("不及格", 59.0);
hashMap.put("及格", 69.0);
hashMap.put("中等", 79.0);
hashMap.put("良好", 89.0);
hashMap.put("优秀", 99.0);
hashMap.put("满分", 100.0);
jedis.zadd("sortset-java-1", hashMap);
// 查询元素
System.out.println("=========[查询元素]=========");
System.out.println("元素总数为:" + jedis.zcard("sortset-java-1"));
System.out.println("优秀 分数为:" + jedis.zscore("sortset-java-1", "优秀"));
System.out.println("及格人数为:" + jedis.zcount("sortset-java-1", 60, 100) + ", 上面的档次有:" + jedis.zrangeByScore("sortset-java-1", 60, 100).toString());
System.out.println("中等人数为:" + jedis.zcount("sortset-java-1", 70, 100) + ", 上面的档次有:" + jedis.zrangeByScore("sortset-java-1", 70, 100).toString());
System.out.println("良好人数为:" + jedis.zcount("sortset-java-1", 80, 100) + ", 上面的档次有:" + jedis.zrangeByScore("sortset-java-1", 80, 100).toString());
System.out.println("优秀人数为:" + jedis.zcount("sortset-java-1", 90, 100) + ", 上面的档次有:" + jedis.zrangeByScore("sortset-java-1", 90, 100).toString());
// 删除元素
System.out.println("=========[删除元素]=========");
jedis.zrem("sortset-java-1", "不及格"); // 单独删除一个元素
jedis.zremrangeByScore("sortset-java-1", 60, 100); // 删除分数段的所有元素
}
2.2.8 Hash 操作方法
- 此处涉及到了对象序列化的内容,所以使用到了 FastJSON工具包,需要添加依赖
com.alibaba fastjson 1.2.3
public void hashMethod(){
// 模拟从数据库中读取大量用户数据,缓存到 redis 中
List userList = new LinkedList<>();
userList.add(new User(2022090101, "Mike", 21, "Beijing"));
userList.add(new User(2022090102, "Peter", 24, "Shanghai"));
userList.add(new User(2022090103, "Jack", 22, "Shenzhen"));
userList.add(new User(2022090104, "云梦", 22, "Dalian"));
userList.add(new User(2022090105, "归遥", 20, "Hangzhou"));
// 将数据库中读取出来的数据进行处理,构建为 map
Map userMap = new LinkedHashMap<>();
for (User user: userList){
userMap.put(String.valueOf(user.getId()), JSON.toJSONString(user));
}
// 增加数据(进行序列化)
System.out.println("============[增加数据(进行序列化)]===========");
jedis.hmset("hash-java-user", userMap);
// 获取所有的键,值
System.out.println("============[获取所有的键,值]===========");
Set hkeys = jedis.hkeys("hash-java-user");
System.out.println("所有的键:" + hkeys.toString());
List hvals = jedis.hvals("hash-java-user");
System.out.println("所有的值:" + hvals.toString());
// 判断某个键是否存在
System.out.println("============[判断某个键是否存在]===========");
Boolean hexists = jedis.hexists("hash-java-user", "2022090101");
System.out.println("2022090101 是否存在:" + hexists);
hexists = jedis.hexists("hash-java-user", "2022090108");
System.out.println("2022090108 是否存在:" + hexists);
// 获取并修改某个键对应的值
System.out.println("============[获取并修改某个键对应的值]===========");
if (jedis.hexists("hash-java-user", "2022090101")){
String hget = jedis.hget("hash-java-user", "2022090101");
User user = JSON.parseObject(hget, User.class);
System.out.println("2022090101 对应的数据为:" + user.toString());
user.setAge(30);
user.setAddress("Guangzhou");
jedis.hset("hash-java-user", "2022090101", JSON.toJSONString(user));
} else {
System.out.println("2022090101 对应的数据为 null");
}
// 获取所有键值对
System.out.println("============[获取所有键值对]===========");
Map newUserMap = jedis.hgetAll("hash-java-user");
System.out.println("元素数量:" + jedis.hlen("hash-java-user"));
Set> entries = newUserMap.entrySet();
for (Map.Entry entry: entries){
System.out.println("键:" + entry.getKey() + ", 值:" + entry.getValue());
}
// 删除元素
System.out.println("============[删除元素]===========");
jedis.hkeys("hash-java-user").forEach(key -> jedis.hdel("hash-java-user", key));
}
2.2.9 事务操作方法
public void multiMethod(){
// 模拟转账操作(模拟 Mike,Jack用户各有 100 元)
jedis.set("Mike", "100");
jedis.set("Jack", "100");
// 进行转账操作(转账 20 元)
int transfer = 20;
String mike = jedis.get("Mike");
Transaction transaction = jedis.multi();
try{
// 判断余额是否足以转出
if (Integer.parseInt(mike) >= transfer){
transaction.decrBy("Mike", (long) transfer); // 转出
transaction.incrBy("Jack", (long) transfer); // 转入
transaction.exec(); // 提交事务
System.out.println("双方转账成功");
} else {
System.out.println("Mike 账户余额不足,转账失败");
}
} catch (Exception e){
System.out.println("转账过程中出现异常:" + e.getMessage());
transaction.discard(); // 回滚
} finally {
transaction.close();
}
System.out.println("转账后双方余额:Mike:" + jedis.get("Mike") + ", Jack: " + jedis.get("Jack"));
// 删除测试数据
jedis.del("Mike", "Jack");
}
3.总结
以上就是 Jedis 操作 Redis的基本操作,五大数据类型,事务的所有方法。



