很多开源项目中都使用了redis,这些项目为什么使用redis?使用redis有什么好处?怎么使用redis?带着这些疑问,我们来了解一下redis。
一、什么是Redis
Redis是一个免费开源用于内存存储的数据结构服务器,可用作数据库,高速缓存和消息队列代理。它支持字符串、哈希表、列表、集合、有序集合等数据类型。它支持多种集群部署,辅助项目达到更高的性能。
二、Redis的结构
Redis数据类型分为:字符串、哈希、列表、集合、有序集合等五种类型。
1.String(字符串)
字符串类型是redis中最基本的数据类型,一个key对应一个value。字符串类型实际上可以是字符串(简单的字符串、复杂的字符串(xml、json)、数字(整数、浮点数)、二进制(图片、音频、视频))等,但最大不能超过M。
2.Hash(哈希)
哈希类型是一个Map,我们知道redis本身就是键值对结构,哈希结构就是“值”也充当键值对结构,如value={{value-a1,value-b1},......value-an,value-bn}}
3.list(链表)
列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素(element),一个列表最多可以储存2的32次方-1个元素,在redis中,可以队列表两端插入(pubsh)和弹出(pop),还可以获取指定范围的元素列表、获取指定索引下表的元素等,列表是一种比较灵活的数据结构,它可以充当栈和队列的角色,在实际开发中有很多应用场景。
4.Set(集合)
集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素,redis除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集,并合理的使用好集合类型
5.zset(有序集合)
有序集合也是用来保存多个字符串的元素,跟集合的区别在于,有序集合中的元素是可以排序的,它给每个元素设置一个分数,作为排序的依据。
三、Redis的三种集群模式
Redis的三种集群模式主要是:主从模式(redis2.8版本之前的模式)、哨兵sentinel模式(redis2.8及之后的模式)和rediscluster集群模式(redis3.0版本之后)。
1、主从模式(master-slave)
(1)模式来源:
同Mysql主从复制的原因一样,Redis虽然读取写入的速度都特别快,但是也会产生读压力特别大的情况。为了分担读压力,Redis支持主从复制,在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。Redis的主从结构可以采用一主多从或者级联结构,客户端可对主数据库进行读写操作,对从数据库进行读操作,主数据库写入的数据会实时自动同步给从数据库。
(2)工作机制:
当主数据库slave启动后,主动向从数据库master发送同步SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,然后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。
复制初始化后,master每次接收到的写命令都会同步发送给slave,保证主从数据一致性。
(3)优缺点
优点:master能自动将数据同步到slave,可以进行读写分离,分担master的读压力;
master、slave之间的同步是以非阻塞的方式进行的,同步期间,客户端仍然可以提交查询或更新请求
缺点:不具备自动容错与恢复功能。主从模式下,master节点在主从模式中唯一,若master挂掉,则redis无法对外提供写服务,导致客户端请求失败,需要等待机器重启或手动切换客户端IP才能恢复;
master宕机,如果宕机前数据没有同步完,则切换IP后会存在数据不一致的问题
难以支持动态扩容,Redis的容量受限于单机配置。
2、哨兵(Sentinel)
(1)模式来源:
主从模式的弊端就是不具备高可用性,当master挂掉以后,Redis将不能再对外提供写入操作,因此sentinel应运而生。sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况。那么如何得知某一台redis服务器挂了,如何切换,如何保证备份的机器是原始服务器的完整备份呢?这时候就需要Sentinel和Replication(复制)出场了。Sentinel可以管理多个Redis服务器,它提供了监控,提醒以及自动的故障转移的功能;Replication则是负责让一个Redis服务器可以配备多个备份的服务器。Redis也是利用这两个功能来保证Redis的高可用的。
在redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用性等各方面表现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置得过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。
(2)工作机制:
每个Sentinel(哨兵)进程以每秒钟一次的频率向整个redis集群中的master主服务器、slave从服务器以及其他的Sentinel(哨兵)进程发送一个ping命令。
如果一个实例距离最后一次有效回复ping命令的时间超过down-after-milliseconds选项所指定的值则这个实例会被Sentinel标记为主观下线(SDOWN)。
如是是master主服务器被标记为SDOWN,则正在监控这个服务器的所有Sentinel都要以每秒一次的频率确认服务器是否真的已经进入SDOWN(主观下线状态)。
当有足够数量(≥配置文件配置值)的Sentinel在指定的时间内确认了master进入了SDOWN状态,则master被标记为ODOWN(客观下线状态)。
在一般情况下,每个Sentinel会每10秒向redis主服务器和从服务器发送Info命令。但是当master被标记为客观下线时,频率改为1秒一次。
若没有足够数量的Sentinel同意master服务器下线,则master的SDOWN状态被移除,若master重新向Sentinel发送ping命令返回了有效回复,则master的SDOWN状态被移除。
(3)优缺点
优点:哨兵集群,基于主从复制模式,所有的主从配置优点,它都有主从可以切换,故障可以转移,高可用性的系统哨兵模式就是主从模式的升级,手动到自动,更加健壮;
缺点:Redis不好在线扩容的,集群容量一旦到达上限,在线扩容就十分麻烦,哨兵模式的配置繁琐;
3、集群(Cluster)
(1)模式来源:
sentinel模式基本可以满足一般生产的需求,具备高可用性。但是当数据量过大到一台服务器存放不下的情况时,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中。单台服务器资源的总是有上限的,CPU资源和IO资源我们可以通过主从复制,进行读写分离,把一部分CPU和IO的压力转移到从服务器上。但是内存资源怎么办,主从模式做到的只是相同数据的备份,并不能横向扩充内存;单台机器的内存也只能进行加大处理,但是总有上限的。所以我们就需要一种解决方案,可以让我们横向扩展。cluster模式的出现就是为了解决单机Redis容量有限的问题,将Redis的数据根据一定的规则分配到多台机器。
cluster可以说是sentinel和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本三个分片的话,就需要六个Redis实例。因为Redis的数据是根据一定规则分配到cluster的不同机器的,当数据量过大时,可以新增机器进行扩容。
使用集群,只需要将redis配置文件中的cluster-enable配置打开即可。每个集群中至少需要三个主数据库才能正常运行,新增节点非常方便。还有就是客户端与redis节点直连,不需要中间代理层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。
(2)工作机制:
在redis的每一个节点上,有两样东西我们比较