单进程单线程与单进程多线程

Redis 是单进程单线程的工作模式,所有的请求都被排队处理处理,因此缓存数据没有互斥的需求。而 Memcached 是单进程多线程的工作模式,请求到达时,主线程会将请求分发给多个工作线程,因此必须要做数据的互斥。

在处理请求的能力上,两者是不相上下的。理论上在一台支持多线程的机器上,Memecached 的 get 操作的吞吐量会较 Redis 高。

那到底是多线程还是单线程优秀?多线程一般会增加程序逻辑的复杂度,需要考虑线程与线程之间的同步与互斥,一定程度上拉低了每个线程的吞吐量(工作量),更多的时间是花在了等待互斥锁上。一般建议在系统设计的时候多考虑系统的横向扩展性。

使用每个进程单个线程的模式。这里没有信条,不是非黑即白,就看什么样的方法解决什么样的问题了。

丰富与简单的数据结构

Redis 有丰富的原生数据结构,包括字符串,链表,集合,有序集合,哈希表,二进制数组等,可见 Redis 能适用于更多的场景,可以当作一个数据结构数据库。Memcached 在这方面较 Redis 逊色,只能做简单的 key/value 存储。

其他

除了上面所说,与 Memcached 比较:

  1. Redis 原生支持主从复制,可以实现一主多从的场景,提高了可用性

  2. Redis 原生支持 RDB 和 AOF 两种持久化方式。前者是将内存中的数据整体落地,后者是将数据的更新落地,类似于 MySQL 中的 binlog。Memcached 原生并不支持持久化

  3. Redis 支持事务

  4. Redis 支持键值对的过期时间设置

  5. 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

测试概括了一些结论:

  1. 随着 payload 增大,会越影响读写性能,尤其是 Redis

  2. Redis,Memcache(worker 线程数为1),读写性能不分上下,Redis 更优一点

  3. Memcache 的 worker 线程达到一定个数,会导致读写的性能下降

默认情况下,Memcached 默认键长设置为 256B,存储数据长度限制为 1M。可以通过 Memcached 的 -I 选项调整默认 slab 页面大小,从而可以调整存储数据长度的限制,但 Memcached 官方是不建议这种做法的。

没有非黑即白的答案,只有哪个工具在哪种场景下更为适用。

本文出自http://wiki.jikexueyuan.com/project/redis/memcache.html