golang工程中间件——redis常用结构及应用(set,zset)

news2025/1/16 18:52:18

Redis

命令中心

这些篇文章专门以应用为主,原理性的后续博主复习到的时候再详细阐述

set

集合,为了描述它的特征,我们可称呼为无序集合;集合的特征是唯一,集合中的元素是唯一存在 的;

存储结构

元素都为整数且节点数量少时,使用整数数组存储;否则使用字典存储;

基础命令

# 添加一个或多个指定的member元素到集合的 key中
SADD key member [member ...]
# 计算集合元素个数
SCARD key
# SMEMBERS key
SMEMBERS key
# 返回成员 member 是否是存储的集合 key的成员
SISMEMBER key member
# 随机返回key集合中的一个或者多个元素,不删除这些元素
SRANDMEMBER key [count]
# 从存储在key的集合中移除并返回一个或多个随机元素
SPOP key [count]
# 返回一个集合与给定集合的差集的元素
SDIFF key [key ...]
# 返回指定所有的集合的成员的交集
SINTER key [key ...]
# 返回给定的多个集合的并集中的所有成员
SUNION key [key ...]

应用

抽奖
# 添加抽奖用户
sadd Award:1 10001 10002 10003 10004 10005 10006
sadd Award:1 10009
# 查看所有抽奖用户
smembers Award:1
# 抽取多名幸运用户
srandmember Award:1 10
# 如果抽取一等奖1名,二等奖2名,三等奖3名,该如何操作
共同关注
sadd follow:A person1 person2 person3 person4 person5
sadd follow:C person3 person4
# 交集
sinter follow:A follow:C
推荐好友
sadd follow:A person1 person2 person3 person4 person5
sadd follow:C person3 person4
# C可能认识的人:
sdiff follow:A follow:C

zset

有序集合;它的特征是有序唯一的集合;通常用来实现排行榜;

基础命令

# 添加到键为key有序集合(sorted set)里面
ZADD key [NX|XX] [CH] [INCR] score member [score member ...]
# 从键为key有序集合中删除 member 的键值对
ZREM key member [member ...]
# 返回有序集key中,成员member的score值
ZSCORE key member
# 为有序集key的成员member的score值加上增量increment
ZINCRBY key increment member
# 返回key的有序集元素个数
ZCARD key
# 返回有序集key中成员member的排名
ZRANK key member
# 返回存储在有序集合key中的指定范围的元素 order by id limit 1,100
ZRANGE key start stop [WITHSCORES]
# 返回有序集合key中,分数在min和max之间的所有元素(且包含min和max); limit 指定从第几个开始返回多少个元素
ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]

有序集合比较规则,先通过比较 score 来确定排序,如果 score 相同则比较 member; member 比较规则是按照字母顺序来进行比较;

存储结构

节点数量少且字符串长度小时使用压缩列表存储;否则使用跳表来进行存储;

应用

热榜
# 点击新闻:
zincrby hot:20210601 1 10001
zincrby hot:20210601 1 10002
zincrby hot:20210601 1 10003
zincrby hot:20210601 1 10004
zincrby hot:20210601 1 10005
zincrby hot:20210601 1 10006
zincrby hot:20210601 1 10007
zincrby hot:20210601 1 10008
zincrby hot:20210601 1 10009
zincrby hot:20210601 1 10010
# 获取排行榜:
zrevrange hot:20210601 0 9 withscores
延时队列

将消息序列化成一个字符串作为 zset 的 member;这个消息的到期处理时间作为 score,然后用 多个线程轮询 zset 获取到期的任务进行处理。

在这里插入图片描述

# delay thread
zadd delay:1 now+5 task1
zadd delay:1 now+10 task2
# check thread
# for {
# vals :=
zrangebyscore delay:1 0 now limit 0 1
# val := vals[0]
zrem delay:1 val
# handle(val)
# }

分布式定时器

在这里插入图片描述

生产者将定时任务 hash 到不同的 redis 实体中,为每一个 redis 实体分配一个 dispatcher 进 程,用来定时获取 redis 中超时事件并发布到不同的消费者中

时间窗口限流

限流是窗口移动,在一个窗口内限流比如六秒窗口:1s-7s, 2-8s, 3s-9s

熔断则是分成一个个时间区间,区间内不能超过多少次请求:1s-6s, 7s-12s

# 指定用户 user_id 的某个行为 action 在特定时间内 period 只允许发生操作次数
max_count
# key limit:10001:action1
# now 时间单位为 毫秒
zadd limit:10001:action1 now now
# 删除score 在0~now-period*1000 内的元素,保留最近period*1000 内的元素
zremrangebyscore limit:10001:action1 0 now - period*1000
# count =
zcard limit:10001:action1
expire limit:10001:action1 60+1
# 比较 count 与 max_count
# 如果 count > max_count 说明超过次数;否则没有超过限定次数
# 第二种实现
# 比较 string + expire
# val =
incr limit:10001:action1
# val =
incr limit:10001:action1
expire limit:10001:action1 60+1

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

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

相关文章

易点易动固定资产管理系统:定制流程与用量控制的高效管理利器

固定资产管理对于企业来说至关重要,而如何提高固定资产管理的效率和精确度一直是企业管理者关注的焦点。易点易动固定资产管理系统以其自定义固定资产流程和用量控制功能,成为了提升固定资产管理效率的利器。本文将详细介绍易点易动固定资产管理系统的自…

【技术驿站】分布式基础与常见面试问题

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

虚幻5.3打包Windows失败

缺失UnrealGame二进制文件。 必须使用集成开发环境编译该UE项目。或者借助虚幻编译工具使用命令行命令进行编译 解决办法: 1.依次点击平台-项目启动程序 2.点击后面的按钮进行设置 3.稍等后,打包后的程序即可运行,之后就可以愉快的打包了

10个改变你Figma体验的高效插件!

Figma Ex 实用指数:⭐️⭐️⭐️⭐️⭐️ figma插件一直受到批评,很难找到。特别是一旦插件安装得太多,你就得去大海捞针,这是浪费时间。 这个工具可以使Figma的所有插件直接悬浮在右边的画布上,最重要的是显示每个插…

智慧工地管理系统源码 智慧大屏、手机APP、SaaS模式

一、智慧工地可以通过安全八要素来提升安全保障,具体措施包括: 1.安全管理制度:建立科学完善的安全管理制度,包括安全标准规范、安全生产手册等,明确各项安全管理职责和要求。 2.安全培训教育:对工地人…

DHorse(K8S的CICD平台)的实现原理

综述 首先,本篇文章所介绍的内容,已经有完整的实现,可以参考这里。 在微服务、DevOps和云平台流行的当下,使用一个高效的持续集成工具也是一个非常重要的事情。虽然市面上目前已经存在了比较成熟的自动化构建工具,比如…

汽车标定技术(六)--基于模型开发如何生成完整的A2L文件(2)

目录 1. 自定义ASAP2文件 2. asap2userlib.tlc需要修改的部分 3. 标定量观测量地址替换 3.1 由elf文件替换 3.2 由map文件替换 3.3 正则表达式(含asap2post.m修改方法) 4.小结 书接上文汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)-C…

Python进阶该怎么学?有什么书推荐吗?

给大家再分享一下整理出来的Python进阶以及Python实践操作可以参考学习的堪称经典的书籍,同样是豆瓣高分榜!内容有点长,一定要耐心看完。 Python进阶学习书籍 Effective Python:编写高质量Python代码的90个有效方法(…

UVM 源码__report 机制浅析(一)

以uvm_error 为例浅析其背后的故事: uvm_error 是一个宏,在声明的时候只需要传入ID 和 msg,均为字符类型; 分析以上源码,发现起内部主要是调用了一个叫做uvm_report_enabled的函数进行判断,打印函数使用的…

零基础学Python有什么建议?如何入门编程?

零基础,如何入门编程? 首先要明确一点,编程之所以被成为超能力,在于其无所不能。学到深处,你自然可以跳脱限制,随心所欲;入门之时,你却处处碰壁,像蹒跚学步的孩童。其实…

Sublime Text Dev v4.0(HTML代码编辑)

Sublime Text是一款代码编辑器,也是一个先进的文本编辑器,支持HTML和散文。该软件由程序员Jon Skinner于2008年1月份开发,最初被设计为一个具有丰富扩展功能的Vim。 Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图、…

人工智能进入强监管时代

全球AI产业正进入“强监管”时代,对人工智能安全威胁的监管正在成为各国政府普遍关注的重要议题。 以ChatGPT为代表的基于LLM(大语言模型)的生成式人工智能应用正风靡全球,各行各业都在争先恐后将其集成到前端和后端的各种系统中,与此同时生…

Docker - 概述

Docker概述 Docker概述Docker安装Docker命令 镜像命令容器命令操作命令 … Docker镜像容器数据卷DockerFileDocker网络管理IDEA整合DockerDocker ComposeDocker Swarm 简化版的K8s Docker为什么出现? 传统的项目部署,环境配置是十分麻烦,第…

【理解链表指针赋值】链表中cur->next = cur->next->next->next与cur =cur->next->next的区别

最近在做链表的题目的时候,对于所定义的cur链表指针产生了一些疑惑,查阅资料后整理一下我的理解: /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode(int x) : val(x), next(n…

Linux 设置静态IP(Ubuntu 20.04/18.04)

以Ubuntu20.04示例 第一步:查看当前网络信息 ifconfig 本机网卡名为:ens32,IP地址为:192.168.15.133,子网掩码为:255.255.255.0 第二步:查看当前网关信息 route -n 网关地址为:1…

麒麟KYLINOS命令行设置系统静音

原文链接:麒麟KYLINOS命令行设置系统静音 hello,大家好啊,今天给大家带来一篇在麒麟KYLINOS上使用命令行调节系统静音的方法,有时候需要制作模板,便可以采用此方法,话不多说,一起来看看吧。 1、…

aardio 模式匹配函数

废话不多说 直接开干! 知识点 string.find 使用模式匹配查找字符串并返回起始位置(i),结束位置(j); 第三个参数pos指定搜索开始的位置,这个参数可以省略(使用默认值1); pos如果为负数,则从右侧倒数计数(-1表示字符串最后一个字符)。 函数返回…

Mysql 一步到位实现插入或替换数据(REPLACE INTO语句)

单条数据插入/替换 比如有一个数据表叫test_table,包含: 主键:key_id数据:value 运行: REPLACE INTO test_table (key_id,value) VALUES ("id_1","value_1"); REPLACE INTO test_table (key_id,value) VAL…

星乐园项目┃助学无止境·探访暖人心

2023年7月10日至10月31日,广州市从化区齐家社会工作服务中心的“星乐园-乡村儿童公益辅导服务项目”社工带领高校志愿老师、社区志愿者在从化区城郊街新开村、太平镇西湖村分阶段、分批次对两个助学点的学困儿童家庭开展了入户探访活动。旨在通过走访了解他们的生活…

第70讲:MySQL数据库全局锁的核心概念

文章目录 1.全局锁的概念2.使用全局锁的语法结构3.全局锁的基本使用 1.全局锁的概念 全局锁是对整个数据库实例添加一个锁,全局锁是面向整个数据库实例的,而不是单个数据库,添加锁之后这个实例就会处于只读状态,此时所有的数据库…