【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 */
    @Getter
    private RedisAsyncCommands<String, String> asyncCommands;

    /*** sync*/
    @Getter
    private 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-排行榜】,# redis,java,服务器文章来源地址https://www.toymoban.com/news/detail-811178.html

到了这里,关于【lettuce-排行榜】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 微博排行榜:获取微博用户和话题排行榜API接口

    随着社交媒体的快速发展,微博已成为了人们获取信息的重要途径。而在微博中,用户和话题的排行榜更是引起了人们的广泛关注。那么如何获取微博用户和话题排行榜呢?下面介绍一下基于微博排行榜API接口的方法。     一、获取微博用户排行榜API接口 微博用户排行榜A

    2024年02月05日
    浏览(46)
  • 爬虫:中国大学排行榜

            访问网址https://www.shanghairanking.cn/rankings,爬取排行榜数据,分析按区域的大学数量排行,得出有效结论。 爬取主榜数据并保存在文件中。 分析每个地区上榜大学的数量,保存在文件中。 分析前十名的地区的大学数量,绘制柱状图。 (4)说明爬虫爬取过程中可能

    2024年01月17日
    浏览(33)
  • 采购管理系统排行榜

    在这个数字化改变业务的年代,有哪些采购管理系统居于排行榜单的前列呢?作为一个自诩对该行业了如执掌的软件行业人员,给各位分享分享采购管理系统排行榜。 1、甄云数字化采购管理平台 国内做的一流的采购管理软件,算是行业内的老大哥,功能全面,也比较实用。

    2024年02月04日
    浏览(28)
  • 全球热门 AI 排行榜出炉!

    以下文章来源于无敌信息差 ,作者无敌 刚刚过去的 2023 年,可以说是 AI 元年。 随着技术的飞速发展,AI 行业在这一年再次迎来了爆炸式的增长。 近日,Writerbuddy 研究了  3000 多个 AI  的数据,出具了一份行业报告:该报告细致地盘点了 全球 50 大热门 AI 工具。 让无敌来带

    2024年02月22日
    浏览(39)
  • 开放 LLM 排行榜: 深入研究 DROP

    最近,开放 LLM 排行榜 迎来了 3 个新成员: Winogrande、GSM8k 以及 DROP,它们都使用了 EleutherAI Harness 的原始实现。一眼望去,我们就会发现 DROP 的分数有点古怪: 绝大多数模型的 F1 分数都低于 10 分 (满分 100 分)!我们对此进行了深入调查以一探究竟,请随我们一起踏上发现之旅吧

    2024年01月16日
    浏览(32)
  • unity微信小游戏——排行榜

    设置时记住排行榜唯一标识 此处建议使用官方案例的UI进行修改 minigame-unity-webgl-transform: Unity WebGL 微信小游戏适配方案 (gitee.com) DemoRanking这个项目就是 1.新建Canvas 此处要选择Overlay 否则排行榜会无法拖动 此处RankingBox默认状态为SetActive(false) bg:排行榜背景 也可以把背景让在

    2024年02月02日
    浏览(43)
  • 【面试题】微博、百度等大厂的排行榜如何实现?

    现如今每个互联网平台都会提供一个排行版的功能,供人们预览最新最有热度的一些消息,比如百度: 再比如微博: 我们要知道,这些互联网平台每天产生的数据是非常大,如果我们使用MySQL的话,db实现小时、天、周、月的排行榜,难度及其大,而且表结构的设计也非常难

    2024年04月10日
    浏览(37)
  • 排序7-2 奥运排行榜 PTA 数据结构

    7-2 奥运排行榜 分数 25 全屏浏览题目 切换布局 作者 陈越 单位 浙江大学 每年奥运会各大媒体都会公布一个排行榜,但是细心的读者发现,不同国家的排行榜略有不同。比如中国金牌总数列第一的时候,中国媒体就公布“金牌榜”;而美国的奖牌总数第一,于是美国媒体就

    2024年02月02日
    浏览(35)
  • SRM的主要功能是什么?国内SRM主流排行榜

    SRM的主要功能是什么?国内SRM主流排行榜 现在国内很多中大型企业都在用SRM来优化企业采购业务,作为SRM行业从业者,我今天和大家聊聊主流SRM的功能,以及国内做SRM比较好的服务商,给大家参考。 SRM的主流功能,主要包括以下6点: 1、优化供应商的管理 供应商管理是企业

    2024年02月04日
    浏览(27)
  • 【python】爬取酷狗音乐Top500排行榜【附源码】

    英杰社区 https://bbs.csdn.net/topics/617804998     这篇博客将介绍如何使用Python编写一个爬虫程序,从斗鱼直播网站上获取图片信息并保存到本地。我们将使用 request s 模块发送HTTP请求和接收响应,以及 os 模块处理文件和目录操作。         如果出现模块报错         进入控

    2024年02月05日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包