节约内存:Instagram的Redis实践
作者:nosqlfan
Instagram可以说是网拍App的始祖级应用,也是当前最火热的拍照App之一,Instagram的照片数量已经达到3亿,而在Instagram里,我们需要知道每一张照片的作者是谁,下面就是Instagram团队如何使用Redis来解决这个问题并进行内存优化的。
首先,这个通过图片ID反查用户UID的应用有以下几点需求:
查询速度要足够快
数据要能全部放到内存里,最好是一台EC2的 high-memory 机型就能存储(17GB或者34GB的,68GB的太浪费了)
要合适Instagram现有的架构(Instagram对Redis有一定的使用经验,比如这个应用)
支持持久化,这样在服务器重启后不需要再预热
Instagram的开发者首先否定了数据库存储的方案,他们保持了KISS原则(Keep It Simple and Stupid),因为这个应用根本用不到数据库的update功能,事务功能和关联查询等等牛X功能,所以不必为这些用不到的功能去选择维护一个数据库。
于是他们选择了Redis,Redis是一个支持持久化的内存数据库,所有的数据都被存储在内存中(忘掉VM吧),而最简单的实现就是使用Redis的String结构来做一个key-value存储就行了。像这样:
SET media:1155315 939
GET media:1155315
> 939
其中1155315是图片ID,939是用户ID,我们将每一张图片ID为作key,用户uid作为value来存成key-value对。然后他们进行了测试,将数据按上面的方法存储,1,000,000数据会用掉70MB内存,300,000,000张照片就会用掉21GB的内存。对比预算的17GB还是超支了。
(NoSQLFan:其实这里我们可以看到一个优化点,我们可以将key值前面相同的media去掉,只存数字,这样key的长度就减少了,减少key值对内存的开销【注:Redis的key值不会做字符串到数字的转换,所以这里节省的,仅仅是media:这6个字节的开销】。经过实验,内存占用会降到50MB,总的内存占用是15GB,是满足需求的,但是Instagram后面的改进任然有必要)
于是Instagram的开发者向Redis的开发者之一Pieter Noordhuis询问优化方案,得到的回复是使用Hash结构。具体的做法就是将数据分段,每一段使用一个Hash结构存储,由于Hash结构会在单个Hash元素在不足一定数量时进行压缩存储,所以可以大量节约内存。这一点在上面的String结构里是不存在的。而这个一定数量是由配置文件中的hash-zipmap-max-entries参数来控制的。经过开发者们的实验,将hash-zipmap-max-entries设置为1000时,性能比较好,超过1000后HSET命令就会导致CPU消耗变得非常大。
于是他们改变了方案,将数据存成如下结构:
HSET "mediabucket:1155" "1155315" "939"
HGET "mediabucket:1155" "1155315"
> "939"
通过取7位的图片ID的前四位为Hash结构的key值,保证了每个Hash内部只包含3位的key,也就是1000个。
再做一次实验,结果是每1,000,000个key只消耗了16MB的内存。总内存使用也降到了5GB,满足了应用需求。
(NoSQLFan:同样的,这里我们还是可以再进行优化,首先是将Hash结构的key值变成纯数字,这样key长度减少了12个字节,其次是将Hash结构中的subkey值变成三位数,这又减少了4个字节的开销,如下所示。经过实验,内存占用量会降到10MB,总内存占用为3GB)
HSET "1155" "315" "939"
HGET "1155" "315"
> "939"
优化无止境,只要肯琢磨。希望你在使用存储产品时也能如此爱惜内存。
来源:instagram-engineering.tumblr.com
相关推荐
《藏经阁-LEAN APP:Instagram Architecture at Scale》是一份探讨Instagram在大规模环境下如何构建精简应用程序的报告,由Frank Du在2017年的GMTC全球移动技术大会上分享。这份文档主要关注Instagram Android应用的...
Meltwater融文:Instagram终极营销指南.pdf
### Instagram iOS团队的成长之路 #### 一、成长的烦恼与挑战 随着Instagram用户数量的快速增长,iOS团队面临着一系列挑战。自2014年起,Instagram的月活跃用户数每七个月就增长一亿,截止演讲时已经突破十亿。...
为了确保数据的快速访问与存储效率,同时避免高昂的成本,Instagram团队选择了一种既简单又高效的方式——Redis实践,即利用Redis这一高性能的内存数据结构服务器,来实现内存的节约与优化。 #### Redis选择的背景...
【相邻用户理论】是Instagram在用户增长策略中的关键概念,这一理论主要针对那些了解产品但未能成为活跃用户的群体。在Instagram从4亿用户增长到10亿的过程中,这个理论起到了重要作用。相邻用户通常是由于背景、...
"fake-instagram:Instagram克隆" 是一个项目,旨在创建一个与Instagram类似的Web应用程序。这个项目展示了如何使用现代前端技术来构建一个社交网络平台的核心功能,如上传图片、浏览、点赞和评论。以下是对该项目...
**微信小程序完整demo:Instagram 图片下载** ...对于学习微信小程序开发和图片处理的开发者来说,这是一个很好的实践案例。同时,它也提醒我们在开发过程中要重视版权问题,遵守相关的法律条款。
【标题】:“luckybot:Instagram自动化” 在IT领域,Instagram自动化是指利用编程技术自动执行在Instagram平台上的一系列任务,如发布帖子、点赞、评论、关注等,以提高效率或扩大影响力。"Luckybot"是一款针对...
微信小程序是一种轻量级的应用开发...通过研究和实践,你可以深入理解微信小程序的开发流程,并掌握如何结合第三方API构建实用的应用。同时,此项目也提醒我们尊重他人的知识产权,确保在使用网络资源时遵守相关规定。
Instagram克隆是一个项目,旨在构建一个与...总之,构建一个Instagram克隆应用是一个综合性的项目,涵盖了Java编程、数据库管理、网络编程、图像处理、用户界面设计等多个领域,是提升开发者综合技能的良好实践。
**instabot:Instagram机器人的探索** Instagram是一个全球知名的社交媒体平台,用户可以通过分享照片、视频以及故事来与他人互动。而instabot是基于Python的一个开源项目,它为Instagram提供自动化功能,允许用户...
Instagram克隆是一个项目,旨在创建一个与Instagram类似的应用程序,以学习和实践Web开发技术,特别是TypeScript。这个项目可以帮助开发者深入理解社交媒体平台的核心功能,如用户注册、登录、发布图片、点赞、评论...
【标题】"instagram-checker:Instagram检查器"指的是一个专门针对Instagram平台的工具,它可能是用PHP编程语言编写的,用于分析、检查或管理Instagram账户的相关信息。在IT行业中,这样的工具可能包括用户数据抓取、...
Instagram私人API Instagram私有API库 安装 您可以使用composer安装它 composer require nicklasw/instagram-api 特征 支持异步和并行请求 可以根据新请求轻松扩展 会话和设备管理 访问发现提要(频道,探索,热门...
总的来说,Instagram克隆项目是一个全面的实践机会,涵盖了JavaScript及其生态系统中的许多核心概念和技术。通过这个项目,开发者不仅可以提高编程技能,还能了解社交应用背后的架构和工作原理。无论是对于初学者...
android-instagram 概述 这是Instagram客户端项目的入门项目。 花费时间:总共花费2个小时 完成的用户案例: 必需:使用SwipeRefreshLayout为家庭供稿添加“从上到下刷新”。 必需:用户可以脱机打开Instagram...
python-instagram 适用于Instagram REST和Search API的Python 2/3客户端安装pip install python-instagram需要httplib2 simplejson 六Instagram REST和搜索API 我们的记录了所有Instagram REST和Search API。...
Instagram链接Wordpress插件 简介:该插件模拟了类似linktr.ee的在线服务,该服务允许Instagram使用者创建与IG关注者特别相关的频繁更新链接的列表。 安装 要在您的Wordpress实例中安装此插件: 将instagram-links...
Magento 2 Instagram 提要扩展是一个支持模块,它允许将 Instagram 图像集成到 Magento 2 网站。 这个时尚的扩展程序使您能够将引人注目的 Instagram 图像块放置到您网站的任何页面,这可以有效地吸引客户的注意力并...
Instagram工具 Instagram自动化脚本使用AI和避免禁令示例代码跨框架支持:TFI可以运行自己的工具或其他工具,例如instabot如何使用它简单的方法: 1. npm install tools-for-instagram2. create a .env file on the ...