Skip to content
GitLab
Menu
Projects
Groups
Snippets
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
ruanhaishen
redis
Commits
e6554bed
Commit
e6554bed
authored
Jun 01, 2016
by
antirez
Browse files
RDB v8: new ZSET storage format with binary doubles.
parent
4aae4f7d
Changes
2
Show whitespace changes
Inline
Side-by-side
src/rdb.c
View file @
e6554bed
...
@@ -520,6 +520,22 @@ int rdbLoadDoubleValue(rio *rdb, double *val) {
...
@@ -520,6 +520,22 @@ int rdbLoadDoubleValue(rio *rdb, double *val) {
}
}
}
}
/* Saves a double for RDB 8 or greater, where IE754 binary64 format is assumed.
* We just make sure the integer is always stored in little endian, otherwise
* the value is copied verbatim from memory to disk. */
int
rdbSaveBinaryDoubleValue
(
rio
*
rdb
,
double
val
)
{
memrev64ifbe
(
&
val
);
return
rdbWriteRaw
(
rdb
,
&
val
,
8
);
}
/* Loads a double from RDB 8 or greater. See rdbSaveBinaryDoubleValue() for
* more info. */
int
rdbLoadBinaryDoubleValue
(
rio
*
rdb
,
double
*
val
)
{
if
(
rioRead
(
rdb
,
val
,
8
)
==
0
)
return
-
1
;
memrev64ifbe
(
val
);
return
0
;
}
/* Save the object type of object "o". */
/* Save the object type of object "o". */
int
rdbSaveObjectType
(
rio
*
rdb
,
robj
*
o
)
{
int
rdbSaveObjectType
(
rio
*
rdb
,
robj
*
o
)
{
switch
(
o
->
type
)
{
switch
(
o
->
type
)
{
...
@@ -541,7 +557,7 @@ int rdbSaveObjectType(rio *rdb, robj *o) {
...
@@ -541,7 +557,7 @@ int rdbSaveObjectType(rio *rdb, robj *o) {
if
(
o
->
encoding
==
OBJ_ENCODING_ZIPLIST
)
if
(
o
->
encoding
==
OBJ_ENCODING_ZIPLIST
)
return
rdbSaveType
(
rdb
,
RDB_TYPE_ZSET_ZIPLIST
);
return
rdbSaveType
(
rdb
,
RDB_TYPE_ZSET_ZIPLIST
);
else
if
(
o
->
encoding
==
OBJ_ENCODING_SKIPLIST
)
else
if
(
o
->
encoding
==
OBJ_ENCODING_SKIPLIST
)
return
rdbSaveType
(
rdb
,
RDB_TYPE_ZSET
);
return
rdbSaveType
(
rdb
,
RDB_TYPE_ZSET
_2
);
else
else
serverPanic
(
"Unknown sorted set encoding"
);
serverPanic
(
"Unknown sorted set encoding"
);
case
OBJ_HASH
:
case
OBJ_HASH
:
...
@@ -644,7 +660,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
...
@@ -644,7 +660,7 @@ ssize_t rdbSaveObject(rio *rdb, robj *o) {
if
((
n
=
rdbSaveRawString
(
rdb
,(
unsigned
char
*
)
ele
,
sdslen
(
ele
)))
if
((
n
=
rdbSaveRawString
(
rdb
,(
unsigned
char
*
)
ele
,
sdslen
(
ele
)))
==
-
1
)
return
-
1
;
==
-
1
)
return
-
1
;
nwritten
+=
n
;
nwritten
+=
n
;
if
((
n
=
rdbSaveDoubleValue
(
rdb
,
*
score
))
==
-
1
)
return
-
1
;
if
((
n
=
rdbSave
Binary
DoubleValue
(
rdb
,
*
score
))
==
-
1
)
return
-
1
;
nwritten
+=
n
;
nwritten
+=
n
;
}
}
dictReleaseIterator
(
di
);
dictReleaseIterator
(
di
);
...
@@ -1041,7 +1057,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
...
@@ -1041,7 +1057,7 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
sdsfree
(
sdsele
);
sdsfree
(
sdsele
);
}
}
}
}
}
else
if
(
rdbtype
==
RDB_TYPE_ZSET
)
{
}
else
if
(
rdbtype
==
RDB_TYPE_ZSET_2
||
rdbtype
==
RDB_TYPE_ZSET
)
{
/* Read list/set value. */
/* Read list/set value. */
size_t
zsetlen
;
size_t
zsetlen
;
size_t
maxelelen
=
0
;
size_t
maxelelen
=
0
;
...
@@ -1059,7 +1075,12 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
...
@@ -1059,7 +1075,12 @@ robj *rdbLoadObject(int rdbtype, rio *rdb) {
if
((
sdsele
=
rdbGenericLoadStringObject
(
rdb
,
RDB_LOAD_SDS
))
==
NULL
)
if
((
sdsele
=
rdbGenericLoadStringObject
(
rdb
,
RDB_LOAD_SDS
))
==
NULL
)
return
NULL
;
return
NULL
;
if
(
rdbtype
==
RDB_TYPE_ZSET_2
)
{
if
(
rdbLoadBinaryDoubleValue
(
rdb
,
&
score
)
==
-
1
)
return
NULL
;
}
else
{
if
(
rdbLoadDoubleValue
(
rdb
,
&
score
)
==
-
1
)
return
NULL
;
if
(
rdbLoadDoubleValue
(
rdb
,
&
score
)
==
-
1
)
return
NULL
;
}
/* Don't care about integer-encoded strings. */
/* Don't care about integer-encoded strings. */
if
(
sdslen
(
sdsele
)
>
maxelelen
)
maxelelen
=
sdslen
(
sdsele
);
if
(
sdslen
(
sdsele
)
>
maxelelen
)
maxelelen
=
sdslen
(
sdsele
);
...
...
src/rdb.h
View file @
e6554bed
...
@@ -76,6 +76,7 @@
...
@@ -76,6 +76,7 @@
#define RDB_TYPE_SET 2
#define RDB_TYPE_SET 2
#define RDB_TYPE_ZSET 3
#define RDB_TYPE_ZSET 3
#define RDB_TYPE_HASH 4
#define RDB_TYPE_HASH 4
#define RDB_TYPE_ZSET_2 5
/* ZSET version 2 with doubles stored in binary. */
/* NOTE: WHEN ADDING NEW RDB TYPE, UPDATE rdbIsObjectType() BELOW */
/* NOTE: WHEN ADDING NEW RDB TYPE, UPDATE rdbIsObjectType() BELOW */
/* Object types for encoded objects. */
/* Object types for encoded objects. */
...
@@ -88,7 +89,7 @@
...
@@ -88,7 +89,7 @@
/* NOTE: WHEN ADDING NEW RDB TYPE, UPDATE rdbIsObjectType() BELOW */
/* NOTE: WHEN ADDING NEW RDB TYPE, UPDATE rdbIsObjectType() BELOW */
/* Test if a type is an object type. */
/* Test if a type is an object type. */
#define rdbIsObjectType(t) ((t >= 0 && t <=
4
) || (t >= 9 && t <= 14))
#define rdbIsObjectType(t) ((t >= 0 && t <=
5
) || (t >= 9 && t <= 14))
/* Special RDB opcodes (saved/loaded with rdbSaveType/rdbLoadType). */
/* Special RDB opcodes (saved/loaded with rdbSaveType/rdbLoadType). */
#define RDB_OPCODE_AUX 250
#define RDB_OPCODE_AUX 250
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
.
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment