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



相关文章
|
21天前
|
消息中间件 缓存 NoSQL
Redis各类数据结构详细介绍及其在Go语言Gin框架下实践应用
这只是利用Go语言和Gin框架与Redis交互最基础部分展示;根据具体业务需求可能需要更复杂查询、事务处理或订阅发布功能实现更多高级特性应用场景。
151 86
|
21天前
|
存储 缓存 NoSQL
Redis基础命令与数据结构概览
Redis是一个功能强大的键值存储系统,提供了丰富的数据结构以及相应的操作命令来满足现代应用程序对于高速读写和灵活数据处理的需求。通过掌握这些基础命令,开发者能够高效地对Redis进行操作,实现数据存储和管理的高性能方案。
61 12
|
20天前
|
存储 消息中间件 NoSQL
【Redis】常用数据结构之List篇:从常用命令到典型使用场景
本文将系统探讨 Redis List 的核心特性、完整命令体系、底层存储实现以及典型实践场景,为读者构建从理论到应用的完整认知框架,助力开发者在实际业务中高效运用这一数据结构解决问题。
|
29天前
|
存储 缓存 NoSQL
【Redis】 常用数据结构之String篇:从SET/GET到INCR的超全教程
无论是需要快速缓存用户信息,还是实现高并发场景下的精准计数,深入理解String的特性与最佳实践,都是提升Redis使用效率的关键。接下来,让我们从基础命令开始,逐步揭开String数据结构的神秘面纱。
|
1月前
|
存储 缓存 监控
Redis分区的核心原理与应用实践
Redis分区通过将数据分散存储于多个节点,提升系统处理高并发与大规模数据的能力。本文详解分区原理、策略及应用实践,涵盖哈希、范围、一致性哈希等分片方式,分析其适用场景与性能优势,并探讨电商秒杀、物联网等典型用例,为构建高性能、可扩展的Redis集群提供参考。
69 0
|
5月前
|
缓存 NoSQL 关系型数据库
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
美团面试:MySQL有1000w数据,redis只存20w的数据,如何做 缓存 设计?
|
14天前
|
存储 缓存 NoSQL
Redis专题-实战篇二-商户查询缓存
本文介绍了缓存的基本概念、应用场景及实现方式,涵盖Redis缓存设计、缓存更新策略、缓存穿透问题及其解决方案。重点讲解了缓存空对象与布隆过滤器的使用,并通过代码示例演示了商铺查询的缓存优化实践。
82 1
Redis专题-实战篇二-商户查询缓存
|
5月前
|
缓存 NoSQL Java
Redis+Caffeine构建高性能二级缓存
大家好,我是摘星。今天为大家带来的是Redis+Caffeine构建高性能二级缓存,废话不多说直接开始~
721 0
|
14天前
|
缓存 NoSQL 关系型数据库
Redis缓存和分布式锁
Redis 是一种高性能的键值存储系统,广泛用于缓存、消息队列和内存数据库。其典型应用包括缓解关系型数据库压力,通过缓存热点数据提高查询效率,支持高并发访问。此外,Redis 还可用于实现分布式锁,解决分布式系统中的资源竞争问题。文章还探讨了缓存的更新策略、缓存穿透与雪崩的解决方案,以及 Redlock 算法等关键技术。
|
5月前
|
消息中间件 缓存 NoSQL
基于Spring Data Redis与RabbitMQ实现字符串缓存和计数功能(数据同步)
总的来说,借助Spring Data Redis和RabbitMQ,我们可以轻松实现字符串缓存和计数的功能。而关键的部分不过是一些"厨房的套路",一旦你掌握了这些套路,那么你就像厨师一样可以准备出一道道饕餮美食了。通过这种方式促进数据处理效率无疑将大大提高我们的生产力。
186 32