本案例分享介绍的是 “东莞梦幻网络科技”体育直播系统的积分流水与风控策略设计,并附上核心实现思路和部分示例代码(基于 ThinkPHP + MySQL + Redis + WebSocket 等技术栈)。从三个层面讲:防刷、防伪、限频。
一、设计目标
-
积分流水透明可追溯
- 每笔积分变动都有记录,包括来源、用途、时间、设备、IP 等。
-
防刷策略
- 防止用户通过刷接口、重复任务、外挂程序获取积分。
-
限频控制
- 对日任务、签到、分享、趣猜等操作设置频率限制。
-
防伪与设备识别
- 通过设备指纹、IP、账号行为分析,检测异常积分行为。
二、防刷策略
1. 接口频率控制
- 对敏感接口(签到、分享、趣猜)进行 接口请求限流。
- 可使用 Redis 计数器和过期时间实现:
// 每日签到积分限额示例
function canAddPoints($userId, $taskType) {
$redisKey = "points:{$userId}:{$taskType}:" . date('Ymd');
$maxDaily = 1; // 每日签到1次积分
$current = \think\facade\Cache::get($redisKey) ?? 0;
if ($current >= $maxDaily) {
return false;
}
return true;
}
function addPoints($userId, $taskType, $points) {
if (!canAddPoints($userId, $taskType)) {
return false;
}
// 写入积分流水
Db::name('points_log')->insert([
'user_id' => $userId,
'task_type' => $taskType,
'points' => $points,
'ip' => request()->ip(),
'device' => request()->header('User-Agent'),
'created_at' => time(),
]);
// 更新Redis计数
$redisKey = "points:{$userId}:{$taskType}:" . date('Ymd');
\think\facade\Cache::inc($redisKey, 1, 86400); // 设置过期1天
return true;
}
2. 设备与IP识别
-
防止同一用户在多设备、多账号刷积分:
- 设备指纹:浏览器指纹、设备ID、MAC 地址(App 端)
- IP 黑名单:短时间内同 IP 大量请求限制
function isDeviceNormal($userId) {
$device = request()->header('User-Agent');
$ip = request()->ip();
// 检测设备同日重复行为
$cacheKey = "device_check:{$device}:" . date('Ymd');
$count = \think\facade\Cache::get($cacheKey) ?? 0;
if ($count > 5) return false;
\think\facade\Cache::inc($cacheKey, 1, 86400);
return true;
}
3. 行为分析防刷
- 短时间完成不合理数量的任务 → 标记为风险
- 异常积分操作 → 暂停账号或人工复审
function riskCheck($userId, $taskType) {
$logs = Db::name('points_log')
->where('user_id', $userId)
->where('task_type', $taskType)
->where('created_at', '>=', strtotime('-1 hour'))
->count();
if ($logs > 10) { // 1小时超过10次任务积分异常
Db::name('user')->where('id', $userId)->update(['status' => 2]); // 账号冻结
return false;
}
return true;
}
三、积分流水与溯源
- 数据库设计
CREATE TABLE `points_log` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint unsigned NOT NULL,
`task_type` varchar(50) NOT NULL,
`points` int NOT NULL,
`ip` varchar(50),
`device` varchar(255),
`remark` varchar(255),
`created_at` int NOT NULL,
PRIMARY KEY (`id`),
INDEX(`user_id`),
INDEX(`task_type`),
INDEX(`created_at`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-
特点
- 每笔积分都可追溯来源、设备、IP、时间
- 结合 Redis 限流防刷
四、限频设计
类型 | 限制策略 |
---|---|
每日签到 | 每天 1 次 |
分享任务 | 每小时 1 次 |
趣猜比分 | 每场比赛 1 次 |
充值返积分 | 单日上限 500 |
- 可使用 Redis 哈希表 + 过期时间实现日限额
- 结合 消息队列 异步更新积分,减少并发风险
// Redis 哈希记录每日积分上限
$redisKey = "daily_points_limit:{$userId}:" . date('Ymd');
$current = \think\facade\Cache::hGet($redisKey, $taskType) ?? 0;
$limit = 100;
if ($current + $points > $limit) {
return false; // 超过日限额
}
\think\facade\Cache::hSet($redisKey, $taskType, $current + $points);
五、总结思路
-
防刷
- 接口频率限制、设备指纹、IP 检测、行为分析
-
防伪
- 积分流水可追溯、消息队列异步写日志、异常标记
-
限频
- 日限额、每小时次数限制、比赛/任务限制
-
积分系统核心
- MySQL 存储历史流水,Redis 做实时频率统计
- 结合 WebSocket 或消息队列异步推送积分更新
點擊查看更多內(nèi)容
為 TA 點贊
評論
評論
共同學(xué)習(xí),寫下你的評論
評論加載中...
作者其他優(yōu)質(zhì)文章
正在加載中
感謝您的支持,我會繼續(xù)努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進(jìn)行掃碼打賞哦