- 浏览: 431582 次
- 性别:
- 来自: 杭州
文章分类
- 全部博客 (269)
- 原创 (7)
- Java (51)
- Java Concurrency (2)
- IDE (16)
- Linux (46)
- Database (23)
- NoSQL (35)
- Web服务器 (23)
- Log日志 (11)
- HTTP (11)
- HTML (2)
- XML (1)
- Test (7)
- Mina (0)
- Amoeba (4)
- Cobar (1)
- 序列化 (2)
- Python (5)
- PHP (1)
- Socket通信 (1)
- Network (3)
- Struts (2)
- Web前端 (10)
- Maven (6)
- SVN (15)
- Json (1)
- XMPP (2)
- Go (1)
- Other (4)
- 未整理 (5)
最新评论
-
u012374672:
[color=darkred][/color][flash=2 ...
Mongo的ORM框架的学习Morphia(annotations) -
b_l_east:
很有问题啊
利用redis的transaction功能,实现分布式下加锁
转自: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"
优化无止境,只要肯琢磨。希望你在使用存储产品时也能如此爱惜内存。
发表评论
-
mongodb 地理位置处理
2016-05-16 13:39 1430我只记录我用到的部分,没有完整分析mongodb对地理位置 ... -
Redis配置文件redis.conf
2014-11-14 14:10 1878# Redis configuration file ex ... -
Redis高可用部署及监控
2014-11-12 13:25 1110一、 Re ... -
JCS官方文档的简单笔记,仅供自己参考
2014-09-26 20:08 7851. 基本配置 jcs.default=DCjcs.de ... -
JCS基本配置
2014-09-26 19:39 9511、默认的内存缓存 ... -
NoSQL解决方案比较(MongoDB vs Redis, Tokyo Cabinet, and Berkeley DB)
2013-09-30 14:20 1349NoSQL解决方案比较 NoSQL Solution: E ... -
morphia与spring的整合
2012-12-07 15:06 1490转自: http://www.blogjava.net/wat ... -
Mongo的ORM框架的学习Morphia(十五)Morphia+spring整合
2012-12-07 15:06 1665转自:http://topmanopensource.itey ... -
Mongo的ORM框架的学习Morphia(十二) morphia的Query和Update
2012-12-07 15:06 1888转自:http://topmanopensource.itey ... -
Mongo的ORM框架的学习Morphia(十) morphia应用
2012-12-05 14:47 1471转自:http://topmanopensource.itey ... -
Mongo的ORM框架的学习Morphia(九) morphia简单使用
2012-12-05 14:44 1387转自 http://topmanopensource.itey ... -
Mongo的ORM框架的学习Morphia(八) morphia数据库访问接口
2012-12-05 14:35 2025转自:http://topmanopensource.itey ... -
Mongo的ORM框架的学习Morphia(annotations)
2012-12-05 14:33 2552一:@Entity的使用 @Entity ... -
SQL 和Mongo 对比图表
2012-11-28 14:54 2216参看官方说明: http://www.mongodb ... -
MongoDB 入门指南、示例
2012-11-23 10:38 859转自:http://www.cnblogs.com/hoojo ... -
mongodb中使用MapReduce
2012-11-23 10:12 1218MapReduce函数的用法如下: db.users.ma ... -
python的redis用法
2012-11-22 15:48 1178#! /usr/bin/env python #coding ... -
Python连接redis
2012-11-22 15:46 5626一、Redis是流行的NOSQL内存数据库,以Key-Valu ... -
【pipeline】【分布式的id生成器】【分布式锁【watch】【multi】】【redis分布式】
2012-08-29 10:42 1383转自 http://www.bwkeji.com/a/wang ... -
利用redis的transaction功能,实现分布式下加锁
2012-08-29 09:57 2422package memcached; import ja ...
相关推荐
### Redis实践:Instagram的内存优化之旅 在当今的互联网时代,高效的数据管理和内存优化成为了各大应用能否稳定运行、提供快速响应的关键。Instagram,这一全球知名的社交媒体平台,以其海量的图片分享功能著称,...
在iOS开发领域,Instagram客户端的高仿项目是一个热门的学习主题,尤其对于初学者而言,它提供了深入了解移动应用设计和实现的宝贵机会。本教程将围绕iOS平台上的Instagram客户端仿制展开,通过学习,开发者可以提升...
在本项目中,我们将探讨如何使用Python爬虫技术来抓取Instagram博主的照片和视频。Instagram_crawler是一个Python脚本集合,旨在...通过学习和实践这个项目,开发者可以提升自己的Web抓取技能,更好地应对类似的需求。
### 分布式系统下的...通过以上知识点的总结,我们可以看到,Instagram的成功不仅仅是产品创新的结果,更是在技术和架构层面不断探索与优化的过程。对于任何正在快速成长的初创企业而言,这些都是宝贵的参考和借鉴。
Instagram克隆源码项目是一个基于JavaScript的Web应用开发实例,旨在构建一个类似于...通过对以上知识点的学习和实践,开发者不仅可以创建出一个功能丰富的Instagram克隆,还能提升自身在前端开发领域的技能和经验。
【Instagram-Helper.zip】是一个开源项目,主要目的是简化在Android应用程序中实现Instagram登录的过程。这个项目特别强调了对API 10(Android Gingerbread)及更高版本的支持,意味着它的兼容性广泛,覆盖了大量的...
Instagram Mac版是一款专为苹果Mac用户设计的应用程序,允许用户在桌面环境中享受Instagram的功能。这款应用将社交媒体体验扩展到了电脑平台,让用户可以更方便地浏览、编辑和分享照片与视频,同时保持与移动设备上...
instagram软件 apk
这篇2017年QCon北京大会的演讲稿深入探讨了Instagram的Web服务效率问题,旨在优化资源利用,确保服务的稳定性和扩展性。 Instagram的架构包括客户端、负载均衡器、Web服务器、后端数据库和服务。Web服务器主要由...
Instagram图片下载V1.0绿色版是一款专为Instagram平台设计的工具,旨在帮助用户方便地获取Instagram上的图片资源。在互联网日益发达的今天,社交媒体平台如Instagram成为了分享和浏览图片的重要场所,但平台通常对...
项目可能采用了延迟加载、缓存策略以及优化的图像解码技术来提高响应速度和降低内存占用。 7. **Android 平台兼容**:考虑到 InsGallery-master 这个文件名,很可能是针对 Android 平台的开发,因此项目可能涉及到 ...
2019年Instagram调查报告(英文)-Instagram,2019年Instagram调查报告(英文)-Instagram
**正文** 在本文中,我们将深入探讨如何使用Laravel框架来开发Instagram相关的应用程序。...当我们谈论“Laravel开发-instagram”时,我们指的...记住,始终遵守Instagram的开发者政策和指南,确保你的应用符合最佳实践。
作者 Instagram 大小 10.29MB 描述 Instagram,iPhone上最著名的照片抓拍、编辑工具之一。它与众不同,为用户创建了一个完整的社交网络。现在它终于抵达了安卓平台,让所有安卓手机用户也能体验这款软件带来的...
549654407452296Instagram.apk
Instagram 2020.07.03 登录协议,10版本,有任何问题请私聊
- 性能优化:确保在大量图片加载和显示时,应用仍保持流畅运行,避免因内存占用过高导致应用崩溃。 在提供的压缩包文件“仿Instagram贴标签显示效果_显示多张图_你值得拥有”中,包含了实现以上功能的源代码和资源...
综上所述,设计一个类似Instagram的图片分享社区数据库是一项涉及多方面技术和策略的任务,从基础架构到性能优化,再到用户体验,每个环节都需要精心设计和实施。通过“camera-jiegou.sql”和“camera-all.sql”这两...
**Laravel开发与Instagram API整合** 在Web开发中,Laravel是一个非常受欢迎的PHP框架,以其优雅的语法和强大的功能而备受赞誉。本教程将深入探讨如何在Laravel项目中集成Instagram私有API,以便与Instagram平台...
【标题】:“用于下载Instagram故事的漂亮Flutter应用程序” 在当今社交媒体盛行的时代,Instagram已经成为人们分享...通过深入学习和实践这些知识点,开发者不仅可以创建类似的应用,还能进一步提升自己的技术能力。