美团在Redis上踩过的一些坑-4.redis内存使用优化
转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154
一、背景: 选择合适的使用场景
(磁带已死,磁盘是新磁带,闪存是新磁盘,随机存储器局部性是为王道)
userId(用户id) | weiboCount(微博数) |
1 | 2000 |
2 |
10 |
3 |
288 |
.... | ... |
1000000 | 1000 |
userId | hashKey | field |
1 | 0 | 1 |
2 | 0 |
2 |
3 | 0 |
3 |
... | .... | ... |
99 | 0 | 99 |
100 | 1 | 0 |
101 | 1 | 1 |
.... | ... | ... |
9999 | 99 | 99 |
100000 | 1000 | 0 |
注意:
3. 获取方法:
- #获取userId=5003用户的微博数
- (1) get u:5003
- (2) hget allUser u:5003
- (3) hget u:50 f:3
4. 内存占用量对比(100万用户 userId u:1~u:1000000)
- #方法一 Memory
- used_memory:118002640
- used_memory_human:112.54M
- used_memory_rss:127504384
- used_memory_peak:118002640
- used_memory_peak_human:112.54M
- used_memory_lua:36864
- mem_fragmentation_ratio:1.08
- mem_allocator:jemalloc-3.6.0
- ---------------------------------------------------
- #方法二 Memory
- used_memory:134002968
- used_memory_human:127.80M
- used_memory_rss:144261120
- used_memory_peak:134002968
- used_memory_peak_human:127.80M
- used_memory_lua:36864
- mem_fragmentation_ratio:1.08
- mem_allocator:jemalloc-3.6.0
- --------------------------------------------------------
- #方法三 Memory
- used_memory:19249088
- used_memory_human:18.36M
- used_memory_rss:26558464
- used_memory_peak:134002968
- used_memory_peak_human:127.80M
- used_memory_lua:36864
- mem_fragmentation_ratio:1.38
- mem_allocator:jemalloc-3.6.0
那么为什么第三种能少那么多内存呢?之前有人说用了共享对象的原因,现在我将key,field,value全部都变成了字符串,仍然还是节约很多内存。
之前我也怀疑过是hashkey,field的字节数少造成的,但是我们下面通过一个实验看就清楚是为什么了。当我将hash-max-ziplist-entries设置为2并且重启后,所有的hashkey都变为了hashtable编码。
同时我们看到了内存从18.36M变为了122.30M,变化还是很大的。
- 127.0.0.1:8000> object encoding u:8417
- "ziplist"
- 127.0.0.1:8000> config set hash-max-ziplist-entries 2
- OK
- 127.0.0.1:8000> debug reload
- OK
- (1.08s)
- 127.0.0.1:8000> config get hash-max-ziplist-entries
- 1) "hash-max-ziplist-entries"
- 2) "2"
- 127.0.0.1:8000> info memory
- # Memory
- used_memory:128241008
- used_memory_human:122.30M
- used_memory_rss:137662464
- used_memory_peak:134002968
- used_memory_peak_human:127.80M
- used_memory_lua:36864
- mem_fragmentation_ratio:1.07
- mem_allocator:jemalloc-3.6.0
- 127.0.0.1:8000> object encoding u:8417
- "hashtable"
内存使用量:
- package com.carlosfu.redis;
- import java.util.ArrayList;
- import java.util.HashMap;
- import java.util.List;
- import java.util.Map;
- import java.util.Random;
- import org.junit.Test;
- import redis.clients.jedis.Jedis;
- /**
- * 一次string-hash优化
- *
- * @author carlosfu
- * @Date 2015-11-8
- * @Time 下午7:27:45
- */
- public class TestRedisMemoryOptimize {
- private final static int TOTAL_USER_COUNT = 1000000;
- private final static String HOST = "127.0.0.1";
- private final static int PORT = 6379;
- /**
- * 纯字符串
- */
- @Test
- public void testString() {
- int mBatchSize = 2000;
- Jedis jedis = null;
- try {
- jedis = new Jedis(HOST, PORT);
- List<String> kvsList = new ArrayList<String>(mBatchSize);
- for (int i = 1; i <= TOTAL_USER_COUNT; i++) {
- String key = "u:" + i;
- kvsList.add(key);
- String value = "v:" + i;
- kvsList.add(value);
- if (i % mBatchSize == 0) {
- System.out.println(i);
- jedis.mset(kvsList.toArray(new String[kvsList.size()]));
- kvsList = new ArrayList<String>(mBatchSize);
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (jedis != null) {
- jedis.close();
- }
- }
- }
- /**
- * 纯hash
- */
- @Test
- public void testHash() {
- int mBatchSize = 2000;
- String hashKey = "allUser";
- Jedis jedis = null;
- try {
- jedis = new Jedis(HOST, PORT);
- Map<String, String> kvMap = new HashMap<String, String>();
- for (int i = 1; i <= TOTAL_USER_COUNT; i++) {
- String key = "u:" + i;
- String value = "v:" + i;
- kvMap.put(key, value);
- if (i % mBatchSize == 0) {
- System.out.println(i);
- jedis.hmset(hashKey, kvMap);
- kvMap = new HashMap<String, String>();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (jedis != null) {
- jedis.close();
- }
- }
- }
- /**
- * segment hash
- */
- @Test
- public void testSegmentHash() {
- int segment = 100;
- Jedis jedis = null;
- try {
- jedis = new Jedis(HOST, PORT);
- Map<String, String> kvMap = new HashMap<String, String>();
- for (int i = 1; i <= TOTAL_USER_COUNT; i++) {
- String key = "f:" + String.valueOf(i % segment);
- String value = "v:" + i;
- kvMap.put(key, value);
- if (i % segment == 0) {
- System.out.println(i);
- int hash = (i - 1) / segment;
- jedis.hmset("u:" + String.valueOf(hash), kvMap);
- kvMap = new HashMap<String, String>();
- }
- }
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- if (jedis != null) {
- jedis.close();
- }
- }
- }
- }
方案 | 优点 | 缺点 |
string |
直观、容易理解 |
|
hash |
直观、容易理解、整合整体 |
|
segment-hash |
内存占用量小,虽然理解不够直观,但是总体上是最优的。 |
理解不够直观。 |
美团在Redis上踩过的一些坑-4.redis内存使用优化相关推荐
- 美团在Redis上踩过的一些坑-5.redis cluster遇到的一些问题
转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 由于演讲时间有限,有关Redis-Cluster,演讲者没做太多介绍,简单的介绍了一些Redis-Clu ...
- 美团在Redis上踩过的一些坑-3.redis内存占用飙升
转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 一.现象: redis-cluster某个分片内存飙升,明显比其他分片高很多,而且持续增长.并且主从的 ...
- (转)Redis上踩过的一些坑-美团
上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团网在redis上踩得一些坑,讲的都是干货和坑. 分为5个部分: 一.周期性出现connect t ...
- Redis上踩过的一些坑-美团
上上周和同事(龙哥)参加了360组织的互联网技术训练营第三期,美团网的DBA负责人侯军伟给大家介绍了美团网在redis上踩得一些坑,讲的都是干货和坑. 分为5个部分: 一.周期性出现connect t ...
- 美团在Redis上踩过的一些坑-1.客户端周期性出现connect timeout
转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 1. 背景: 大部分互联网公司都会有Mysql或者Oracle的DBA,但是在Nosql方面一般不会设置 ...
- 美团在Redis上踩过的一些坑-2.bgrewriteaof问题
转载请注明出处哈:http://carlosfu.iteye.com/blog/2254154 一.背景 1. AOF: Redis的AOF机制有点类似于Mysql binlog,是Redis的提供的 ...
- redis 分布式锁的 5个坑,真是又大又深
引言 最近项目上线的频率颇高,连着几天加班熬夜,身体有点吃不消精神也有些萎靡,无奈业务方催的紧,工期就在眼前只能硬着头皮上了.脑子浑浑噩噩的时候,写的就不能叫代码,可以直接叫做Bug.我就熬夜写了一个 ...
- Redis 中常见的 15个坑,你踩过几个?
Redis 是我们系统开发中必须要用到的一个组件,那它都有哪些需要主要的地方呢?本文我们就来盘点一下 Redis 中常见的一些坑: 明明一个 key 设置了过期时间,怎么变成不过期了? 使用 O(1) ...
- 阿里云服务器 搭建单体redis 以及踩坑
在搭建阿里云服务器的过程中,踩坑很多,特写此文: 简介 Redis是一个开源(BSD许可),内存数据结构存储,用作数据库,缓存和消息代理.它支持数据结构,如字符串,散列,列表,集合,带有范围查询的排序 ...
最新文章
- 从FPN到Mask R-CNN,一文告诉你Facebook的计算机视觉有多强
- /dev、/sys/dev 和/sys/devices 和udev的关系
- 【机器学习】3万字长文,PySpark入门级学习教程,框架思维
- GPD电脑安装linux,怕虚拟机影响性能?GPD pocket 2 安装 Ubuntu 体验
- 2、VMware vCenter Server5.1功能介绍与安装
- Mybatis高级应用 多表关联查询
- python-含参函数
- CentOS 7.6 vi编辑器常用命令详解
- html遮罩层动画制作,《Flash遮罩层动画的制作》的教学反思
- Cdence版图设计手册
- littleVGL开发(8):消息弹窗控件(lv_mbox)
- 研究人员发现英特尔芯片组中可能被黑客使用的“新功能”VISA
- Mermaid知识点总结4 - Flowchart 3
- 二、功能篇:八相供电用料豪华,功能齐全应有尽有
- 【LINGO】lingo 软件简介
- 产品思维驱动自我成长
- 全球及中国单相固态继电器行业规模预测及产值分析报告2022~2027年
- 云编排技术加持,华为助力国网陕西电力成就数字化转型新样板
- 光电检测技术(第一二章未完)
- 中国企业再迎出海潮,只不过主角已是AI了
热门文章
- php的long类型转换,[PHP]将RGB或HEX转换为“Long Int”颜色
- canvas 实现图片局部模糊_JavaScript中的图片处理与合成(四)
- linux下安装微信wechat
- mysql ---- innodb-1- 体系结构、文件、表
- 初使用swagger遇到的问题(1)
- 《高级软件测试》实践作业4学习记录12月25日
- C#语言基础——结构体和枚举类型
- Using dbms_shared_pool.purge to remove a single task from the library cache
- winphone8更换帐号问题的几点说明
- 第二章: 第二课 内容处理-插入图片