Redis是单线程的,如何提高多核CPU的利用率?

可以在同一个服务器部署多个Redis的实例,并把他们当作不同的服务器来使用,在某些时候,无论如何一个服务器是不够的, 所以,如果你想使用多个
CPU,你可以考虑一下分片(shard)。

为什么要做 Redis 分区?

分区可以让 Redis 管理更大的内存, Redis 将可以使用所有机器的内存。 如果没有分区, 你最多只能使用一台机器的内存。 分区使 Redis 的计算能力通过简单地增加计算机得到成倍提升,Redis 的网络带宽也会随着计算机和网卡的增加而成倍增长。

Redis 分区有什么缺点?

涉及多个 key 的操作通常不会被支持。 例如你不能对两个集合求交集, 因为他们可能被存储到不同的 Redis 实例(实际上这种情况也有办法, 但是不能直接使用交集指令)。
同时操作多个 key,则不能使用 Redis 事务.
分区使用的粒度是key,不能使用一个非常长的排序key存储一个数据集(The partitioning granularity is the key, so it is not possible to shard a dataset with a single huge key like a very big sorted set) .
当使用分区的时候, 数据处理会非常复杂, 例如为了备份你必须从不同的 Redis 实例和主机同时收集 RDB / AOF 文件。
分区时动态扩容或缩容可能非常复杂。 Redis 集群在运行时增加或者删除 Redis 节点, 能做到最大程度对用户透明地数据再平衡,但其他一些客户端分区或者代理分区方法则不支持这种特性。 然而, 有一种预分片的技术也可以较好的解决这个问题。

你知道有哪些Redis分区实现方案?

  1. 客户端分区就是在客户端就已经决定数据会被存储到哪个redis节点或者从哪个redis节点读取。
    1. 范围切分
    2. hash切分:一致性哈希/普通哈希
  2. 代理分区意味着客户端将请求发送给代理,然后代理决定去哪个节点写数据或者读数据。代理根据分区规则决定请求哪些Redis实例,然后根据Redis的响应结果返回给客户端。redis的代理分区实现如Twemproxy。
  3. 查询路由(Query routing) 的意思是客户端随机地请求任意一个redis实例, 然后由Redis将请求转发给正确的Redis节点。Redis Cluster实现了一种混合形式的查询路由,但并不是直接将请求从一个redis节点转发到另一个redis节点, 而是在客户端的帮助下直接redirected到正确的redis节点。