`
冰糖葫芦
  • 浏览: 293904 次
社区版块
存档分类
最新评论

Redis架构

阅读更多

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的主从复制功能可能也是大多数人所需要的。

我设计了一个关于源代码的模块化视图如下:

  1. redis 是服务端守护进程。它是由一个单一的redis.c文件组成,大约为6k。

  2. networking 网络功能的实现代码。尤其是基于事件的逻辑,可以通过epoll、kqueue以及select等系统调用实现。

  3. datastructure 标识服务器所使用的重要数据结构。至关重要的是例如sds.c表示redis编写的所有代码所使用的字符串

  4. 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. 更多文章请扫码:

3
2
分享到:
评论

相关推荐

    01 缓存通识与Redis架构原理.pdf

    01 缓存通识与Redis架构原理.pdf01 缓存通识与Redis架构原理.pdf01 缓存通识与Redis架构原理.pdf01 缓存通识与Redis架构原理.pdf01 缓存通识与Redis架构原理.pdf01 缓存通识与Redis架构原理.pdf01 缓存通识与Redis...

    亿级流量新浪微博与微信Redis架构实战

    亿级流量新浪微博与微信Redis架构实战

    Redis架构下的MySQL数据库性能提升浅析.pdf

    Redis架构下的MySQL数据库性能提升浅析.pdf

    redis 架构原理.pdf

    redis 架构原理.pdfredis 架构原理.pdfredis 架构原理.pdfredis 架构原理.pdfredis 架构原理.pdfredis 架构原理.pdfredis 架构原理.pdfredis 架构原理.pdfredis 架构原理.pdfredis 架构原理.pdfredis 架构原理....

    redis架构图

    redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/...

    Redis架构和最佳实践share

    Redis架构和最佳实践shareRedis架构和最佳实践shareRedis架构和最佳实践share

    redis架构与设计.xmind

    redis架构与设计.xmind

    3.3_Srcapy+redis架构1

    3.3Scrapy-redis架构为什么使用Scrapy+redis架构:Scrapy,Python开发的一个快速,高层次的屏幕抓取和web抓取框架,用于抓取w

    Redis架构和最佳实践.odg

    Redis架构和最佳实践,系统的说明了redis架构、开发最佳实践、生产问题解答和文档及自助工具

    redis架构分析.docx

    因为近期项目中开始使用Redis,为了更好的理解Redis并应用在适合的业务场景,需要对Redis设计与实现深入的理解。 我分析流程是按照从main进入,逐步深入分析Redis的启动流程。同时根据Redis初始化的流程,理解Redis...

    Redis架构设计分析

    因为近期项目中开始使用Redis,为了更好的理解Redis并应用在适合的业务场景,需要对Redis设计与实现深入的理解。 我分析流程是按照从main进入,逐步深入分析Redis的启动流程。同时根据Redis初始化的流程,理解Redis...

    Redis架构与源码剖析

    从redis的架构分析到数据引擎,事件,持久化,主从复制 再到网络IO,对redis的源码进行剖析的介绍

    2020最新版Redis架构全套视频教程课件

    Redis(REmote DIctionary Server)是一个Key Value存储系统,是非常著名的NoSQL数据库之一。Redis常常作为系统的缓存Cache使用。在互联网行业应用十分广泛,是进入互联网行业Java攻城狮必备技能,在本课程中,您能...

    Redis架构演变与Redis-cluster群集读写方案

    Redis-cluster是近年来Redis架构不断改进中的相对较好的Redis高可用方案。本文涉及到近年来Redis多实例架构的演变过程,包括普通主从架构(Master、slave可进行写读分离)、哨兵模式下的主从架构、Redis-cluster高...

    SSM+redis+mysql框架实现的一个简单博客

    SSM+redis+mysql框架实现的一个简单博客,SSM+redis+mysql框架实现的一个简单博客SSM+redis+mysql框架实现的一个简单博客SSM+redis+mysql框架实现的一个简单博客SSM+redis+mysql框架实现的一个简单博客SSM+redis+...

    Redis架构原理及应用实践

    Redis是完全开源免费的,是一个高性能的key-value类型的内存数据库。整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以...

    springmvc+redis项目架构

    基本架构 ssm + redis

Global site tag (gtag.js) - Google Analytics