Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
xindoo
redis
提交
a9b18e54
R
redis
项目概览
xindoo
/
redis
通知
2
Star
2
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,发现更多精彩内容 >>
提交
a9b18e54
编写于
11月 04, 2010
作者:
P
Pieter Noordhuis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Stop using the freelist robj* cache
上级
8df3dcad
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
4 addition
and
51 deletion
+4
-51
src/object.c
src/object.c
+3
-17
src/redis.c
src/redis.c
+1
-29
src/redis.h
src/redis.h
+0
-4
src/vm.c
src/vm.c
+0
-1
未找到文件。
src/object.c
浏览文件 @
a9b18e54
...
...
@@ -3,22 +3,12 @@
#include <math.h>
robj
*
createObject
(
int
type
,
void
*
ptr
)
{
robj
*
o
;
if
(
server
.
vm_enabled
)
pthread_mutex_lock
(
&
server
.
obj_freelist_mutex
);
if
(
listLength
(
server
.
objfreelist
))
{
listNode
*
head
=
listFirst
(
server
.
objfreelist
);
o
=
listNodeValue
(
head
);
listDelNode
(
server
.
objfreelist
,
head
);
if
(
server
.
vm_enabled
)
pthread_mutex_unlock
(
&
server
.
obj_freelist_mutex
);
}
else
{
if
(
server
.
vm_enabled
)
pthread_mutex_unlock
(
&
server
.
obj_freelist_mutex
);
o
=
zmalloc
(
sizeof
(
*
o
));
}
robj
*
o
=
zmalloc
(
sizeof
(
*
o
));
o
->
type
=
type
;
o
->
encoding
=
REDIS_ENCODING_RAW
;
o
->
ptr
=
ptr
;
o
->
refcount
=
1
;
/* Set the LRU to the current lruclock (minutes resolution).
* We do this regardless of the fact VM is active as LRU is also
* used for the maxmemory directive when Redis is used as cache.
...
...
@@ -204,11 +194,7 @@ void decrRefCount(void *obj) {
default:
redisPanic
(
"Unknown object type"
);
break
;
}
o
->
ptr
=
NULL
;
/* defensive programming. We'll see NULL in traces. */
if
(
server
.
vm_enabled
)
pthread_mutex_lock
(
&
server
.
obj_freelist_mutex
);
if
(
listLength
(
server
.
objfreelist
)
>
REDIS_OBJFREELIST_MAX
||
!
listAddNodeHead
(
server
.
objfreelist
,
o
))
zfree
(
o
);
if
(
server
.
vm_enabled
)
pthread_mutex_unlock
(
&
server
.
obj_freelist_mutex
);
zfree
(
o
);
}
}
...
...
src/redis.c
浏览文件 @
a9b18e54
...
...
@@ -616,10 +616,7 @@ int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) {
while
(
server
.
vm_enabled
&&
zmalloc_used_memory
()
>
server
.
vm_max_memory
)
{
int
retval
;
if
(
tryFreeOneObjectFromFreelist
()
==
REDIS_OK
)
continue
;
retval
=
(
server
.
vm_max_threads
==
0
)
?
int
retval
=
(
server
.
vm_max_threads
==
0
)
?
vmSwapOneObjectBlocking
()
:
vmSwapOneObjectThreaded
();
if
(
retval
==
REDIS_ERR
&&
!
(
loops
%
300
)
&&
...
...
@@ -825,7 +822,6 @@ void initServer() {
server
.
clients
=
listCreate
();
server
.
slaves
=
listCreate
();
server
.
monitors
=
listCreate
();
server
.
objfreelist
=
listCreate
();
createSharedObjects
();
server
.
el
=
aeCreateEventLoop
();
server
.
db
=
zmalloc
(
sizeof
(
redisDb
)
*
server
.
dbnum
);
...
...
@@ -1261,27 +1257,6 @@ void monitorCommand(redisClient *c) {
/* ============================ Maxmemory directive ======================== */
/* Try to free one object form the pre-allocated objects free list.
* This is useful under low mem conditions as by default we take 1 million
* free objects allocated. On success REDIS_OK is returned, otherwise
* REDIS_ERR. */
int
tryFreeOneObjectFromFreelist
(
void
)
{
robj
*
o
;
if
(
server
.
vm_enabled
)
pthread_mutex_lock
(
&
server
.
obj_freelist_mutex
);
if
(
listLength
(
server
.
objfreelist
))
{
listNode
*
head
=
listFirst
(
server
.
objfreelist
);
o
=
listNodeValue
(
head
);
listDelNode
(
server
.
objfreelist
,
head
);
if
(
server
.
vm_enabled
)
pthread_mutex_unlock
(
&
server
.
obj_freelist_mutex
);
zfree
(
o
);
return
REDIS_OK
;
}
else
{
if
(
server
.
vm_enabled
)
pthread_mutex_unlock
(
&
server
.
obj_freelist_mutex
);
return
REDIS_ERR
;
}
}
/* This function gets called when 'maxmemory' is set on the config file to limit
* the max memory used by the server, and we are out of memory.
* This function will try to, in order:
...
...
@@ -1299,9 +1274,6 @@ void freeMemoryIfNeeded(void) {
while
(
server
.
maxmemory
&&
zmalloc_used_memory
()
>
server
.
maxmemory
)
{
int
j
,
k
,
freed
=
0
;
/* Basic strategy -- remove objects from the free list. */
if
(
tryFreeOneObjectFromFreelist
()
==
REDIS_OK
)
continue
;
for
(
j
=
0
;
j
<
server
.
dbnum
;
j
++
)
{
long
bestval
=
0
;
/* just to prevent warning */
sds
bestkey
=
NULL
;
...
...
src/redis.h
浏览文件 @
a9b18e54
...
...
@@ -41,7 +41,6 @@
#define REDIS_STATIC_ARGS 8
#define REDIS_DEFAULT_DBNUM 16
#define REDIS_CONFIGLINE_MAX 1024
#define REDIS_OBJFREELIST_MAX 1000000
/* Max number of objects to cache */
#define REDIS_MAX_SYNC_TIME 60
/* Slave can't take more to sync */
#define REDIS_EXPIRELOOKUPS_PER_CRON 10
/* lookup 10 expires per loop */
#define REDIS_MAX_WRITE_PER_EVENT (1024*64)
...
...
@@ -366,7 +365,6 @@ struct redisServer {
char
neterr
[
ANET_ERR_LEN
];
aeEventLoop
*
el
;
int
cronloops
;
/* number of times the cron function run */
list
*
objfreelist
;
/* A list of freed objects to avoid malloc() */
time_t
lastsave
;
/* Unix time of last save succeeede */
/* Fields used only for stats */
time_t
stat_starttime
;
/* server start time */
...
...
@@ -447,7 +445,6 @@ struct redisServer {
list
*
io_processed
;
/* List of VM I/O jobs already processed */
list
*
io_ready_clients
;
/* Clients ready to be unblocked. All keys loaded */
pthread_mutex_t
io_mutex
;
/* lock to access io_jobs/io_done/io_thread_job */
pthread_mutex_t
obj_freelist_mutex
;
/* safe redis objects creation/free */
pthread_mutex_t
io_swapfile_mutex
;
/* So we can lseek + write */
pthread_attr_t
io_threads_attr
;
/* attributes for threads creation */
int
io_active_threads
;
/* Number of running I/O threads */
...
...
@@ -685,7 +682,6 @@ robj *dupStringObject(robj *o);
robj
*
tryObjectEncoding
(
robj
*
o
);
robj
*
getDecodedObject
(
robj
*
o
);
size_t
stringObjectLen
(
robj
*
o
);
int
tryFreeOneObjectFromFreelist
(
void
);
robj
*
createStringObjectFromLongLong
(
long
long
value
);
robj
*
createListObject
(
void
);
robj
*
createZiplistObject
(
void
);
...
...
src/vm.c
浏览文件 @
a9b18e54
...
...
@@ -96,7 +96,6 @@ void vmInit(void) {
server
.
io_processed
=
listCreate
();
server
.
io_ready_clients
=
listCreate
();
pthread_mutex_init
(
&
server
.
io_mutex
,
NULL
);
pthread_mutex_init
(
&
server
.
obj_freelist_mutex
,
NULL
);
pthread_mutex_init
(
&
server
.
io_swapfile_mutex
,
NULL
);
server
.
io_active_threads
=
0
;
if
(
pipe
(
pipefds
)
==
-
1
)
{
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录