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

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容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
相关文章
|
1月前
|
NoSQL 安全 测试技术
Redis游戏积分排行榜项目中通义灵码的应用实战
Redis游戏积分排行榜项目中通义灵码的应用实战
52 4
|
20天前
|
存储 消息中间件 缓存
Redis 5 种基础数据结构?
Redis的五种基础数据结构——字符串、哈希、列表、集合和有序集合——提供了丰富的功能来满足各种应用需求。理解并灵活运用这些数据结构,可以极大地提高应用程序的性能和可扩展性。
26 2
|
24天前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
45 5
|
23天前
|
并行计算 算法 测试技术
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面
C语言因高效灵活被广泛应用于软件开发。本文探讨了优化C语言程序性能的策略,涵盖算法优化、代码结构优化、内存管理优化、编译器优化、数据结构优化、并行计算优化及性能测试与分析七个方面,旨在通过综合策略提升程序性能,满足实际需求。
54 1
|
1月前
|
监控 NoSQL 网络协议
【Azure Redis】部署在AKS中的应用,连接Redis高频率出现timeout问题
查看Redis状态,没有任何异常,服务没有更新,Service Load, CPU, Memory, Connect等指标均正常。在排除Redis端问题后,转向了AKS中。 开始调查AKS的网络状态。最终发现每次Redis客户端出现超时问题时,几乎都对应了AKS NAT Gateway的更新事件,而Redis服务端没有任何异常。因此,超时问题很可能是由于NAT Gateway更新事件导致TCP连接被重置。
|
1月前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
40 5
|
1月前
|
存储 NoSQL 关系型数据库
Redis的ZSet底层数据结构,ZSet类型全面解析
Redis的ZSet底层数据结构,ZSet类型全面解析;应用场景、底层结构、常用命令;压缩列表ZipList、跳表SkipList;B+树与跳表对比,MySQL为什么使用B+树;ZSet为什么用跳表,而不是B+树、红黑树、二叉树
|
1月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
191 9
|
1月前
|
存储 算法
非递归实现后序遍历时,如何避免栈溢出?
后序遍历的递归实现和非递归实现各有优缺点,在实际应用中需要根据具体的问题需求、二叉树的特点以及性能和空间的限制等因素来选择合适的实现方式。
32 1
|
1月前
|
存储 算法 Java
数据结构的栈
栈作为一种简单而高效的数据结构,在计算机科学和软件开发中有着广泛的应用。通过合理地使用栈,可以有效地解决许多与数据存储和操作相关的问题。