《程序猿之Redis缓存实战 · 有序集合类型》

news2024/10/1 3:14:58

📢 大家好,我是 【战神刘玉栋】,有10多年的研发经验,致力于前后端技术栈的知识沉淀和传播。 💗

🌻 CSDN入驻不久,希望大家多多支持,后续会继续提升文章质量,绝不滥竽充数,欢迎多多交流。👍

文章目录

    • 有序集合(SortedSet)

有序集合(SortedSet)

【结构简介】

1、Sorted Set 类似于 Set,但和 Set 相比,Sorted Set 增加了一个 double 类型的分数,使得集合中的元素能够按分数进行有序排列。

2、Redis的SortedSet是一个可排序的set集合,与Java中的TreeSet有些类似,但底层数据结构却差别很大。SortedSet中的每一个元素都带有一个score属性,可以基于score属性对元素排序,底层的实现是一个跳表(SkipList)加 hash表。

3、SortedSet具备下列特性:

  • 可排序
  • 元素不重复
  • 查询速度快

总之,因为SortedSet的可排序特性,经常被用来实现排行榜这样的功能。

【应用场景】

要随机获取数据源中的元素根据某个权重进行排序的场景。

● 举例 :各种排行榜,还有周榜月榜的汇总实现。

● 相关命令 :ZINCR(每点击一次进行加一)、ZREVRANGE (从大到小排序)、ZUNIONSTORE(多日搜索汇总)。

【应用场景 - 补充】

ZSet(有序集合)是 Redis 中的一种数据结构,它结合了集合的特性和排序的能力。每个元素都有一个分数(score),根据分数的大小,元素会被自动排序。

  1. 排行榜:可以用 ZSet 来实现游戏的排行榜,玩家的分数作为分数,玩家的 ID 作为元素。
  2. 时间序列数据:可以用 ZSet 存储带有时间戳的数据,时间戳作为分数,比如存储商品的剩余库存,并根据剩余时间进行排序,优先展示剩余时间少的商品。
  3. 推荐系统:可以用 ZSet 来存储用户的偏好,分数可以表示用户对某个项目的喜好程度,也可以是商品、文章、视频等内容的热门推荐。

总之,ZSet 是 Redis 中一个功能强大的数据结构,它可以用于各种场景,例如排行榜、热门推荐、搜索结果排序、限时抢购等。通过使用 RedisTemplate,我们可以方便地操作 ZSet,实现各种功能。

//LeaderboardService 提供了添加玩家分数、获取前 N 名玩家和获取玩家分数的方法。
//使用 opsForZSet().add() 方法添加分数,使用 opsForZSet().reverseRange() 获取排名前 N 的玩家。
@Service
public class LeaderboardService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private final String LEADERBOARD_KEY = "game_leaderboard";

    // 添加玩家分数
    public void addScore(String playerId, double score) {
        redisTemplate.opsForZSet().add(LEADERBOARD_KEY, playerId, score);
    }

    // 获取前 N 名玩家
    public Set<String> getTopPlayers(int topN) {
        return redisTemplate.opsForZSet().reverseRange(LEADERBOARD_KEY, 0, topN - 1);
    }

    // 获取玩家的分数
    public Double getPlayerScore(String playerId) {
        return redisTemplate.opsForZSet().score(LEADERBOARD_KEY, playerId);
    }
}

//TimeSeriesService 提供了添加时间序列数据和获取指定时间范围内数据的方法。
//使用 opsForZSet().add() 方法添加数据,使用 opsForZSet().rangeByScore() 获取指定时间范围内的数据。
@Service
public class TimeSeriesService {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private final String TIME_SERIES_KEY = "sensor_data";

    // 添加时间序列数据
    public void addData(long timestamp, String data) {
        redisTemplate.opsForZSet().add(TIME_SERIES_KEY, data, timestamp);
    }

    // 获取指定时间范围内的数据
    public Set<String> getDataInRange(long startTime, long endTime) {
        return redisTemplate.opsForZSet().rangeByScore(TIME_SERIES_KEY, startTime, endTime);
    }
}

【对比Java的SortedSet】

Redis 的 ZSet 类似于 Java 中的 SortedSet 结构,但又有一些区别:

相同点:

  • 有序性: 两种结构都按照元素的排序规则进行排序,ZSet 按照分数排序,SortedSet 按照比较器定义的规则排序。
  • 唯一性: 两种结构都保证元素的唯一性,不允许重复元素。

不同点:

  • 数据结构: ZSet 是 Redis 自己的数据结构,而 SortedSet 是 Java 中的集合接口。
  • 排序依据: ZSet 按照分数排序,而 SortedSet 按照比较器定义的规则排序。
  • 分数: ZSet 中每个元素都有一个分数,用于排序和范围查询,而 SortedSet 没有分数的概念。
  • 范围查询: ZSet 支持范围查询,例如获取分数在某个范围内的元素,而 SortedSet 不支持范围查询。

总结,虽然 ZSet 和 SortedSet 都具有有序性和唯一性,但 ZSet 更加强大,它支持分数排序、范围查询等功能,更适合用于需要排序和范围查询的场景。

【基础操作】

ZADD key score menber1 [ score2 menber2 ]:向有序集合添加一个或者多个成员,或者更新已存在的成员分数
ZCARD key:获取有序集合的元素个数
ZREM key menber [ member ]:移除有序集合中的一个或多个成员
ZSCORE key member:获取指定有序集合中指定元素的 score 值
ZRANGE key start stop:通过索引区间返回有序集合成指定区间内的成员(score 从低到高)
ZREVRANGE key start stop:通过索引区间返回有序集合成指定区间内的成员(score 从高到低)
● ZADD key score menber1 [ score2 menber2 ]:向有序集合添加一个或者多个成员,或者更新已存在的成员分数
● ZCARD key:获取有序集合的元素个数
● ZRANGE key start stop [ WITHSCORES ]:通过索引区间返回有序集合成指定区间内的成员
● ZREM key menber [ member ]:移除有序集合中的一个或多个成员
● ZSCORE key member1:获取指定有序集合中指定元素的 score 值
● ZREVRANGE key start end:
 ---------------------------------------------------分隔线---------------------------------------------------
● ZCOUNT key min max:可计算在有序集合中指定区间分数的成员
● ZINCRBY key increment menber:有序集合中对指定成员的分数加上增量increment
● ZINTERSTORE destination numkeys key [ key… ]:计算给定的一个或者多个有序集的交集并将结果集存储在新的有序集合key中
● ZUNIONSTORE destination numkeys key [ key… ]:计算给定的一个或者多个有序集的并集并将结果集存储在新的有序集合key中
● ZDIFF destination numkeys key [ key… ]:计算给定的一个或者多个有序集的差集并将结果集存储在新的有序集合key中
● ZRANGEBYSCORE key min max [ WITHSCORES ] [ LIMIT ]:通过分数返回有序集合指定区间内的成员
● ZLEXCOUNT key min max:在有序集合中计算指定字典区间内成员数量
● ZRANGEBYLEX key min max [ LIMIT offset count ]:通过字典区间返回有序集合的成员
● ZRANK key menber:返回有序集合中指定成员的索引

注意:所有的排名默认都是升序,如果要降序则在命令的Z后面添加REV即可,例如:

  • 升序获取sorted set 中的指定元素的排名:ZRANK key member
  • 降序获取sorted set 中的指定元素的排名:ZREVRANK key memeber

【代码示例】

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2181353.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenGL ES 索引缓冲区(4)

OpenGL ES 索引缓冲区(4) 简述 本节会介绍索引缓冲区&#xff0c;索引缓冲区和顶点缓冲区类似&#xff0c;也是显存上的一段内存&#xff0c;只不过上面的数据用处不同&#xff0c;索引缓冲区故名思义里面的数据是用于索引&#xff0c;主要作用是用于复用顶点缓冲区里的数据。…

Kd-tree介绍和使用

GeoHash原理介绍以及在redis中的应用-CSDN博客 这边文章中介绍了GeoHash编码原理以及它的一个应用——利用GeoHash编码可以建立一个索引&#xff0c;从而实现快速的空间搜索。今天&#xff0c;我们介绍一个常见的数据结构Kd-Tree&#xff0c;利用它也可以快速实现多位数据的搜索…

调用智谱AI,面试小助手Flask简单示例

文章目录 1.接入AI获取API密钥Python代码 2.小助手的实现流程3.Flask应用示例Python文件.pyindex.html运行Flask应用地址栏输入 http://localhost:5000/ 1.接入AI 获取API密钥 在智谱AI的官方网站上注册&#xff0c;右上角点击API密钥&#xff0c;新建并复制一个 API Key&…

掌握未来:产品经理学习AI大模型的重要性解析

前言 在AI大模型时代&#xff0c;技术的迅猛进步正在重塑各行各业的面貌。作为产品经理&#xff0c;我们不仅要紧跟时代步伐&#xff0c;更要深入探索与运用这一前沿技术。学习大模型等AI技术&#xff0c;不仅是为了理解其背后的工作原理和应用潜力&#xff0c;更是为了将智能…

天选思路怎能不会!小波变换+CNN完美融合,最新idea发了CV顶会!

今天给大家推荐一个涨点发顶会的好方向&#xff1a;小波变换CNN。这俩热点的结合可以轻松实现“11&#xff1e;2”的效果。 这是因为&#xff0c;一方面小波变换可以作为预处理步骤&#xff0c;提取出关键的局部特征&#xff0c;加速CNN收敛并提升性能&#xff1b;另一方面&am…

配置树莓派打开SSH服务

在树莓派终端中查看IP 在终端中输入命令来查看IP地址。最常用的命令是&#xff1a;hostname -I注意&#xff0c;这里的参数I是大写的&#xff0c;它表示查看本机上所有配置的IP地址&#xff08;包括IPv4和IPv6&#xff0c;如果有的话&#xff09;。如果你只需要查看IPv4地址&am…

Linux:磁盘管理

一、静态分区管理 静态的分区方法不可以动态的增加或减少分区的容量。 1、磁盘分区-fdisk 该命令是用于查看磁盘分区情况&#xff0c;和分区管理的命令 命令格式&#xff1a;fdisk [选项] 设备文件名常用命令&#xff1a; -h&#xff1a;查看分区信息 fdisk系统常用命令&…

19、网络安全合规复盘

数据来源&#xff1a;5.网络安全合规复盘_哔哩哔哩_bilibili

山大电力研发费用率远弱同行,先分红上亿再补流9000万?

《港湾商业观察》施子夫 8月9日&#xff0c;证监会网站披露深交所已向山东山大电力技术股份有限公司&#xff08;以下简称&#xff0c;山大电力&#xff09;发出第三轮审核问询函。据悉&#xff0c;2023年6月&#xff0c;山大电力递表深交所&#xff0c;保荐机构为兴业证券。 …

Linux中find命令详解

记录linux中find命令的详细用法。 文章目录 find命令简介基本语法常用选项-name-iname-type-size-mtime,-atime,-ctime-perm-user-group-delete-exec-printand or find --help find命令简介 find 是一个搜索目录树以查找一个文件或一组文件的程序。它遍历目录树并报告与用户规…

VMware虚拟机NAT模式配置

1、宿主机 2、宿主机网络适配器 VMnet8 ①要与虚拟机在同一网段 ②不能和宿主机同一网段 3、VMware 4、虚拟机

短视频剪辑工具有哪些?推荐4个简单好用的工具

短视频如今充斥着我们的生活&#xff0c;刷短视频已经成了很多人的生活必备。所以掌握短视频剪辑技能是一件很重要的事情&#xff0c;能够为视频创作者带来很多的流量。如果想要学习剪辑的话&#xff0c;可以先从选择一款合适的剪辑工具开始&#xff0c;这几款功能丰富的软件&a…

Google ads投广中的这些问题,看你中了没

谷歌广告是一个强大的工具&#xff0c;可以显著提升外贸独立站的流量和销售。但是&#xff0c;要想充分发挥其潜力&#xff0c;需要深入了解其工作原理&#xff0c;并掌握如何设定预算、选择关键词、创建广告文案等技巧。以下是一些在谷歌广告投放过程中网友遇到的一些问题及其…

基于ESP8266—AT指令连接阿里云+MQTT透传数据(1)

在阿里云创建MQTT产品的过程涉及几个关键步骤,主要包括注册阿里云账号、实名认证、开通MQTT服务实例、创建产品与设备等。以下是详细的步骤说明: 一、准备工作 访问阿里云官网,点击注册按钮,填写相关信息(如账号、密码、手机号等)完成注册。注册完成后,需要对账号进行实…

Solaris11.4配置远程桌面登录

Solaris11.4配置远程桌面登录 一. 版本信息 1. 内核版本信息 rootsolaris11:~# uname -a SunOS solaris11 5.11 11.4.27.82.1 sun4v sparc sun4v rootsolaris11:~# rootsolaris11:~# rootsolaris11:~# cat /etc/releaseOracle Solaris 11.4 SPARCCopyright (c) 1983, 2020, …

【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和常规型数字格式的区别

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 【EXCEL数据处理】000009 案列 EXCEL单元格数字格式。文本型数字格式和…

2024年国外优质API:情绪识别口碑佳

随着全球一体化进程的加速&#xff0c;跨语言沟通需求提升&#xff0c;进而催生出大量语种识别类型API服务。此类服务致力于协助使用者便捷且精确地辨识文本所属的语种&#xff0c;从而实现各类多语言文本处理、自动化翻译及文本解析等功能。 目前&#xff0c;市面上已出现多种…

麒麟服务器装完系统后删除backup以及swap分区的操作步骤

一、需求描述 将V10-SP3服务器的klas-backup、klas-swap两个lvm分区删除掉。 现场原来lvm结构如下: 二、注意事项 在缩减lvm前,必须做好数据备份。 三、操作步骤 1、执行vgs、lvs查看vg、lv [root@server-sp3 ~]# vgsVG #PV #LV #SN Attr VSize VFreeklas 1 3 …

微服务——服务保护

1.雪崩问题 级联失败或雪崩问题指的是在微服务架构中&#xff0c;由于服务间的相互依赖和调用&#xff0c;当一个服务出现故障时&#xff0c;会引起调用它的服务也出现故障&#xff0c;进而引发整个调用链路的多个服务都出现故障&#xff0c;最终导致整个系统崩溃的现象。 产生…

阿里巴巴国际站获取商品详情item_get接口技术分享

在跨境电商日益繁荣的今天&#xff0c;如何高效、准确地获取商品信息成为了商家们关注的焦点。阿里巴巴作为全球领先的B2B电商平台&#xff0c;其提供的item_get API接口成为了跨境电商获取商品信息的必备工具。本文将详细介绍item_get接口的功能、优势、应用场景以及返回数据字…