谈谈对日期的压缩存储

最近在项目中做缓存的性能优化,对热点代码/TP时间进行分析之后.发现这些性能不理想的请求,都是cache的value比较大导致的.所以自然想到的就是精简字段.并且对数据进行压缩存储.这篇文章就谈谈其中对日期的压缩处理.

字符串

最常规的日期存储方式应该就是字符串.如"20171029",那这样的字符串到底占用多大空间呢.我们可以让代码告诉我们.

    public static void main(String[] args) {
        String date = "20171029";
        byte[] dateBytes = date.getBytes();
        System.out.println(dateBytes.length);
    }

运行结果是: 8

我们可以看到,使用字符串存储的日期.要占用8个字节.如果一个数据包里大部分都是日期.那1KB的数据包只能存放128个日期.当日期很多的时候,会占用很多空间.

Long

了解Unix时间的都知道.我们可以用一个long类型来存储日期.Java里long类型占用的空间也是8byte.和上面的字符串是一样的.

Int

int在Java中占用4Byte.所代表的数字范围是 -2^32 ~ 2^31-1.用来存储日期完全够用.所以我们完全可以使用int类型来存储时间.这样下来.我们用1KB的数据包就能存放256个日期了.

到这里看起来已经很好了.但是我们发现.2^31-1 = 2147483647 远远大于99991231.也就是说这个int的前面很多个bit是空闲的.那我们有没有可能继续压缩?

Mysql如何存储日期

因为使用int存储日期肯定是肯定不是最优的.那如何知道更优的方案呢.那就是去借鉴其他人的方案.那么数据库一定是一个很好的选择.因为对于数据库来说,能存小,一定不会存大.经过查询资料.Mysql是使用3个byte来存储日期的.具体的公式是

yyyy * 32 * 16 + mm * 32 + dd

具体成二进制表示为:yyyyyyyy yyyyyyym mmmddddd

这个公式是什么意思呢.

  1. 日的范围是1~31.我们使用5个bit就足够存储.
  2. 月的范围是1~12.我们使用4个bit就足够存储.
  3. 对于3个byte的24位.还剩下15位.可以存储2^15-1 = 32767个数据.用来当年已经足够了.

Unix时间戳 + Mysql存储方式 = 2Byte

看了Mysql的存储方案,不难发现,使用3Byte确实不错.但是我们能不能做的更好,只用2个Byte.
我们可以看下.对于日和月的存储已经没有压缩空间了.如果使用2个byte.则还有7个bit供我们使用.

2^7=128.如果直接用来存年份.肯定是不够的.但是Unix时间戳还记得吗.它是从1970年1月1日到现在的毫秒差.这个相对的思路如果加到我们的设计里呢.

我们这127不用来做绝对的时间,而是作为相对的时间存储.那参照日期如果采用2017年.则可以存储到2017 + 127 = 2144.对于一般的业务系统.128年的偏移,足够我们使用了.

使用二进制来表示则日期格式为:yyyyyyym mmmddddd

而使用这种2Byte类型的存储.则1KB的数据包则可以存储512个日期.相比一开始的128.多了3倍.

总结

你可能需要知道,2M的数据和2K的数据.在网络传输中有什么区别.
才能理解这篇文章为什么会要对这种看似没什么用字符串存储进行优化.
不过没关系.多了解一下,总没有错.

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

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,605评论 18 399
  • 编码问题一直困扰着开发人员,尤其在 Java 中更加明显,因为 Java 是跨平台语言,不同平台之间编码之间的切换...
    x360阅读 2,471评论 1 20
  • 8086汇编 本笔记是笔者观看小甲鱼老师(鱼C论坛)《零基础入门学习汇编语言》系列视频的笔记,在此感谢他和像他一样...
    Gibbs基阅读 37,151评论 8 114
  • 书籍浩如烟海,如果花一生,也未必能读遍全书。所谓的读万卷书,行万里路,人生的格局和视野必然更加宏观。但是如...
    糖鑫鑫阅读 420评论 2 1
  • 莫名我就喜欢你,没有理由,从认识你的那年起直到现在,或许还有将来,在你没有女朋友的时候,光明正大的喜欢你,有女朋...
    筱i柒阅读 134评论 0 0