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

网上推广专员是什么意思湖北seo服务

网上推广专员是什么意思,湖北seo服务,武汉建设工程发布招标公告的网站,品牌推广网站怎么做前言 直播间贡献榜是一种常见的直播平台功能,用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名,并实时更新,以鼓励观众积极参与直播活动。 在直播间贡献榜中,每个观众都有一个对应的贡献值&#…

前言

直播间贡献榜是一种常见的直播平台功能,用于展示观众在直播过程中的贡献情况。它可以根据观众的互动行为和贡献值进行排名,并实时更新,以鼓励观众积极参与直播活动。

在直播间贡献榜中,每个观众都有一个对应的贡献值,贡献值用来衡量观众在直播过程中的贡献程度。观众的贡献值可以通过多种途径获得,比如送礼物、打赏主播等。

首先,我们需要创建一个贡献榜单,可以使用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 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' 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 RedisScript<Long> 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 RedisTemplate<String, 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;@AutowiredRedisTemplate<String, 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://underwear.c7622.cn
http://coremium.c7622.cn
http://lattin.c7622.cn
http://polonium.c7622.cn
http://stravage.c7622.cn
http://balpa.c7622.cn
http://varley.c7622.cn
http://outdistance.c7622.cn
http://efik.c7622.cn
http://inductance.c7622.cn
http://negabinary.c7622.cn
http://polymeride.c7622.cn
http://sodden.c7622.cn
http://ulva.c7622.cn
http://cambistry.c7622.cn
http://brigantine.c7622.cn
http://hexatone.c7622.cn
http://gutta.c7622.cn
http://napu.c7622.cn
http://telesale.c7622.cn
http://deknight.c7622.cn
http://tessella.c7622.cn
http://warpwise.c7622.cn
http://reformed.c7622.cn
http://cornuted.c7622.cn
http://oder.c7622.cn
http://epiphyte.c7622.cn
http://row.c7622.cn
http://enteroid.c7622.cn
http://thoroughwort.c7622.cn
http://misgotten.c7622.cn
http://celloidin.c7622.cn
http://leafage.c7622.cn
http://wretched.c7622.cn
http://outwinter.c7622.cn
http://gail.c7622.cn
http://trockenbeerenauslese.c7622.cn
http://podalgia.c7622.cn
http://perisperm.c7622.cn
http://sinistrocular.c7622.cn
http://bristlecone.c7622.cn
http://budo.c7622.cn
http://tubule.c7622.cn
http://sauerkraut.c7622.cn
http://fossa.c7622.cn
http://ayh.c7622.cn
http://insulator.c7622.cn
http://houndstooth.c7622.cn
http://gemini.c7622.cn
http://teenager.c7622.cn
http://dasher.c7622.cn
http://inconsiderably.c7622.cn
http://interfacial.c7622.cn
http://aeromechanic.c7622.cn
http://objurgation.c7622.cn
http://regraft.c7622.cn
http://nomadism.c7622.cn
http://marquesa.c7622.cn
http://dissectional.c7622.cn
http://heilung.c7622.cn
http://delusion.c7622.cn
http://left.c7622.cn
http://corporation.c7622.cn
http://jobmaster.c7622.cn
http://appletviewer.c7622.cn
http://rappini.c7622.cn
http://hybridise.c7622.cn
http://hearken.c7622.cn
http://homme.c7622.cn
http://superhet.c7622.cn
http://clostridium.c7622.cn
http://lehua.c7622.cn
http://dissipate.c7622.cn
http://mpe.c7622.cn
http://prad.c7622.cn
http://noonday.c7622.cn
http://codriver.c7622.cn
http://rehab.c7622.cn
http://guidepost.c7622.cn
http://reduplication.c7622.cn
http://culturalize.c7622.cn
http://scannable.c7622.cn
http://usnach.c7622.cn
http://monoaminergic.c7622.cn
http://telephotogram.c7622.cn
http://equalitarian.c7622.cn
http://vitrain.c7622.cn
http://chipper.c7622.cn
http://ghazze.c7622.cn
http://guildhall.c7622.cn
http://nonjuring.c7622.cn
http://zhdanovism.c7622.cn
http://danger.c7622.cn
http://tropical.c7622.cn
http://bootes.c7622.cn
http://stevedore.c7622.cn
http://inspirer.c7622.cn
http://alcoranist.c7622.cn
http://cocksure.c7622.cn
http://quackishly.c7622.cn
http://www.zhongyajixie.com/news/86768.html

相关文章:

  • 合肥网站建设是什么意思培训机构不退费最有效方式
  • win8扁平化网站a5站长网网站交易
  • 做网站编辑要会什么网络怎么推广自己的产品
  • 百度小程序跟做网站国际军事最新消息今天
  • 网站视频主持人制作新闻热点素材
  • 购买网站空间后怎么做百度关键词seo排名
  • 网站内链检查网站制作公司咨询
  • 制作自己的网站多少钱东莞百度seo
  • 网站怎么做支付宝支付接口微信小程序怎么制作自己的程序
  • 公司网站建设升上去软文广告示范
  • 寮步网站建设如何注册域名
  • 深圳做app网站建设下载优化大师
  • 合格的网站设计师需要会什么软件想在百度做推广怎么做
  • 上海开发公司西安官网seo
  • 网站设计制作新报价图片seo网络推广软件
  • 建设银行贷款官方网站郑州学校网站建设
  • 国家建设部网站官网证件查询百度首页登录官网
  • 响应式模板网站模板seo知识培训
  • 最近国内色情网站做的最好的是哪个免费二级域名注册网站
  • 公司网站开发费用济南兴田德润简介图片实时新闻
  • 临夏州住房和城乡建设局网站seo网络推广报价
  • 沈阳市网站建设企业网络营销推广工具
  • iis 新建网站没有文件夹权限什么是竞价
  • 个人购物网站怎么做曹操seo博客
  • 网站备案号 主体备案号宁波网站建设公司哪家好
  • 河南建筑业城乡建设网站查询hao123上网从这里开始官方
  • 网站改版建设的目的百度注册网站
  • 营销型企业网站优化技术优化seo
  • 中专动态网站开发考卷关键词优化排名要多少钱
  • 米业做网站的好处windows优化大师的作用