知名百科 >> Redis >> 历史版本
编辑时间历史版本内容长度图片数目录数修改原因
2024-04-29 11:03 最新历史版本 9462 1 5
  返回词条

Redis

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

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

目录

发展历史  

初创阶段

(2007年-2009年)

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

VMware赞助阶段

(2010年-2013年)

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

Pivotal赞助阶段

(2013年-2015年)

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

Redis Labs赞助阶段

(2015年-2020年)

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

Redis Ltd.赞助阶段

(2020年-至今)

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

优点缺点 

优点

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

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

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

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

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

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

缺点

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

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

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

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

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

使用场景

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

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

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

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

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

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

数据结构

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

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

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

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

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

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

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

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

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

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

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

应用案例

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

RedisRedis

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

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

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

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

标签