Redis

2009年开发的NoSQL数据库软件

Redis

Redis(Remote Dictionary Server,远程字典服务)是一种快速、开源、内存数据结构的存储数据库[0]。Redis(Remote Dictionary Server,远程字典服务)是一种快速、开源、内存数据结构的键值对存储数据库[0]。它支持多种数据结构,包括字符串、、列表、集合、有序集合等,Redis可在多种操作系统上运行,如Linux、BSD、Mac OS X等(官方不提供Windows操作系统的支持)[1],并提供了多种客户端库[0]。Redis最初由Salvatore Sanfilippo(名为“antirez”)使用ANSI C编写,随后Pieter Noordhuis加入了Redis的开发和维护,后来Salvatore Sanfilippo接受了VMWare等公司的赞助[0]。由于Redis中的数据存储在内存中,使得Redis最突出的特点是访问速度非常快。同时Redis也支持持久化,可以将数据写入磁盘,确保数据不会因为宕机而丢失。Redis还提供了一些高级功能,例如发布/订阅、事务、Lua脚本和分布式锁,并且Redis也支持集群模式,可以将数据分布在多个Redis节点中,以提高可用性和性能。由于Redis的高性能和丰富的功能,它被广泛应用于各种应用场景,例如缓存、队列、计数器、排行榜、实时消息系统等[0]。

Redis(Remote Dictionary Server,远程字典服务)是一种快速、开源、内存数据结构的存储数据库[1]。Redis(Remote Dictionary Server,远程字典服务)是一种快速、开源、内存数据结构的键值对存储数据库[1]。它支持多种数据结构,包括字符串、、列表、集合、有序集合等,Redis可在多种操作系统上运行,如Linux、BSD、Mac OS X等(官方不提供Windows操作系统的支持)[2],并提供了多种客户端库[1]。Redis最初由Salvatore Sanfilippo(名为“antirez”)使用ANSI C编写,随后Pieter Noordhuis加入了Redis的开发和维护,后来Salvatore Sanfilippo接受了VMWare等公司的赞助[1]

由于Redis中的数据存储在内存中,使得Redis最突出的特点是访问速度非常快。同时Redis也支持持久化,可以将数据写入磁盘,确保数据不会因为宕机而丢失。Redis还提供了一些高级功能,例如发布/订阅、事务、Lua脚本和分布式锁,并且Redis也支持集群模式,可以将数据分布在多个Redis节点中,以提高可用性和性能。由于Redis的高性能和丰富的功能,它被广泛应用于各种应用场景,例如缓存、队列、计数器、排行榜、实时消息系统等[1]

初创阶段(2007年-2009年)

Redis的作者为Salvatore Sanfilippo(推特名为“antirez”)[1],他在2007年和另一个朋友共同创建了访客信息追踪网站LLOOGG.com[3],该网站最初使用MySQL存储用户的浏览记录,但随着用户量的增大,该网站的出现了严重的负载问题,因此2009年2月26日Salvatore Sanfilippo发明了Redis[3]

VMware赞助阶段(2010年-2013年)

VMware公司从2010年开始赞助Redis的开发[4],Salvatore Sanfilippo和Pieter Noordhuis也分别于同年的3月和5月加入VMware,全职开发Redis[5]

Pivotal赞助阶段(2013年-2015年)

2013年5月至2015年6月,Salvatore Sanfilippo开发Redis的工作由Pivotal赞助[4]

Redis Labs赞助阶段(2015年-2020年)

从2015年6月起,Redis的开发由Redis Labs赞助[4],Redis Labs公司由Ofer Bengal于2011年成立,该公司于2021年更名“Redis”[6]。同期Salvatore Sanfilippo加入Redis Labs[7]

Redis Ltd.赞助阶段(2020年-至今)

自2020年4月以来,Redis Ltd.赞助了Redis的治理以及Redis官方网站redis.io的托管和维护[4]

在Redis Ltd.赞助期间,2021年10月,“Redis之父”Salvatore Sanfilippo在Redis社区邮件列表上宣布隐退,不再继续维护和开发Redis。他在邮件中表示,他需要专注于个人事务,并计划在未来几个月内逐步退出开发工作。Salvatore Sanfilippo的离开引起了业界的关注和讨论,但是Redis的开发和维护团队表示会继续致力于开发和推进Redis的发展[8]

版本演进

版本发布时间所属时期版本说明
Redis 1.02009年9月初创阶段Redis的初始版本。支持多种数据类型,包括字符串、哈希表、列表、集合和有序集合等,提供RDB持久化,客户端库和发布订阅等功能[9]
Redis 2.0 2010年9月VMware赞助阶段该版本引入了pubsub发布订阅模式和Lua脚本支持,同时也改进了Redis的性能和可靠性[9]
Redis 3.02015年4月Pivotal赞助阶段该版本引入了Redis集群模式,实现了Redis的分布式部署,提高了可扩展性和可用性。同时也引入了更多的新功能和改进,例如更好的AOF持久化和Lua脚本性能等[10]
Redis 4.02017年7月Redis Labs赞助阶段该版本提供了模块系统,使第三方开发者可以更容易地开发和集成自定义功能和数据类型。还改进了集群管理、AOF持久化和Lua脚本等方面的性能和可靠性[11]
Redis 5.02018年10月Redis Labs赞助阶段该版本引入了新的数据类型stream,支持更好的TLS支持、延迟监控等功能。还改进了集群管理、AOF持久化和Lua脚本性能等方面的性能和可靠性[12]
Redis 6.02020年3月Redis Labs赞助阶段该版本引入了多线程IO,提高了网络IO性能,同时也支持了更高并发的处理能力。还改进了集群管理、AOF持久化和Lua脚本性能等方面的性能和可靠性。此外,还引入了更好的内存管理机制,提高了内存使用效率[13]
Redis 7.02022年1月Redis Ltd.赞助阶段该版本引入了Redis函数和ACL功能,支持分片发布/订阅,改进了命令元数据和文档,实现了命令键规格和多部分AOF机制。还改进了集群管理、网络缓冲区和内存管理机制,并提供了更好的Lua脚本性能[14]

高速读写

Redis采用内存存储、优化的数据结构、单线程模型、异步操作等技术手段,能够快速高效地存储和访问数据,处理大量的并发请求,提高系统的性能和可靠性。以至于可以达到每秒几十万次的读写操作[15]

单线程模型

Redis采用单线程模型,每个请求都会在同一个线程中处理,避免了线程切换的开销。同时,Redis使用异步I/O和事件驱动模型,可以在处理请求时不阻塞其他请求的处理,提高了系统的并发性能[16]

多种数据结构和操作

Redis支持多种数据结构和操作,例如高效的哈希表、有序集合、位图等,可以满足各种数据存储和查询的需求[17]

集群模式

Redis支持分布式集群模式,可以水平扩展,从而支持更高的并发和更大的数据存储[18]

持久化存储

Redis支持多种持久化存储方式,例如RDB(Redis Database)、AOF(Append Only File)和混合模式等。其中,RDB是将内存中的数据定期写入磁盘,而AOF是将每条写命令追加到一个日志文件中。这些持久化机制可以在不影响Redis性能的情况下保证数据的持久性和可靠性[19]

高可用性

Redis提供主从复制、Sentinel和Cluster等多种高可用性解决方案,可以保证系统的可用性和数据的安全性[20]

数据持久化问题

Redis提供了将数据持久化到磁盘的功能,但是这种方式并不能完全保证数据的安全性。例如,如果在Redis执行数据写入操作时系统崩溃或者Redis进程意外停止,那么Redis最后一次快照或者AOF文件中保存的数据可能会丢失。虽然Redis支持在数据恢复时自动加载最近一次的RDB或AOF文件,但这也只是能够保证在文件保存时间点的数据恢复,而不是Redis所有的历史数据[21]

内存限制

Redis高速读写的性能是基于将所有数据存储在内存中进行的。由于内存资源是有限的,如果存储的数据量过大,内存可能会不够用。Redis提供了多种策略,如LRU策略、最大内存限制策略等,用于限制Redis占用内存的大小,需要注意的是,如果数据量过大,仅依靠内存限制策略可能无法完全解决内存限制问题,但仍然可以使用Redis集群模式对数据进行分散[22]

单线程限制

Redis的单线程架构是其设计的一个重要特点,也是其优点之一,它使得Redis在读写请求相对较少、数据量较小的情况下能够达到非常高的性能表现。然而,在面对大量并发请求时,由于Redis的单线程限制,可能会导致Redis的处理能力达到瓶颈,降低系统的性能。为了解决这个问题,Redis使用了Redis Pipeline、Lua 脚本等方式来充分利用多核CPU的性能。尽管如此,在大量并发请求时Reids这个缺点仍然存在[23]

数据库复制问题

Redis数据库复制功能可能会出现延迟,导致从服务器上的数据不一致。如果主服务器崩溃时,从服务器上丢失的数据无法恢复,可能会导致数据不一致和错误行为。为了避免这种情况,需要设置合适的复制延迟阈值和拓扑结构,选择适当的持久化存储方式,并结合业务需求和系统负载特点,来保证Redis的高可用性特性[24]

不支持多个键的事务

Redis是一个支持事务的键值存储数据库,它可以将多个操作组成一个事务,并保证这些操作要么全部执行成功,要么全部失败。但是,Redis事务只支持对单个键进行操作,如果需要对多个键进行操作,就需要使用Lua脚本或者Pipeline[25]

使用场景

Redis的高性能和多种特性,使其适合应用于多种场景,包括缓存计数器、消息队列、分布式锁、会话管理、排行榜等。在选择Redis作为解决方案时,需要结合具体应用需求和场景,选择合适的数据结构和Redis特性[26]

缓存

Redis最常见的使用场景是作为缓存层。由于Redis存储在内存中,读写速度非常快,可以大大提高数据访问的速度和响应时间。Redis还支持过期时间、LRU算法等缓存策略,可以更好地控制缓存大小和缓存命中率[27]

计数器

Redis的原子操作和高并发性能,使其适合用于计数器的场景。例如网站的访问量、点赞数、评论数等数据,都可以使用Redis实现。Redis还支持多种计数器操作,包括递增(INCR)、递减(DECR)、获取当前计数值(GET)等[28]

消息队列

Redis支持发布/订阅机制,可以实现简单的消息队列功能。例如可以将任务加入队列,等待后续处理。同时,Redis的高并发和高可用性,也适合用于实现大规模的消息队列[29]

分布式锁

Redis支持多种锁机制,可以实现分布式锁的场景。例如在分布式系统中,为了避免多个客户端同时修改同一数据,可以使用Redis的锁机制来保证数据的一致性[30]

地理位置服务

Redis的地理位置功能可以用来存储和查询位置数据。这种功能可以用于各种位置相关的应用场景,例如地图服务、位置检索和社交网络等[31]

Twitter

Twitter使用Redis来存储大量的实时数据,包括用户状态、关系图和推文。他们使用Redis的哈希数据结构来存储用户信息,使用有序集合来存储推文信息,以支持实时的数据查询和分析[32]

Snapchat

Snapchat使用Redis来存储和处理用户数据、实时消息和多媒体内容等信息,以支持其快速增长的用户群体和高并发性能要求[32]

GitHub

GitHub使用Redis来存储和缓存代码仓库、用户数据和API请求等信息,以提高响应时间和可扩展性[32]

Craigslist

Craigslist公司使用Redis作为他们的缓存数据库来提高网站性能和响应速度。他们使用Redis来缓存广告数据、实现实时消息通知、实现基于地理位置的搜索和并发控制。这些功能可以帮助Craigslist提供更好的用户体验和网站性能[32]

StackOverflow

StackOverflow公司使用Redis来实现多种功能,包括缓存用户会话和登录信息、实时通知和活动更新、数据缓存和排名/计数器功能[32]

数据结构

Redis支持多种数据结构,常用的数据结构包括字符串(Strings)、哈希表(Hashes)、列表(Lists)、集合(Sets)、有序集合(Sorted Sets)、流(Redis Streams)、地理空间(Redis geospatial)、超级日志(Redis HyperLogLog)、位图(Redis bitmaps)、位字段(Redis bitfields)等。每种数据结构都有不同的用途和优势。Redis通过多种数据结构的组合和灵活运用,可以实现各种复杂的数据处理和存储需求。在使用Redis时,需要根据具体应用场景和需求选择合适的数据结构[33]

字符串(Strings)

Strings是Redis最基本的数据类型,也是最常用的数据类型之一。字符串可以存储任何类型的数据,包括数字、文本、图片等。Redis中的字符串支持高效的读写操作,例如获取字符串长度、追加字符串、设置和获取指定偏移量的子串等[34]

哈希表(Hashes)

Hashes是Redis中的一种字典结构,可以存储多个字段和值的映射关系。哈希表适合用于存储对象,例如用户信息、商品信息等。哈希表的读写操作非常高效,可以通过键名和字段名快速获取对应的值[35]

列表(Lists)

Lists是一种有序的字符串列表,支持在列表两端插入或删除元素,可以用于实现队列、栈等数据结构。列表支持高效的插入、删除、查找操作,以及支持多种排序和范围查询方式[36]

集合(Sets)

Sets是一种无序的字符串集合,支持添加、删除、查找和求交集并集、差集等操作。集合支持高效的添加、删除、查找操作,以及支持多种集合运算和排序方式[37]

有序集合(Sorted Sets)

Sorted Sets是一种有序的字符串集合,每个元素都关联着一个分数,可以用于实现排行榜、计数器等功能。有序集合支持高效的添加、删除、查找、范围查询等操作,与Sets相比还支持多种排序方式[38]

流(Redis Streams)

Redis Streams是一种数据结构,类似于追加日志。可以使用Redis Streams实时记录和同时传输事件,比如事件源,传感器监控和通知等。每个流入口都有一个唯一的ID,可以使用这个ID来检索相关条目。Redis Streams支持多种削减策略(以防止流变得无限增长),并支持多种消费策略[39]

地理空间(Redis geospatial)

Redis geospatial是Redis提供的一种用于存储地理位置信息的数据类型,允许开发人员在Redis中存储地理位置信息,并对这些信息进行地理位置查询。通过将地理位置数据存储为经度和纬度坐标的有序集合,Redis提供了一系列基于地理位置查询的命令,如添加地理位置数据、搜索附近的位置、计算距离等。这种数据类型使得开发人员能够方便地实现诸如位置服务、推荐系统等应用,同时具有高效和可扩展性的特点[31]

超级日志(Redis HyperLogLog)

Redis HyperLogLog是一种基数算法,用于估计集合中不同元素的数量。它通过使用非常小的内存空间来实现这一目标,同时还提供了相对较高的精度。在Redis中,HyperLogLog通过使用单个字符串来实现,并且支持添加元素、计算基数、合并多个HyperLogLog等操作。它在很多场景中都可以被使用,例如统计网站的独立访客数、统计搜索关键字的独立数目等[40]

位图(Redis bitmaps)

Redis bitmaps用于存储和操作二进制位数组。它们非常适合于存储和处理大量位,例如表示用户在线状态或网站流量分析。Redis提供了许多位操作命令,例如SETBIT、GETBIT和BITCOUNT,用于在位图上进行操作和计算。它还支持按位操作,例如AND、OR和XOR,这些操作可用于合并、比较和计算位图之间的交集并集和差异[41]

位字段(Redis bitfields)

Redis bitfields允许在一个字符串中执行位级别的操作。通过使用Redis bitfields,可以方便地对单个二进制位进行读取、设置和清除操作,或者以不同大小的整数形式读取或写入多个二进制位。它通常用于存储和操作二进制数据,例如压缩数据、布隆过滤器和颜色编码等。Redis bitfields提供了一组命令来处理位字段,包括GET、SET、INCRBY、OVERFLOW和NUMERIC等[42]

Redis与Memcached的对比

Redis和Memcached都是基于内存缓存系统,它们都能够快速地读写数据。以下是Redis和Memcached的一些主要区别和比较[43]

-RedisMemcached
线程模型单进程单线程单进程多线程
数据支持类型key-value、set、map、list、String等key-value
持久化支持支持不支持
支持数据备份支持不支持(可通过第三方工具实现)
数据一致性支持事务轻量级锁CAS机制
List排序支持支持不支持
缓存策略LRU、FIFO、LFULRU
是否支持集群

参考资料 43

  1. 参考 1
  2. Introduction to Redis — Redis官网
  3. LLOOGG realtime log analyzer web app — github
  4. Redis sponsors — Redis官网
  5. VMware: the new Redis home — antirez weblog
  6. Redis Labs Becomes, Simply, Redis — businesswire
  7. Redis Creator, Salvatore Sanfilippo (Antirez), Joins Redis Labs — redis官网
  8. The end of the Redis adventure — antirez
  9. redis/redis — github
  10. redis3.0版本发布 — githubusercontent
  11. Redis4.0版本发布 — githubusercontent
  12. Redis5.0版本发布 — githubusercontent
  13. Redis6.0版本发布 — githubusercontent
  14. Redis7.0版本发布 — githubusercontent
  15. 参考 15
  16. 参考 16
  17. Redis data types — redis官网
  18. https://redis.io/docs/management/scaling/ — redis官网
  19. 参考 19
  20. 参考 20
  21. Redis persistence — Redis 官网
  22. Memory optimization — Redis官网
  23. Redis FAQ — Redis官网
  24. Redis replication — Redis官网
  25. Redis事务 — Redis官网
  26. Redis使用 — redis官网
  27. Getting started with Redis — redis官网
  28. Redis Strings — Redis官网
  29. Redis发布/订阅 — Redis官网
  30. Distributed Locks with Redis — Redis官网
  31. Redis geospatial — Redis官网
  32. Who's using Redis? — redis官网
  33. 参考 33
  34. 参考 34
  35. 参考 35
  36. 参考 36
  37. 参考 37
  38. 参考 38
  39. Redis Streams — redis官网
  40. Redis HyperLogLog — Redis官网
  41. Redis bitmaps — Redis官网
  42. Redis bitfields — Redis官网
  43. 参考 43
广告位:底部(ad-bottom)—— 请到中台「公共区块」编辑此内容