Redis

编辑
本词条由“小小编” 建档。
Redis(RemoteDictionaryServer,远程字典服务)是一种快速、开源、内存数据结构的存储数据库。Redis(RemoteDictionaryServer,远程字典服务)是一种快速、开源、内存数据结构的键值对存储数据库。它支持多种数据结构,包括字符串、、列表、集合、有序集合等,Redis可在多种操作系统上运行,如Linux、BSD、MacOSX等(官方不提供Windows操作系统...

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等公司的赞助。

发展历史

编辑

初创阶段(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采用单线程模型,每个请求都会在同一个线程中处理,避免了线程切换的开销。同时,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的地理位置功能可以用来存储和查询位置数据。这种功能可以用于各种位置相关的应用场景,例如地图服务、位置检索和社交网络等。

应用案例

编辑

Twitter

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

Snapchat

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

GitHub

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

Craigslist

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

StackOverflow

StackOverflow公司使用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等。

Redis与Memcached的对比

编辑

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

Redis与Memcached对比

百科词条作者:小小编,如若转载,请注明出处:https://glopedia.cn/349852/

(55)
词条目录
  1. 发展历史
  2. 初创阶段(2007年-2009年)
  3. VMware赞助阶段(2010年-2013年)
  4. Pivotal赞助阶段(2013年-2015年)
  5. Redis Labs赞助阶段(2015年-2020年)
  6. Redis Ltd.赞助阶段(2020年-至今)
  7. 版本演进
  8. 优缺点
  9. 优点
  10. 高速读写
  11. 单线程模型
  12. 多种数据结构和操作
  13. 集群模式
  14. 持久化存储
  15. 高可用性
  16. 缺点
  17. 数据持久化问题
  18. 内存限制
  19. 单线程限制
  20. 数据库复制问题
  21. 不支持多个键的事务
  22. 使用场景
  23. 缓存
  24. 计数器
  25. 消息队列
  26. 分布式锁
  27. 地理位置服务
  28. 应用案例
  29. Twitter
  30. Snapchat
  31. GitHub
  32. Craigslist
  33. StackOverflow
  34. 数据结构
  35. 字符串(Strings)
  36. 哈希表(Hashes)
  37. 列表(Lists)
  38. 集合(Sets)
  39. 有序集合(Sorted Sets)
  40. 流(Redis Streams)
  41. 地理空间(Redis geospatial)
  42. 超级日志(Redis HyperLogLog)
  43. 位图(Redis bitmaps)
  44. 位字段(Redis bitfields)
  45. Redis与Memcached的对比

轻触这里

关闭目录

目录