文章目录
- Redis高级功能使用说明
-
- 功能清单
- [1. 分布式锁](#1. 分布式锁)
-
- [1.1 功能描述](#1.1 功能描述)
- [1.2 使用方法](#1.2 使用方法)
- [1.3 测试接口](#1.3 测试接口)
- [2. 消息发布订阅](#2. 消息发布订阅)
- [3. 接口限流](#3. 接口限流)
-
- [3.1 功能描述](#3.1 功能描述)
- [3.2 使用方法](#3.2 使用方法)
- [3.3 测试接口](#3.3 测试接口)
- [4. 排行榜实现](#4. 排行榜实现)
-
- [4.1 功能描述](#4.1 功能描述)
- [4.2 使用方法](#4.2 使用方法)
- [4.3 测试接口](#4.3 测试接口)
- [5. 用户行为分析](#5. 用户行为分析)
-
- [5.1 功能描述](#5.1 功能描述)
- [5.2 使用方法](#5.2 使用方法)
- [5.3 测试接口](#5.3 测试接口)
- [6. 注意事项](#6. 注意事项)
- [7. 性能优化建议](#7. 性能优化建议)
Redis高级功能使用说明
本文档介绍了系统中集成的Redis高级功能及其使用方法。
功能清单
- 分布式锁
- 消息发布订阅
- 接口限流
- 排行榜实现
- 多维度用户行为分析
1. 分布式锁
1.1 功能描述
分布式锁用于在分布式环境中对共享资源进行同步访问控制,防止多个服务实例同时操作同一资源导致的数据不一致问题。
1.2 使用方法
java
@Autowired
private RedisLockUtil lockUtil;
public void doBusinessWithLock() {
String lockKey = "业务唯一标识";
String requestId = UUID.randomUUID().toString(); // 请求唯一标识
boolean locked = lockUtil.tryLock(lockKey, requestId, 30); // 尝试获取锁,30秒超时
if (locked) {
try {
// 执行需要加锁的业务逻辑
doSomething();
} finally {
// 释放锁
lockUtil.releaseLock(lockKey, requestId);
}
} else {
// 获取锁失败的处理逻辑
}
}
1.3 测试接口
- GET
/redis/lock/test
- 测试分布式锁功能
2. 消息发布订阅
2.1 功能描述
消息发布订阅用于实现应用内的事件通知和组件间通信,支持一对多的消息推送。
2.2 使用方法
发布消息
java
@Autowired
private RedisPubSubUtil pubSubUtil;
// 发布消息
pubSubUtil.publish("channel:name", "消息内容");
订阅消息
系统默认订阅了"user:actions"频道,订阅逻辑在UserActionSubscriber
类中实现。
如需订阅新的频道,需要修改RedisPubSubConfig
配置类:
java
@Bean
public RedisMessageListenerContainer container(RedisConnectionFactory connectionFactory,
MessageListenerAdapter myListenerAdapter) {
RedisMessageListenerContainer container = new RedisMessageListenerContainer();
container.setConnectionFactory(connectionFactory);
// 添加新的订阅
container.addMessageListener(myListenerAdapter, new PatternTopic("my:channel"));
return container;
}
2.3 测试接口
- POST
/redis/publish?channel=user:actions&message=test
- 发布测试消息
3. 接口限流
3.1 功能描述
接口限流用于防止API被恶意频繁调用或突发流量冲击,保护系统稳定性。
3.2 使用方法
方式一:直接使用工具类
java
@Autowired
private RedisRateLimiter rateLimiter;
public void doSomething() {
String key = "限流标识"; // 可以是接口名、用户ID等
boolean allowed = rateLimiter.isAllowed(key, 60, 100); // 60秒内最多允许100次请求
if (allowed) {
// 正常处理业务
} else {
// 触发限流,拒绝请求
throw new RuntimeException("请求过于频繁");
}
}
方式二:使用注解(推荐)
java
@RestController
public class MyController {
@RateLimit(period = 60, count = 100, limitType = LimitType.IP)
@GetMapping("/api/test")
public Result test() {
// 业务逻辑
return Result.success();
}
}
支持的限流类型:
- IP:根据客户端IP限流
- USER:根据用户ID限流(暂未实现用户识别)
- INTERFACE:根据接口限流
3.3 测试接口
- GET
/redis/ratelimit/test?key=testKey
- 测试限流功能
4. 排行榜实现
4.1 功能描述
基于Redis的Sorted Set实现各种排行榜功能,如热门用户、热门商品等。
4.2 使用方法
java
@Autowired
private RedisRankingUtil rankingUtil;
// 添加或更新分数
rankingUtil.addScore("ranking:hot:products", productId, score);
// 增加分数
rankingUtil.incrementScore("ranking:hot:products", productId, incrementScore);
// 获取排行榜前N名
List<Map<String, Object>> topN = rankingUtil.getTopN("ranking:hot:products", 10);
// 获取指定成员排名
Long rank = rankingUtil.getRank("ranking:hot:products", productId);
// 获取指定成员分数
Double score = rankingUtil.getScore("ranking:hot:products", productId);
4.3 测试接口
- GET
/redis/ranking/test
- 测试排行榜功能
5. 用户行为分析
5.1 功能描述
记录和分析用户行为数据,如页面访问、点赞、评论等,实现用户热度统计和行为分析。
5.2 使用方法
java
@Autowired
private UserBehaviorAnalysisUtil behaviorUtil;
// 记录用户被查看
behaviorUtil.recordUserView(userId, viewerId);
// 记录用户行为
behaviorUtil.recordUserAction("like", targetId, userId);
// 获取用户热度
long dailyHeat = behaviorUtil.getUserDailyHeat(userId);
long monthlyHeat = behaviorUtil.getUserMonthlyHeat(userId);
// 获取热门用户排行
List<Map<String, Object>> hotUsers = behaviorUtil.getHotUsersRanking(10);
// 获取行为统计
Map<String, Long> stats = behaviorUtil.getDailyActionStats();
5.3 测试接口
- GET
/redis/behavior/view/{userId}?viewerId=1
- 记录用户被查看并返回热度数据 - GET
/redis/behavior/stats
- 获取行为统计数据
6. 注意事项
- Redis连接配置在application.yml中设置
- 大规模数据存储时注意设置合理的过期时间,避免内存占用过大
- 分布式锁使用时确保加锁和解锁操作都能正确执行,建议使用try-finally结构
- 限流策略需根据业务特点和系统承载能力合理设置
7. 性能优化建议
- 使用Redis连接池,合理配置最大连接数
- 批量操作使用Pipeline提高性能
- 使用合适的数据结构,避免不必要的数据转换
- 定期清理过期数据,减轻Redis服务器负担
- 对于高频访问的数据,考虑使用本地缓存进一步提升性能