• 内存优化


    一.特殊编码处理

    存储集合数据的时候会采用压缩技术,以使用更少的内存存储更多的数据;如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,不需要序列化,也不需要关心并发修改问题;

  • 相关阅读:
    奔驰4-MATIC和奥迪quattro的区别和共同点是什么(杂记)
    ibatis.net:QueryForObject(转)
    iBatis入门(转)
    javax.servlet.ServletException: java.lang.NullPointerException 空指针异常
    报错:Action[/statisticsManage] does not contain specified method (check logs)
    eclipse下,64位tomcat报错(转)
    Resource '/servers' does not exist 问题的解决(转)
    Ext.data.SimpleStore的使用方法
    combo的displayField和valueField属性
    Exception occurred during processing request: null java.lang.NullPointerException
  • 原文地址:https://www.cnblogs.com/smailjunk/p/10654745.html
Copyright © 2020-2023  润新知