


专栏:Redis 修行录
个人主页:手握风云
目录
[一、Hash 类型核心操作](#一、Hash 类型核心操作)
[1.1. 设置 / 获取单个字段](#1.1. 设置 / 获取单个字段)
[1.2. 判断存在 / 删除字段](#1.2. 判断存在 / 删除字段)
[1.3. 获取所有键值](#1.3. 获取所有键值)
[1.4. 批量获取多个字段](#1.4. 批量获取多个字段)
[1.5. 获取哈希长度](#1.5. 获取哈希长度)
[1.6. 字段数值自增 / 自减](#1.6. 字段数值自增 / 自减)
[二、Set 类型核心操作](#二、Set 类型核心操作)
[2.1. 元素新增与全量查询](#2.1. 元素新增与全量查询)
[2.2. 元素存在判断与删除](#2.2. 元素存在判断与删除)
[2.3. 集合元素统计](#2.3. 集合元素统计)
[2.4. 多集合逻辑运算](#2.4. 多集合逻辑运算)
[三、Zset 类型核心操作](#三、Zset 类型核心操作)
[3.1. 添加与范围查询](#3.1. 添加与范围查询)
[3.2. 删除与元素计数](#3.2. 删除与元素计数)
[3.3. 分数区间统计](#3.3. 分数区间统计)
[3.4. 弹出最值元素](#3.4. 弹出最值元素)
[3.5. 排名查询](#3.5. 排名查询)
[3.6. 分数操作](#3.6. 分数操作)
一、Hash 类型核心操作
基于 Jedis 客户端的 Redis 哈希表(hash)操作,方法与 Redis 原生 hash 命令一一对应,核心是对哈希的字段 - 值进行增、删、查、计数、数值增减等操作。
1.1. 设置 / 获取单个字段
- hset:为哈希 key 设置单个字段与对应值;
- hget:根据哈希 key 和字段名,获取对应字段值。
java
public static void test1(Jedis jedis) {
System.out.println("设置获取单个字段: hset / hget");
jedis.flushDB();
String key = "test_hash";
// 为哈希 key 设置单个字段与对应值
jedis.hset(key, "name", "John");
jedis.hset(key, "age", "25");
// 获取对应字段值
String name = jedis.hget(key, "name");
String age = jedis.hget(key, "age");
System.out.println("获取的 name 为" + name + "、age 为" + age);
System.out.println("======");
}

1.2. 判断存在 / 删除字段
- hexists:判断字段是否存在
- hdel:删除指定字段
java
public static void test2(Jedis jedis) {
System.out.println("判断存在 / 删除字段: hexists / hdel");
jedis.flushDB();
String key = "test_hash";
jedis.hset(key, "status", "active");
// 判断哈希中指定字段是否存在
boolean status = jedis.hexists(key, "status");
System.out.println("status 是否存在: " + status);
// 删除哈希中指定字段,返回删除数量
long delCnt = jedis.hdel(key, "status");
System.out.println("删除字段数量: " + delCnt);
status = jedis.hexists(key, "status");
System.out.println("status 是否存在: " + status);
System.out.println("======");
}

1.3. 获取所有键值
- hkeys:获取哈希所有字段名
- hvals:获取哈希所有字段值
java
public static void test3(Jedis jedis) {
System.out.println("获取所有键值: hkeys / hvals");
jedis.flushDB();
String key = "test_hash";
jedis.hset(key, "city", "Beijing");
jedis.hset(key, "country", "China");
// 获取所有字段名
Set<String> keys = jedis.hkeys(key);
System.out.println("获取所有字段名: " + keys);
// 获取所有字段值
List<String> values = jedis.hvals(key);
System.out.println("获取所有字段值: " + values);
System.out.println("======");
}

1.4. 批量获取多个字段
- hmget:一次取多个字段的值
java
public static void test4(Jedis jedis) {
System.out.println("批量获取多个指定字段的值: hmget");
jedis.flushDB();
String key = "test_hash";
jedis.hset(key, "name", "John");
jedis.hset(key, "age", "25");
jedis.hset(key, "city", "Beijing");
jedis.hset(key, "country", "China");
List<String> values = jedis.hmget(key, "name", "city", "not_exist_field");
System.out.println("批量获取的字段值: " + values);
System.out.println("======");
}

1.5. 获取哈希长度
- hlen:获取哈希有多少个字段
java
public static void test5(Jedis jedis) {
System.out.println("获取哈希中字段的总数量: hlen");
jedis.flushDB();
String key = "test_hash";
jedis.hset(key, "name", "John");
jedis.hset(key, "age", "25");
jedis.hset(key, "city", "Beijing");
jedis.hset(key, "country", "China");
// 返回字段总数量
long len = jedis.hlen(key);
System.out.println("字段总数量: " + len);
System.out.println("======");
}

1.6. 字段数值自增 / 自减
- hincrby:整数增减
- hincrbyfloat:浮点数增减
java
public static void test6(Jedis jedis) {
System.out.println("数值类型的字段进行增减操作: hincrby / hincrbyfloat");
jedis.flushDB();
String key = "test_hash";
jedis.hset(key, "view_count", "100");
jedis.hset(key, "score", "85.5");
// 对整数值进行增减
long view_cnt = jedis.hincrBy(key, "view_count", 3);
System.out.println("view_count 新值为: " + view_cnt);
view_cnt = jedis.hincrBy(key, "view_count", -5);
System.out.println("view_count 新值为: " + view_cnt);
double new_score = jedis.hincrByFloat(key, "score", 2.3);
System.out.println("score 新值为: " + new_score);
System.out.println("======");
}

二、Set 类型核心操作
Redis 集合(Set)是无序、不可重复的字符串集合,基于 Jedis 客户端的集合操作方法名与 Redis 原生命令完全对应,核心包含8 个基础操作,覆盖增、查、删、统计、多集合运算场景。
2.1. 元素新增与全量查询
- sadd:向集合添加一个 / 多个元素,返回成功添加的元素数量
- smembers:获取集合内所有元素,返回 Set<String> 类型结果
java
public static void test1(Jedis jedis) {
System.out.println("元素新增与全量查询: sadd / smembers");
jedis.flushDB();
String key = "set:fruits";
// 向集合中添加一个或多个元素,并且集合中的元素不可重复
long addedCnt = jedis.sadd(key, "apple", "banana", "orange", "apple");
System.out.println("成功添加的元素个数: " + addedCnt);
// 获取集合中的所有元素
Set<String> members = jedis.smembers(key);
System.out.println("集合内的元素: " + members);
System.out.println("======");
}

2.2. 元素存在判断与删除
- sismember:校验指定元素是否在集合中,返回布尔值
- srem:删除集合中一个 / 多个元素,返回实际删除的元素个数
java
public static void test2(Jedis jedis) {
System.out.println("元素存在判断与删除: sismember / srem");
jedis.flushDB();
String key = "set:fruits";
jedis.sadd(key, "apple", "banana", "orange", "apple");
// 集合中是否存在指定元素
boolean hasApple = jedis.sismember(key, "apple");
boolean hasGrape = jedis.sismember(key, "grape");
System.out.println("集合中是否包含 apple: " + hasApple);
System.out.println("集合中是否包含 grape: " + hasGrape);
// 删除集合中一个或多个元素
long remCnt = jedis.srem(key, "banana", "grape");
System.out.println("成功删除的个数: " + remCnt);
System.out.println("======");
}

2.3. 集合元素统计
- scard:获取集合的元素总数量,返回长整型数值
java
public static void test3(Jedis jedis) {
System.out.println("集合元素统计: scard");
jedis.flushDB();
String key = "set:fruits";
jedis.sadd(key, "apple", "banana", "orange", "apple");
// 获取集合中的元素个数
long cnt = jedis.scard(key);
System.out.println("集合中的元素个数: " + cnt);
System.out.println("======");
}
2.4. 多集合逻辑运算
- sinter:计算多个集合的交集(共同存在的元素)
- sunion:计算多个集合的并集(所有去重后的元素)
- sdiff:计算多个集合的差集(第一个集合独有、其他集合没有的元素)
java
public static void test4(Jedis jedis) {
System.out.println("多集合逻辑运算: sinter, sunion, sdiff");
jedis.flushDB();
String setA = "team_a";
String setB = "team_b";
jedis.sadd(setA, "Alice", "Bob", "Charlie");
jedis.sadd(setB, "Bob", "David", "Eve");
System.out.println("Team A 成员: " + jedis.smembers(setA));
System.out.println("Team B 成员: " + jedis.smembers(setB));
// 交集
Set<String> inter = jedis.sinter(setA, setB);
System.out.println("共同成员: " + inter);
// 并集
Set<String> union = jedis.sunion(setA, setB);
System.out.println("所有成员: " + union);
// 差集
Set<String> diff = jedis.sdiff(setA, setB);
System.out.println("Team A 独有成员: " + diff);
System.out.println("======");
}

三、Zset 类型核心操作
3.1. 添加与范围查询
- zadd:为有序集合添加元素 + 分数键值对,分数决定元素排序规则。
- zrange:按下标闭区间获取元素;zrangeWithScores可同步获取元素与对应分数,返回Tuple(元素 + 分数)对象。
java
public static void test1(Jedis jedis) {
System.out.println("添加与范围查询: zadd / zrange");
jedis.flushDB();
String key = "zset:demo1";
// 添加元素与分数
jedis.zadd(key, 90.0, "Alice");
jedis.zadd(key, 85.5, "Bob");
jedis.zadd(key, 95.5, "Charlie");
// 按下标闭区间获取元素
List<String> elements = jedis.zrange(key, 0, -1);
System.out.println("获取的元素: " + elements);
// 同步获取元素与对应分数
List<Tuple> elementsWithScore = jedis.zrangeWithScores(key, 0, -1);
System.out.println("zrangeWithScores 结果:");
for (Tuple tuple : elementsWithScore) {
System.out.println(" 元素" + tuple.getElement() + ", 分数: " + tuple.getScore());
}
System.out.println("======");
}

3.2. 删除与元素计数
- zrem:删除集合中指定的一个 / 多个元素,返回实际删除的元素数量。
- zcard:获取有序集合的总元素个数。
java
public static void test2(Jedis jedis) {
System.out.println("删除与元素计数: zrem / zcard");
jedis.flushDB();
String key = "zset:demo2";
jedis.zadd(key, 10, "Java");
jedis.zadd(key, 20, "Python");
jedis.zadd(key, 30, "Go");
jedis.zadd(key, 40, "Rust");
long remCnt = jedis.zrem(key, "Python", "Go");
System.out.println("实际删除的元素数量: " + remCnt);
// 获取所有元素个数
long totalCnt = jedis.zcard(key);
System.out.println("剩余元素个数: " + totalCnt);
System.out.println("======");
}

3.3. 分数区间统计
- zcount:统计分数闭区间内的元素数量。
java
public static void test3(Jedis jedis) {
System.out.println("分数区间统计: zcount");
jedis.flushDB();
String key = "zset:demo3";
jedis.zadd(key, 100, "PlayerA");
jedis.zadd(key, 250, "PlayerB");
jedis.zadd(key, 300, "PlayerC");
jedis.zadd(key, 500, "PlayerD");
// 统计分数在 200 到 400 之间
long count = jedis.zcount(key, 200, 400);
System.out.println("分数在 200-400 闭区间内的元素数量: " + count);
System.out.println("======");
}

3.4. 弹出最值元素
- zpopmax:弹出集合中分数最高的元素,返回Tuple对象。
- zpopmin:弹出集合中分数最低的元素,返回Tuple对象。
java
public static void test4(Jedis jedis) {
System.out.println("弹出最值元素: zpopmax / zpopmin");
jedis.flushDB();
String key = "zset:demo4";
jedis.del(key);
jedis.zadd(key, 15, "Task1");
jedis.zadd(key, 5, "Task2"); // 分数最低
jedis.zadd(key, 80, "Task3"); // 分数最高
jedis.zadd(key, 50, "Task4");
// 弹出分数最高的元素
Tuple maxTuple = jedis.zpopmax(key);
System.out.println("弹出的最高分元素: " + maxTuple.getElement() + ", 分数: " + maxTuple.getScore());
// 弹出分数最低的元素
Tuple minTuple = jedis.zpopmin(key);
System.out.println("弹出的最低分元素: " + minTuple.getElement() + ", 分数: " + minTuple.getScore());
System.out.println("======");
}

3.5. 排名查询
- zrank:查询元素正序(分数升序) 的下标。
- zrevrank:查询元素逆序(分数降序) 的下标。
java
public static void test5(Jedis jedis) {
System.out.println("排名查询: zrank / zrevrank");
jedis.flushDB();
String key = "zset:demo5";
jedis.zadd(key, 100, "UserA");
jedis.zadd(key, 200, "UserB");
jedis.zadd(key, 300, "UserC");
// 升序
Long rankAsc = jedis.zrank(key, "UserA");
System.out.println("UserA 的升序排名: " + rankAsc);
// 逆序
Long rankDesc = jedis.zrevrank(key, "UsrA");
System.out.println("UserA 的降序排名: " + rankDesc);
System.out.println("======");
}

3.6. 分数操作
- zscore:查询指定元素对应的分数值。
- zincrby:为指定元素增减分数,支持传入正负数值。
java
public static void test6(Jedis jedis) {
System.out.println("分数操作: zscore / zincrby");
jedis.flushDB();
String key = "zset:demo6";
jedis.zadd(key, 50.0, "Item1");
// 查询元素对应的分数
Double score = jedis.zscore(key, "Item1");
System.out.println("Item1 的当前分数: " + score);
// 增加分数
double addScore = jedis.zincrby(key, 20.5, "Item1");
System.out.println("增加后的分数: " + addScore);
double minusScore = jedis.zincrby(key, -10.0, "Item1");
System.out.println("减少后的分数: " + minusScore);
System.out.println("======");
}
