zoukankan      html  css  js  c++  java
  • 内存优化

    一.特殊编码处理

    存储集合数据的时候会采用压缩技术,以使用更少的内存存储更多的数据;如Hashes,Lists,Sets和Sorted Sets,当这些集合中数据小于一个给定的数量是,存储的数据会被一种非常节省内存的方式进行编码,使用这种编码理论上至少节约10倍以上的内存(平均节省5倍以上)。这是使用CPU换内存的编码,所以可以在redis.conf配置文件中更改阈值;超过这个值,就会转换成正常的散列表;

    二.使用32位的redis

    使用32位的redis,对于每一个key,将会有更少的内存,因为32为程序,指针占用的字节数更少;但是整个redis实例使用的内存将被限制在4G下;RDB和AOF文件是不分32位和64位的,所以你可以使用64位的redis恢复32位的RDB备份文件,相反亦然;

    三.位级别和字  级别的操作

    GETRANGE,SETRANGE,GETBIT,SETBIT使用这些命令,你可以把redis的字符串当做一个随机读取的(字节)数组;例如,可以把性别用1和0代表,存一个bit,这样1亿个用户只用了大约12M内存,也可以存储一个字节的信息;

    四.尽可能使用散列表

    小散列表所占的内存非常小,所以尽可能的将你的数据模型抽象到一个散列表里面;例如,把一个对象存储到redis中,有3种方法:

    1)把用户号设置为key,把对象序列化,使用JSON.toJSONString()方法,用普通的key/value来存储:

    这种方式的缺点是,增加了序列化和反序列化的开销,并且在需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发保护,引入CAS等复杂问题;

    2)把用户号+对象的属性设置为key,存储多对key/value

    这种方式虽然没有了序列化的开销和并发问题,但是用户号重复的存储,浪费内存空间;
    3)用hash能很好的解决这个问题

    key是用用户的id,value是一个Map,这Map的key是成员的属性名,value是属性值,这样对象的修改和存取都可以直接修该内部map的key,不需要序列化,也不需要关心并发修改问题;

  • 相关阅读:
    HDU 1800 Flying to the Mars 字典树,STL中的map ,哈希树
    字典树 HDU 1075 What Are You Talking About
    字典树 HDU 1251 统计难题
    最小生成树prim算法 POJ2031
    POJ 1287 Networking 最小生成树
    次小生成树 POJ 2728
    最短路N题Tram SPFA
    poj2236 并查集
    POJ 1611并查集
    Number Sequence
  • 原文地址:https://www.cnblogs.com/smailjunk/p/10654745.html
Copyright © 2011-2022 走看看