Compare commits

..

2 Commits

Author SHA1 Message Date
JACKYMYPERSON
056f2eca65 Merge remote-tracking branch 'origin/main' 2026-03-09 16:36:00 +08:00
JACKYMYPERSON
c2b42476bc 学习迭代器 2026-03-09 16:35:54 +08:00

View File

@@ -7,9 +7,7 @@ import java.net.http.HttpClient;
import java.net.http.HttpRequest;
import java.net.http.HttpResponse;
import java.time.Duration;
import java.util.HashMap;
import java.util.List;
import java.util.Set;
import java.util.*;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
@@ -22,95 +20,13 @@ public class App
{
public static void main(String[] args) {
Jedis jedis = null;
try {
// 建立 Redis 连接
jedis = new Jedis("localhost", 6379);
// 可选Redis 密码认证
// jedis.auth("你的Redis密码");
// ==================== ZSet 结构核心操作 ====================
// ZSet 特点有序、元素唯一member 不重复、每个元素关联一个分数score按score排序
// 场景1商品销量排行榜按销量从高到低排序
String salesRankKey = "rank:product:sales"; // 商品销量排行榜
// 方式1添加元素member=商品IDscore=销量重复添加会更新score
jedis.zadd(salesRankKey, 500, "product1001"); // 商品1001销量500
jedis.zadd(salesRankKey, 800, "product1002"); // 商品1002销量800
jedis.zadd(salesRankKey, 1200, "product1003");// 商品1003销量1200
jedis.zadd(salesRankKey, 800, "product1002");// 重复添加仅更新score这里score不变
System.out.println("商品销量排行榜初始化完成");
// 方式2按score升序/降序查询(核心!排行榜核心操作)
// zrange升序查询0=第1名-1=最后1名WITHSCORES 显示分数
Set<String> ascRank = (Set<String>) jedis.zrange(salesRankKey, 0, -1);
System.out.println("\n销量升序排行榜商品ID:销量):" + ascRank);
// zrevrange降序查询最常用排行榜从高到低
Set<String> descRank = (Set<String>) jedis.zrevrange(salesRankKey, 0, -1);
System.out.println("销量降序排行榜商品ID:销量):" + descRank);
// 方式3查询指定元素的分数查看单个商品销量
Double sales1002 = jedis.zscore(salesRankKey, "product1002");
System.out.println("商品1002的销量" + sales1002);
// 方式4更新元素分数销量增加比如商品1001新增200单
jedis.zincrby(salesRankKey, 200, "product1001"); // score += 200
System.out.println("商品1001销量+200后" + jedis.zscore(salesRankKey, "product1001"));
// 方式5查询元素排名降序从0开始计数
Long rank1003 = jedis.zrevrank(salesRankKey, "product1003");
System.out.println("商品1003的销量排名第1名=0" + (rank1003 + 1) + "");
// 方式6按分数范围查询比如销量≥800的商品
Set<String> highSales = (Set<String>) jedis.zrangeByScore(salesRankKey, 800, Double.MAX_VALUE);
System.out.println("销量≥800的商品" + highSales);
// ==================== 场景2延迟队列按时间戳排序 ====================
String delayQueueKey = "queue:delay:order"; // 订单延迟队列
// 核心逻辑score=执行时间戳比如10秒后执行、30秒后执行
long now = System.currentTimeMillis() / 1000; // 当前时间戳(秒)
jedis.zadd(delayQueueKey, now + 10, "订单100110秒后自动取消"); // 10秒后处理
jedis.zadd(delayQueueKey, now + 30, "订单100230秒后自动确认收货"); // 30秒后处理
System.out.println("\n延迟队列初始化完成当前时间戳" + now);
// 方式7获取需要执行的任务score ≤ 当前时间戳的元素)
Set<String> needExecute = (Set<String>) jedis.zrangeByScore(delayQueueKey, 0, now, 0, 10); // 取前10个待执行任务
System.out.println("当前需要执行的延迟任务(无):" + needExecute);
// 模拟10秒后仅演示逻辑实际需定时轮询
long after10s = now + 10;
needExecute = (Set<String>) jedis.zrangeByScore(delayQueueKey, 0, after10s, 0, 10);
System.out.println("10秒后需要执行的延迟任务" + needExecute);
// 执行任务后删除(避免重复执行)
for (String task : needExecute) {
jedis.zrem(delayQueueKey, task);
System.out.println("执行并删除延迟任务:" + task);
}
// ==================== 场景3带权重的用户推荐按权重排序 ====================
String recommendKey = "recommend:user:1001"; // 给用户1001的推荐列表
// score=推荐权重(越高越优先)
jedis.zadd(recommendKey, 95, "商品A高转化");
jedis.zadd(recommendKey, 80, "商品B高浏览");
jedis.zadd(recommendKey, 60, "商品C相关推荐");
System.out.println("\n用户1001的推荐列表按权重降序");
// 取TOP2推荐商品
Set<String> top2Recommend = (Set<String>) jedis.zrevrange(recommendKey, 0, 1);
System.out.println("TOP2推荐" + top2Recommend);
} catch (Exception e) {
e.printStackTrace();
} finally {
// 关闭连接
if (jedis != null) {
jedis.close();
System.out.println("\nRedis 连接已关闭");
}
ArrayList<String> fruitList = new ArrayList<>();
fruitList.add("苹果");
fruitList.add("香蕉");
fruitList.add("橙子");
Iterator<String> iterator = fruitList.iterator();
while (iterator.hasNext()) {
System.out.println(iterator.next());
}
}
}