缓存之Redis(二)

目录
  1. Redis与Memcache对比
  2. Redis集群相关
    1. ✔Redis常见的集群技术
    2. ✔Twemproxy
    3. ✔codis

Redis与Memcache对比

  1. 进程数:首先Redis是单进程的,Memcache是多进程的。
  2. 是否支持数据持久化、主从复制:Redis是支持数据持久化的,有两种方式RDB和AOF;RDB是将数据库的快照以二进制的方式存储到磁盘;AOF是将命令的日志记录到AOF文件。Redis是支持主从复制的。Memcache是不支持持久化的所有数据都放在内存。
  3. 支持的数据类型:Redis除了支持支持key-val,还支持Hash(哈希表),List,SET,ZSET;Memcache只支持简单的key-val。
  4. 性能对比:性能方面,事实上两者的性能都足够高,当然因为Redis是单进程的,Memcache是多进程的,在存储大数据(100k)以上的情况,Memcache略高于Redis,在存储小数据时,Redis性能是要高于Memcache的。

如何选择:有持久化的需求以及多种数据结构的需求建议使用Redis。

Redis作者在stackoverflow对redis与memcache的对比的回答:

You should not care too much about performances. Redis is faster per core with small values, but memcached is able to use multiple cores with a single executable and TCP port without help from the client. Also memcached is faster with big values in the order of 100k. Redis recently improved a lot about big values (unstable branch) but still memcached is faster in this use case. The point here is: nor one or the other will likely going to be your bottleneck for the query-per-second they can deliver. You should care about memory usage. For simple key-value pairs memcached is more memory efficient. If you use Redis hashes, Redis is more memory efficient.Depends on the use case. You should care about persistence and replication, two features only available in Redis. Even if your goal is to build a cache it helps that after an upgrade or a reboot your data are still there. You should care about the kind of operations you need. In Redis there are a lot of complex operations, even just considering the caching use case, you often can do a lot more in a single operation, without requiring data to be processed client side (a lot of I/O is sometimes needed). This operations are often as fast as plain GET and SET. So if you don’t need just GEt/SET but more complex things Redis can help a lot (think at timeline caching).

翻译如下:

没有必要过多的关注性能。由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。

你需要关注内存使用率。对于key-value这样简单的数据储存,memcache的内存使用率更高。如果采用hash结构,redis的内存使用率会更高。当然,这些都依赖于具体的应用场景。

你需要关注关注数据持久化和主从复制时,只有redis拥有这两个特性。如果你的目标是构建一个缓存在升级或者重启后之前的数据不会丢失的话,那也只能选择redis。

你应该关心你需要的操作。redis支持很多复杂的操作,甚至只考虑内存的使用情况,在一个单一操作里你常常可以做很多,而不需要将数据读取到客户端中(这样会需要很多的IO操作)。这些复杂的操作基本上和纯GET和POST操作一样快,所以你不只是需要GET/SET而是更多的操作时,redis会起很大的作用。

Redis集群相关

Redis常见的集群技术

  • 客户端耦合分片路由规则
  • 分离路由规则成一个代理服务(解耦)
  • Redis Cluster

客户端耦合分片路由规则,把分片的规则写死在客户端里面,这种优势是比较简单,容易实现,缺点就是耦合度高,改动代价大。 代理模式,用代理进行分片主要的好处当然是解耦,改动只要改代理就行,当然代理服务会损失一点点的性能。 代理分片一般用的都是一些开源的中间件,比如Twitter的Twemproxy。 Redis Cluster Redis Cluster是一种去中心化的思想,Redis的每一个实例两两相连通讯,客户端随机连接一个实例,如果该实例没有查询的数据,就会去其他实例查询。Redis cluster的集群信息通过两两相连通讯进行交换更新等操作。 这是一种相对比较重的实现,完全的去中心化,集群不容易管理。

Twemproxy

Twitter,开源的一种代理模式,请求访问代理,然后根据路由规则去对应的实例去数据,然后通过代理返回给客户端。当然Twemproxy是存在单点故障,可以使用keepalived来保障高可用。 魅族现在用的就是Twemproxy! Twemproxy缺点就是不能平滑的扩容与及缩容,还有就是没有控制面板(Dashboard)来进行监控管理。

codis

国内公司开源的软件,不是很了解,据说解决了Twemproxy现有存在的相关痛点。github地址https://github.com/CodisLabs/codis