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 吗?》有 7 条评论
---------------------------------------
Memcached vs Redis vs MongoDB vs MySQL 效能比較
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
三、測試案例
共同的 Client 執行環境設定
java -server -Xms512m -Xmx512m
memcached -m 2048
disable RDB and AOF
save 900 1
save 300 10
save 60 10000
rdbcompression yes
appendonly yes
appendfsync no
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
appendonly yes
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
appendonly yes
appendfsync always
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
max_connections = 300
table_open_cache = 400
thread_cache_size = 4
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
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
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
4.Redis(AOF - no)
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
所有測試
五、結論
雖說是玩票性質的的測試,但數據還是找的出一些結論:
- 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 結果不知道是怎麼一回事
對於測試程式有些心得,由於效能與測試方法的原因共實作了三個版本
第一個版本用Python來開發,能找到的連線模組都不太確定是否穩定,在內建的Threading模組的效能也不太好,最終執行結果測不到資料庫的效能,在Memcached的測試吞吐量不到20k,其它的也不太好
第二版用JMeter 與 java sampler,參數化與流程控制組合設定起來不彈性,也由於有用GUI即時顯示數據,整體吞吐量也較差
第三版純 Java,能掌控測試週期與資源配置,擴充也較容易,整體表現也比前二版優秀,輸出數據比較能看出各資料庫間的差異
順道一題,對岸同胞整理了許多關於Redis的技術文章,有助於了解Redis的運用
http://blog.nosqlfan.com/html/3537.html
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更多优点,请移步官方网站查询。
功能上可以,但是仅仅用来替代memcached未免有点大材小用了,也不是作者最初设计的目的。
1.mongodb 和memcached不具可比性,一个是基于磁盘的数据库,只是缓存热点数据数据在内存中,一个是全内存cache;
2. memcached支持过期策略,而mongodb仅有一个capped collection(适合存储日志)的策略可以丢弃先存储的历史数据;
3. redis可以做cache,但redis更多是作为内存数据库的角色存在,且一致性哈希的实现还不成熟,如果memcached已经能实现你的需求,没有必要采用不够成熟稳定的redis.
redis可以代替memcached,并且在效率方面可能比memcached更高一点。
两者都是典型的key value store,且都是内存型数据库。由于redis可以持久化到文件系统,在缓存方面可以比memcached做的更好。
现在的项目中完全用redis取代了memcached,效果良好。
项目是rails的,使用redis-store代替memcache-store。
如果真要替代,那只能是redis了
MongoDB 和memcached完全是两类产品
mongodb和redis是作为数据库的, 并不是作为mc一样的缓存。应用领域不同。
如果说用mongodb做缓存?太消耗磁盘空间了。据我实验感觉,频繁读写对于mongodb并不是优点。mongodb的优点是解决类似like ‘%%’这样的查询时候用的。
至于redis可能是比较合适的替换工具了。但据我所知,redis有其数据库特性:日志,恢复等功能。单单从存储性能的角度来讲, 应该是不如mc的。
个人感觉,mc是作为缓存而不是断电后存储用的。特性不同哦。