Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
别团等shy哥发育
redis
提交
9fa9ccb0
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,发现更多精彩内容 >>
提交
9fa9ccb0
编写于
3月 14, 2012
作者:
A
antirez
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Reclaim space from the client querybuf if needed.
上级
6934832e
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
33 addition
and
3 deletion
+33
-3
src/aof.c
src/aof.c
+1
-0
src/networking.c
src/networking.c
+2
-0
src/redis.c
src/redis.c
+29
-3
src/redis.h
src/redis.h
+1
-0
未找到文件。
src/aof.c
浏览文件 @
9fa9ccb0
...
@@ -287,6 +287,7 @@ struct redisClient *createFakeClient(void) {
...
@@ -287,6 +287,7 @@ struct redisClient *createFakeClient(void) {
selectDb
(
c
,
0
);
selectDb
(
c
,
0
);
c
->
fd
=
-
1
;
c
->
fd
=
-
1
;
c
->
querybuf
=
sdsempty
();
c
->
querybuf
=
sdsempty
();
c
->
querybuf_peak
=
0
;
c
->
argc
=
0
;
c
->
argc
=
0
;
c
->
argv
=
NULL
;
c
->
argv
=
NULL
;
c
->
bufpos
=
0
;
c
->
bufpos
=
0
;
...
...
src/networking.c
浏览文件 @
9fa9ccb0
...
@@ -43,6 +43,7 @@ redisClient *createClient(int fd) {
...
@@ -43,6 +43,7 @@ redisClient *createClient(int fd) {
c
->
fd
=
fd
;
c
->
fd
=
fd
;
c
->
bufpos
=
0
;
c
->
bufpos
=
0
;
c
->
querybuf
=
sdsempty
();
c
->
querybuf
=
sdsempty
();
c
->
querybuf_peak
=
0
;
c
->
reqtype
=
0
;
c
->
reqtype
=
0
;
c
->
argc
=
0
;
c
->
argc
=
0
;
c
->
argv
=
NULL
;
c
->
argv
=
NULL
;
...
@@ -998,6 +999,7 @@ void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) {
...
@@ -998,6 +999,7 @@ void readQueryFromClient(aeEventLoop *el, int fd, void *privdata, int mask) {
}
}
qblen
=
sdslen
(
c
->
querybuf
);
qblen
=
sdslen
(
c
->
querybuf
);
if
(
c
->
querybuf_peak
<
qblen
)
c
->
querybuf_peak
=
qblen
;
c
->
querybuf
=
sdsMakeRoomFor
(
c
->
querybuf
,
readlen
);
c
->
querybuf
=
sdsMakeRoomFor
(
c
->
querybuf
,
readlen
);
nread
=
read
(
fd
,
c
->
querybuf
+
qblen
,
readlen
);
nread
=
read
(
fd
,
c
->
querybuf
+
qblen
,
readlen
);
if
(
nread
==
-
1
)
{
if
(
nread
==
-
1
)
{
...
...
src/redis.c
浏览文件 @
9fa9ccb0
...
@@ -629,7 +629,7 @@ long long getOperationsPerSecond(void) {
...
@@ -629,7 +629,7 @@ long long getOperationsPerSecond(void) {
}
}
void
clientsCronHandleTimeout
(
redisClient
*
c
)
{
void
clientsCronHandleTimeout
(
redisClient
*
c
)
{
time_t
now
=
time
(
NULL
)
;
time_t
now
=
server
.
unixtime
;
if
(
server
.
maxidletime
&&
if
(
server
.
maxidletime
&&
!
(
c
->
flags
&
REDIS_SLAVE
)
&&
/* no timeout for slaves */
!
(
c
->
flags
&
REDIS_SLAVE
)
&&
/* no timeout for slaves */
...
@@ -649,15 +649,40 @@ void clientsCronHandleTimeout(redisClient *c) {
...
@@ -649,15 +649,40 @@ void clientsCronHandleTimeout(redisClient *c) {
}
}
}
}
/* The client query buffer is an sds.c string that can end with a lot of
* free space not used, this function reclaims space if needed. */
void
clientsCronResizeQueryBuffer
(
redisClient
*
c
)
{
size_t
querybuf_size
=
sdsAllocSize
(
c
->
querybuf
);
time_t
idletime
=
server
.
unixtime
-
c
->
lastinteraction
;
/* There are two conditions to resize the query buffer:
* 1) Query buffer is > BIG_ARG and too big for latest peak.
* 2) Client is inactive and the buffer is bigger than 1k. */
if
(((
querybuf_size
>
REDIS_MBULK_BIG_ARG
)
&&
(
querybuf_size
/
(
c
->
querybuf_peak
+
1
))
>
2
)
||
(
querybuf_size
>
1024
&&
idletime
>
2
))
{
/* Only resize the query buffer if it is actually wasting space. */
if
(
sdsavail
(
c
->
querybuf
)
>
1024
)
{
c
->
querybuf
=
sdsRemoveFreeSpace
(
c
->
querybuf
);
}
}
/* Reset the peak again to capture the peak memory usage in the next
* cycle. */
c
->
querybuf_peak
=
0
;
}
void
clientsCron
(
void
)
{
void
clientsCron
(
void
)
{
/* Make sure to process at least 1/100 of clients per call.
/* Make sure to process at least 1/100 of clients per call.
* Since this function is called 10 times per second we are sure that
* Since this function is called 10 times per second we are sure that
* in the worst case we process all the clients in 10 seconds.
* in the worst case we process all the clients in 10 seconds.
* In normal conditions (a reasonable number of clients) we process
* In normal conditions (a reasonable number of clients) we process
* all the clients in a shorter time. */
* all the clients in a shorter time. */
int
iterations
=
listLength
(
server
.
clients
)
/
100
;
int
numclients
=
listLength
(
server
.
clients
)
;
i
f
(
iterations
<
50
)
iterations
=
5
0
;
i
nt
iterations
=
numclients
/
10
0
;
if
(
iterations
<
50
)
iterations
=
(
numclients
<
50
)
?
numclients
:
50
;
while
(
listLength
(
server
.
clients
)
&&
iterations
--
)
{
while
(
listLength
(
server
.
clients
)
&&
iterations
--
)
{
redisClient
*
c
;
redisClient
*
c
;
listNode
*
head
;
listNode
*
head
;
...
@@ -669,6 +694,7 @@ void clientsCron(void) {
...
@@ -669,6 +694,7 @@ void clientsCron(void) {
head
=
listFirst
(
server
.
clients
);
head
=
listFirst
(
server
.
clients
);
c
=
listNodeValue
(
head
);
c
=
listNodeValue
(
head
);
clientsCronHandleTimeout
(
c
);
clientsCronHandleTimeout
(
c
);
clientsCronResizeQueryBuffer
(
c
);
}
}
}
}
...
...
src/redis.h
浏览文件 @
9fa9ccb0
...
@@ -323,6 +323,7 @@ typedef struct redisClient {
...
@@ -323,6 +323,7 @@ typedef struct redisClient {
redisDb
*
db
;
redisDb
*
db
;
int
dictid
;
int
dictid
;
sds
querybuf
;
sds
querybuf
;
size_t
querybuf_peak
;
/* Recent (100ms or more) peak of querybuf size */
int
argc
;
int
argc
;
robj
**
argv
;
robj
**
argv
;
struct
redisCommand
*
cmd
,
*
lastcmd
;
struct
redisCommand
*
cmd
,
*
lastcmd
;
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录