赞
踩
之前做过《MongoDB和Redis对比》,但是有哥们说redis和mongoDB没有必要做对比,因为一个是基于磁盘的数据库,一个完全是内存数据库,没有可比性。所以就找了相关的资料,玩了下memcache,以下是自己的学习笔记。
memcache | redis | |
类型 | 内存数据库 | 内存数据库 |
数据类型 | 在定义value时就要固定数据类型 | 不需要 有字符串,链表,集 合和有序集合 |
虚拟内存 | 不支持 | 支持 |
过期策略 | 支持 | 支持 |
分布式 | magent | master-slave,一主一从或一主多从 |
存储数据安全 | 不支持 | 使用save存储到dump.rdb中 |
灾难恢复 | 不支持 | append only file(aof)用于数据恢复 |
性能 |
说明:
1、 类型——memcache和redis都是将数据存放在内存,所以是内存数据库。当然,memcache也可用于缓存其他东西,例如图片等等。
2、 数据类型——
Memcache在添加数据时就要指定数据的字节长度,例如:
set key3 0 0 8
hellodba
STORED
而redis不需要,例如
redis 127.0.0.1:6379>set key2 "test2"
OK
redis 127.0.0.1:6379>get key2
"test2"
3、 虚拟内存——当物理内存用完时,可以将一些很久没用到的value 交换到磁盘
4、 过期策略——memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定,例如expire name 10
5、 分布式——设定memcache集群,利用magent做一主多从;redis可以做一主多从。都可以一主一从
6、 存储数据安全——memcache断电就断了,数据没了;redis可以定期save到磁盘
7、 灾难恢复——memcache同上,redis丢了后可以通过aof恢复
8、 性能没做过测试,不评论
一、Memcache
1. memecache 把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小
redis有部份存在硬盘上,这样能保证数据的持久性。
2. Memcache使用了Slab Allocator的内存分配机制:按照预先规定的大小,将分配的内存分割成特定长度的块,以完全解决内存碎片问题。
3. memcache 存在内存中,分配的内存满后,会按一定的规则删除一些k/v数据,重启后自然全部丢失。
4. 过期策略--memcache在set时就指定,例如set key1 0 0 8,即永不过期。Redis可以通过例如expire 设定。
5. 首先要说明的是Memcached支持最大的存储对象为1M。它的内存分配比较特殊,但是这样的分配方式其实也是基于性能考虑的,简单的分配机制可以更容易回收再分配,节省对CPU的使用。大于1M需要拆分。
6. memcached能接受的key的最大长度是,255字符。
7. 同一份数据同时发送了一个set命令和一个get命令,它们不会影响对方,但是get以后,处理期间可能先被其他Set了,后面的Set会覆盖前面的,但是memcached 1.2.5以及更高版本,提供了gets和cas命令,它们可以解决上面的问题。如果您使用gets命令查询某个key的item,memcached会 给您返回该item当前值的唯一标识。如果您覆写了这个item并想把它写回到memcached中,您可以通过cas命令把那个唯一标识一起发送给 memcached。如果该item存放在memcached中的唯一标识与您提供的一致,您的写操作将会成功。如果另一个进程在这期间也修改了这个 item,那么该item存放在memcached中的唯一标识将会改变,您的写操作就会失败。
8. 无身份验证,认为身份验证是更高层的问题。
9. 删除Delete操作只是将该chunk置为删除状态,这样在下次使用将优先利用这样的chunk。
10. Flush操作相当于将所有的item失效的一个动作。并不会改变memcache内存分配情况。
11. memcache已经分配的内存不会再主动清理。
12. memcache分配给某个slab的内存页不能再分配给其他slab。
13. flush_all不能重置memcache分配内存页的格局,只是给所有的item置为过期。
14. memcache最大存储的item(key+value)大小限制为1M,这由page大小1M限制。
15. 由于memcache的分布式是客户端程序通过hash算法得到的key取模来实现,不同的语言可能会采用不同的hash算法,同样的客户端程序也有可能使用相异的方法,因此在多语言、多模块共用同一组memcached服务时,一定要注意在客户端选择相同的hash算法。
16. 启动memcached时可以通过-M参数禁止LRU替换,在内存用尽时add和set会返回失败。
17. memcached启动时指定的是数据存储量,没有包括本身占用的内存、以及为了保存数据而设置的管理空间。因此它占用的内存量会多于启动时指定的内存分配量,这点需要注意。
二、Redis
1. Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,hash等数据结构的存储。
2. Redis支持数据的备份,即master-slave模式的数据备份。
3. Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
4. Redis,具备一定的数据库特征。
5. Redis数据可以存储到硬盘,基本没有过期策略。
6. redis有一个致命缺陷 当内存满了时 dump数据cpu占用100%。
7.
三、Memcache和Redis区别
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。