暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
redis设计思想.doc
8
3页
0次
2025-04-01
免费下载
不同
nginx
的精雕细琢,
redis
代码的风格趋向于简洁实用。简洁启事,下面所述不再
源码资料除末
redis
尽可
redis
的设计思想。
整体模型:单进程单线程事件驱动模式。
Redis
在主处理流程中,采用了单进程接受各种
client
请求并返回结果,整体处理流程采
事件驱动的方式进行。通过其
IO
复用的方式监听
aeEventLoop
事件,在事件处理的过程
这种模式对处理函数的要求:进行一次事件处理需要尽可能地快。因此会有以下几种处理
方法:
1.
对于非长时间处理事件,直接处理。如
set
命令;
2.
对于需要长时间处理的事件,分步处理,直至完成。如
rehash
过程,在单次事件处理
程中,每次只移动一个桶。
3.
对于阻塞函数,如从磁盘读取
vm
数据等,采用异步的模式。从磁盘
load
数据,是一个较
耗时的操,如理函中直读取数据将会塞整体的线程处理其
client
求。
多线程开发的复杂性是我们所清楚的。采用单进程单线程的模式,可以避免很多复杂性,
另外事务性操作,无须额外加锁,大大降低了开发难度。
IO
复用
Redis
IO
tiny libevent
ae.c
ae_select.c
ae_kqueue.c
ae_epoll.c
ae
interface
select
kqueque
epoll
三种可选
IO
用方式。而够,简高效充分
体现了
redis
的设计理念。
Redis Default
select
C10K max
事件监听
在单线程事件驱动模型中,往往会遇到两种任务,定时处理任务及事件触发任务,于是会
有如下问题:事件触发任务在无任务时,会处于阻塞状态;定时任务要求定时处理,于是
往往会有如下两种处理方式:
1.
果定时任时间隔为
t
一般
IO
复用的超时间
t/10
这样可以证定
务得到及时处理,在调用所有
cron
任务时,会做间隔时间判断。
2.
计算当前事件与最近的定时任务开始时间的间隔,设置
IO
复用超时时间为该事件。这样
定时任务也能得到及时处理。
注意:以上定时任务的处理时间,都为估约时间,非精确时间。前一种方式每轮计算量少
当容易引起空转,后一种计算量大,但减少了空转次数。
Redis
采用的是后一种方式。
里也会问什么
sigaction
setitimer
设置钟,再也
cron
事件做额外处理。原因如下:
定时时钟,往往会让进程陷入内核态,内核软中断往往会打破用户态一个函数的完整性,
因此会破坏的状态转移;另外加入软中断的,将可能为程不可避免地复杂
性。
曾经做过一个目的一段挫折经历
一个电话路呼转的目,采用的是单线程异步事件驱动模型,每次定时任务有个让空
道“挂机”的任务。前采用预制的驱动时钟,时钟信号为实时信号(信号宏值
32-64
间的一个数信号
sigqueue
,这样如果任务阻塞返回后,量时钟
事件多次机失败。后
setitimer
设置系统钟,软中断打断了用户
的一
mutex_lock
mutex_unlock
,并且挂机使用了该锁,成整个进程时有时无的
锁现
数据结
Intset
,该
set
不同于
hash set
数据结,该数据结其实是一个有,对于:
>
>
memmove
续元素
查找操作:查找
hash table
set
presentation
size 20-50k
hashset
hash
set
遍历链表时间,与
intset
查找时间本差不多。但其实另一方面,作者没
intset
memmove
O(n)
hash set
优势的是,该
array set
,是有的。
Ziplist
数据
small size
计的
list
比常
linked list
value-header
encoding
等,用遍历
list
。在需求上,
encoding
保证多种不同的数据,可以保在同一个
list
中,如
int16
int32
str
等。
zset
hash dict + skip list
常见的有
set
rb tree
基础。而在整
redis
中,我们很难发
现任何复杂数据结
tree
踪影
Redis
hash dict
保证查找的效,以跳表保证
范围查找需求的快速满足范围查找抛弃
rb tree
b+-* tree
,也体现了其不想复杂
的简洁美学
......
整个
redis
中,有任专门的内存池所有内
stl
niginx
,内
有其内存池机构
redis
Redis
size+malloc
zmalloc
,其常见的小对
intset
ziplist
数据以数不断
realloc
方式
resize
间接
现了存池的思想,但却没有实现一个存池简单美学体现
持久化
持久化
redis
这种内数据拓展功能,如
memcachedb
memcached
一样。借鉴却
大大减了
OS
vm
处理机制(复杂程度较
memecached
在数量级),以够用的理
用,在某些地方按照需求定。其思想为一个大的磁盘文件,作为
vm
文件,
bitmap
所有
block
使
redisObject
vmPointer
为同型异,后指明
value
vm
文件中的置等信息对大的
value
进行
lzf
压缩解压以减少磁盘
IO
来的性能开
Key
作为永远在内中。
常见
LRU
实现有如下几种:
memcached
lru list
LRU
表),每次使用会改变这个链表,最终淘汰
list
的数据。
Linux
核,
active
inactive
list
计算入相
list
,并对
inactive
中的
page
进行再激活或淘汰
redis
有相
lru
据结
lru
机制:整
redis
有一时钟每隔
次,每一个数据都会保存它最近使用时当前的时钟
dict
中几个数据
据其
value
的大系统确定
swap
的能,超将其
更换出去。
Vm
的思想,对
redis
这种崇尚洁实效的设计来,多少复杂,因此作
一直在考虑另外一种实现方式去
vm
持久化机制,可
http://groups.google.com/group/redis-
db/browse_thread/thread/d444bc786689bde9/1565b7570ffbb268?
show_docid=1565b7570ffbb268#
步模
redis
弱项,目前只能同到,而不能到主,有待继开发,对此模
感兴趣的可以参考
mysql
的实现。
redis
洁、
redis
kv-db
db
source code
中,恐怕很难
redis
简单易读的代码了。这很多方面,得我们设计
开发借鉴
of 3
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。