`

Instagram的Redis实践(内存占用优化)

 
阅读更多

转自:http://blog.nosqlfan.com/html/3379.html

 

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"

优化无止境,只要肯琢磨。希望你在使用存储产品时也能如此爱惜内存。

分享到:
评论

相关推荐

    Redis 实践

    ### Redis实践:Instagram的内存优化之旅 在当今的互联网时代,高效的数据管理和内存优化成为了各大应用能否稳定运行、提供快速响应的关键。Instagram,这一全球知名的社交媒体平台,以其海量的图片分享功能著称,...

    ios_Instagram客户端

    在iOS开发领域,Instagram客户端的高仿项目是一个热门的学习主题,尤其对于初学者而言,它提供了深入了解移动应用设计和实现的宝贵机会。本教程将围绕iOS平台上的Instagram客户端仿制展开,通过学习,开发者可以提升...

    Python爬虫爬取 Instagram 博主照片视频-Instagram_crawler.zip

    在本项目中,我们将探讨如何使用Python爬虫技术来抓取Instagram博主的照片和视频。Instagram_crawler是一个Python脚本集合,旨在...通过学习和实践这个项目,开发者可以提升自己的Web抓取技能,更好地应对类似的需求。

    Scaling-Instagram.pdf

    ### 分布式系统下的...通过以上知识点的总结,我们可以看到,Instagram的成功不仅仅是产品创新的结果,更是在技术和架构层面不断探索与优化的过程。对于任何正在快速成长的初创企业而言,这些都是宝贵的参考和借鉴。

    instagram克隆-源码

    Instagram克隆源码项目是一个基于JavaScript的Web应用开发实例,旨在构建一个类似于...通过对以上知识点的学习和实践,开发者不仅可以创建出一个功能丰富的Instagram克隆,还能提升自身在前端开发领域的技能和经验。

    Instagram-Helper,.zip

    【Instagram-Helper.zip】是一个开源项目,主要目的是简化在Android应用程序中实现Instagram登录的过程。这个项目特别强调了对API 10(Android Gingerbread)及更高版本的支持,意味着它的兼容性广泛,覆盖了大量的...

    instagram mac版

    Instagram Mac版是一款专为苹果Mac用户设计的应用程序,允许用户在桌面环境中享受Instagram的功能。这款应用将社交媒体体验扩展到了电脑平台,让用户可以更方便地浏览、编辑和分享照片与视频,同时保持与移动设备上...

    instagram.apk

    instagram软件 apk

    WEB SERVICE EFFICIENCY AT INSTAGRAM.pdf

    这篇2017年QCon北京大会的演讲稿深入探讨了Instagram的Web服务效率问题,旨在优化资源利用,确保服务的稳定性和扩展性。 Instagram的架构包括客户端、负载均衡器、Web服务器、后端数据库和服务。Web服务器主要由...

    Instagram图片下载 V1.0 绿色版

    Instagram图片下载V1.0绿色版是一款专为Instagram平台设计的工具,旨在帮助用户方便地获取Instagram上的图片资源。在互联网日益发达的今天,社交媒体平台如Instagram成为了分享和浏览图片的重要场所,但平台通常对...

    UI 炫酷高仿 Instagram 的图片、视频选择器

    项目可能采用了延迟加载、缓存策略以及优化的图像解码技术来提高响应速度和降低内存占用。 7. **Android 平台兼容**:考虑到 InsGallery-master 这个文件名,很可能是针对 Android 平台的开发,因此项目可能涉及到 ...

    2019年Instagram调查报告(英文)-Instagram

    2019年Instagram调查报告(英文)-Instagram,2019年Instagram调查报告(英文)-Instagram

    Laravel开发-instagram

    **正文** 在本文中,我们将深入探讨如何使用Laravel框架来开发Instagram相关的应用程序。...当我们谈论“Laravel开发-instagram”时,我们指的...记住,始终遵守Instagram的开发者政策和指南,确保你的应用符合最佳实践。

    Instagram 6.12.2

    作者 Instagram 大小 10.29MB 描述 Instagram,iPhone上最著名的照片抓拍、编辑工具之一。它与众不同,为用户创建了一个完整的社交网络。现在它终于抵达了安卓平台,让所有安卓手机用户也能体验这款软件带来的...

    549654407452296Instagram.apk

    549654407452296Instagram.apk

    Instagram登陆协议.rar

    Instagram 2020.07.03 登录协议,10版本,有任何问题请私聊

    仿Instagram贴标签显示效果_显示多张图_你值得拥有

    - 性能优化:确保在大量图片加载和显示时,应用仍保持流畅运行,避免因内存占用过高导致应用崩溃。 在提供的压缩包文件“仿Instagram贴标签显示效果_显示多张图_你值得拥有”中,包含了实现以上功能的源代码和资源...

    类似instagram图片分享社区数据库设计

    综上所述,设计一个类似Instagram的图片分享社区数据库是一项涉及多方面技术和策略的任务,从基础架构到性能优化,再到用户体验,每个环节都需要精心设计和实施。通过“camera-jiegou.sql”和“camera-all.sql”这两...

    Laravel开发-laravel-instagram-api

    **Laravel开发与Instagram API整合** 在Web开发中,Laravel是一个非常受欢迎的PHP框架,以其优雅的语法和强大的功能而备受赞誉。本教程将深入探讨如何在Laravel项目中集成Instagram私有API,以便与Instagram平台...

    用于下载Instagram故事的漂亮Flutter应用程序

    【标题】:“用于下载Instagram故事的漂亮Flutter应用程序” 在当今社交媒体盛行的时代,Instagram已经成为人们分享...通过深入学习和实践这些知识点,开发者不仅可以创建类似的应用,还能进一步提升自己的技术能力。

Global site tag (gtag.js) - Google Analytics