Compare commits

...

3 Commits

Author SHA1 Message Date
JACKYMYPERSON
0fbfe30af7 学习JDK动态代理 2026-03-12 10:04:13 +08:00
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
5 changed files with 49 additions and 93 deletions

View File

@@ -28,5 +28,10 @@
<artifactId>jedis</artifactId>
<version>4.4.6</version> <!-- 推荐使用稳定版 -->
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>provided</scope>
</dependency>
</dependencies>
</project>

View File

@@ -1,5 +1,11 @@
package cn.mayiming;
import cn.mayiming.Properties.UserProperties;
import cn.mayiming.Serivce.UserSerivce;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ApplicationContext;
import redis.clients.jedis.Jedis;
import java.net.URI;
@@ -7,9 +13,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;
@@ -18,99 +22,14 @@ import java.util.concurrent.TimeUnit;
* Hello world!
*
*/
@SpringBootApplication
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 连接已关闭");
}
}
ApplicationContext context = SpringApplication.run(App.class, args);
UserSerivce userSerivce = context.getBean(UserSerivce.class);
System.out.println("UserSerivce 对象:" + userSerivce);
userSerivce.getUser(); // 输出mayiming
}
}

View File

@@ -0,0 +1,14 @@
package cn.mayiming.Properties;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.stereotype.Component;
@ConfigurationProperties(prefix = "user")
@Component
@Data
public class UserProperties {
private String name;
}

View File

@@ -0,0 +1,16 @@
package cn.mayiming.Serivce;
import cn.mayiming.Properties.UserProperties;
import org.apache.catalina.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class UserSerivce {
@Autowired
UserProperties userProperties;
public void getUser() {
System.out.println(userProperties.getName());
}
}

View File

@@ -0,0 +1,2 @@
user:
name: mayiming