当前位置: 首页 > news >正文

网站建设教程赚找湖南岚鸿认 可沈阳网站建设方案托管

网站建设教程赚找湖南岚鸿认 可,沈阳网站建设方案托管,南宁公司注册,购物商城模板前言 直播间贡献榜是一种常见的直播平台功能#xff0c;用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名#xff0c;并实时更新#xff0c;以鼓励观众积极参与直播活动。 在直播间贡献榜中#xff0c;每个观众都有一个对应的贡献值#… 前言 直播间贡献榜是一种常见的直播平台功能用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名并实时更新以鼓励观众积极参与直播活动。 在直播间贡献榜中每个观众都有一个对应的贡献值贡献值用来衡量观众在直播过程中的贡献程度。观众的贡献值可以通过多种途径获得比如送礼物、打赏主播等。 首先我们需要创建一个贡献榜单可以使用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/jsondestination: gift_all_flow GiftFlowInput: #礼物队列content-type: application/jsongroup: GiftAllFlowGroup 2.redis使用lua脚本增加榜单保证多机并发原子性 //redis lua脚本配置 Slf4j Configuration public class RedisConfig {Autowiredprivate JdkCacheHandler jdkCacheHandler;Bean(zsetScoreScript)public RedisScriptLong zsetScoreScript() {DefaultRedisScriptLong redisScript new DefaultRedisScript();redisScript.setScriptSource(new ResourceScriptSource(new ClassPathResource(/lua/zadd.lua)));redisScript.setResultType(Long.class);return redisScript;} }3。LUA脚本具体实现保留3位有效礼物小数位后面小数位用于同个时间刷礼物进行排序目前这里只精确到了秒 local keyKEYS[1] local memberKEYS[2] local newValuetonumber(string.format(%.16f,ARGV[1])) local oldValueredis.call(ZSCORE,key,member) if type(oldValue) boolean thenredis.call(ZADD,key,newValue,member)return 1 elseredis.call(ZADD,key,tonumber(string.format(%.3f,oldValue))newValue,member)return 1 end return 0 4.调用lua脚本增加排行榜积分 Component Slf4j public class RankScoreUtilManager {private final static DecimalFormat format new DecimalFormat(ActivityBase.TOTAL_FORMAT);Autowiredprivate StringRedisTemplate redisTemplate;Autowiredprivate ActivityTimeCache activityTimeCache;Resource(name zsetScoreScript)private RedisScriptLong zaddScript;/*** 添加分数到排行榜可以并发的*/public void addScoreToRank(String cacheKey, String anchorId, BigDecimal integral, Date eventTime) {try {BigDecimal bigDecimal dealScore(integral, activityTimeCache.getActivityDTO().getEndTime(), eventTime);String score format.format(bigDecimal.doubleValue());Long execute redisTemplate.execute(zaddScript, Arrays.asList(cacheKey, anchorId), score);log.warn(增加积分到排行榜integral{},anchorId{},score{},execute,integral,anchorId,score,execute);} catch (Exception e) {log.error(增加异常, e);}}private static BigDecimal dealScore(BigDecimal newScore, LocalDateTime activityEndTime, Date eventDate) {DecimalFormat format new DecimalFormat(ActivityBase.VALID_FORMAT);String formatStr format.format(EeBigDecimalUtil.scale(newScore, ActivityBase.VALID_SCALE, RoundingMode.DOWN).doubleValue());StringBuilder sb new StringBuilder(32);//后面补个0避免lua进1出错sb.append(formatStr).append(0);long n EeDateUtil.getMilli(activityEndTime) - eventDate.getTime();String s Long.toString(Math.abs(n) / 1000);for (int i s.length(); i ActivityBase.TIME_SCALE; i) {sb.append(0);}sb.append(s);return new BigDecimal(sb.toString()).setScale(ActivityBase.TOTAL_SCALE, RoundingMode.DOWN);}} 5.配置礼物队列名称  /** * 监听礼物流水队列 */ public interface AllGiftFlowProcessor {String OUTPUT GiftFlowOutput;Output(OUTPUT)MessageChannel output();String INPUT GiftFlowInput;Input(INPUT)SubscribableChannel input(); } 6.监听礼物队列的listener,前面做了一些活动时间校验的判断最关键的是最下面roundListBusiness.dealAnchorRoundList(dto);的方法 //监听礼物队列处理相关业务逻辑榜单的处理在最下面Slf4j Service public class AllGiftFlowListener {Autowiredprivate RedisTemplateString, String redisTemplate;Autowiredprivate AnchorLevelBusiness anchorLevelBusiness;private static final String cacheKey GIFT:TASK:INTER:EVENT:;Autowiredprivate EeEnvironmentHolder eeEnvironmentHolder;Autowiredprivate ActivityRoundDao activityRoundDao;Autowiredprivate ActivityTimeCache activityTimeCache;Autowiredprivate GiftConfigCache giftConfigCache;Autowiredprivate GiftFlowProcessor giftFlowProcessor;Autowiredprivate AnchorCache anchorCache;Autowiredprivate RoundListBusiness roundListBusiness;Autowiredprivate EeLog eeLog;StreamListener(AllGiftFlowProcessor.INPUT)public void onReceive(ActivityGiftEventDTO dto) {MqConsumeRunner.run(dto.getEventId().toString(), dto, o - dealMsgEvent(o), TaskIntegralProcessor [{}], dto);}private void dealMsgEvent(ActivityGiftEventDTO dto) {// 过滤非活动时间礼物ActivityDTO activityDTO activityTimeCache.getActivityDTO();if (null activityDTO) {return;}if (EeDateUtil.toLocalDateTime(dto.getEventDate()).isBefore(activityDTO.getStartTime())) {eeLog.info(礼物时间小于活动开始时间丢弃礼物);return;}// 判断活动时间if (ActivityStatusEnum.NO_START activityRoundDao.getActivityStatus()) {return;}// 过滤活动礼物if (giftConfigCache.getData().stream().noneMatch(o - o.getGiftId().equals(dto.getGiftId()))) {eeLog.info(礼物id:{}不计算, dto.getGiftId());return;}Integer region anchorCache.getRegionById(dto.getTarget());// 是否为签区域主播if (null region || !ActivityBase.AnchorRegion.contains(region)) {eeLog.warn(该主播非签约或非参赛区域{}, dto.getTarget());return;}// 是否重复消费礼物Boolean success redisTemplate.opsForValue().setIfAbsent(cacheKey dto.getEventId(), , 15, TimeUnit.DAYS);if (success ! null !success) {eeLog.info(升级事件已处理: dto);return;}try {//监听礼物并且处理榜单最主要的代码就这一句roundListBusiness.dealAnchorRoundList(dto);} catch (Exception e) {log.error(处理榜单 fail.[ dto ], e);}}}7.榜单的具体实现逻辑 Component Slf4j public class RoundListBusiness {//平台主播榜单private final static String CHRISTMAS_ROUND_ANCHOR_LIST CHRISTMAS:ROUND:ANCHOR:LIST;private final static String CHRISTMAS_ROUND_LIST_LOCK CHRISTMAS:ROUND:LIST:LOCK;Autowiredprivate RankScoreUtilManager rankScoreUtilManager;Autowiredprivate ActivityTimeCache activityTimeCache;AutowiredRedisTemplateString, String redisTemplate;Autowiredprivate AllGiftFlowProcessor allGiftFlowProcessor;/*** 处理榜单加分逻辑*/public void dealAnchorRoundList(ActivityGiftEventDTO dto) {ActivityDTO activityDTO activityTimeCache.getActivityDTO();if (EeDateUtil.toLocalDateTime(dto.getEventDate()).isBefore(activityDTO.getStartTime())) {return;}if (!EeDateUtil.toLocalDateTime(dto.getEventDate()).isBefore(activityDTO.getEndTime())) {return;}//记录总的榜单流水try {//插入总的流水allGiftFlowProcessor.output().send(MessageBuilder.withPayload(dto).build());} catch (Exception e) {log.error(插入总的礼物流水异常dto{}, dto, e);}LocalDateTime now LocalDateTime.now();if (!now.isBefore(activityDTO.getEndTime())) {//2.判断是否符合处理上一轮榜单的逻辑if (isThrowAwayBeforeGift(dto.getEventId(), now, activityDTO.getEndTime())) {log.warn(这里跳出了dto{},now{}, dto, EeDateUtil.format(now));return;}}dealRoundList(dto, dto.getTotalStarAmount());}/*** 处理主播榜单加分逻辑*/private void dealRoundList(ActivityGiftEventDTO dto, BigDecimal value) {//增加平台主播榜单incrAnchorListValue(CHRISTMAS_ROUND_ANCHOR_LIST, dto.getTarget(), value, dto.getEventDate());}/*** 具体加分方法*/public void incrAnchorListValue(String listCacheKey, String userId, BigDecimal value, Date eventTime) {if (EeStringUtil.isNotEmpty(listCacheKey)) {//增加榜单分数rankScoreUtilManager.addScoreToRank(listCacheKey, userId, value, eventTime);}}/*** 判断是否已经超过结算时间*/private boolean isThrowAwayBeforeGift(String eventId, LocalDateTime now, LocalDateTime endTime) {//如果当前时间超过了结算时间直接丢弃礼物if (!now.isBefore(endTime.plusSeconds(ActivityBase.PROCESS_TS))) {log.error(主播榜单-当前时间超过了结算时间直接丢弃礼物: {}, eventId);return true;}//如果上一轮的榜单已经锁定丢弃礼物if (checkBlockRankList(CHRISTMAS_ROUND_ANCHOR_LIST)) {log.error(主播榜单-榜单被锁定后丢弃礼物: {}, {}, eventId, EeDateUtil.format(LocalDateTime.now()));return true;}return false;}/*** 判断结算时榜单是否已经被锁定*/public boolean checkBlockRankList(String listCacheKey) {Boolean cache redisTemplate.opsForHash().hasKey(CHRISTMAS_ROUND_LIST_LOCK, listCacheKey);return null ! cache cache;}/*** 锁定榜单,把锁定的榜单都放入一个hash中*/public void setBlockRankList(String cacheKey) {redisTemplate.opsForHash().put(CHRISTMAS_ROUND_LIST_LOCK, cacheKey, EeDateUtil.format(LocalDateTime.now()));} } 总结目前这段代码只是实现了简单的日榜逻辑还有一段结算的代码我没有复制出来结算榜单无非就是在每天0点的时候结算前一天的榜单对榜单前几名的主播进行礼物发放后续将会更新几种复杂榜单的实现方式包括晋级榜单积分晋级榜单滚动日榜滚动周榜滚动月榜的一些实现方式
http://www.hkea.cn/news/14378275/

相关文章:

  • 谷歌网站推广公司百度seo优化规则
  • 光谷做网站推广价格谷歌推广怎么做最有效
  • 辽宁省城乡住房和建设厅网站四川 网站建设
  • 网站底部放什么wordpress用户组名称
  • 汉堡只做网站国内做网站用的程序
  • 团购机票网站建设网站下载到本地
  • 做外贸怎样上国外网站安卓版傻瓜式编程app软件
  • 网站建设内容与实现功能wordpress优化搜索引擎
  • 做网站什么主题比较好装饰设计室内公司
  • 自己做网站前期困难吗站长资讯
  • 网站布局结构主要分为wordpress 帝国 seo
  • 网上制作网站推广链接网站
  • 自己做cdk兑换码网站wordpress网站需要多大空间
  • 辽阳网站seo松江建设新城有限公司网站
  • 宁波市网站集约化建设通知合浦住房和城乡规划建设局网站
  • 长春生物新冠疫苗苏州seo关键词优化软件
  • 清远做网站哪家好上海网站制作科技公司
  • 大丰网站开发ftp替换网站图片
  • 做网站是找什么人做外贸网站效果
  • 金塔网站建设出售app软件的平台
  • 网站的结构怎么做广告设计图片赏析
  • 建设营销型网站公司网上注册公司流程和费用标准
  • 辽阳网站设计杭州做网站公司排名
  • 大兴安岭网站制作太原站建设有多长时间
  • 行业网站系统连江县建设局网站
  • 南宁网站规划与网页设计宁晋网站建设设计
  • 站长工具关键词挖掘茶文化网站建设内容
  • 东莞建设局网站公司宣传策划方案
  • 买东西网站有哪些福建省住建厅建设网站
  • 网站建设宽度一般都是多少中建八局一公司官网