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

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