单进程单线程与单进程多线程
Redis 是单进程单线程的工作模式,所有的请求都被排队处理处理,因此缓存数据没有互斥的需求。而 Memcached 是单进程多线程的工作模式,请求到达时,主线程会将请求分发给多个工作线程,因此必须要做数据的互斥。
在处理请求的能力上,两者是不相上下的。理论上在一台支持多线程的机器上,Memecached 的 get 操作的吞吐量会较 Redis 高。
那到底是多线程还是单线程优秀?多线程一般会增加程序逻辑的复杂度,需要考虑线程与线程之间的同步与互斥,一定程度上拉低了每个线程的吞吐量(工作量),更多的时间是花在了等待互斥锁上。一般建议在系统设计的时候多考虑系统的横向扩展性。
使用每个进程单个线程的模式。这里没有信条,不是非黑即白,就看什么样的方法解决什么样的问题了。
丰富与简单的数据结构
Redis 有丰富的原生数据结构,包括字符串,链表,集合,有序集合,哈希表,二进制数组等,可见 Redis 能适用于更多的场景,可以当作一个数据结构数据库。Memcached 在这方面较 Redis 逊色,只能做简单的 key/value 存储。
其他
除了上面所说,与 Memcached 比较:
Redis 原生支持主从复制,可以实现一主多从的场景,提高了可用性
Redis 原生支持 RDB 和 AOF 两种持久化方式。前者是将内存中的数据整体落地,后者是将数据的更新落地,类似于 MySQL 中的 binlog。Memcached 原生并不支持持久化
Redis 支持事务
Redis 支持键值对的过期时间设置
Redis 3.0 中已经开始支持 Redis 集群了
对比下来,Redis 好玩多了。
性能测试
曾经被问到 Redis 和 Memcached 哪个更快?在测试的时候,需要保证测试的客观环境是一样的,这包括测试机器,客户端除了在构造协议的逻辑部分不一样外,其他都应该是保持一致的。
测试环境:
ubuntu, Intel(R) Core(TM) i5-3210M CPU @ 2.50GHz 4 核心 memcache 1.4.14 redis 3.1.99
测试概括了一些结论:
随着 payload 增大,会越影响读写性能,尤其是 Redis
Redis,Memcache(worker 线程数为1),读写性能不分上下,Redis 更优一点
Memcache 的 worker 线程达到一定个数,会导致读写的性能下降
默认情况下,Memcached 默认键长设置为 256B,存储数据长度限制为 1M。可以通过 Memcached 的 -I 选项调整默认 slab 页面大小,从而可以调整存储数据长度的限制,但 Memcached 官方是不建议这种做法的。
没有非黑即白的答案,只有哪个工具在哪种场景下更为适用。
本文出自http://wiki.jikexueyuan.com/project/redis/memcache.html