降低Redis内存的占用

1.原理

短结构

Redis为列表、集合、散列和有序集合提供了一组配置选项,让Redis以跟节约内存的方式存储这些变量

阿里云主从版提供的选项(全是和短结构有关的,ziplist可以说是除了hash字典之外最常用的结构)

image

在列表、散列、有序集合的长度较短或者体积较小的时候,redis会使用压缩列表(ziplist)代替通常情况下这三种结构的底层实现方式作为这几种结构的底层实现。

配置:

  • entries:最大元素数量
  • value:压缩列表的每个节点的最大体积

当任一条件被突破时,Redis就会把底层实现改为通常的结构,而且当数据被删除之后也不会再次使用ziplist

体积较小的集合使用intset来作为底层实现

条件:

  • 整数集合包含的所有成员都可以被解释为十进制数
  • 这些整数又处于平台的有符号整数范围之内
  • 集合成员数量足够少

短结构是以上几种结构的紧凑表示方式

减少键的长度也是应该注意的一个点。

短结构ziplist

Redis中ziplist的定义(序列化字符串)和接口

unsigned char *ziplistNew(void);
unsigned char *ziplistPush(unsigned char *zl, unsigned char *s, unsigned int slen, int where);
unsigned char *ziplistIndex(unsigned char *zl, int index);
unsigned char *ziplistNext(unsigned char *zl, unsigned char *p);
unsigned char *ziplistPrev(unsigned char *zl, unsigned char *p);
unsigned int ziplistGet(unsigned char *p, unsigned char **sval, unsigned int *slen, long long *lval);
unsigned char *ziplistInsert(unsigned char *zl, unsigned char *p, unsigned char *s, unsigned int slen);
unsigned char *ziplistDelete(unsigned char *zl, unsigned char **p);
unsigned char *ziplistDeleteRange(unsigned char *zl, unsigned int index, unsigned int num);
unsigned int ziplistCompare(unsigned char *p, unsigned char *s, unsigned int slen);
unsigned char *ziplistFind(unsigned char *p, unsigned char *vstr, unsigned int vlen, unsigned int skip);
unsigned int ziplistLen(unsigned char *zl);
size_t ziplistBlobLen(unsigned char *zl);

压缩列表由节点序列和四个控制位组成。

影响性能的因素:每次读取数据时都需要对进行解码,写入也需要进行局部的重新编码,并且有可能触发连锁更新,但是这些操作在对小列表进行处理时对性能的损耗并不很明显(平均O(N))。

短结构intset

Redis中整数集合的定义和接口,可见其最底层实现就是一个有序的C语言数组。

typedef struct intset {
    
    // 编码方式
    uint32_t encoding;

    // 集合包含的元素数量
    uint32_t length;

    // 保存元素的数组
    int8_t contents[];

} intset;

intset *intsetNew(void);
intset *intsetAdd(intset *is, int64_t value, uint8_t *success);
intset *intsetRemove(intset *is, int64_t value, int *success);
uint8_t intsetFind(intset *is, int64_t value);
int64_t intsetRandom(intset *is);
uint8_t intsetGet(intset *is, uint32_t pos, int64_t *value);
uint32_t intsetLen(intset *is);
size_t intsetBlobLen(intset *is);

影响性能的因素:对整数集合进行插入或者删除操作时需要进行数据移动,并有可能引起底层升级。

随着短结构的体积变得越来越大,操作这些结构的速度也会变得越来越慢,所以可以引入分片技术以追求性能和空间之前的平衡。

2.分片结构

  • 特别适合分片的场景:执行分片版命令的时候只需要访问指定分片即可。
  • 特别不适合分片的场景:需要访问指定分片,完事还得进行归并聚合的操作。
  • 可以通过分片提升性能的场景:搜索
  • 替代分片的一种场景:只对前n位和后n位操作的有序集合(用单独维护的两个最大有序集合和最小有序集合实现)。
  1. 对列表进行分片

  2. 有序集合进行分片:
    有序集合的大部分操作都属于特别不适合分片的场景。

  3. 分片式散列:将字符串键存储到散列里面也可以明显降低内存占用

    1. 实现分片方法即可
asbtract class ShardHlist { 
/*
** $base 基础散列 
** $key 将要保存到分片散列里面的键
** $total_elements 预计元素总量
** $shard_size 预期分片大小
*/
abstract public function shard_key($base, $key, $total_elements, $shard_size);
abstract public function shard_hset($shard_key, key, value, $total_elements, $shard_size);
abstract public function shard_hset($shard_key, key, $total_elements, $shard_size);
}

如果不是辅助缓存那么不应该随便更改$total_elements 和 $shard_size,一旦不得不更改需要resharding方法将数据从旧的分片迁移到新的分片

  1. 分片集合
    shard_add、shard_rem

3.二进制位和字节打包用来进一步降低存储空间

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,560评论 4 361
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,104评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,297评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,869评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,275评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,563评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,833评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,543评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,245评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,512评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,011评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,359评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,006评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,062评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,825评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,590评论 2 273
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,501评论 2 268

推荐阅读更多精彩内容