Redis为何这么快?(下)

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 为啥就Redis这么突出? 它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快 数据结构 键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,所以高效的数据结构是Redis快速处理数据的基础

集合数据操作效率

一个集合类型的值:

  1. 通过全局哈希表找到对应的哈希桶位置
  2. 在集合中再增删改查

影响因素

底层数据结构

使用哈希表实现的集合,要比使用链表实现的集合访问效率更高。

操作效率和这些操作本身的执行特点有关,比如读写一个元素的操作要比读写所有元素的效率高。

整数数组和双向链表都是顺序读写,时间复杂度基本是O(N),效率较低。

压缩列表

类似数组,数组中每个元素对应一个数据。

而压缩列表在表头有三个字段zlbytes、zltail和zllen,分别表示列表长度、列表尾的偏移量和列表中的entry个数;压缩列表在表尾还有一个zlend,表示列表结束。

image.png

  • 第一个元素、最后一个元素,可通过表头三字段的长度直接定位,复杂度O(1)
  • 查找其他元素时,就只能逐个查找,复杂度O(N)

跳表

有序链表只能逐一查找元素,非常慢,于是出现跳表。

跳表基于链表,增加多级索引,通过索引位置跳转,快速定位数据:

image.png

查找过程就是在多级索引上跳来跳去,最后定位到元素。故名“跳”表。

数据量很大时,跳表查找复杂度O(logN)。

不同操作的复杂度

image.png

不同操作的复杂度

集合类型的操作类型:

  • 读写单个集合元素的
    如HGET、HSET
  • 操作多个元素的
    如SADD
  • 遍历整个集合操作
    如SMEMBERS

各种骚操作复杂度不尽相同,事关选型。

单元素操作

每种集合类型对单个数据实现的crud操作。例如,Hash类型的HGET、HSET和HDEL,Set类型的SADD、SREM、SRANDMEMBER等。这些操作的复杂度由集合采用的数据结构决定,如:

  • HGET、HSET和HDEL操作哈希表,所以复杂度都是O(1)
  • Set类型用哈希表作为底层数据结构时,SADD、SREM、SRANDMEMBER复杂度也是O(1)

集合类型支持同时对多个元素进行增删改查,如:

  • Hash类型的HMGET和HMSET
  • Set类型的SADD也支持同时增加多个元素

这些操作的复杂度,就是由单个元素操作复杂度和元素个数决定的。如HMSET增加M个元素时,复杂度就从O(1)变成O(M)。

范围操作

集合类型中的遍历操作,可返回集合所有数据,如Hash类型的HGETALL和Set类型的SMEMBERS,或者返回一个范围内的部分数据,如:

  • List类型的LRANGE
  • ZSet类型的ZRANGE

复杂度一般是O(N),应尽量避免

Redis从2.8版本开始提供SCAN系操作(HSCAN,SSCAN和ZSCAN),实现渐进式遍历,每次只返回有限数量的数据。这相比HGETALL、SMEMBERS,避免了一次性返回所有元素而导致Redis过久阻塞。


统计操作

集合类型对集合中所有元素个数的记录,例如LLEN和SCARD。

复杂度只有O(1),因为当集合类型采用压缩列表、双向链表、整数数组这些数据结构时,这些结构中专门记录了元素的个数统计,可高效完成。

例外情况

某些数据结构的特殊记录,例如压缩列表和双向链表都会记录表头和表尾的偏移量。这样一来,对于List类型的LPOP、RPOP、LPUSH、RPUSH这四个操作来说,它们是在列表的头尾增删元素,这就可以通过偏移量直接定位,所以它们的复杂度也只有O(1),可以实现快速操作。

总结

Redis之所以能快速操作键值对,因为:

  • O(1)复杂度的哈希表被广泛使用,包括String、Hash和Set,它们的操作复杂度基本由哈希表决定
  • Sorted Set也采用了O(logN)复杂度的跳表

集合类型的范围操作,因为要遍历底层数据结构,复杂度通常是O(N)。

建议用其他命令来替代,如SCAN来代替,避免在Redis内部产生费时的全集合遍历操作。


List底层实现结构:双向链表和压缩列表的操作复杂度都是O(N)。

因地制宜使用List类型。既然它的POP/PUSH效率很高,那就将它主要用于FIFO队列场景,而不是作为一个可随机读写的集合。


相关实践学习
基于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
目录
相关文章
|
NoSQL Redis 数据库
Redis为何这么快?(上)
为啥就Redis这么突出? 它是内存数据库,所有操作都在内存上完成,内存的访问速度本身就很快 数据结构 键值对是按一定的数据结构来组织的,操作键值对最终就是对数据结构进行增删改查操作,所以高效的数据结构是Redis快速处理数据的基础
162 0
Redis为何这么快?(上)
|
缓存 NoSQL Redis
|
存储 NoSQL Redis
Redis 为什么这么快?
本文内容思维导图如下: 1、简介和应用 Redis是一个由ANSI C语言编写,性能优秀、支持网络、可持久化的K-K内存数据库,并提供多种语言的API。它常用的类型主要是 String、List、Hash、Set、ZSet 这5种。
7866 0
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(一)
数据的存储--Redis缓存存储(一)
|
1月前
|
存储 缓存 NoSQL
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
数据的存储--Redis缓存存储(二)
|
1月前
|
消息中间件 缓存 NoSQL
Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。
【10月更文挑战第4天】Redis 是一个高性能的键值对存储系统,常用于缓存、消息队列和会话管理等场景。随着数据增长,有时需要将 Redis 数据导出以进行分析、备份或迁移。本文详细介绍几种导出方法:1)使用 Redis 命令与重定向;2)利用 Redis 的 RDB 和 AOF 持久化功能;3)借助第三方工具如 `redis-dump`。每种方法均附有示例代码,帮助你轻松完成数据导出任务。无论数据量大小,总有一款适合你。
77 6
|
15天前
|
缓存 NoSQL 关系型数据库
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
本文详解缓存雪崩、缓存穿透、缓存并发及缓存预热等问题,提供高可用解决方案,帮助你在大厂面试和实际工作中应对这些常见并发场景。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:如何解决Redis缓存雪崩、缓存穿透、缓存并发等5大难题
|
16天前
|
存储 缓存 NoSQL
【赵渝强老师】基于Redis的旁路缓存架构
本文介绍了引入缓存后的系统架构,通过缓存可以提升访问性能、降低网络拥堵、减轻服务负载和增强可扩展性。文中提供了相关图片和视频讲解,并讨论了数据库读写分离、分库分表等方法来减轻数据库压力。同时,文章也指出了缓存可能带来的复杂度增加、成本提高和数据一致性问题。
【赵渝强老师】基于Redis的旁路缓存架构
|
9天前
|
缓存 NoSQL PHP
Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出
本文深入探讨了Redis作为PHP缓存解决方案的优势、实现方式及注意事项。Redis凭借其高性能、丰富的数据结构、数据持久化和分布式支持等特点,在提升应用响应速度和处理能力方面表现突出。文章还介绍了Redis在页面缓存、数据缓存和会话缓存等应用场景中的使用,并强调了缓存数据一致性、过期时间设置、容量控制和安全问题的重要性。
28 5
|
24天前
|
缓存 NoSQL Redis
Redis 缓存使用的实践
《Redis缓存最佳实践指南》涵盖缓存更新策略、缓存击穿防护、大key处理和性能优化。包括Cache Aside Pattern、Write Through、分布式锁、大key拆分和批量操作等技术,帮助你在项目中高效使用Redis缓存。
134 22
下一篇
无影云桌面