1、 简介
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间索引半径查询。 Redis 内置了复制,LUA脚本, LRU驱动事件,事务和不同级别的磁盘持久化, 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性。
2、 redis集群
通常情况下redis是一个单机的Nosql数据库,要使用redis的集群需要根据自身的需求,确定使用哪一种集群。
redis的集群模式大概有三种:主从模式、哨兵和自动分区。
主从模式
单机的redis会遇到单点压力的问题,即同时访问redis的客户端太多,redis无法及时处理。为了解决这个问题redis使用主从模式,简单来说就是多启动几个redis,将请求发送给别的服务器,分担压力。
使用这种方式有一个要求,就是集群内部的数据一致性。redis为了解决集群内数据的一致性,使用了主从模式:集群内只有一台机器为主服务器,主服务器既有读也有写的权限,其他机器都是从服务器,从服务器只有读的权限。从服务器在加入集群的时候会复制主服务器的数据,保证两者的数据一致,随后主服务器发生写操作的时候,主服务器会将操作发送给从服务器,保证集群的数据一致。
哨兵
主从模式有一个问题:当主服务器挂机后,整个集群就丧失了写权限,导致集群不可用。为了解决这个问题redis提供了哨兵模式,简单来说就是再创建一个集群用来监控主从模式中的服务器,当哨兵发现主服务器挂机后,将一个从服务器再转换为主服务器。
自动分区
主从模式和哨兵主要是解决的是单点压力问题,而自动分区解决的是另一个问题:数据量太大了,单机的内存不够用。解决方式也很简单,单机不够用,就用多台机器一起进行存储,将数据分成多片,存储在不同的机器上。
数据分片可以使用hash的方式来做,简单来说就是对数据的key进行hash取模,得到的数字就是数据需要存储的机器的编号。但是这种方式有一个问题:不利于集群的扩张。具体说就是当有一台新的机器要加入到集群的时候,需要更改hash取模的模数,但是如果更改了模数会导致集群内已经存储的数据,存储出错(改前计算的存储位置和改后计算的存储位置不同)。这样就需要将原先所存储的所有数据取出来再进行一次新的hash取模运算。
redis为了解决上述问题,提出hash槽的概念。他将hash取模的模数固定,固定为16384个。每一个视作为一个槽位,然后让集群里的机器认领槽位,存储分布道改槽位的数据。当新的机器加入集群的时候,只需要重新分配槽位,然后一堆指定槽位的数据便可。