Memcached、MongoDB、Redis 相关的

Memcached、MongoDB、Redis和tokyotyrant

2011-11-25 14:52 by s80895304, 221 visits, 收藏, 编辑

MongoDB实际上是一个简化版的MySQL,Mongodb的接口实际上就是类似给SQL做个封装而已。Mongodb只能支持简单的单一查询 语句,不能join,不能子查询。实际性能MySQL和Mongodb差不多,MySQL在高并发的情况下性能不太好,MongoDB会好很多。

Redis读写性能都非常强悍,但是存储数据的容量受限于内存容量。支持Lists类型和Sets类型的数据,2.0增加了更多数据类型。相当于是一个支持持久存储的memcache。

tokyotyrant也是是一个高性能的存储引擎,性能非常出色,每秒可以处理4-5万次读写操作。TT不是内存映射的模式,主要是文件系统存储为主。吃内存少一些。TC除了支持Key-Value存储之外,还支持保存Hashtable数据类型,表结构TokyoTyrantTable,支持列,表,字段,索引,支持query查询。


 

memcached:设定最大内存占用,最久不使用自动过期,高读写性能,适合最缓存。

 

redis:拥有memcached的优点,储存数据支持list,适合做队列。是否可以替代memcached我还在考虑。

 

mongodb:模式自由,容易搭建分布式群集,适合做储存。

 

MongoDB

添加到服务:mongod.exe --dbpath d:\mongodb\work\db -- logpath d:\mongodb\work\log\log.log --install

启动服务监听:mongod.exe --dbpath d:\mongodb\work\db -- logpath d:\mongodb\work\log\log.log

测试:mongo.exe命令,之后进行操作

注:dppath和logpath必须存在,默认端口为27017

 

编译redis

启动src / redis - server

客户端连接:src / redis - cli,连接成功后可进行操作

停止服务:src / redis - cli shutdown

以配置文件启动:src / redis - server redis.conf


---------------------------------------


MongoDB 或者 redis 可以替代 memcached 吗?

此条目发表在 问答 分类目录,贴了 , , 标签。将 固定链接加入收藏夹。

MongoDB 或者 redis 可以替代 memcached 吗?》有 7 条评论

  1. seamon (rails开发者,关注互联网技术和产品。) 说:

    mongodb和memcached不是一个范畴内的东西。mongodb是文档型的非关系型数据库,其优势在于查询功能比较强大,能存储海量数据。mongodb和memcached不存在谁替换谁的问题。

    和memcached更为接近的是redis。它们都是内存型数据库,数据保存在内存中,通过tcp直接存取,优势是速度快,并发高,缺点是数据类型有限,查询功能不强,一般用作缓存。在我们团队的项目中,一开始用的是memcached,后来用redis替代。

    相比memcached:

    1、redis具有持久化机制,可以定期将内存中的数据持久化到硬盘上。

    2、redis具备binlog功能,可以将所有操作写入日志,当redis出现故障,可依照binlog进行数据恢复。

    3、redis支持virtual memory,可以限定内存使用大小,当数据超过阈值,则通过类似LRU的算法把内存中的最不常用数据保存到硬盘的页面文件中。

    4、redis原生支持的数据类型更多,使用的想象空间更大。

    5、前面有位朋友所提及的一致性哈希,用在redis的sharding中,一般是在负载非常高需要水平扩展时使用。我们还没有用到这方面的功能,一般的项目,单机足够支撑并发了。redis 3.0将推出cluster,功能更加强大。

    6、redis更多优点,请移步官方网站查询。

  2. Juno (web developer) 说:

    功能上可以,但是仅仅用来替代memcached未免有点大材小用了,也不是作者最初设计的目的。

  3. Gary (产品,架构,数据. 70年代.) 说:

    1.mongodb 和memcached不具可比性,一个是基于磁盘的数据库,只是缓存热点数据数据在内存中,一个是全内存cache;
    2. memcached支持过期策略,而mongodb仅有一个capped collection(适合存储日志)的策略可以丢弃先存储的历史数据;
    3. redis可以做cache,但redis更多是作为内存数据库的角色存在,且一致性哈希的实现还不成熟,如果memcached已经能实现你的需求,没有必要采用不够成熟稳定的redis.

  4. 王宪伟 (互联网从业人员) 说:

    redis可以代替memcached,并且在效率方面可能比memcached更高一点。
    两者都是典型的key value store,且都是内存型数据库。由于redis可以持久化到文件系统,在缓存方面可以比memcached做的更好。
    现在的项目中完全用redis取代了memcached,效果良好。
    项目是rails的,使用redis-store代替memcache-store。

  5. 左建光 (新浪网WEB开发工程师) 说:

    如果真要替代,那只能是redis了

  6. yiihsia (淘宝后端工程师 www.yiihsia.com) 说:

    MongoDB 和memcached完全是两类产品

  7. 林毅文 (初级入门) 说:

    mongodb和redis是作为数据库的, 并不是作为mc一样的缓存。应用领域不同。

    如果说用mongodb做缓存?太消耗磁盘空间了。据我实验感觉,频繁读写对于mongodb并不是优点。mongodb的优点是解决类似like ‘%%’这样的查询时候用的。

    至于redis可能是比较合适的替换工具了。但据我所知,redis有其数据库特性:日志,恢复等功能。单单从存储性能的角度来讲, 应该是不如mc的。

    个人感觉,mc是作为缓存而不是断电后存储用的。特性不同哦。




---------------------------------------

Memcached vs Redis vs MongoDB vs MySQL 效能比較

"記憶體是新一代的硬碟"在高流量網站內已是稀鬆平常的事情,像是採用  Memcached 做分散式快取服務即是典型的應用模式,Memcached 使用概念簡單且相關應用情境、文件、工具、演算法都已相當成熟,許多知名網站都運用 Memcached 提升scalability,像是GAE、Heroku 等PaaS 環境也有提供 Memcached 的收費服務,這些市場訊息已說明大規模的使用記憶體是可以合乎成本效益的。

Redis 是近年隨著 NoSQL 熱潮出現的 Key-Value store,其功能涵蓋了 Memcached 並且提供許多高階功能,在許多應用情境下相較 Memcached,能降低開發與營運複雜度,比如:
  • 豐富的資料結構(strings, hashes, lists, sets and sorted sets) 更易於設計適當的資料粒度增進資料重用的機會,且可依不同的資料結構特性在redis server上做組合與計算,降低開發上的複雜度與資料傳輸
  • 永續保存功能可充當簡易的資料庫降低重覆資料的一致性問題或一些特殊應用,像是當系統當機後能快速回復快取資料,避免大量重建的衝擊
  • 資料覆寫功能 提升讀取效能,提升 availability
  • 2.6版本可以寫script (lua)
  • 3.0版本預期還會加上Cluster做HA與Balancing有些data grid的樣子

但效能是否能與 Memcached 匹敵呢?以下透過大量的 get/set 操作做簡單的比較,並且加入MySQL與MonogoDB 做為參考




一、測試環境

Hardware Overview:

  Model Name: MacBook Pro
  Model Identifier: MacBookPro8,2
  Processor Name: Intel Core i7
  Processor Speed: 2 GHz
  Number of Processors: 1
  Total Number of Cores: 4
  L2 Cache (per Core): 256 KB
  L3 Cache: 6 MB
  Memory: 8 GB
  HDD: 500G(5400RPM)

System Software Overview:

  System Version: Mac OS X 10.7.2 (11C74)
  Kernel Version: Darwin 11.2.0
  64-bit Kernel and Extensions: Yes

Software Overview:
  Java: "1.6.0_29" HotSpot(TM) 64-Bit Server VM (build 20.4-b02-402, mixed mode)

  Memcached Version: 1.4.5
  Memcached Client:  xmemcache 1.3.5

  Redis Version: 2.4.2
  Redis Client:  jedis 2.0

  MongoDB Version: mongodb-osx-x86_64-2.0.0
  MongoDb Client:  mongo-java-driver 2.7.2

  MySQL Version: 5.5.11-log Community Server
  MySQL Client:  mysql-connector-java 5.1.6 +  tomcat- jdbc 7.0.22 (connection-pool)
  


二、測試方法


  • 每組測式含三種方法 Set/Get/Set-Get(50/50),各別產生500,000個請求
  • 不同的壓力測試Thread(50/100/150/200) * 資料量(64/128/256/512/1024) bytes
  • 壓力測試工具 https://github.com/parkghost/NoSQLBenchmark


三、測試案例


共同的 Server 執行環境設定
ulimit -n 10000 

共同的 Client  執行環境設定
java -server -Xms512m -Xmx512m
1.Memcached 
memcached -m 2048

2.Redis(without persistence)
disable RDB and AOF

3.Redis(RDB)
save 900 1
save 300 10
save 60 10000
rdbcompression yes

4.Redis(AOF - no)
appendonly yes
appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

5.Redis(AOF - every second)
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

6.Redis(AOF - always)
appendonly yes
appendfsync always
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb


7.MongoDB
8.MySQL - MyISAM
max_connections = 300
table_open_cache = 400
thread_cache_size = 4


9.MySQL - Innodb(innodb_flush_log_at_trx_commit=0)
max_connections = 300
table_open_cache = 400
thread_cache_size = 4
innodb_log_file_size = 512m
innodb_flush_log_at_trx_commit = 0
innodb_buffer_pool_size = 2g
innodb_log_buffer_size = 16m


10.MySQL - Innodb(innodb_flush_log_at_trx_commit=1)
max_connections = 300
table_open_cache = 400
thread_cache_size = 4

innodb_log_file_size = 512m
innodb_flush_log_at_trx_commit = 1
innodb_buffer_pool_size = 2g
innodb_log_buffer_size = 16m



11.MySQL - Innodb(innodb_flush_log_at_trx_commit=2)
max_connections = 300
table_open_cache = 400
thread_cache_size = 4

innodb_log_file_size = 512m
innodb_flush_log_at_trx_commit = 2
innodb_buffer_pool_size = 2g
innodb_log_buffer_size = 16m


四、測試結果


所有結果數據與圖表有興趣可自行從 Github下載,下面僅顯示 Thread:200 / Bytes:1024 壓力的圖表

1.Memcached 

xmemcached(client library) 會將 get 操作轉成 mget 因而減少許多 get 指令,減少網路傳輸

2.Redis(without persistence)
3.Redis(RDB)
4.Redis(AOF - no)




AOF寫入的效能依數據量增加而下降的比較明顯

5.Redis(AOF - every second)
6.Redis(AOF - always)

當磁碟寫入 70M/s 的時候,Redis開始不能寫入資料,雖然停頓一陣子又能繼續運作,但已有寫入失敗,因而不能完成測試

[8112] 23 Nov 20:43:03 * Background AOF rewrite successful
[8112] 23 Nov 20:43:03 * Asynchronous AOF fsync is taking too long (disk is busy?). Writing the AOF buffer without waiting for fsync to complete, this may slow down Redis.
[8112] 23 Nov 20:43:18 * Starting automatic rewriting of AOF on 101% growth
[8112] 23 Nov 20:43:18 * Background append only file rewriting started by pid 8253
[8253] 23 Nov 20:43:32 * SYNC append only file rewrite performed
[8112] 23 Nov 20:43:32 * Background AOF rewrite terminated with success
[8112] 23 Nov 20:43:35 * Parent diff successfully flushed to the rewritten AOF (239673418 bytes)
[8112] 23 Nov 20:43:35 * Background AOF rewrite successful






7.MongoDB


同時讀取寫入的時候throughput 降到低點


8.MySQL - MyISAM
9.MySQL - Innodb(innodb_flush_log_at_trx_commit=0)
10.MySQL - Innodb(innodb_flush_log_at_trx_commit=1)
11.MySQL - Innodb(innodb_flush_log_at_trx_commit=2)



MyISAM表現的還算平穩,但 Innodb 在 select 的時候反應很奇怪

所有測試




五、結論


雖說是玩票性質的的測試,但數據還是找的出一些結論:
  • Memcached 吞吐量約為 Redis 約1.3倍
  • Memcached 979M 記憶體用量比Redis(RDB) 960.43M 多了一些些
  • Memcached 的client library較Redis先進
  • Redis(AOF) 寫入的TPS比Redis(RDB)少了約55%
  • Redis(AOF) 記憶體用量比Redis(RDB)多很多
  • Redis(AOF) 的檔案很大,重寫後較同資料量的RDB檔案大一些
  • Redis 在 bgsave/bgrewriteaof 會fork process來寫檔案會使用到兩倍原有的記憶體大小
  • 以get/set來看MongoDB的效能跟MySQL MyIsam 接近
  • MongoDB 在同時讀寫時TPS下降非常多
  • mongo-java-driver GC佔掉整體時間的1.85%,創建過多物件(可能是為了asynchronous write 的實作)

  • MySQL Innodb 的 select 結果不知道是怎麼一回事
Memcached 的Get/Set 操作的吞吐量較 Redis 高,但實際應用上Redis在伺服器與應用端還有許多優化策略(e.g. rich data structure、scripting、自動化的指令選擇),理論上能大幅提升效能,若再結合其它特性還能降低開發維護的複雜度。



對於測試程式有些心得,由於效能與測試方法的原因共實作了三個版本
第一個版本用Python來開發,能找到的連線模組都不太確定是否穩定,在內建的Threading模組的效能也不太好,最終執行結果測不到資料庫的效能,在Memcached的測試吞吐量不到20k,其它的也不太好

第二版用JMeter 與 java sampler,參數化與流程控制組合設定起來不彈性,也由於有用GUI即時顯示數據,整體吞吐量也較差

第三版純 Java,能掌控測試週期與資源配置,擴充也較容易,整體表現也比前二版優秀,輸出數據比較能看出各資料庫間的差異

順道一題,對岸同胞整理了許多關於Redis的技術文章,有助於了解Redis的運用
http://blog.nosqlfan.com/html/3537.html

--------------------------------

memcached做缓存,redis做队列,mongodb做储存——当前最潮兼实用的组合

mongodb memcached redis web Rei Created at 10 months ago
5aec84cd0b5479a0d1d89b6ffa2a9a20

memcached:设定最大内存占用,最久不使用自动过期,高读写性能,适合最缓存。

redis:拥有memcached的优点,储存数据支持list,适合做队列。是否可以替代memcached我还在考虑。

mongodb:模式自由,容易搭建分布式群集,适合做储存。

最近的心得。

5 people marked
5aec84cd0b5479a0d1d89b6ffa2a9a20
Rei
10 months ago

MySQL与NoSQL - SQL与NoSQL的融合

http://www.infoq.com/cn/news/2011/05/nosql-mysql

E9ed4664dfd7ea664ccc5813de4d1fd7
10 months ago

用这么多管理起来不方便。直接redis做缓存、队列、存储:-)

60fbc6a9f457b3d7401a54e61e468857
10 months ago Updated at 10 months ago

同意楼上,为啥不redis全包 ,mysql 下一代就要全包了~ 以后用啥还得看性能测试了

5aec84cd0b5479a0d1d89b6ffa2a9a20
Rei
10 months ago

redis 一脚在缓存,一脚在储存,要储存一些“关系”(比如tags)的话要在应用层做很多工作,不如 mongodb 只存一个文档方便。

5aec84cd0b5479a0d1d89b6ffa2a9a20
Rei
10 months ago Updated at 10 months ago

@hooopo @quix 用resque(redis)做异步任务,现在campo的mention可以发邮件了。

5aec84cd0b5479a0d1d89b6ffa2a9a20
Rei
10 months ago

抱歉,发现防spam机制不完善,代码回滚了,mention不会触发邮件了。

1bccb10b01bf30d5de497a1a571ef65e
10 months ago

twitter用的是Redis

8dc1bdd018fbfb2ee71f8bb2b98f5733
10 months ago

haml怎么样,erb不行吗?貌似haml没有学习资料

8dc1bdd018fbfb2ee71f8bb2b98f5733
10 months ago

没有HAML的文档啊

5aec84cd0b5479a0d1d89b6ffa2a9a20
Rei
10 months ago

@dengtj 个人感觉haml很棒。erb很繁琐,xml类数据就应该是生成而不是手写。

看haml的文档就行了。

5aec84cd0b5479a0d1d89b6ffa2a9a20
Rei
10 months ago

@dengtj http://haml-lang.com/docs.html

3619f458b9382ed2c13894f63e523ffd
8 months ago

目前本站 redis 主要用来做些什么?

5aec84cd0b5479a0d1d89b6ffa2a9a20
Rei
8 months ago

@kenziii http://codecampo.com/topics/4dfcc6019f328b1e7f000014#replies-3

异步任务的队列和timeline的缓存

C07150e4ce02ca97c7f6865fc1b414e1
7 months ago

你的系统是哪方面的,能否给些具体的真实请求数据。看具体处理速度如何

5aec84cd0b5479a0d1d89b6ffa2a9a20
Rei
7 months ago

@bert82503 惭愧,只是个个人项目,就是这个论坛。完全没有大流量经验。


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值