REDIS是一个开源的、先进的键值存储系统。它通常可以被用作数据结构服务器,因为它的键可以包含字符串(string)、哈希值(hash)、列表(list)、集合(set)以及有序集合(sortedset)。而且Redis使用的是内存数据集合。根据你自身的使用情况,你可以定时将这些内存中的数据保存至磁盘中,或者将每个命令都添加至日志中。你可以通过redis的项目主页了解它的更多功能。Redis最初的作者是Salvatore Sanfilippo,并且VMWare从2010年5月份开始资助该项目。目前,Redis已经被用在很多重要产品和服务之中,如:github、stackoverflow、Disqus、Guardian以及你访问的很多网页。
Redis是使用ANSI C标准编写的,可以在不依赖其他程序的情况下运行在大部分POSIX系统中,如:Linux、BSD以及Solaris。而从我有限的角度来看,redis的代码非常简单而且易于阅读;而且它的代码库不是很大(2.2版本大约为20k),同时它的内部结构在网站上都被很好的记录在文档中。在继续这篇文章之前我邀请你首先看下由作者本人最近写的他自己的发展哲学的声明。下面我引用一段其中我非常赞赏的话:
我们乐于优化。我们坚信写代码是一项非常艰难的工作,而值得坚持的唯一方法就是享受写代码;当你不再享受写代码的过程时,那么最好的做法是停一停。为了防止这种情况的发生,我们会尽量避免有降低redis开发乐趣的事情发生。
这篇文章将尝试这去总结我对帮助文档和源码的一些理解。Redis是一个Client/Server模式的系统,典型的调度图如下:
Redis服务端是一个进程,该进程通过TCP协议和客户端进行会话。
虽然redis-cli是官方提供的客户端,但是第三方项目实现了其他语言的客户端,如:C++, C#, Clojure, Common Lisp, Erlang, Haskell, Java, JavaScript,Lua, Objective-C, Perl, PHP, Python, R, Ruby, Scala, Go以及Tcl。由于在官网上都有关于协议的说明文档,因此你也可以根据官网上的协议文档实现自己的协议。除此之外,redis的主从复制功能可能也是大多数人所需要的。
我设计了一个关于源代码的模块化视图如下:
-
redis 是服务端守护进程。它是由一个单一的redis.c文件组成,大约为6k。
-
networking 网络功能的实现代码。尤其是基于事件的逻辑,可以通过epoll、kqueue以及select等系统调用实现。
-
datastructure 标识服务器所使用的重要数据结构。至关重要的是例如sds.c表示redis编写的所有代码所使用的字符串
-
redis-cli 表示客户端命令行
Redis是如何工作的
从其根本来看,redis是一个单线程的服务器。这意味着通过一个单独的线程使用事件模式如epoll、kqueue、select来读取传入的连接。当一个特定的时间生成一个文件描述符后,这个线程处理这些文件描述符并会写响应结果。这个UML序列图显示了一个命令被客户端接受后是如何被redis在内部处理的:
Redis使用自定义的时间库,该库抽象了低层面的socket管理。核心对象是eventLoop,它包含了已经被scoket I/O释放的事件。同时,aeApiPoll(eventLoop)检查所有的socket描述符来确定是否还有网络处于激活状态。而在aeProcessEvents方法中,所有被释放的事件都会被检查并调用适当的处理程序。对于协议中的所有命令,redis会拦截所有命令并通过一个命令表单来查找合适的操作来执行。命令表单被定义在redis.c中,具体如下:
这个结构的第二个参数是要调用的方法的名称。例如,saveCommand方法实现如下:
addReply方法被用来推送相应结果至客户端。
以上内容快速回顾:
redis使用一个单独的线程来管理同步所有网络连接。redis实现了一个轻量级的事件库来抽线unix系统的一些系统调用(如epoll, select, kqueue)。在redis的邮件列表中,在推动使用新的事件库还是依赖已有的开源库这个问题上有一个有趣的争论。
请求通过命令来完成。redis使用了一个命令列表,在从socket中读取到相关命令后通过该列表来找到并调用执行需要的操作。
基础数据结构是SDS字符串。
数据存储管理
Redis实例包括代表服务器状态的全局变量。例如在redis.c中的定义如下:
其中,变量redisDB的定义如下:
其中dict是redis模型中使用的内存数据结构。它在dict.c中定义,当你需要实现一个hashtable时,它可提供一系列所需要的方法,例如:
如果我们来看一个最重要的命令-set command-命令,我们会看到以下代码:
Redis启动原理
启动过程非常简单。如前所说,redis实例是由一组全局变量组成,并通过方法来访问这些变量。redis服务器main方法如下:
在读取完配置文件之后,initServer方法会被调用。该方法会初始化redis的所有全局变量。特别是它创建一组链接列表用于管理:
同时,它还创建最重要的数据结构:
它还初始化事件库来创建eventloop以及服务端socket。最终,进入主循环来管理客户端I/O:
aeProcessEvents就是在上一小节中分析的方法。
虚拟内存
Redis也支持虚拟内存:这意味着,当你的数据集不适合放在RAM中,redis可以支持回写在磁盘上。
Redis语言及工具概述
1. 本文由程序员学架构摘译
2. 本文译自http://www.enjoythearchitecture.com/redis-architecture
3. 转载请务必注明本文出自:程序员学架构(微信号:archleaner )
4. 更多文章请扫码:
相关推荐
Redis 架构下的 MySQL 数据库性能提升浅析 I. Redis 架构简介 Redis 是一个基于 key-value 的高速缓存系统,具有性能高、数据类型丰富、复杂度低以及优化部分 bug 的优点。在互联网时代,快速开发是一个不变的需求...
亿级流量新浪微博与微信Redis架构实战
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/...
### Redis架构设计分析 #### 一、前言 在项目的实际应用中,Redis因其高性能、低延迟等特点成为了不可或缺的一部分。为了更好地理解和应用Redis,在合适的业务场景中发挥其最大效能,有必要深入了解Redis的设计与...
redis架构与设计.xmind
### Redis架构全套视频教程知识点概览 #### 一、NoSQL概述 1. **NoSQL概念** NoSQL(Not Only SQL 或 Non-relational)指的是非关系型数据库,其特点是数据模型灵活、易于水平扩展,并且能够处理大规模数据。 2...
### Redis架构设计与实现 #### 一、内部数据结构 Redis 的内部数据结构是其能够高效存储和处理数据的关键所在。这些数据结构不仅为 Redis 提供了基础支持,还允许它实现了复杂的数据类型如字符串(String)、列表...
Redis架构和最佳实践,系统的说明了redis架构、开发最佳实践、生产问题解答和文档及自助工具
本文将深入分析Redis的架构和启动流程,并探讨其数据持久化方案。 在启动Redis时,首先进行的是初始化server变量,设置一系列默认值,如端口号、数据库数量、超时时间等。接着,Redis读入配置文件,通常为`redis....
因为近期项目中开始使用Redis,为了更好的理解Redis并应用在适合的业务场景,需要对Redis设计与实现深入的理解。 本文档分析流程是按照从main进入,逐步深入分析Redis的启动流程。同时根据Redis初始化的流程,理解...
Redis 是一个高性能的键值对内存数据库,广泛用于缓存和数据存储场景。...综上所述,Redis 的架构原理涉及数据的存储、恢复、扩展和高可用性,理解这些核心概念对于有效使用和管理 Redis 非常关键。
原生的 Scrapy 架构依赖于本地的队列结构(deque)来管理待爬取的 URL,而 scrapy-redis 将这一部分替换为 Redis 的数据结构,如 Set 和 Queue,以实现跨节点的请求管理和去重。 Scrapy 和 Scrapy-redis 的主要区别...
Redis的架构原理包括内存模型和数据存储方式。内存模型方面,Redis提供了一些命令用于查看内存统计,例如`used_memory`显示Redis分配的总内存,`used_memory_rss`则表示Redis占用的实际物理内存。内存碎片比`mem_...
Redis-cluster是近年来Redis架构不断改进中的相对较好的Redis高可用方案。本文涉及到近年来Redis多实例架构的演变过程,包括普通主从架构(Master、slave可进行写读分离)、哨兵模式下的主从架构、Redis-cluster高...
本文深度剖析了Redis作为一种高效、灵活且广泛应用的日志型、内存持久化的Key-Value数据库的技术特点,涵盖其基础架构、数据类型、快速响应原因以及布隆过滤器等扩展技术,并详述了其在缓存、排名统计、数据记录、...
计算机系毕业设计