十) redis使用过程的一些建议

部分参考
https://segmentfault.com/a/1190000004708270

1)通过配置文件限制最大内存
最大内存限制maxmemory的设置非常重要,如果不设置maxmemory,Redis一直会为其分配内存,直至耗尽所有物理内存,直到操作系统进行虚拟内存交换。因此,一般情况下,作者建议还是把峰值设置设上。开启此配置,当超出限定内存情况发生,Redis会返回异常消息,操作系统不会因内存溢出而奔溃。还有一点建议是,开发者在系统设计之初,就应当制定Redis内存使用划分计划,而划分原则是,为Redis准备系统可能使用的峰值内存,而不是平均使用内存。例如系统大部分情况会以Redis作为分布式缓存写入10G数据,但大部分情况下只会跑到4G,但Redis依然推荐用户为其预留10G内存
redis.conf–> maxmemory 10000000
maxmemory的单位是bytes,默认为0,即不限制最大内存。

2)设置内存回收策略(默认的LRU就挺好)
除maxmemory以外,仍然需要指定Redis在最大内存溢出后的处理行为——maxmemory-policy。同时设置了maxmemory与maxmemory-policy选项,redis内存使用达到上限。可以通过设置LRU算法(Least Recently Used 近期最少使用算法)来删除部分key,释放空间。相关内容参考:将redis当做使用LRU算法的缓存来使用。

3)通过hash散列存储数据而不是string从而节省内存
a)Redis的Key承载了很多特性的,过期时间、LRU、Cluster节点信息、系统关键信息等,因此和String类型的key-value相比,hash类型可更大限度地减少key的数量,从而节省内存空间的使用率;
b)key对应多种数据结构,而hash key对应的value只能是string,这种简单结构比多重复杂结构更加高效。(Redis是不支持嵌套数据的,例如hash中value还嵌套有hash);
c)hash在额定数量及容积下,将会以一维线性的紧凑格式存储(ziplist),这种存储形式可节省更多空间。(代价就是读写速度降低,故也要慎重)

补充redis的内存回收机制
就如上面设置的1和2来说,redis是通过控制内存上限和回收策略来实现内存管理。
1) 控制内存上限
Redis使用maxmemory来限制最大可用内存,由于内存碎片的存在,实际上消耗的内存可能比maxmemory设置的更大。
Redis默认无限使用服务器内存, 为防止极端情况下导致系统内存耗尽, 建议所有的Redis进程都要配置maxmemory。

2) 回收策略
Redis的内存回收主要体现在两个方面
A) 删除过期的键对象
Redis的删除不是一旦过期就直接删除,这样性能太差。它是基于惰性删除和定时任务删除的结合。定时任务删除是redis内部维护了一个定时任务,默认每秒运行10次,每次抽样删除一部分key;而惰性删除是指当客户端读取带有超时属性的key时,会去检测是否已过期,如果已过期就会执行删除操作并返回空(这种方法可以节约cpu资源,但是存在内存泄漏,某个过期的键一直没有被访问从而导致内存不能被及时释放)。

B) 内存使用达到maxmemory时触发内存溢出策略
有6种策略

  1. volatile-lru:在所有设置了过期时间的key中,使用lru删除。推荐使用的方式
  2. allkeys-lru:在所有key中使用LRU删除
  3. volatile-random:在所有设置过期时间的key中随机删除
  4. allkeys-random:对所有key随机删除
  5. volatile-ttl:查询全部设定超时时间的数据,之后排序,将马上将要过期的数据进行删除操作.
  6. Noeviction:不进行删除,如果内存溢出就报错返回。不推荐

猜你喜欢

转载自blog.csdn.net/xiaohesdu/article/details/87906437
今日推荐