【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

相关文章

[图]12大编程语言收入排行榜

计算机软件开发或者说程序员工作已经成为收入最高的职业之一。BI最近的一份报告显示,近两年美国软件工程师的平均年薪已经接近10万美元(下图),与之相比欧洲的软件工程师的收入要少得多,平均年薪月5.5万美元,不过比去年同期增长了9%,呈现上升势头。 但值得注意的是,不同编程语言技巧的市场价值不同,最近Quartz对编程语言的价值进行评估后给出了收入最高的12个编程语言排行榜。Quar

全球AI产品Top100排行榜

Web Top50的榜单里,AIGC类型的应用占比52%,遥遥领先。AIGC类型包括图像、视频、音乐、语音等的内容生成和编辑。音乐生成应用Suno在过去六个月中的排名跃升最为显著,从第36位上升至第5位。排名第二大类是通用对话/AI聊天/角色扮演类型的应用,占比20%,包括常见的ChatGPT、Claude、Character.ai等。其他是AI写作(8%)、AI搜索/问答(6%)、Agent/

最新!全国电力设计院排行榜!跳槽必看!

近日,权威机构电规协发布《2023年电力勘测设计行业统计分析与报告》,这个报告整整160页,看得是头昏眼花。 这个报告内容很多,整理出最关心和最关键的数据,展示给读者们。 要说大家最关心的肯定是排名啦,立马安排上,大家可以看看是否有自家公司,没有的赶紧跳槽哈,就照这个排名投简历。 一起看看全国电力设计院排行榜前十名吧: 1. 新签合同额前十名单位(入围门槛290.97亿元)分别为: 中国

10款好用的文件加密软件排行榜|文件加密管理软件推荐(合集篇)

某企业在疫情期间实行远程办公政策,所有员工通过公司提供的VPN访问内部系统。为了保障数据安全,然而,某位员工为了加快工作进度,将文件下载到个人电脑上进行编辑。 在一次在线会议中,员工不慎将这份未加密的文件通过非加密的邮件服务发送给外部合作伙伴,导致核心商业计划泄露,给公司带来了巨大的竞争风险。 从以上案例可见,在当今数字化时代,给文件加密都是不可或缺的。无论是个人用户还是企业用户,选择一款

开放式蓝牙耳机哪个品牌好用?开放式耳机排行榜10强

开放式耳机是我觉得蓝牙耳机里最适合入手的耳机类型,它有很多使用场景的选择。平时外出办公的话,也很合适,我自己也算是外出办公的打工人了,我会比较喜欢一点点嘈杂的环境,就还挺适合的。 那平时下班健身就更不用说了,健身最适合戴耳机了,那入耳式就很容易掉,所以这时就该轮到开放式耳机登场了,挂耳式、耳夹式或者是挂脖式的佩戴设计都很适合运动健身。 所以,毋庸置疑,开放式耳机当然是好用且适合入手的。

超好用的图纸加密软件排行榜 | 2024图纸加密软件的七款最优选择!

数字化设计日益普及的今天,图纸作为设计与工程的核心载体,其安全性成为了企业和设计师们最为关注的焦点之一。 面对日益复杂的数据泄露风险,如何有效地保护图纸文件的安全呢? 下面,我们就来探讨一下2024图纸加密软件的最优选择,为您介绍七款超好用的图纸加密软件! 一、域智盾:专业级图纸加密的领军者 ①透明加密 采用基于Windows文件系统驱动开发的透明加密技术,结合高强度国际流行加密算法

吃透Redis系列(十一):Jedis和Lettuce客户端详细介绍

Redis系列文章: 吃透Redis系列(一):Linux下Redis安装 吃透Redis系列(二):Redis六大数据类型详细用法 吃透Redis系列(三):Redis管道,发布/订阅,事物,过期时间 详细介绍 吃透Redis系列(四):布隆(bloom)过滤器详细介绍 吃透Redis系列(五):RDB和AOF持久化详细介绍 吃透Redis系列(六):主从复制详细介绍 吃透Redi

2014十大家族排行榜 2014年十大网络红人排行榜

2014十大家族排行榜 2014年十大网络红人排行榜 2014年十大网络红人:NO.1 (网络红人斌少) 2014年十大网络红人:NO.2 (网络红人张小熙) 2014年十大网络红人:NO.3 (网络红人三笔) 2014年十大网络红人:NO.4 (网络红人夏爱熙 ) 2014年十大网络红人:NO.5 (网络红人龚心逸 ) 20

找搭子神器有哪些?盘点找搭子软件排行榜前十名

现在找搭子文化越来越流行,主打一个“恰到好处的陪伴”,深受年轻人喜爱。以下是一些值得推荐的找搭子软件: 1. 咕哇小程序:特点:这是一个实名制的找搭子交友平台,因此相对较为纯粹,骗子较少。用户可以轻松找到兴趣相投的各类搭子,如旅行搭子、学习搭子、运动搭子等。同时,用户还可以发布自己的搭子需求,查看并加入他人的搭子聊天,以及发布个人动态。适用场景:适合希望找到志同道合搭子进行各种活动的用户。

德国弗锐德管道:十大家装进口水管品牌排行榜【2024版】

随着人们生活水平的提升,人们更加注重饮水健康安全等问题,水管的好坏直接影响到饮水安全问题,面对市场众多的品牌,质量参差不齐,消费者选购时也是眼花缭乱。如今,越来越多的业主开始选择进口水管,更加有保障!下面就和大家分享一下: 十大家装进口水管品牌排行榜【2024版】,大家在选购时可以做个参考: 1.十大家装进口水管品牌之德国阔盛 aquatherm德国阔盛是跨国公司,主要生产用于给水和采暖/制