Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
别团等shy哥发育
redis
提交
6500fabf
R
redis
项目概览
别团等shy哥发育
/
redis
与 Fork 源项目一致
从无法访问的项目Fork
通知
2
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
R
redis
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
6500fabf
编写于
8月 06, 2013
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Some activeExpireCycle() refactoring.
上级
d398f388
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
32 addition
and
21 deletion
+32
-21
src/redis.c
src/redis.c
+26
-19
src/redis.h
src/redis.h
+6
-2
未找到文件。
src/redis.c
浏览文件 @
6500fabf
...
...
@@ -691,33 +691,37 @@ int activeExpireCycleTryExpire(redisDb *db, struct dictEntry *de, long long now)
* No more than REDIS_DBCRON_DBS_PER_CALL databases are tested at every
* iteration.
*
* If fast is non-zero the function will try to run a "fast" expire cycle that
* takes no longer than EXPIRE_FAST_CYCLE_DURATION microseconds, and is not
* repeated again before the same amount of time.
*
* This kind of call is used when Redis detects that timelimit_exit is
* true, so there is more work to do, and we do it more incrementally from
* the beforeSleep() function of the event loop. */
#define EXPIRE_FAST_CYCLE_DURATION 1000
* the beforeSleep() function of the event loop.
*
* Expire cycle type:
*
* If type is ACTIVE_EXPIRE_CYCLE_FAST the function will try to run a
* "fast" expire cycle that takes no longer than EXPIRE_FAST_CYCLE_DURATION
* microseconds, and is not repeated again before the same amount of time.
*
* If type is ACTIVE_EXPIRE_CYCLE_SLOW, that normal expire cycle is
* executed, where the time limit is a percentage of the REDIS_HZ period
* as specified by the REDIS_EXPIRELOOKUPS_TIME_PERC define. */
void
activeExpireCycle
(
int
fast
)
{
void
activeExpireCycle
(
int
type
)
{
/* This function has some global state in order to continue the work
* incrementally across calls. */
static
unsigned
int
current_db
=
0
;
/* Last DB tested. */
static
int
timelimit_exit
=
0
;
/* Time limit hit in previous call? */
static
long
long
last_fast_cycle
=
0
;
/* When last fast cycle ran. */
unsigned
int
j
,
iteration
=
0
;
unsigned
int
dbs_per_call
=
REDIS_DBCRON_DBS_PER_CALL
;
long
long
start
=
ustime
(),
timelimit
;
static
long
long
last_fast_cycle
=
0
;
if
(
fast
)
{
if
(
type
==
ACTIVE_EXPIRE_CYCLE_FAST
)
{
/* Don't start a fast cycle if the previous cycle did not exited
* for time limt. Also don't repeat a fast cycle for the same period
* as the fast cycle total duration itself. */
if
(
!
timelimit_exit
)
return
;
if
(
start
<
last_fast_cycle
+
EXPIRE_FAST_CYCLE
_DURATION
)
return
;
if
(
start
<
last_fast_cycle
+
ACTIVE_EXPIRE_CYCLE_FAST
_DURATION
)
return
;
last_fast_cycle
=
start
;
}
...
...
@@ -731,15 +735,16 @@ void activeExpireCycle(int fast) {
if
(
dbs_per_call
>
server
.
dbnum
||
timelimit_exit
)
dbs_per_call
=
server
.
dbnum
;
/* We can use at max
REDIS_EXPIRELOOKUPS
_TIME_PERC percentage of CPU time
/* We can use at max
ACTIVE_EXPIRE_CYCLE_SLOW
_TIME_PERC percentage of CPU time
* per iteration. Since this function gets called with a frequency of
* server.hz times per second, the following is the max amount of
* microseconds we can spend in this function. */
timelimit
=
1000000
*
REDIS_EXPIRELOOKUPS
_TIME_PERC
/
server
.
hz
/
100
;
timelimit
=
1000000
*
ACTIVE_EXPIRE_CYCLE_SLOW
_TIME_PERC
/
server
.
hz
/
100
;
timelimit_exit
=
0
;
if
(
timelimit
<=
0
)
timelimit
=
1
;
if
(
fast
)
timelimit
=
EXPIRE_FAST_CYCLE_DURATION
;
/* in microseconds. */
if
(
type
==
ACTIVE_EXPIRE_CYCLE_FAST
)
timelimit
=
ACTIVE_EXPIRE_CYCLE_FAST_DURATION
;
/* in microseconds. */
for
(
j
=
0
;
j
<
dbs_per_call
;
j
++
)
{
int
expired
;
...
...
@@ -770,8 +775,8 @@ void activeExpireCycle(int fast) {
/* The main collection cycle. Sample random keys among keys
* with an expire set, checking for expired ones. */
expired
=
0
;
if
(
num
>
REDIS_EXPIRELOOKUPS_PER_CRON
)
num
=
REDIS_EXPIRELOOKUPS_PER_CRON
;
if
(
num
>
ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP
)
num
=
ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP
;
while
(
num
--
)
{
dictEntry
*
de
;
...
...
@@ -788,7 +793,9 @@ void activeExpireCycle(int fast) {
timelimit_exit
=
1
;
}
if
(
timelimit_exit
)
return
;
}
while
(
expired
>
REDIS_EXPIRELOOKUPS_PER_CRON
/
4
);
/* We don't repeat the cycle if there are less than 25% of keys
* found expired in the current DB. */
}
while
(
expired
>
ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP
/
4
);
}
}
...
...
@@ -908,7 +915,7 @@ void databasesCron(void) {
/* Expire keys by random sampling. Not required for slaves
* as master will synthesize DELs for us. */
if
(
server
.
active_expire_enabled
&&
server
.
masterhost
==
NULL
)
activeExpireCycle
(
0
);
activeExpireCycle
(
ACTIVE_EXPIRE_CYCLE_SLOW
);
/* Perform hash tables rehashing if needed, but only if there are no
* other processes saving the DB on disk. Otherwise rehashing is bad
...
...
@@ -1151,7 +1158,7 @@ void beforeSleep(struct aeEventLoop *eventLoop) {
redisClient
*
c
;
/* Run a fast expire cycle. */
activeExpireCycle
(
1
);
activeExpireCycle
(
ACTIVE_EXPIRE_CYCLE_FAST
);
/* Try to process pending commands for clients that were just unblocked. */
while
(
listLength
(
server
.
unblocked_clients
))
{
...
...
src/redis.h
浏览文件 @
6500fabf
...
...
@@ -74,8 +74,6 @@
#define REDIS_MAXIDLETIME 0
/* default client timeout: infinite */
#define REDIS_DEFAULT_DBNUM 16
#define REDIS_CONFIGLINE_MAX 1024
#define REDIS_EXPIRELOOKUPS_PER_CRON 20
/* lookup 20 expires per loop */
#define REDIS_EXPIRELOOKUPS_TIME_PERC 25
/* CPU max % for keys collection */
#define REDIS_DBCRON_DBS_PER_CALL 16
#define REDIS_MAX_WRITE_PER_EVENT (1024*64)
#define REDIS_SHARED_SELECT_CMDS 10
...
...
@@ -124,6 +122,12 @@
#define REDIS_PEER_ID_LEN (REDIS_IP_STR_LEN+32)
/* Must be enough for ip:port */
#define REDIS_BINDADDR_MAX 16
#define ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP 20
/* Loopkups per loop. */
#define ACTIVE_EXPIRE_CYCLE_FAST_DURATION 1000
/* Microseconds */
#define ACTIVE_EXPIRE_CYCLE_SLOW_TIME_PERC 25
/* CPU max % for keys collection */
#define ACTIVE_EXPIRE_CYCLE_SLOW 0
#define ACTIVE_EXPIRE_CYCLE_FAST 1
/* Protocol and I/O related defines */
#define REDIS_MAX_QUERYBUF_LEN (1024*1024*1024)
/* 1GB max query buffer. */
#define REDIS_IOBUF_LEN (1024*16)
/* Generic I/O buffer size */
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录