redis省内存的几个方法,序列化和bitmap,key的再hash

正如标题说的,redis提供简单的缓存读取,读写性能可以在10ms级别,有利有弊,内存限制也成了redis稳定与否的关键,特别是海量集key的场景,内存优化是跳不过去的坎。

假设一个1亿个key的场景,key是32位的guid,value是个人信息,假设100个字符,redis key占用的空间就要5g,小公司单机16g内存来说还是比较可观的。

第一种优化方式牺牲时间换空间。
简单能想到到的一个key存多个value,reids的hashset正好可以做到这一点,
假设我们有5个key:

key1_afdfdfdffffffadeeecfyyiiid: key1value
key2_cdfadfddrgfgfdgggadda: key2value
key3_aeedfddeedgggaddabd: key3value
key4_yyrrrtttgggaddahjkpppiy: key4value
key5_rdfaerergggaddabbgbgb: key5value

我们用一个简单的函数对key按10000取模,newkey = hash10000(key),所有key的结果都会落在1到10000之间,所以有很多key的取模会一样,这个就是key压缩的关键。

假设key1和key2的取模结果都是5,key3,4,5的结果是8,那么key1和key2都可以放入
hashset_5中,3,4,5放入hashset_8中,filed是真正的key,这样只用2个hash就替代了原来的5个key,付出的代价是取值的时候需要先把key用newkey函数计算属于哪个hash而已。

第二种是利用reids的 bitmap位图数据结构。
这种情况对key和value有特殊的场景限制,比如我们有很多用户,然后想统计是否上线,或者是一个网站有很多不同的产品,想统计某个产品是否被访问,也即是value必须是0或1能表示。
传统我们会用
13535366:1
31135355:0
这样1亿个用户就需要1亿的key,实在太浪费了。

image.png

而bitmap是一个byte数组,可以把不同的用户id对应到这个数字的不同位置,也就是说我们可以只用一个bitmap对象来存放所有用户的信息!!!

0000 0000 0000 0000 0000 0000 0000
从左往右数,id位1的用户打卡了,就把第一个位设置位1
如下图表示id位1和10的用户都打卡了。
0000 0000 0000 0000 0010 0000 0001
bitmap命令,设置和获取某一个位置的值:
SETBIT key useid 1
GETBIT key userid

bitmap对reidis来说就是一个字符串,所以最大长度是redis字符串最大长度512mb,换算成bit是4294967296,所以小于42亿的数字都可以表示。

第三种方式我们可以对结果进行压缩。
以前用PHP开发,我们会把一个对象用json_encode(obj)的方式转正字符给redis,这个就是用到了序列化,不同序列方式的结果大小一样。

一般常用的序列化有JdkSerializationRedisSerializer和GenericFastJsonRedisSerializer,网上有的文章说jdk序列化省内存,我觉得还是测试看下好。

我建了一个对象,包含两个简单的属性。

public class RedisObject implements Serializable {
    private String fied1 = "";
    private String fied2 = "";;

    public   RedisObject(String value){
        this.fied1 = value;
        this.fied2 =  value;
    }
}

        String value1 = "Licensed to the Apache Software Foundation (ASF) under one or more" ;
        String value2 = "Unless required by applicable law or agreed to in writing";

fastjson序列化后的结果
"{"@type":"com.example.demo.myservice.emtity.RedisObject","fied1":"Licensed to the Apache Software Foundation (ASF) under one or more","fied2":"Unless required by applicable law or agreed to in writing"}"

jdk序列化的结果要大一些,主要是描述字段类型耗费的额外字符比fastjson多。

"\xac\xed\x00\x05sr\x00-com.example.demo.myservice.emtity.RedisObjectQ5i\x01\xf1\xf3)6\x02\x00\x02L\x00\x05fied1t\x00\x12Ljava/lang/String;L\x00\x05fied2q\x00~\x00\x01xpt\x00BLicensed to the Apache Software Foundation (ASF) under one or moret\x009Unless required by applicable law or agreed to in writing"

假设我们把两个value设置成一样值,再看看。

        String value1 = "Licensed to the Apache Software Foundation (ASF) under one or more" ;
        String value2 = "Licensed to the Apache Software Foundation (ASF) under one or more";

json序列化还是不会压缩,而jdk序列化结果小了一些,相同的原文只出现了一次。

"{"@type":"com.example.demo.myservice.emtity.RedisObject","fied1":"Licensed to the Apache Software Foundation (ASF) under one or more","fied2":"Licensed to the Apache Software Foundation (ASF) under one or more"}"

"\xac\xed\x00\x05sr\x00-com.example.demo.myservice.emtity.RedisObjectQ5i\x01\xf1\xf3)6\x02\x00\x02L\x00\x05fied1t\x00\x12Ljava/lang/String;L\x00\x05fied2q\x00~\x00\x01xpt\x00BLicensed to the Apache Software Foundation (ASF) under one or moreq\x00~\x00\x03"

一般我们对象里比如分类等信息也是会有一些重复,所以不太好说用哪种方式耗内存就一定少,最好的方法还是跑一下线上的数据,看下最终耗的内存数和执行时间来采取合适自己程序的序列化方式。

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

推荐阅读更多精彩内容

  • 一、Region 概念 Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下: T...
    达微阅读 1,491评论 0 1
  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 4,380评论 0 5
  • 总想着写点什么,才不荒废每天每天蹦出的灵感,又总是没时间,想要记住,却先忘记,每天过着浑浑噩噩的日子,没有人明白,...
    逢场作戏人阅读 233评论 0 0
  • 女人是真正的女人,活明白了,知道自己的压力任何人都分担不了。依赖男人是小女孩专利。自己给自己一切的一切。除了不能自...
    简爱乌阅读 242评论 0 0
  • 人生三十多载,无夫,无子嗣。 贪欲般爱过,信誓旦旦自信过,也窝窝囊囊地进退两难过。曾以为,最漂亮的事,...
    萌了个萌阅读 136评论 0 0