Redis:不只是缓存那么简单(十一)

专栏: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("======");
}
相关推荐
C雨后彩虹1 小时前
SpringBoot整合Redis String,全套原生API讲解,覆盖80%缓存业务场景
java·数据结构·spring boot·redis·string
Web极客码1 小时前
Python Deque:构建实时滑动窗口与高性能缓存的“隐藏高手”
java·python·缓存
June`2 小时前
多线程redis项目基石
数据库·redis·缓存
Devin~Y2 小时前
电商AIGC智能客服面试:JVM调优、Spring Cloud微服务、Redis缓存、Kafka消息、K8s观测与RAG落地
java·jvm·spring boot·redis·spring cloud·kafka·kubernetes
最后一支迷迭香13 小时前
Redis+ThreadLocal实现防重复提交,参考美团GTIS防重系统
redis·threadlocal·防止重复提交
高翔·权衡之境16 小时前
主题4:差错控制——噪声中如何保真?
驱动开发·安全·缓存·系统安全·信息与通信
我叫Double16 小时前
简易版的EINO基于redis库的向量搜索项目v2
数据库·redis·bootstrap
techdashen18 小时前
dial9:给 Tokio 装上“飞行记录仪“
java·数据库·redis
环流_20 小时前
Redis过期策略
数据库·redis·缓存