mirror of
https://github.com/fluencelabs/redis
synced 2025-04-12 04:06:04 +00:00
RDB v8: new ZSET storage format with binary doubles.
This commit is contained in:
parent
4aae4f7d35
commit
e6554bed92
29
src/rdb.c
29
src/rdb.c
@ -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) {
|
|||||||
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) {
|
|||||||
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 = rdbSaveBinaryDoubleValue(rdb,*score)) == -1) return -1;
|
||||||
nwritten += n;
|
nwritten += n;
|
||||||
}
|
}
|
||||||
dictReleaseIterator(di);
|
dictReleaseIterator(di);
|
||||||
@ -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) {
|
|||||||
|
|
||||||
if ((sdsele = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS)) == NULL)
|
if ((sdsele = rdbGenericLoadStringObject(rdb,RDB_LOAD_SDS)) == NULL)
|
||||||
return NULL;
|
return NULL;
|
||||||
if (rdbLoadDoubleValue(rdb,&score) == -1) return NULL;
|
|
||||||
|
if (rdbtype == RDB_TYPE_ZSET_2) {
|
||||||
|
if (rdbLoadBinaryDoubleValue(rdb,&score) == -1) return NULL;
|
||||||
|
} else {
|
||||||
|
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);
|
||||||
|
@ -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 @@
|
|||||||
/* 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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user