Redis 核心数据结构和应用(下)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 常用 5 种数据类型 string, list, set, hash, zset

1. 36 氪发推送消息,消息id 1001


lpush msg:{zhangsan id} 1001 


2. 汽车之家推送消息, 消息id 1002


lpush msg:{zhangsan id} 1002


3. 获取最新消息


lrange msg:{zhangsan id} 0 4


遇到的问题:如果大 V 关注的用户上几千万,那么我们就可以分批次发消息


  1. 先发在线的用户


  1. 再后台分批次发其他用户


4. set


Set 常用操作


sadd key member [member ...]  // 往集合key 中存入数据,如果元素存在则忽略若key 不存在则新建
srem key member [member ...]  // 从集合 key 中删除元素
smember key                   // 获取集合 Key 中所有元素
scard key                     // 获取集合 key 中的元素个数
simember key member           // 判断 member 元素是否存在与集合 key 中
srangmembre key [count]       // 从集合中选出 count 个元素。 元素不从 key 中删除
spop key [count]              // 从集合 key 中选出 count 个元素, 元素从 key 中删除


Set 运算操作


sinter key [key..]                                  // 交集运算
sinterstore destination key [key ...]               // 将交集结果存入新的集合 destination 中
sunion key [key ...]                                // 并集运算
sunionstore destination key [key ...]               // 将并集结果存入新的集合 destination 中
sdiff key [key ...]                                 // 差集运算
sdiffstore destination key [key ...]                // 将差集结果存入新集合 destination 中


使用场景


1)微信抽奖功能


  1. 点击参与加入集合


sadd key {userId}


  1. 查看参与抽奖的所有用户


smembers key


  1. 抽取 count 名中间者


srandmember key [count] / spop key [count]
srandmember 抽奖完成后,那么就没有这个用户了
spop 抽奖完成一个这个用户就没有了


2) 微信新浪微博点赞,收藏,标签


image.png


  1. 点赞


sadd like:{消息id} {用户id}


  1. 取消点赞


srem like:{消息id} {用户id}


  1. 检查用户是否点赞


sismember like:{消息id} {用户id}


  1. 获取点赞的用户列表


smembers like:{消息id}


  1. 获取点赞用户数


scard like:{消息id}


集合操作


sinter set1 set2 set3 -> {c}  //交集
sumion set1 set2 set3 -> {a, b, c, d ,e} // 并集
sdiff set1 set2 set3 -> {a} // 差集, 第一个集合减去后面集合的并集


集合操作实现微博关注模型


image.png


  1. 张三关注的人


zhangsan -> {lisi , wangmazi}


  1. 李四关注的人


lisi -> {zhaoliu, wangmazi}


  1. 王麻子关注的人


wangmazi -> {lisi, zhangsan, wangwu}


  1. 张三和李四共同关注的人


sinter zhangsan lisi -> {wangmazi}


  1. 张三罐组的人也关注了李四


sismember zhangsan lisi
sisimember wangmazi lisi


  1. 我可能认识的人


sdiff  lisi zhangsan -> {zhaoliu}


集合操作实现电商商品筛选


image.png


sadd brand:huawei P40
sadd brand:xiaomi mi-11
sadd brand:iPhone iphone11
sadd os:android P40 mi-11
sadd cpu:brand:intel P40 mi-11
sadd ram:8G mi-11 iphone11
     sinter os:andorid cpu:brand:intel ram:8G -> {P40, mi-11}


5. zset


zset 常用操作


zadd key score member [[score member] ... ]      // 往有序集合 key 中加入代分值元素
zrem key member [member ... ]                    // 从有序集合 key 中删除元素
zscore key score                                 // 返回有序集合 key 元素 member 的分值
zrange key start stop [withscores]               // 正序获取有序集合 key 下标 start 下标到 stop 下标的元素
zrevrages key start stop [withscores]            // 倒序获取有序集合 key 从 start 下标到 stop 下标的元素
zset 集合操作
zunionstore destkey numkeys key [key ...]        // 并集计算
zunionstore destkey numkeys key [key ...]        // 并集计算


热搜推荐


image.png


  1. 点击新闻


zincrby hotnews:20210120 1 中国航天2021开门红 


  1. 展示当日排行前 10


zrevrange hotnews:20210120 0 9 withscores


  1. 七日搜索榜单计算


zunionstore hotnews:20210114 - hotnews:20210120  10


  1. 展示七日排行前十


zrevrange hotnews:20210114 - hotnews:20210120  0 9 withscores



相关实践学习
基于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
相关文章
|
18天前
|
存储 消息中间件 NoSQL
Redis数据结构:List类型全面解析
Redis数据结构——List类型全面解析:存储多个有序的字符串,列表中每个字符串成为元素 Eelement,最多可以存储 2^32-1 个元素。可对列表两端插入(push)和弹出(pop)、获取指定范围的元素列表等,常见命令。 底层数据结构:3.2版本之前,底层采用**压缩链表ZipList**和**双向链表LinkedList**;3.2版本之后,底层数据结构为**快速链表QuickList** 列表是一种比较灵活的数据结构,可以充当栈、队列、阻塞队列,在实际开发中有很多应用场景。
|
22天前
|
机器学习/深度学习 存储 人工智能
数据结构在实际开发中的广泛应用
【10月更文挑战第20天】数据结构是软件开发的基础,它们贯穿于各种应用场景中,为解决实际问题提供了有力的支持。不同的数据结构具有不同的特点和优势,开发者需要根据具体需求选择合适的数据结构,以实现高效、可靠的程序设计。
50 7
|
23天前
|
存储 消息中间件 NoSQL
Redis 数据结构与对象
【10月更文挑战第15天】在实际应用中,需要根据具体的业务需求和数据特点来选择合适的数据结构,并合理地设计数据模型,以充分发挥 Redis 的优势。
54 8
|
22天前
|
存储 NoSQL Java
介绍下Redis 的基础数据结构
本文介绍了Redis的基础数据结构,包括动态字符串(SDS)、链表和字典。SDS是Redis自实现的动态字符串,避免了C语言字符串的不足;链表实现了双向链表,提供了高效的操作;字典则类似于Java的HashMap,采用数组加链表的方式存储数据,并支持渐进式rehash,确保高并发下的性能。
介绍下Redis 的基础数据结构
|
18天前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
18天前
|
存储 NoSQL Redis
Redis常见面试题:ZSet底层数据结构,SDS、压缩列表ZipList、跳表SkipList
String类型底层数据结构,List类型全面解析,ZSet底层数据结构;简单动态字符串SDS、压缩列表ZipList、哈希表、跳表SkipList、整数数组IntSet
|
14天前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
90 9
|
5天前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
15 1
|
8天前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。
|
11天前
|
存储 JavaScript 前端开发
执行上下文和执行栈
执行上下文是JavaScript运行代码时的环境,每个执行上下文都有自己的变量对象、作用域链和this值。执行栈用于管理函数调用,每当调用一个函数,就会在栈中添加一个新的执行上下文。

热门文章

最新文章