redis zset 多值排序

news/2024/7/8 8:04:35/文章来源:https://www.cnblogs.com/FCmmmmmm/p/18286525

最近面试老被问到ZSet相关的排序题,平时也没相关的经验,一问一个不吱声。抽有点时间,自己尝试去想了一种解决方案。

ZSet相关常用命令

添加成员

ZADD [Key] [Score] [Member]
//例 向班级a里面插入小明的80分
ZADD   a     80     xiaoming

有序获取

//从低到高获取指定区间的人员
ZRANGE [Key] [Start] [Stop] [WITHSCORES
//例 获取班级a里面所有人的分数 
ZRANGE     a    0        -1     WITHSCORES 
//例 获取班级a里面分数从低到高10个人的分数 
ZRANGE     a    0         9     WITHSCORES
//从高到低获取指定区间的人员 
ZREVRANGE [Key] [Start] [Stop] [WITHSCORES]

 下标参数 start 和 stop 都以 0 为底,也就是说,以 0 表示有序集第一个成员,以 1 表示有序集第二个成员,以此类推。

你也可以使用负数下标,以 -1 表示最后一个成员, -2 表示倒数第二个成员,以此类推。 

TIPS: 如果分数相同的话,Redis会按照Member的词典顺序排序。比如 xiaoming和 xiaoli 都是80分,但是他两中的 l < m ,会导致分数从小到大 xiaoli 排在 xiaoming 前面。

增加分数 

ZINCRBY [Key]  [Score_Step]  [Member]
//例 发现班级a里面小明分数统计错误,需要再加10分
ZINCRBY a 10 xiaoming

 

 Redis场景设计

某公司举办了一次小型售卖公司周边礼物的活动,需要你实时统计这场活动商品售卖数量前x的商品。

  用zset实现也比较简单,以 活动ID 为Key , 商品ID 为 Member,售卖额为 Score。每次商品售卖量增加时调用 ZINCRBY 原子增加 Score 即可。

ZADD    [活动ID] [售卖数量]      [商品ID]
ZINCRBY [活动ID] 1 [商品ID]

一般真实场景没这么简单,比如在此基础上产品肯要求售卖数量相同时,再按照商品价格从低到高排序,相同价格的再按照最新售卖时间从小到大排序。 

   可以尝试将Score分段,比如定制一个标准Score数值模板 10000000000000 (举个例子,结合业务情况自己设置),将蓝色部分当最新售卖时间排序值,绿色部分是价格排序值,红色部分是真实销售量。售卖量增加只需要加红色部分即可

  时间区间的排序值可以利用时间戳计算,但是Score精度只有16位,此时可以将活动创建时间当成时间戳起始值、减少时间戳精确度(以小时级)等方式减少位数。

  

  售卖一个商品之后,每次更新前先查一下redis里面的值,计算一下时间差值再 ZINCRBY 增加 Score。

    1、先取出商品对应的score

    ZSCORE [活动ID] [商品ID]

    2、计算时间部分的变更量(假设变更了1小时)

    7200 =  time.now().Unix()-time.Unix(score%1000000, 0)

    3、对score进行变更

    ZINCRBY [活动ID]   1000007200   [商品ID]     

       

 

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Git的基本应用

Git工作区:就是你在电脑里能看到的目录。也就是放置源码的地方。和.git文件同级目录下 暂存区:英文叫 stage 或 index。一般存放在 .git 目录下的 index 文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。 版本库:工作区有一个隐藏目录 .git,这个不算工作区…

2024.7.5 CTF MISC 任务清单

目录:数据包中的线索荷兰宽带数据泄露被偷走的文件 数据包中的线索 BUUCTF在线评测 (buuoj.cn) 打开一看是可以用wireshark 流量分析的题 直接查http的包即可 (大部分都是TCP的包,直接过滤http的包) 然后保存就会得到 php 文件 ,直接打开它,似乎是Base64解密 解密后看到…

Go语言高级数据类型之指针篇

目录一.指针1.指针概述2.指针地址和指针类型3.定义指针变量4.指针细节4.1 可以通过改变指向值4.2 指针变量接收的一定是地址值4.3 指针的地址不可以不匹配4.4 基础数据类型又称为值类型5.指针传值5.1 案例一5.2 案例二(注意,数组也是值类型哟~)二.new和make1.new1.1 new概述…

[LeetCode] 380. Insert Delete GetRandom O(1)

竟然不需要import random,击败了5%的O(1)哈哈哈 class RandomizedSet:def __init__(self):self.data = []def insert(self, val: int) -> bool:if val in self.data:return Falseelse:self.data.append(val)return Truedef remove(self, val: int) -> bool:if val in …

springboot下的纯html页面乱码带问号?

springboot下的纯html页面乱码带问号? html访问后端接口 返回的Content-Type: text/html;charset=ISO-8859-1所以大概率是springboot编码影响到了html页面在springboot的application.yml加上以下配置server:servlet:encoding:#enabled: true #让系统的CharacterEncdoingFil…

运用inlinehook主动调用函数

这里拿arm32的环境下运行的来举例 首先我们先准备这两个函数可以清楚的看到,解锁英雄那里有个参数为id,可以猜到为英雄id(元气的英雄id为1,2,3...) 所以,我们在update进行hook.用他调用该函数 我们首先分配个内存页,方便我们编写hook段的代码编写如下的汇编将a地址的值0…

等保V2.0测评指标

等保V2.0测评指标列表清单:1、物理和环境安全:主要关注机房的物理环境,包括机房位置的选择、温湿度控制、防盗、防火、防潮、防水、防雷击、电力供应、电磁防护等方面的要求。确保服务器房间、设备存储区域等得到适当的物理保护。2、网络和通信安全:这一指标主要对网络安全…

jdk1.8安装到d盘

下载地址双击直接安装,安装过程中需要指定jdk和jre的安装目录安装完成后验证,打开cmdC:\Users\xxx>java -version java version "1.8.0_381" Java(TM) SE Runtime Environment (build 1.8.0_381-b09) Java HotSpot(TM) 64-Bit Server VM (build 25.381-b09, mix…

vscode设置背景图片

1.vscode应用商店搜索下载 background 2.更改settings.json3.搜索 "background.fullscreen"; 保存重启vscode

《操作系统》第三章的重难点内容_补充笔记

前言 王道408书上很多内容是没有的,但是这些内容是超级重要的考点,也能加深理解,所以我将其补充一下。 《25操作系统408王道》p184-185 混淆点 页框、页帧是指内存中。页框号同理。 页面、页是指页表中。页号、页内偏移量同理。 每个页表项占多少字节【经常考察】 一个页表项…

收集了几个Github文件代理下载的站点

收集了几个Github文件代理下载的站点 1、GitClone 2、ghproxy 3、moeyy 最后实在不行可以去Gitee 上边,新建仓库->从现有仓库导入,然后从gitee上下载

Power BI实用技巧——批量爬取网页数据

Power BI实用技巧——批量爬取网页数据假设我是个电商公司老板,我的公司最近要上架一款新产品,我需要你来帮我做一个竞品分析,同类型产品的评分、价格、销量、市场占有率最高的品牌详情,来帮助我进行前期宣发,这个时候最让你一筹莫展的环节是什么?我猜是数据从哪来?竞争…

Hello,NanXi~

今天是2024.07.05,注册博客已经4天了,零零散散的抽时间把博客园美化了一下(我有自定义美化的习惯,喜欢自定义性强的东西),毕竟这是我的新家啊!我准备丢掉之前自己搭建的博客了,改用博客园平台,这样会很方便,省下了自己维护网站的时间,而且平台的稳定性自然是比个人网…

HDLC报文简单分析

最近在学习HDLC协议,从刚开始的一窍不通到现在的懵懵懂懂,下面分享一段报文解析,给初学者一点点经验的分析。 报文:7E A0 57 03 02 B8 4B 5B E6 E7 00 C4 01 C1 00 01 01 02 08 09 0C 07 E8 04 05 05 0D 08 33 FF 80 00 02 06 00 00 00 02 06 00 00 00 05 06 00 00 00 07 0…

喜闻乐见的颓柿子

从洛谷搬来的高三时做的题,主要目的是测试既然一开始的时候把 dp 方程写了,第三问不如就尝试一下。 接下来我们考虑一下对 $ a_n=a_{n-1}+(n-1)a_{n-2} $ 找出通项。 首先有 $ a_1=1,,a_2=2, $ 化一下式子: \[a_n=a_{n-1}+(n-1)a_{n-2} \]即 \[\frac{a_n}{(n-1)!}=\frac{a_…

safe_shellcode

[HNCTF 2022 Week1]safe_shellcode 思路 下载附件,名称为shellcoder,很明显的shellcode提示。 判断题目解法可能是shellcode利用 常规流程查看保护发现存在NX保护,但是让我们以shellcode的思路去解题,则可能存在修改权限的函数mprotect ida打开分析分析代码,发现存在一个m…

环境变量的一些作用

环境变量的一些作用 接上篇:如果希望批量执行一组cmd指令,而不是像之前那样一次执行一个cmd指令,那么可以通过批处理来实现。将多条cmd指令存放在一个以.bat为扩展名的文件里,然后执行这个文件,这个文件就叫批处理文件。 在d:\aaa文件夹里新建demo.bat编辑,记得把文件扩展名…

Jitsi搭建流程

系统要求:Debian 11 (DD 脚本 非必需 DD,用原来的系统也 OK)。安装好宝塔(需要用到https证书)、Nninx前置: sudo -i # 切换到 root 用户apt update -y # 升级 packagesapt install wget curl sudo vim git -y # Debian 系统比较干净,安装常用的软件 1:安装 Docker 环…

代码随想录算法训练营第五十三天 | 739.每日温度 496.下一个更大的元素I 503.下一个更大的元素II

739.每日温度 题目链接 文章讲解 视频讲解 单调栈适合的场景:求当前元素左面或右面第一个比它大或小的元素单调栈里存什么元素 只要存下标就可以了,比较元素时可以通过下标取元素 单调栈是单调增还是单调减(从栈顶到栈底) 使用单调增的单调栈解题步骤:遍历数组,当栈空时直…

积分中值定理的证明1

积分中值定理的证明如下: