【lettuce-排行榜】

2024-01-21 19:28
文章标签 排行榜 lettuce

本文主要是介绍【lettuce-排行榜】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

背景:

这次游戏中台采用lettuce的zset完成游戏内的本服和跨服排行榜,因此写一下案例。

pom.xml

    <dependency><groupId>io.lettuce</groupId><artifactId>lettuce-core</artifactId><version>6.2.4.RELEASE</version><exclusions><exclusion><artifactId>netty-common</artifactId><groupId>io.netty</groupId></exclusion><exclusion><artifactId>netty-handler</artifactId><groupId>io.netty</groupId></exclusion><exclusion><artifactId>netty-transport</artifactId><groupId>io.netty</groupId></exclusion></exclusions></dependency>

RedisManager.java

package org.example.testRank.manager;import io.lettuce.core.RedisClient;
import io.lettuce.core.RedisURI;
import io.lettuce.core.api.StatefulRedisConnection;
import io.lettuce.core.api.async.RedisAsyncCommands;
import io.lettuce.core.api.sync.RedisCommands;
import lombok.Getter;
import lombok.extern.slf4j.Slf4j;import java.time.Duration;@Slf4j
public class RedisManager {private static RedisManager instance = new RedisManager();private RedisClient redisClient;private StatefulRedisConnection<String, String> connection;/*** async */@Getterprivate RedisAsyncCommands<String, String> asyncCommands;/*** sync*/@Getterprivate RedisCommands<String, String> commands;public static RedisManager inst() {return instance;}public void init(String host, int port) {int dbIndex = 15;int timeout = 10;try {RedisURI uri = RedisURI.builder().withHost(host).withPort(port).withDatabase(dbIndex).withTimeout(Duration.ofSeconds(timeout)).build();redisClient = RedisClient.create(uri);connection = redisClient.connect();asyncCommands = connection.async();commands = connection.sync();} catch (Exception e) {log.error("redis init error=", e);}}public void close() {if (connection != null) {connection.close();}if (redisClient != null) {redisClient.close();}}
}

RankManager.java

package org.example.testRank.manager;import com.google.common.collect.Lists;
import io.lettuce.core.RedisFuture;
import io.lettuce.core.ScoredValue;
import lombok.extern.slf4j.Slf4j;
import org.example.testRank.model.RankInfo;
import org.example.testRank.model.RankItem;import java.math.BigDecimal;
import java.util.List;@Slf4j
public class RankManager {private static RankManager instance = new RankManager();public static RankManager inst() {return instance;}/*** 尝试上榜* @param rankKey     排行榜类型* @param uid         玩家id* @param num         得分* @param increment   是否是增加 false的话直接设置为得分*/public void updateRank(String rankKey, long uid, double num, boolean increment) {RedisFuture<Double> future = RedisManager.inst().getAsyncCommands().zscore(rankKey, uid + "");future.whenCompleteAsync((v, e) -> {if (increment && v != null) {RedisManager.inst().getAsyncCommands().zadd(rankKey, addNumAndGetScoreWithTime(v.doubleValue(), num), String.valueOf(uid));} else {RedisManager.inst().getAsyncCommands().zadd(rankKey, getScoreWithTime(num), String.valueOf(uid));}});}/*** 获取排行榜列表 + 自己的排名*/public RankInfo getRankInfo(String rankKey, int start, int end, long selfUid) {RankInfo rankInfo = new RankInfo();List<RankItem> rankItems = Lists.newArrayList();List<ScoredValue<String>> list = RedisManager.inst().getCommands().zrevrangeWithScores(rankKey, start, end);int userRank = start;for (ScoredValue<String> scoredValue : list) {userRank++;String uid = scoredValue.getValue();double score = getRealScore(scoredValue.getScore());rankItems.add(new RankItem(uid, userRank, (long) score));}rankInfo.setRankItems(rankItems);Long selfRankObj = RedisManager.inst().getCommands().zrevrank(rankKey, selfUid + "");Double selfScoreObj = RedisManager.inst().getCommands().zscore(rankKey, selfUid + "");rankInfo.setSelfRankItem(new RankItem(selfUid + "", selfRankObj == null ? 0 : selfRankObj.intValue()+1, selfScoreObj == null ? 0 : selfScoreObj.longValue()));return rankInfo;}private double getScoreWithTime(double score) {return score + (1 - Double.parseDouble("0." + System.currentTimeMillis()));}private double getRealScore(double score) {BigDecimal bigDecimal = new BigDecimal(score);String realScore = String.valueOf(bigDecimal).split("\\.")[0];return Double.parseDouble(realScore);}private double addNumAndGetScoreWithTime(double score, double addNum) {double num = getRealScore(score) + addNum;return getScoreWithTime(num);}
}

RankItem.java

package org.example.testRank.model;import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.ToString;@Data
@AllArgsConstructor
@ToString
public class RankItem {private String uid;private int rank;private long score;
}

RankInfo.java

package org.example.testRank.model;import lombok.Data;
import lombok.ToString;import java.util.List;@Data
@ToString
public class RankInfo {private List<RankItem> rankItems;private RankItem selfRankItem;
}

Main.java

package org.example.testRank;import lombok.extern.slf4j.Slf4j;
import org.example.testRank.manager.RankManager;
import org.example.testRank.manager.RedisManager;
import org.example.testRank.model.RankInfo;@Slf4j
public class Main {public static String rankKey = "power_rank";public static void main(String[] args) {RedisManager.inst().init("localhost", 6379);//        RankManager.inst().updateRank(rankKey, 1002, 10, true);
//
//        RankManager.inst().updateRank(rankKey, 1001, 10, true);//        RankManager.inst().updateRank(rankKey, 1003, 100, true);RankInfo rankInfo = RankManager.inst().getRankInfo(rankKey, 0, -1, 1002);log.info("{}", rankInfo);}
}/*
RankInfo(rankItems=[RankItem(uid=1003, rank=1, score=100), RankItem(uid=1001, rank=2, score=30), RankItem(uid=1002, rank=3, score=10)], selfRankItem=RankItem(uid=1002, rank=3, score=10))*/

redis中查看下

这篇关于【lettuce-排行榜】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/630588

相关文章

【Rust日报】 2019-07-21 Redmonk 语言排行榜:Rust 比上季度上升两名

treelike - 一个用于方便地实现树结构的辅助包 它提供了一个 Treelike trait,实现其中的两个方法 content() 和 children() 即可。 作者是在在多个项目中重复写树实现得出的灵感。赞一个! Repo Neuralink 在组建一个队伍,寻找有 Rust 经验的工程师 Neuralink is developing ultra-high bandwidth

任务3.8.4 利用RDD实现分组排行榜

文章目录 1. 任务说明2. 解决思路3. 准备成绩文件4. 采用交互式实现5. 采用Spark项目实战概述:使用Spark RDD实现分组排行榜任务背景任务目标技术选型实现步骤1. 准备数据2. 数据上传至HDFS3. 启动Spark Shell4. 读取数据生成RDD5. 数据处理6. 计算TopN7. 输出结果8. 采用Spark项目实现 代码实现结果展示总结 1.

2019年8月的10大机器学习开源项目排行榜

点击上方“AI公园”,关注公众号,选择加“星标“或“置顶” 作者:Mybridge 编译:ronghuaiyang 导读 在过去的一个月里,我们对近250个机器学习开源项目进行了排名,选出了前10名。 在此期间,我们将项目与新版本和主要版本进行了比较。根据各种因素对项目进行排名,以衡量其对专业人士的质量。 Github星星的平均数量:1355⭐️在Github上“Watch”机器学习

NL2SQL基础系列(1):业界顶尖排行榜、权威测评数据集及LLM大模型(Spider vs BIRD)全面对比优劣分析[Text2SQL、Text2DSL]

Text-to-SQL(或者Text2SQL),顾名思义就是把文本转化为SQL语言,更学术一点的定义是:把数据库领域下的自然语言(Natural Language,NL)问题,转化为在关系型数据库中可以执行的结构化询语言(Structured Query Language,SQL),因此Text-to-SQL也可以被简写为NL2SQL。 输入:自然语言问题,比如“查询表t_user的相关信息,结

【转载】TIOBE 编程指数 6 月排行榜公布,vb.net排第九

原文地址:https://baijiahao.baidu.com/s?id=1801368030428902126&wfr=spider&for=pc IT之家 6 月 9 日消息,TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎,今天 TIOBE 官网公布了 2024 年 6 月的编程语言排行榜,IT之家整理如下: Pyt

python爬虫入门——豆瓣电影排行榜top250

需要用到的库 1.requests 2.re(正则表达式库)   部分参数 请求头: 此处复制的火狐浏览器请求头 myheader = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:67.0) Gecko/20100101 Firefox/67.0","Host": "movie.douban.com"}

小说爬虫-01爬取总排行榜 分页翻页 Scrapy SQLite SQL 简单上手!

代码仓库 代码实现部分很简单! 为了大家方便,代码我已经全部都上传到了 GitHub,希望大家可以点个Start! https://github.com/turbo-duck/biquge_fiction_spider 背景信息 我们计划对笔趣阁网站的小说进行爬取。我们通过小说的排行榜对整个网站的所有小说进行爬取。 https://www.xbiqugew.com/top/allvi

[第五名公共排行榜] LGB 连续学习 + Catboost 集成

大家好, 首先,我想感谢竞赛组织者和所有参与讨论的人。这是@ibazhov和我在Kaggle上的第一次正式比赛,我们学到了很多,并希望未来能参与更多的比赛。 总结: 使用5个LGB模型进行连续更新/学习,通过.train(init_model)和.refit()方法,以及5个基于216个特征的Catboost模型。通过减去指数贡献的加权和进行后处理,使得w_i * targ_i ≈ 0。

Python11 使用爬虫实现图书250排行榜信息爬取

1.什么是网络爬虫 Python爬虫是使用Python编程语言编写的程序,它能自动从互联网上抓取数据。这类程序一般利用网络请求来访问网站,解析网站的HTML或其他格式的内容,提取出有用的数据,有时还会进行后续的数据处理或存储。 Python爬虫的用途包括: 数据收集:对于数据分析师和研究人员来说,爬虫可以帮助从各种网站上自动化收集数据,如社交媒体数据、金融市场数据、商品信息等。

无线麦克风哪个品牌音质最好,领夹麦克风品牌排行榜前十名推荐

​在数字化时代的背景下,声音的传播与记录变得日益重要。无论是会议室、教室还是户外场所,无线领夹麦克风凭借其便携性和稳定的连接性能,成为人们沟通表达的首选工具。面对众多选择,我为你精选了几款性能卓越且性价比高的无线领夹麦克风,都可以来参数一下: 1.优先挑选高性价比的产品 选择无线麦克风时,品牌信誉和价格是关键考虑因素,但最适合的设备并不总是价格最高的。性能和实用性与价格并非直接对等。消