redis系列一

239 阅读2分钟

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个字节