1、key的命名规则,采用数据库:表:业务:*的形式(例如:db0:user:pay:782178504)
好处:命名规范可以很好的会意
方便之后监控,防止数据倾斜
复制代码
2、各数据结构注意(以下都是针对value,key都是string类型的)
string
int:8个字节的长整型
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
hash
ziplist:元素个数<512(hash-max-ziplist-entries)&&value<64字节(hash-max-ziplist-value)
hashtable:反之
list
quicklist:3.2之后新增,结合了ziplist和linkedlist的优势
ziplist:元素个数<512(list-max-ziplist-entries)&&value<64字节(list-max-ziplist-value)
linkedlist:反之
set
intset:元素都是整数 && 个数<512(set-max-intset-entries)
hashtable:反之
zset
ziplist:元素个数<128(zset-max-ziplist-entries)&&value<64字节(zset-max-ziplist-value)
skiplist:反之
以上数据结构在使用时,尽量使用顺序在前的结构,可以减少内存的使用。
最后再解释一下为什么string中value小于等于39字节内部编码会使用embstr?
redis默认的内存分配器采用jemalloc,分配内存策略一般采用固定范围的内存块进行分配。在64位系统中,
分为小、大、巨三个范围
最小分配:8,16,32,64byte分配
redis存储的数据都使用redisObject来封装
embstr由RedisObject和sdshdr组成。
typedef struct redisObject {//16byte
unsigned type:4;
unsigned encoding:4;
unsigned lru:REDIS_LRU_BITS;
int refcount;
void *ptr;
} robj;
struct sdshdr {//8+8+1+?
unsigned int len;
unsigned int free;
char buf[];
};
16+8+1=25+8=33,所有最小分配64字节,39=64-16-8-1
注意在redis3.2版本之后是44个字节复制代码