Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
hanoi2005
redis
提交
2159782b
R
redis
项目概览
hanoi2005
/
redis
与 Fork 源项目一致
从无法访问的项目Fork
通知
1
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,发现更多精彩内容 >>
提交
2159782b
编写于
8月 03, 2010
作者:
P
Pieter Noordhuis
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
Use flexible array in zskiplistNode to reduce memory usage
上级
68254919
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
64 addition
and
83 deletion
+64
-83
src/redis.h
src/redis.h
+6
-5
src/t_zset.c
src/t_zset.c
+58
-78
未找到文件。
src/redis.h
浏览文件 @
2159782b
...
@@ -480,13 +480,14 @@ typedef struct _redisSortOperation {
...
@@ -480,13 +480,14 @@ typedef struct _redisSortOperation {
}
redisSortOperation
;
}
redisSortOperation
;
/* ZSETs use a specialized version of Skiplists */
/* ZSETs use a specialized version of Skiplists */
typedef
struct
zskiplistNode
{
typedef
struct
zskiplistNode
{
struct
zskiplistNode
**
forward
;
struct
zskiplistNode
*
backward
;
unsigned
int
*
span
;
double
score
;
robj
*
obj
;
robj
*
obj
;
double
score
;
struct
zskiplistNode
*
backward
;
struct
zskiplistLevel
{
struct
zskiplistNode
*
forward
;
unsigned
int
span
;
}
level
[];
}
zskiplistNode
;
}
zskiplistNode
;
typedef
struct
zskiplist
{
typedef
struct
zskiplist
{
...
...
src/t_zset.c
浏览文件 @
2159782b
...
@@ -24,13 +24,7 @@
...
@@ -24,13 +24,7 @@
* from tail to head, useful for ZREVRANGE. */
* from tail to head, useful for ZREVRANGE. */
zskiplistNode
*
zslCreateNode
(
int
level
,
double
score
,
robj
*
obj
)
{
zskiplistNode
*
zslCreateNode
(
int
level
,
double
score
,
robj
*
obj
)
{
zskiplistNode
*
zn
=
zmalloc
(
sizeof
(
*
zn
));
zskiplistNode
*
zn
=
zmalloc
(
sizeof
(
*
zn
)
+
level
*
sizeof
(
struct
zskiplistLevel
));
zn
->
forward
=
zmalloc
(
sizeof
(
zskiplistNode
*
)
*
level
);
if
(
level
>
1
)
zn
->
span
=
zmalloc
(
sizeof
(
unsigned
int
)
*
(
level
-
1
));
else
zn
->
span
=
NULL
;
zn
->
score
=
score
;
zn
->
score
=
score
;
zn
->
obj
=
obj
;
zn
->
obj
=
obj
;
return
zn
;
return
zn
;
...
@@ -45,11 +39,8 @@ zskiplist *zslCreate(void) {
...
@@ -45,11 +39,8 @@ zskiplist *zslCreate(void) {
zsl
->
length
=
0
;
zsl
->
length
=
0
;
zsl
->
header
=
zslCreateNode
(
ZSKIPLIST_MAXLEVEL
,
0
,
NULL
);
zsl
->
header
=
zslCreateNode
(
ZSKIPLIST_MAXLEVEL
,
0
,
NULL
);
for
(
j
=
0
;
j
<
ZSKIPLIST_MAXLEVEL
;
j
++
)
{
for
(
j
=
0
;
j
<
ZSKIPLIST_MAXLEVEL
;
j
++
)
{
zsl
->
header
->
forward
[
j
]
=
NULL
;
zsl
->
header
->
level
[
j
].
forward
=
NULL
;
zsl
->
header
->
level
[
j
].
span
=
0
;
/* span has space for ZSKIPLIST_MAXLEVEL-1 elements */
if
(
j
<
ZSKIPLIST_MAXLEVEL
-
1
)
zsl
->
header
->
span
[
j
]
=
0
;
}
}
zsl
->
header
->
backward
=
NULL
;
zsl
->
header
->
backward
=
NULL
;
zsl
->
tail
=
NULL
;
zsl
->
tail
=
NULL
;
...
@@ -58,19 +49,15 @@ zskiplist *zslCreate(void) {
...
@@ -58,19 +49,15 @@ zskiplist *zslCreate(void) {
void
zslFreeNode
(
zskiplistNode
*
node
)
{
void
zslFreeNode
(
zskiplistNode
*
node
)
{
decrRefCount
(
node
->
obj
);
decrRefCount
(
node
->
obj
);
zfree
(
node
->
forward
);
zfree
(
node
->
span
);
zfree
(
node
);
zfree
(
node
);
}
}
void
zslFree
(
zskiplist
*
zsl
)
{
void
zslFree
(
zskiplist
*
zsl
)
{
zskiplistNode
*
node
=
zsl
->
header
->
forward
[
0
]
,
*
next
;
zskiplistNode
*
node
=
zsl
->
header
->
level
[
0
].
forward
,
*
next
;
zfree
(
zsl
->
header
->
forward
);
zfree
(
zsl
->
header
->
span
);
zfree
(
zsl
->
header
);
zfree
(
zsl
->
header
);
while
(
node
)
{
while
(
node
)
{
next
=
node
->
forward
[
0
]
;
next
=
node
->
level
[
0
].
forward
;
zslFreeNode
(
node
);
zslFreeNode
(
node
);
node
=
next
;
node
=
next
;
}
}
...
@@ -93,13 +80,12 @@ void zslInsert(zskiplist *zsl, double score, robj *obj) {
...
@@ -93,13 +80,12 @@ void zslInsert(zskiplist *zsl, double score, robj *obj) {
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
/* store rank that is crossed to reach the insert position */
/* store rank that is crossed to reach the insert position */
rank
[
i
]
=
i
==
(
zsl
->
level
-
1
)
?
0
:
rank
[
i
+
1
];
rank
[
i
]
=
i
==
(
zsl
->
level
-
1
)
?
0
:
rank
[
i
+
1
];
while
(
x
->
level
[
i
].
forward
&&
while
(
x
->
forward
[
i
]
&&
(
x
->
level
[
i
].
forward
->
score
<
score
||
(
x
->
forward
[
i
]
->
score
<
score
||
(
x
->
level
[
i
].
forward
->
score
==
score
&&
(
x
->
forward
[
i
]
->
score
==
score
&&
compareStringObjects
(
x
->
level
[
i
].
forward
->
obj
,
obj
)
<
0
)))
{
compareStringObjects
(
x
->
forward
[
i
]
->
obj
,
obj
)
<
0
)))
{
rank
[
i
]
+=
x
->
level
[
i
].
span
;
rank
[
i
]
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
x
=
x
->
level
[
i
].
forward
;
x
=
x
->
forward
[
i
];
}
}
update
[
i
]
=
x
;
update
[
i
]
=
x
;
}
}
...
@@ -112,30 +98,28 @@ void zslInsert(zskiplist *zsl, double score, robj *obj) {
...
@@ -112,30 +98,28 @@ void zslInsert(zskiplist *zsl, double score, robj *obj) {
for
(
i
=
zsl
->
level
;
i
<
level
;
i
++
)
{
for
(
i
=
zsl
->
level
;
i
<
level
;
i
++
)
{
rank
[
i
]
=
0
;
rank
[
i
]
=
0
;
update
[
i
]
=
zsl
->
header
;
update
[
i
]
=
zsl
->
header
;
update
[
i
]
->
span
[
i
-
1
]
=
zsl
->
length
;
update
[
i
]
->
level
[
i
].
span
=
zsl
->
length
;
}
}
zsl
->
level
=
level
;
zsl
->
level
=
level
;
}
}
x
=
zslCreateNode
(
level
,
score
,
obj
);
x
=
zslCreateNode
(
level
,
score
,
obj
);
for
(
i
=
0
;
i
<
level
;
i
++
)
{
for
(
i
=
0
;
i
<
level
;
i
++
)
{
x
->
forward
[
i
]
=
update
[
i
]
->
forward
[
i
]
;
x
->
level
[
i
].
forward
=
update
[
i
]
->
level
[
i
].
forward
;
update
[
i
]
->
forward
[
i
]
=
x
;
update
[
i
]
->
level
[
i
].
forward
=
x
;
/* update span covered by update[i] as x is inserted here */
/* update span covered by update[i] as x is inserted here */
if
(
i
>
0
)
{
x
->
level
[
i
].
span
=
update
[
i
]
->
level
[
i
].
span
-
(
rank
[
0
]
-
rank
[
i
]);
x
->
span
[
i
-
1
]
=
update
[
i
]
->
span
[
i
-
1
]
-
(
rank
[
0
]
-
rank
[
i
]);
update
[
i
]
->
level
[
i
].
span
=
(
rank
[
0
]
-
rank
[
i
])
+
1
;
update
[
i
]
->
span
[
i
-
1
]
=
(
rank
[
0
]
-
rank
[
i
])
+
1
;
}
}
}
/* increment span for untouched levels */
/* increment span for untouched levels */
for
(
i
=
level
;
i
<
zsl
->
level
;
i
++
)
{
for
(
i
=
level
;
i
<
zsl
->
level
;
i
++
)
{
update
[
i
]
->
span
[
i
-
1
]
++
;
update
[
i
]
->
level
[
i
].
span
++
;
}
}
x
->
backward
=
(
update
[
0
]
==
zsl
->
header
)
?
NULL
:
update
[
0
];
x
->
backward
=
(
update
[
0
]
==
zsl
->
header
)
?
NULL
:
update
[
0
];
if
(
x
->
forward
[
0
]
)
if
(
x
->
level
[
0
].
forward
)
x
->
forward
[
0
]
->
backward
=
x
;
x
->
level
[
0
].
forward
->
backward
=
x
;
else
else
zsl
->
tail
=
x
;
zsl
->
tail
=
x
;
zsl
->
length
++
;
zsl
->
length
++
;
...
@@ -145,23 +129,19 @@ void zslInsert(zskiplist *zsl, double score, robj *obj) {
...
@@ -145,23 +129,19 @@ void zslInsert(zskiplist *zsl, double score, robj *obj) {
void
zslDeleteNode
(
zskiplist
*
zsl
,
zskiplistNode
*
x
,
zskiplistNode
**
update
)
{
void
zslDeleteNode
(
zskiplist
*
zsl
,
zskiplistNode
*
x
,
zskiplistNode
**
update
)
{
int
i
;
int
i
;
for
(
i
=
0
;
i
<
zsl
->
level
;
i
++
)
{
for
(
i
=
0
;
i
<
zsl
->
level
;
i
++
)
{
if
(
update
[
i
]
->
forward
[
i
]
==
x
)
{
if
(
update
[
i
]
->
level
[
i
].
forward
==
x
)
{
if
(
i
>
0
)
{
update
[
i
]
->
level
[
i
].
span
+=
x
->
level
[
i
].
span
-
1
;
update
[
i
]
->
span
[
i
-
1
]
+=
x
->
span
[
i
-
1
]
-
1
;
update
[
i
]
->
level
[
i
].
forward
=
x
->
level
[
i
].
forward
;
}
update
[
i
]
->
forward
[
i
]
=
x
->
forward
[
i
];
}
else
{
}
else
{
/* invariant: i > 0, because update[0]->forward[0]
update
[
i
]
->
level
[
i
].
span
-=
1
;
* is always equal to x */
update
[
i
]
->
span
[
i
-
1
]
-=
1
;
}
}
}
}
if
(
x
->
forward
[
0
]
)
{
if
(
x
->
level
[
0
].
forward
)
{
x
->
forward
[
0
]
->
backward
=
x
->
backward
;
x
->
level
[
0
].
forward
->
backward
=
x
->
backward
;
}
else
{
}
else
{
zsl
->
tail
=
x
->
backward
;
zsl
->
tail
=
x
->
backward
;
}
}
while
(
zsl
->
level
>
1
&&
zsl
->
header
->
forward
[
zsl
->
level
-
1
]
==
NULL
)
while
(
zsl
->
level
>
1
&&
zsl
->
header
->
level
[
zsl
->
level
-
1
].
forward
==
NULL
)
zsl
->
level
--
;
zsl
->
level
--
;
zsl
->
length
--
;
zsl
->
length
--
;
}
}
...
@@ -173,16 +153,16 @@ int zslDelete(zskiplist *zsl, double score, robj *obj) {
...
@@ -173,16 +153,16 @@ int zslDelete(zskiplist *zsl, double score, robj *obj) {
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
while
(
x
->
forward
[
i
]
&&
while
(
x
->
level
[
i
].
forward
&&
(
x
->
forward
[
i
]
->
score
<
score
||
(
x
->
level
[
i
].
forward
->
score
<
score
||
(
x
->
forward
[
i
]
->
score
==
score
&&
(
x
->
level
[
i
].
forward
->
score
==
score
&&
compareStringObjects
(
x
->
forward
[
i
]
->
obj
,
obj
)
<
0
)))
compareStringObjects
(
x
->
level
[
i
].
forward
->
obj
,
obj
)
<
0
)))
x
=
x
->
forward
[
i
]
;
x
=
x
->
level
[
i
].
forward
;
update
[
i
]
=
x
;
update
[
i
]
=
x
;
}
}
/* We may have multiple elements with the same score, what we need
/* We may have multiple elements with the same score, what we need
* is to find the element with both the right score and object. */
* is to find the element with both the right score and object. */
x
=
x
->
forward
[
0
]
;
x
=
x
->
level
[
0
].
forward
;
if
(
x
&&
score
==
x
->
score
&&
equalStringObjects
(
x
->
obj
,
obj
))
{
if
(
x
&&
score
==
x
->
score
&&
equalStringObjects
(
x
->
obj
,
obj
))
{
zslDeleteNode
(
zsl
,
x
,
update
);
zslDeleteNode
(
zsl
,
x
,
update
);
zslFreeNode
(
x
);
zslFreeNode
(
x
);
...
@@ -204,15 +184,15 @@ unsigned long zslDeleteRangeByScore(zskiplist *zsl, double min, double max, dict
...
@@ -204,15 +184,15 @@ unsigned long zslDeleteRangeByScore(zskiplist *zsl, double min, double max, dict
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
while
(
x
->
forward
[
i
]
&&
x
->
forward
[
i
]
->
score
<
min
)
while
(
x
->
level
[
i
].
forward
&&
x
->
level
[
i
].
forward
->
score
<
min
)
x
=
x
->
forward
[
i
]
;
x
=
x
->
level
[
i
].
forward
;
update
[
i
]
=
x
;
update
[
i
]
=
x
;
}
}
/* We may have multiple elements with the same score, what we need
/* We may have multiple elements with the same score, what we need
* is to find the element with both the right score and object. */
* is to find the element with both the right score and object. */
x
=
x
->
forward
[
0
]
;
x
=
x
->
level
[
0
].
forward
;
while
(
x
&&
x
->
score
<=
max
)
{
while
(
x
&&
x
->
score
<=
max
)
{
zskiplistNode
*
next
=
x
->
forward
[
0
]
;
zskiplistNode
*
next
=
x
->
level
[
0
].
forward
;
zslDeleteNode
(
zsl
,
x
,
update
);
zslDeleteNode
(
zsl
,
x
,
update
);
dictDelete
(
dict
,
x
->
obj
);
dictDelete
(
dict
,
x
->
obj
);
zslFreeNode
(
x
);
zslFreeNode
(
x
);
...
@@ -231,17 +211,17 @@ unsigned long zslDeleteRangeByRank(zskiplist *zsl, unsigned int start, unsigned
...
@@ -231,17 +211,17 @@ unsigned long zslDeleteRangeByRank(zskiplist *zsl, unsigned int start, unsigned
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
while
(
x
->
forward
[
i
]
&&
(
traversed
+
(
i
>
0
?
x
->
span
[
i
-
1
]
:
1
)
)
<
start
)
{
while
(
x
->
level
[
i
].
forward
&&
(
traversed
+
x
->
level
[
i
].
span
)
<
start
)
{
traversed
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
traversed
+=
x
->
level
[
i
].
span
;
x
=
x
->
forward
[
i
]
;
x
=
x
->
level
[
i
].
forward
;
}
}
update
[
i
]
=
x
;
update
[
i
]
=
x
;
}
}
traversed
++
;
traversed
++
;
x
=
x
->
forward
[
0
]
;
x
=
x
->
level
[
0
].
forward
;
while
(
x
&&
traversed
<=
end
)
{
while
(
x
&&
traversed
<=
end
)
{
zskiplistNode
*
next
=
x
->
forward
[
0
]
;
zskiplistNode
*
next
=
x
->
level
[
0
].
forward
;
zslDeleteNode
(
zsl
,
x
,
update
);
zslDeleteNode
(
zsl
,
x
,
update
);
dictDelete
(
dict
,
x
->
obj
);
dictDelete
(
dict
,
x
->
obj
);
zslFreeNode
(
x
);
zslFreeNode
(
x
);
...
@@ -260,12 +240,12 @@ zskiplistNode *zslFirstWithScore(zskiplist *zsl, double score) {
...
@@ -260,12 +240,12 @@ zskiplistNode *zslFirstWithScore(zskiplist *zsl, double score) {
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
while
(
x
->
forward
[
i
]
&&
x
->
forward
[
i
]
->
score
<
score
)
while
(
x
->
level
[
i
].
forward
&&
x
->
level
[
i
].
forward
->
score
<
score
)
x
=
x
->
forward
[
i
]
;
x
=
x
->
level
[
i
].
forward
;
}
}
/* We may have multiple elements with the same score, what we need
/* We may have multiple elements with the same score, what we need
* is to find the element with both the right score and object. */
* is to find the element with both the right score and object. */
return
x
->
forward
[
0
]
;
return
x
->
level
[
0
].
forward
;
}
}
/* Find the rank for an element by both score and key.
/* Find the rank for an element by both score and key.
...
@@ -279,12 +259,12 @@ unsigned long zslistTypeGetRank(zskiplist *zsl, double score, robj *o) {
...
@@ -279,12 +259,12 @@ unsigned long zslistTypeGetRank(zskiplist *zsl, double score, robj *o) {
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
while
(
x
->
forward
[
i
]
&&
while
(
x
->
level
[
i
].
forward
&&
(
x
->
forward
[
i
]
->
score
<
score
||
(
x
->
level
[
i
].
forward
->
score
<
score
||
(
x
->
forward
[
i
]
->
score
==
score
&&
(
x
->
level
[
i
].
forward
->
score
==
score
&&
compareStringObjects
(
x
->
forward
[
i
]
->
obj
,
o
)
<=
0
)))
{
compareStringObjects
(
x
->
level
[
i
].
forward
->
obj
,
o
)
<=
0
)))
{
rank
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
rank
+=
x
->
level
[
i
].
span
;
x
=
x
->
forward
[
i
]
;
x
=
x
->
level
[
i
].
forward
;
}
}
/* x might be equal to zsl->header, so test if obj is non-NULL */
/* x might be equal to zsl->header, so test if obj is non-NULL */
...
@@ -303,10 +283,10 @@ zskiplistNode* zslistTypeGetElementByRank(zskiplist *zsl, unsigned long rank) {
...
@@ -303,10 +283,10 @@ zskiplistNode* zslistTypeGetElementByRank(zskiplist *zsl, unsigned long rank) {
x
=
zsl
->
header
;
x
=
zsl
->
header
;
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
for
(
i
=
zsl
->
level
-
1
;
i
>=
0
;
i
--
)
{
while
(
x
->
forward
[
i
]
&&
(
traversed
+
(
i
>
0
?
x
->
span
[
i
-
1
]
:
1
)
)
<=
rank
)
while
(
x
->
level
[
i
].
forward
&&
(
traversed
+
x
->
level
[
i
].
span
)
<=
rank
)
{
{
traversed
+=
i
>
0
?
x
->
span
[
i
-
1
]
:
1
;
traversed
+=
x
->
level
[
i
].
span
;
x
=
x
->
forward
[
i
]
;
x
=
x
->
level
[
i
].
forward
;
}
}
if
(
traversed
==
rank
)
{
if
(
traversed
==
rank
)
{
return
x
;
return
x
;
...
@@ -778,7 +758,7 @@ void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -778,7 +758,7 @@ void zrangeGenericCommand(redisClient *c, int reverse) {
ln
=
start
==
0
?
zsl
->
tail
:
zslistTypeGetElementByRank
(
zsl
,
llen
-
start
);
ln
=
start
==
0
?
zsl
->
tail
:
zslistTypeGetElementByRank
(
zsl
,
llen
-
start
);
}
else
{
}
else
{
ln
=
start
==
0
?
ln
=
start
==
0
?
zsl
->
header
->
forward
[
0
]
:
zslistTypeGetElementByRank
(
zsl
,
start
+
1
);
zsl
->
header
->
level
[
0
].
forward
:
zslistTypeGetElementByRank
(
zsl
,
start
+
1
);
}
}
/* Return the result in form of a multi-bulk reply */
/* Return the result in form of a multi-bulk reply */
...
@@ -789,7 +769,7 @@ void zrangeGenericCommand(redisClient *c, int reverse) {
...
@@ -789,7 +769,7 @@ void zrangeGenericCommand(redisClient *c, int reverse) {
addReplyBulk
(
c
,
ele
);
addReplyBulk
(
c
,
ele
);
if
(
withscores
)
if
(
withscores
)
addReplyDouble
(
c
,
ln
->
score
);
addReplyDouble
(
c
,
ln
->
score
);
ln
=
reverse
?
ln
->
backward
:
ln
->
forward
[
0
]
;
ln
=
reverse
?
ln
->
backward
:
ln
->
level
[
0
].
forward
;
}
}
}
}
...
@@ -872,7 +852,7 @@ void genericZrangebyscoreCommand(redisClient *c, int justcount) {
...
@@ -872,7 +852,7 @@ void genericZrangebyscoreCommand(redisClient *c, int justcount) {
/* Get the first node with the score >= min, or with
/* Get the first node with the score >= min, or with
* score > min if 'minex' is true. */
* score > min if 'minex' is true. */
ln
=
zslFirstWithScore
(
zsl
,
min
);
ln
=
zslFirstWithScore
(
zsl
,
min
);
while
(
minex
&&
ln
&&
ln
->
score
==
min
)
ln
=
ln
->
forward
[
0
]
;
while
(
minex
&&
ln
&&
ln
->
score
==
min
)
ln
=
ln
->
level
[
0
].
forward
;
if
(
ln
==
NULL
)
{
if
(
ln
==
NULL
)
{
/* No element matching the speciifed interval */
/* No element matching the speciifed interval */
...
@@ -893,7 +873,7 @@ void genericZrangebyscoreCommand(redisClient *c, int justcount) {
...
@@ -893,7 +873,7 @@ void genericZrangebyscoreCommand(redisClient *c, int justcount) {
while
(
ln
&&
(
maxex
?
(
ln
->
score
<
max
)
:
(
ln
->
score
<=
max
)))
{
while
(
ln
&&
(
maxex
?
(
ln
->
score
<
max
)
:
(
ln
->
score
<=
max
)))
{
if
(
offset
)
{
if
(
offset
)
{
offset
--
;
offset
--
;
ln
=
ln
->
forward
[
0
]
;
ln
=
ln
->
level
[
0
].
forward
;
continue
;
continue
;
}
}
if
(
limit
==
0
)
break
;
if
(
limit
==
0
)
break
;
...
@@ -903,7 +883,7 @@ void genericZrangebyscoreCommand(redisClient *c, int justcount) {
...
@@ -903,7 +883,7 @@ void genericZrangebyscoreCommand(redisClient *c, int justcount) {
if
(
withscores
)
if
(
withscores
)
addReplyDouble
(
c
,
ln
->
score
);
addReplyDouble
(
c
,
ln
->
score
);
}
}
ln
=
ln
->
forward
[
0
]
;
ln
=
ln
->
level
[
0
].
forward
;
rangelen
++
;
rangelen
++
;
if
(
limit
>
0
)
limit
--
;
if
(
limit
>
0
)
limit
--
;
}
}
...
...
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录