Redis是一种支持多类型数据结构的内存数据库,可用于数据库、数据缓存、消息中间件等。
Redis分为支持单机、主从、集群(双副本)模式,其中:单机模式只包含一个Redis实例,主从模式包含一主一从两个实例,集群模式则至少由三个Redis实例组成。Redis实例负责响应Redis客户端的操作请求。
Redis单机模式只包含一个实例,也就是Redis只能安装在一个节点上。
Redis单机模式的架构如图-1所示,其特点为:
用户可通过Client客户端连接Redis实例,进行数据的读写操作。
Redis单机模式,实例包含n(默认为16)个数据库,可通过修改配置参数redis.databases的值来修改数据库数量。Redis作为一个Key-Value内存数据库,同一数据库中Key不能重复,但不同数据库之间可以重复。
图-1 Redis单机模式
Redis主从模式包含一主一从两个实例。主实例和从实例的数据保持一致,主实例支持数据的写入和读取等各项操作,从实例只支持与主实例数据的同步和读取。主从模式由于主从实例数据几乎是一致的,可以将写入数据的命令发送给主实例执行,而读取数据的命令发送给从实例执行,从而达到读写分离的目的。
图-2 Redis主从模式
单机模式的Redis只能安装在一个节点上,那么该节点上的主机资源(内存/CPU)会成为限制Redis大小的主要因素。而Redis集群模式,可通过哈希槽(Hash Slot)方式极大提升Redis的扩展性,且其主从架构可有效保障Redis的稳定性。
Redis集群模式的架构如图-3所示。其特点为:
Redis集群模式通常由3个主(Master)实例和3个副本(Replica)实例组成。Client客户端可连接任何一个实例对Redis集群进行操作,其中:连接Master实例可读写数据,连接Replica实例可读取数据。
三个Master平分16384个slot。Client通过公式HASH_SLOT = CRC16 (key) mod 16384来计算出key所映射的slot,然后Redis会在包含该slot的实例上进行数据的读写操作。
Redis集群为无中心结构,实例间使用gossip协议进行通信,每个实例都保存着所有实例和slot的映射关系。实例间的互相通信能够及时发现故障的Master,并从其它的Replica实例中选举出新的Master。
图-3 Redis集群模式
与Redis单机模式对比,Redis集群模式的优缺点如下:
Redis集群模式的优点
读写分离:集群中Master实例的Relica实例会全量备份它的数据。Client写数据时可连接Master,读数据时可连接Replica。
高可用:当Master实例意外宕机时,它的Replica实例会通过选举成为新的Master实例,确保Redis集群稳定可用。
Redis集群模式的缺点
集群模式的Redis实例不再支持多数据库,只能使用数据库。
不支持批量操作的命令。
主从架构使内存占用翻倍。
消息系统:消息队列是大型网站常用的中间件,主要用于业务解耦、流量削峰及异步处理。Redis提供了发布、订阅及阻塞队列功能,可以实现一个简单的消息队列系统。
最新列表:Redis的列表结构,可以使用LPUSH在列表头部插入一个内容ID作为关键字或使用LTRIM来限制列表的数量。列表永远为N个ID,可直接根据ID查找对应的内容,无需查询最新的列表。