Initial commit: web_hghl_server
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,226 @@
|
||||
package redisconst
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"strings"
|
||||
"time"
|
||||
"videoweb/pub/pubdef"
|
||||
)
|
||||
|
||||
const (
|
||||
visitLogFmt = "bd_visitlog:%s:%d"
|
||||
FiveMVisit = "bd_visitFmt:%s"
|
||||
BloomUser = "bd_bloom_user:%d"
|
||||
AppUserToken = "bd_app_user_token:%d"
|
||||
captchaKey = "bd_captcha_mobile_%s"
|
||||
CaptchaExpire = 5 * time.Minute
|
||||
replayNonceKey = "bd_replay:nonce:_%s"
|
||||
mediaM3U8Fmt = "m3u8cache:%s"
|
||||
MediaM3U8CacheExpire = time.Hour * 24 * 7
|
||||
|
||||
//禁止登陆设置
|
||||
userForbit = "userForbit:%d"
|
||||
ipForbit = "ipForbit:%s"
|
||||
|
||||
//每分钟Ip注册次数
|
||||
registerLimist = "registerLimit:%s"
|
||||
RegisterLimistExpire = time.Minute * 30
|
||||
|
||||
//用户关注限制
|
||||
careLimitKey = "carelimit:%d"
|
||||
CareLimitKeyExpire = 15 * time.Second
|
||||
|
||||
//用户评论限制
|
||||
commentLimitKey = "commentlimit:%s"
|
||||
CommentLimitKeyExpire = 5 * time.Second
|
||||
CommentDayLimitKeyExpire = 10 * time.Hour
|
||||
|
||||
ContactUsLimitKey = "contactuslimit:%s"
|
||||
ContactusLimitKeyExpire = 1 * time.Minute
|
||||
ContactusLimitKeyDayExpire = 10
|
||||
//每用户访问次数限制
|
||||
userCallLimit = "userCall:%d"
|
||||
ipCallLimit = "ipCall:%s"
|
||||
CallLimitExpire = time.Second * 10
|
||||
|
||||
userSidKey = "userSid:%d"
|
||||
UserSidKeyExpire = time.Minute * 30
|
||||
|
||||
// 评论缓存key和过期时间
|
||||
CommentListKey = "commentList_%d_%d"
|
||||
CommentListKeyExpire = time.Minute * 5
|
||||
|
||||
// 视频收藏列表分页缓存key、版本key和过期时间
|
||||
FavoriteListVersionKeyExpire = time.Hour * 24
|
||||
|
||||
FavoriteVideoListKey = "favoriteVideoList:v%d:%d:%d:%d"
|
||||
FavoriteVideoListVersionKey = "favoriteVideoListVersion:%d"
|
||||
FavoriteVideoListKeyExpire = time.Minute * 30
|
||||
|
||||
// 问卷提交频率限制(同一 IP / 用户每分钟只能提交一次)
|
||||
questionnaireLimitIp = "questionnaireLimit:ip:%s"
|
||||
questionnaireLimitUser = "questionnaireLimit:user:%d"
|
||||
QuestionnaireLimitExpire = time.Minute
|
||||
|
||||
// m3u8 / enkey 防盗链
|
||||
// IP 自然日正片去重计数(key 含日期,次日自动换桶)
|
||||
m3u8DayRateLimitIp = "m3u8dayrate:ip:%s:%s" // %s=ip, %s=日期 20060102
|
||||
m3u8DailyMediaIpFmt = "m3u8:daily:media:ip:%s:%d:%s" // ip, mediaId, 日期
|
||||
M3U8DayRateLimitMax = int64(80) // 每 IP 每天最多 80 个不同正片(sys_cfg 未配置时的默认值)
|
||||
// enkey 一次性票据:/h5/m3u8 鉴权通过后写入,/enkey 消费后删除
|
||||
enkeyTicketKey = "enkey:ticket:%s" // %s = token 前16位
|
||||
EnkeyTicketExpire = 15 * time.Minute
|
||||
|
||||
// 访问IP去重统计:每个 appId 每天一个 SET
|
||||
ipStatKey = "ipstat:%d:%s" // %d=appId, %s=日期 "20060102"
|
||||
IpStatExpire = 49 * time.Hour // 保留49小时,确保昨日数据在今天仍可读
|
||||
)
|
||||
|
||||
func BloomUserKey(userId int64) string {
|
||||
return fmt.Sprintf(BloomUser, userId)
|
||||
}
|
||||
|
||||
func FiveMVisitKey(time string) string {
|
||||
return fmt.Sprintf(FiveMVisit, time)
|
||||
}
|
||||
|
||||
func UserVisitLogKey(uid int64, t time.Time) string {
|
||||
return fmt.Sprintf(visitLogFmt, t.Format("20060102"), uid)
|
||||
}
|
||||
|
||||
func MobileCaptchaKey(mobile string) string {
|
||||
return fmt.Sprintf(captchaKey, mobile)
|
||||
}
|
||||
|
||||
func AppUserTokenKey(userId int64) string {
|
||||
return fmt.Sprintf(AppUserToken, userId)
|
||||
}
|
||||
|
||||
// AppPlayletHomeCacheVersionKey 用于后台变更后切换短剧首页缓存版本。
|
||||
func AppPlayletHomeCacheVersionKey() string {
|
||||
return fmt.Sprintf("app:playlet:home:version:%d", pubdef.AppId)
|
||||
}
|
||||
|
||||
// AppPlayletRankCacheVersionKey 用于短剧删除后刷新榜单缓存
|
||||
func AppPlayletRankCacheVersionKey() string {
|
||||
return fmt.Sprintf("app:playlet:rank:version:%d", pubdef.AppId)
|
||||
}
|
||||
|
||||
func MediaM3U8Key(name string) string {
|
||||
return fmt.Sprintf(mediaM3U8Fmt, name)
|
||||
}
|
||||
func UserForbitKey(userId int64) string {
|
||||
return fmt.Sprintf(userForbit, userId)
|
||||
}
|
||||
|
||||
func RegisterLimitKey(ip string) string {
|
||||
ip = strings.ReplaceAll(ip, ":", "-")
|
||||
return fmt.Sprintf(registerLimist, ip)
|
||||
}
|
||||
|
||||
func CareLimitKey(userId int64) string {
|
||||
return fmt.Sprintf(careLimitKey, userId)
|
||||
}
|
||||
func ReplayNonceKey(nonce string) string {
|
||||
return fmt.Sprintf(replayNonceKey, nonce)
|
||||
}
|
||||
|
||||
func CommentLimitKey(ip string) string {
|
||||
return fmt.Sprintf(commentLimitKey, ip)
|
||||
}
|
||||
func CommentOneDayLimitKey(ip string) string {
|
||||
return fmt.Sprintf("commentdaylimit:%s", ip)
|
||||
}
|
||||
|
||||
func UserCallLimitKey(userId int64) string {
|
||||
return fmt.Sprintf(userCallLimit, userId)
|
||||
}
|
||||
|
||||
func IpCallLimitKey(ip string) string {
|
||||
return fmt.Sprintf(ipCallLimit, ip)
|
||||
}
|
||||
|
||||
func IpForbitKey(ip string) string {
|
||||
ip = strings.ReplaceAll(ip, ":", "-")
|
||||
return fmt.Sprintf(ipForbit, ip)
|
||||
}
|
||||
|
||||
func UserSidKey(userId int64) string {
|
||||
return fmt.Sprintf(userSidKey, userId)
|
||||
}
|
||||
|
||||
// CommentListCacheKey 返回评论列表缓存key
|
||||
func CommentListCacheKey(objectId int64, objectType pubdef.CommentObjectType) string {
|
||||
return fmt.Sprintf(CommentListKey, objectId, objectType)
|
||||
}
|
||||
|
||||
func FavoriteVideoListCacheKey(userId, version, pageNum, pageSize int64) string {
|
||||
return fmt.Sprintf(FavoriteVideoListKey, version, userId, pageNum, pageSize)
|
||||
}
|
||||
|
||||
func FavoriteVideoListVersionCacheKey(userId int64) string {
|
||||
return fmt.Sprintf(FavoriteVideoListVersionKey, userId)
|
||||
}
|
||||
|
||||
func QuestionnaireLimitIpKey(ip string) string {
|
||||
ip = strings.ReplaceAll(ip, ":", "-")
|
||||
return fmt.Sprintf(questionnaireLimitIp, ip)
|
||||
}
|
||||
|
||||
func QuestionnaireLimitUserKey(userId int64) string {
|
||||
return fmt.Sprintf(questionnaireLimitUser, userId)
|
||||
}
|
||||
|
||||
// M3U8DayRateLimitIpKey 按自然日(Asia/Shanghai)生成 IP 日限流 key
|
||||
func M3U8DayRateLimitIpKey(ip string) string {
|
||||
ip = normalizeM3U8Ip(ip)
|
||||
loc, err := time.LoadLocation("Asia/Shanghai")
|
||||
if err != nil {
|
||||
loc = time.Local
|
||||
}
|
||||
day := time.Now().In(loc).Format("20060102")
|
||||
return fmt.Sprintf(m3u8DayRateLimitIp, ip, day)
|
||||
}
|
||||
|
||||
// M3U8DayRateLimitExpire 返回距下一个自然日 0 点的时长,用于 key TTL
|
||||
func M3U8DayRateLimitExpire() time.Duration {
|
||||
loc, err := time.LoadLocation("Asia/Shanghai")
|
||||
if err != nil {
|
||||
loc = time.Local
|
||||
}
|
||||
now := time.Now().In(loc)
|
||||
next := time.Date(now.Year(), now.Month(), now.Day()+1, 0, 0, 0, 0, loc)
|
||||
d := next.Sub(now)
|
||||
if d < time.Minute {
|
||||
return time.Minute
|
||||
}
|
||||
return d
|
||||
}
|
||||
|
||||
// EnkeyTicketKey token 的前 16 个字符作为 key,避免存完整 token 太长
|
||||
func EnkeyTicketKey(token string) string {
|
||||
if len(token) > 16 {
|
||||
token = token[:16]
|
||||
}
|
||||
return fmt.Sprintf(enkeyTicketKey, token)
|
||||
}
|
||||
|
||||
func normalizeM3U8Ip(ip string) string {
|
||||
return strings.ReplaceAll(ip, ":", "-")
|
||||
}
|
||||
|
||||
// M3U8DailyMediaIpKey 同一 IP 同一正片当天只计一次
|
||||
func M3U8DailyMediaIpKey(ip string, mediaId int64) string {
|
||||
loc, err := time.LoadLocation("Asia/Shanghai")
|
||||
if err != nil {
|
||||
loc = time.Local
|
||||
}
|
||||
day := time.Now().In(loc).Format("20060102")
|
||||
return fmt.Sprintf(m3u8DailyMediaIpFmt, normalizeM3U8Ip(ip), mediaId, day)
|
||||
}
|
||||
|
||||
// IpStatKey 返回指定 appId 在某天的访问IP集合 key
|
||||
// date 格式: "20060102"
|
||||
func IpStatKey(appId int64, date string) string {
|
||||
return fmt.Sprintf(ipStatKey, appId, date)
|
||||
}
|
||||
Reference in New Issue
Block a user