【Redis基础知识 三】Redis五种常用数据结构应用场景(三)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 【Redis基础知识 三】Redis五种常用数据结构应用场景

场景十:利用set交并差实现推荐系统池

可以使用如下命令实现:

总而言之就是实现数据的关联差异:

场景十一:利用set不重复特征获取所有业务系统权限

我们可以设置用户为一个set集合,他的权限为value,然后合并所有用户就可以拿到所有不重复权限

场景十二:利用set不重复特征获取UV和IP数据

我们可以采用将ip或者cookie放到set中保证不重复,对同类型数据进行快速去重

场景十三:利用set不重复特征实现黑白名单

实现时把对应黑白名单信息源添加到set中即可。

操作规范

Sorted_Set类型

redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。有序集合的成员是唯一的,但分数(score)却可以重复。

基本操作

操作都是关联score的,获取时按照score值来进行排序获取。

同时需要注意,删除的时候按照值删除,而不是按照score删除。

扩展操作【应用场景】

sorted_set最经典的应用场景就是进行排行榜设置了。当然除此之外还有些带权重的操作都类似:

  • 场景十四:利用set不重复排序特征实现计数器组合排序排行榜功能
  • 场景十五:利用set不重复排序特征实现基于时效性任务提醒
  • 场景十六:利用set不重复排序特征实现带权重任务队列

接下来看下这三种场景

场景十四:利用set不重复排序特征实现计数器组合排序排行榜功能

可以利用如下命令直接获取排名

场景十五:利用set不重复排序特征实现基于时效性任务提醒

队列中全部为vip,按照会员时间长短排序,短时间到期后提醒下一个。

场景十六:利用set不重复排序特征实现带权重任务队列

仅是任务队列可以通过队列,但是如果队列中的任务有优先级,则需要使用带权重的。

操作规范

Redis数据结构综合应用场景及总结

最后总结一下各类数据结构他们的性能和特点吧,方便之后用的时候好记忆:

数据类型 特点 查询性能 插入、删除性能 适用场景
string 性能高 O(1)【多指令时为O(N)】 O(1)【多指令时为O(N)】 计数器、分布式自增主键、按时按次服务计算、热点数据刷新、时效性投票系统
hash 结构性 O(1)【同时设置多字段时为O(N)】 O(1)【同时设置多字段时为O(N)】 购物车操作、抢购系统
list 顺序性 O(n) O(1) 社交点赞、任务队列、分布式日志顺序显示
set 不重复性 O(1)【多值操作时为O(N)】 O(1)【多值操作时为O(N)】 黑白名单、推荐系统、业务系统权限整合、UV\IP数据统计
sorted_set 不重复排行榜 O(1) O(log(n)) 合并排行榜、带权重的任务队列、vip超时队列【时间作为得分】

总体而言,redis的设计就是简单、快,时间复杂度最多不超过O(N),并且设计了多种有特色的数据结构,利用这些数据结构服务现有的业务场景。

时间复杂度部分来源于 https://blog.csdn.net/zzm848166546/article/details/80360665,深度好文

限时限次结算的服务控制

按此结算的服务限制需要限制:每分钟最多调用10次

选定类型:string,选定命令 setex , 设定redis的生命周期,每次incr后get一次,到10次的时候禁止调用,并且生命周期到期后清空值。

操作同理,但是可以设置数字的最大值,利用超过报异常来避免每次get操作

微信接收消息顺序通知

需要区分置顶用户和普通用户,并且后来的消息在最上边,先看到【按栈模型使用】

选定类型:list、set,选定命令 消息来了之后先和set比较是否为置顶用户然后加入不同的list,并且后来的list较新展示

如果需要做计数,再对相同的消息设备同步使用一个计数redis去实现。当然这里使用sorted_set也可以,用时间作为排行榜得分。

总结

通过一周的学习终于从场景的角度更深入的理解了redis的使用,基于这周的学习内容,依据redis的不同数据结构的特性,再次梳理下场景:

  • string,redis对于KV的操作效率很高,可以直接用作计数器。例如,统计在线人数等等,另外string类型是二进制存储安全的,所以也可以使用它来存储图片,甚至是视频等。【计数器、分布式自增、分布式锁、热点数据刷新】
  • hash,存放键值对,一般可以用来存某个对象的基本属性信息,例如,用户信息,商品信息等,另外,由于hash的大小在小于配置的大小的时候使用的是ziplist结构,比较节约内存,所以针对大量的数据存储可以考虑使用hash来分段存储来达到压缩数据量,节约内存的目的,例如,对于大批量的商品对应的图片地址名称。比如:商品编码固定是10位,可以选取前7位做为hash的key,后三位作为field,图片地址作为value。这样每个hash表都不超过999个,只要把redis.conf中的hash-max-ziplist-entries改为1024,即可。【数据对象存储、秒杀系统、分布式锁】
  • list,列表类型【顺序性】,可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能。【任务队列、社交点赞、分布式日志顺序显示】
  • set,集合,整数的有序列表可以直接使用set。可以用作某些去重功能,例如用户名不能重复等,另外,还可以对集合进行交集,并集操作,来查找某些元素的共同点。【推荐系统、数据去重、运营数据统计、黑白名单】
  • Sorted_Set,有序集合,可以使用范围查找,排行榜功能或者topN功能。【排行榜】

总而言之,string当做计数器,hash存储对象,list实现消息队列(安全队列),set用来去重和联表查询,zset用来做排行榜。

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
2月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
71 4
|
2月前
|
NoSQL Java 数据处理
基于Redis海量数据场景分布式ID架构实践
【11月更文挑战第30天】在现代分布式系统中,生成全局唯一的ID是一个常见且重要的需求。在微服务架构中,各个服务可能需要生成唯一标识符,如用户ID、订单ID等。传统的自增ID已经无法满足在集群环境下保持唯一性的要求,而分布式ID解决方案能够确保即使在多个实例间也能生成全局唯一的标识符。本文将深入探讨如何利用Redis实现分布式ID生成,并通过Java语言展示多个示例,同时分析每个实践方案的优缺点。
77 8
|
1月前
|
存储 消息中间件 缓存
Redis 5 种基础数据结构?
Redis的五种基础数据结构——字符串、哈希、列表、集合和有序集合——提供了丰富的功能来满足各种应用需求。理解并灵活运用这些数据结构,可以极大地提高应用程序的性能和可扩展性。
40 2
|
2月前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
2月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
47 5
|
2月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
2月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
265 9
|
2月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
42 1
|
5天前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
116 75
|
5天前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
27 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】