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

时间: 2024-11-16 09:42:58

Redis架构的相关文章

如何搭建高可用redis架构?

1 题记 Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 数据库,并提供多种语言的 API. 如今,互联网业务的数据正以更快的速度在增长,数据类型越来越丰富,这对数据处理的速度和能力提出了更高要求.Redis 是一种开源的内存非关系型数据库,给开发人员带来的体验是颠覆性的.在自始至终的设计过程中,都充分考虑高性能,这使得 Redis 成为当今速度最快的 NoSQL 数据库. 考虑高性能的同时,高可用也是很重要的考虑因素.互联网 7

Redis架构之防雪崩设计:网站不宕机背后的兵法

Redis架构之防雪崩设计:网站不宕机背后的兵法 原创: 付磊,张益军 高可用架构 2017-03-24 导读:互联网系统中不可避免要大量用到缓存,在缓存的使用过程中,架构师需要注意哪些问题?本文以 Redis 为例,详细探讨了最关键的 3 个问题. 一.缓存穿透预防及优化 缓存穿透是指查询一个根本不存在的数据,缓存层和存储层都不会命中,但是出于容错的考虑,如果从存储层查不到数据则不写入缓存层,如图 11-3 所示整个过程分为如下 3 步: 缓存层不命中 存储层不命中,所以不将空结果写回缓存 返

Redis03——Redis架构

Redis架构 1.1.问题 redis是单线程,单实例,为什么并发那么多,依旧很快呢? 回答:因为调用了系统内核的epoll 1.2.Linux的早期版本 Linux有Linux kernal,我们的客户端,进行连接,首先到达的是Linux kernal,在Linux的早期版本,只有read和write进行文件读写.我们使用一个线程/进程 进行调用read和write函数,那么将会返回一个文件描述符fd(file description).我们开启线程/进程去调用read进行读取.因为sock

redis架构详解

一.redis特性1.redis 是什么?redis是基于内存的可持久化的key-value数据库2.redis数据结构类型?value支持五种数据类型,字符串.字符串列表.字符串集合.有序集合.hashs3.redis持久存储方式redis两种持久化方式,RDB,和AOFRDB: 将某一时刻的数据持久化到磁盘上,是一种快照式的持久方式, redis在进行持久化的过程中,会先将数据写入临时文件中,待持久化过程结束,会用这个临时文件,替换上次持久化的文件,正是这种特性,让我们可以随时来进行备份,因

细说分布式Redis架构设计和踩过的那些坑

摘要:本文章主要分成五个步骤内容讲解 Redis.RedisCluster和Codis; 我们更爱一致性; Codis在生产环境中的使用的经验和坑们; 对于分布式数据库和分布式架构的一些看法; Q & A环节. Codis是一个分布式Redis解决方案,与官方的纯P2P的模式不同,Codis采用的是Proxy-based的方案.今天我们介绍一下Codis及下一个大版本RebornDB的设计,同时会介绍一些Codis在实际应用场景中的tips.最后抛砖引玉,会介绍一下我对分布式存储的一些观点和看法

Discuz!NT中的Redis架构设计

在之前的Discuz!NT缓存的架构方案中,曾说过Discuz!NT采用了两级缓存方式,即本地缓存+memcached方式.在近半年多的实际运行环境下,该方案经受住了检验.现在为了提供多样式的解决方案,我在企业版里引入了Redis这个目前炙手可热的缓存架构产品,即将memcached与Redis作为可选插件方式来提供了最终用户,尽管目前测试的结果两者的差异不是很大(毫秒级),但我想多一种选择对用户来说也是好的. 闲话不多说了,开始今天的正文吧.         熟悉我们产品的开发者都知道,我们的

[转载] Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

原文: http://mp.weixin.qq.com/s?__biz=MzAwMDU1MTE1OQ==&mid=208733458&idx=1&sn=691bfde670fb2dd649685723f7358fea&scene=1&key=c76941211a49ab58cb17c68ecaeeda0f1c083d9508a0f6629461fff9025fd87de4706bd9c1730e0ddbab70568b34b16a&ascene=0&

Codis作者黄东旭细说分布式Redis架构设计和踩过的那些坑们

本次分享的内容主要包括五个大部分: Redis.RedisCluster和Codis; 我们更爱一致性; Codis在生产环境中的使用的经验和坑们; 对于分布式数据库和分布式架构的一些看法; Q & A环节. ??Codis是一个分布式Redis解决方案,与官方的纯P2P的模式不同,Codis采用的是Proxy-based的方案.今天我们介绍一下Codis及下一个大版本RebornDB的设计,同时会介绍一些Codis在实际应用场景中的tips.最后抛砖引玉,会介绍一下我对分布式存储的一些观点和看

Memcached 及 Redis 架构分析和区别比较

Memcached和Redis作为两种Inmemory的key-value数据库,在设计和思想方面有着很多共通的地方,功能和应用方面在很多场合下(作为分布式缓存服务器使用等) 也很相似,在这里把两者放在一起做一下对比的介绍 基本架构和思想 首先简单介绍一下两者的架构和设计思路 Memcached Memcached采用客户端-服务器的架构,客户端和服务器端的通讯使用自定义的协议标准,只要满足协议格式要求,客户端Library可以用任何语言实现. 从用户的角度来说,服务器维护了一个键-值关系的数据