前言
直播间贡献榜是一种常见的直播平台功能,用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名,并实时更新,以鼓励观众积极参与直播活动。
在直播间贡献榜中,每个观众都有一个对应的贡献值,贡献值用来衡量观众在直播过程中的贡献程度。观众的贡献值可以通过多种途径获得,比如送礼物、打赏主播等。
首先,我们需要创建一个贡献榜单,可以使用Redis的有序集合 (Sorted Set)结构来实现。在有序集合中,每个观众对应一个唯一的ID作为成员,而成员的分数表示观众的贡献值。可以根据观众每次送出礼物增加相应的贡献值。
当有新的观众参与直播并进行互动时,我们可以使用ZADD命令将其用户ID添加到贡献榜单中,并更新相应的贡献值。可以根据贡献值对观众进行排序,从而得到当前排名靠前的观众。
要实时更新贡献榜单,可以使用ZINCRBY命令增加观众的贡献值。当观众进行互动行为时,我们可以调用ZINCRBY命令增加相应观众的贡献值,并确保贡献榜单及时反映观众的最新贡献情况。
Redis实现命令
用户ID为Test1000的得到价值为1314的礼物时,以及获取排行榜时,命令如下。比如
# 增加排行榜用户数据
ZINCRBY ROUND_LIST_CACHE_20221222 1314 Test1000
# 展示用户榜单
ZRANGE ROUND_LIST_CACHE_20221222 0 -1 WITHSCORES
JAVA简单逻辑代码实现
1.Spring boot的yml配置文件,配置礼物队列
#yml配置文件配置队列
GiftFlowOutput:
content-type: application/json
destination: gift_all_flow
GiftFlowInput: #礼物队列
content-type: application/json
group: GiftAllFlowGroup
2.redis使用lua脚本增加榜单,保证多机并发原子性
//redis lua脚本配置
@Slf4j
@Configuration
public class RedisConfig {
@Autowired
private JdkCacheHandler jdkCacheHandler;
@Bean("zsetScoreScript")
public RedisScript<Long> zsetScoreScript() {
DefaultRedisScript<Long> redisScript = new DefaultRedisScript<>();
redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource("/lua/zadd.lua")));
redisScript.setResultType(Long.class);
return redisScript;
}
}
3。LUA脚本具体实现,保留3位有效礼物小数位,后面小数位用于同个时间刷礼物进行排序,目前这里只精确到了秒
local key=KEYS[1]
local member=KEYS[2]
local newValue=tonumber(string.format("%.16f",ARGV[1]))
local oldValue=redis.call('ZSCORE',key,member)
if type(oldValue) == 'boolean' then
redis.call(