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

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

概述


常用 5 种数据类型 string, list, set, hash, zset


image.png


1. string


string 常用操作


set key value 
get key


对象缓存


1. set user:1 value(Json 格式化数据)
2. mset user:1:name huawei user1:balance 2000
   mget user:1:name user:1balance


分布式锁


setnx product:10001 true        // 返回 1 代表获取锁成功
setnx product:10001 true        // 返回 0 代表获取锁失败
.... 执行业务逻辑
del product:10001               // 执行完业务释放锁
set product:10001 true ex 10 nx // 防止意外中断导致最终死锁


计数器


image.png


incr article:forward:{文章id}
get article:forward:{文章id}


web 集群 session 共享


spring session + redis 实现  session 共享


分布式全局序列号


incrby orderId 1000 // redis 批量生成序列号提升性能 批量生成 ID, 这里有一个步长,通过空间换取时间的概念,来减少和 Redis 的交互,提升新跟那个


字符串常用操作


set key value               // 存入字符串键值对
mset key value [key value]  // 批量存储字符串键值对
setnx key value             // 存入一个不存在的字符串键值对
get key                     // 获取一个字符串键值对
mget key [key ..]           // 批量获取字符串键值对
del key [key ...]           // 删除一个键
expire key seconds          // 设置一个键的过期时间(秒)


原子加减


incr key                    // 将 key 中存储的一个数字加1
decr key                    // 将 key 中存储的一个数字减1
incrby key increment        // 将 key 所存储的值加上 increment 
decrby key decrement        // 将 key 所存储的值减去 increment 


2. hash


hash 常用操作


hset key field value                       // 存储一个哈希表 key 的键值
hsetnx key field value                     // 存储一个不存在的哈希表 key 的键值
hmset key field [field value  ... ]        // 在一个 哈希表 key 中存储多个键值对
hget key field [field ... ]                // 批量获取哈希表 key 中的 field 键值
hdel key field [field ... ]                // 删除哈希表中的 field 键值
hlen key                                   // 返回哈希表中 key 的field 的数量
hgetall key                                // 返回哈希表中 key 所有的键值
hincrby key field increment                // 为哈希表 key 中 field 键的值增量  increment
注意:大量的数据存储在一个 key 种,容易存在 BigKey 问题,可以做分段处理


Hash 应用场景


对象缓存


hmset user {userid}:name zhangsan {userid:}:balance 1888
hmset user 1:name zhangsan 1:balance 1888
hmget user 1:name 1:balance


电商购物车


  1. 以用户id 为key
  2. 商品 id 为 field
  3. 商品数量为 value


购物车操作:


  1. 添加商品 hset cart:1001 1088 1
  2. 增加数量 hincrby cart:1001 1088 1
  3. 商品总数 hlen cart:1001
  4. 删除商品 hdel cart:1001 1088
  5. 获取所有展示的商品 hgetall cart:1001


image.png


Hash 的优点


  1. 同类数据归整合存储,方便数据管理
  2. 相比 String 操作消耗内存与 CPU 更小
  3. 相比 String 存储更节省空间


Hash 的缺点


  1. 过期功能不能在 field 上, 只能在 Key 上
  2. Redis 集群架构不太适合大规模使用


3. list


List 常用操作


lpush key value [value...]         // 将一个或者多个值value 插入到 key 列表的表头(最左边)
rpush key value [value...]         // 将一个或者多个值value 插入到 key 列表的表尾(最右边)
lpop key                           // 移除并返回 key 列表的头元素
rpop key                           // 移除并返回 key 列表的尾元素
lrang key srat stop                // 返回列表 key 中指定区间内的元素, 区间内的偏移量 start 和 stop 指定
blpop key [key ,,,] timeout        // 从 key 列表头弹出一个元素,若列表中没有元素,阻塞等待timeout 秒,如果timeout = 0, 一直阻塞等待
brpop key [key ...] timeout        // 从 key 列表尾弹出一个元素,若列表中没有元素,阻塞等待timeout 秒,如果timeout = 0, 一直阻塞等待


使用场景


stack(栈) lpush + lpop = fifo


Queue (队列) lpush + rpop


Blocking MQ (阻塞队列) = LPUSH + BRPOP


微博和微信消息流


张三关注了 36氪 , 汽车之间等公众号


image.png

相关文章
|
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