Redis--架构及原理
- 格式:pdf
- 大小:248.39 KB
- 文档页数:5
Redis--架构及原理
⼀.Redis简介Redis 是完全开源免费的,是⼀个⾼性能的key-value类型的内存数据库。整个数据库统统加载在内存当中进⾏操作,定期通过异步操作把数据库数据flush到硬盘上进⾏保存。因为是纯内存操作,Redis的性能⾮常出⾊,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。
Redis的出⾊之处不仅仅是性能,Redis最⼤的魅⼒是⽀持保存多种数据结构,此外单个value的最⼤限制是1GB,因此Redis可以⽤来实现很多有⽤的功能,⽐⽅说⽤List来做FIFO双向链表,实现⼀个轻量级的⾼性 能消息队列服务,⽤他的Set可以做⾼性能的tag系统等等。另外Redis也可以对存⼊的Key-Value设置expire时间。总结来说,使⽤Redis的好处如下:
1.速度快,因为数据存在内存中,读的速度是 110000 次 /s, 写的速度是 81000 次 /s;
2.⽀持丰富数据类型,⽀持string,list,set,sorted set,hash;
3.⽀持事务,操作都是原⼦性,对数据的更改要么全部执⾏,要么全部不执⾏,事务中任意命令执⾏失败,其余命令依然被执⾏。也就是说Redis 事务不保证原⼦性,也不⽀持回滚;事务中的多条命令被⼀次性发送给服务器,服务器在执⾏命令期间,不会去执⾏其他客户端的命令请求。4.丰富的特性:可⽤于缓存,消息(⽀持 publish/subscribe 通知),按key设置过期时间,过期后将会⾃动删除,具体淘汰策略有:
4.1.volatile-lru:从已经设置过期时间的数据集中,挑选最近最少使⽤的数据淘汰
4.2.volatile-ttl:从已经设置过期时间的数据集中,挑选即将要过期的数据淘汰
4.3.volatile-random:从已经设置过期时间的数据集中,随机挑选数据淘汰
4.4.allkeys-lru:从所有的数据集中,挑选最近最少使⽤的数据淘汰
4.5.allkeys-random:从所有的数据集中,随机挑选数据淘汰
4.6.no-enviction:禁⽌淘汰数据
具体过期键的策略有:定时删除(缓存过期时间到就删除,创建timer耗CPU),惰性删除(获取的时候检查,不获取⼀直留在内存,对内存不友好),定期删除(CPU和内存的折中⽅案)5.⽀持数据持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进⾏使⽤;
6.⽀持数据的备份,即 master - slave 模式的数据备份。
Redis的主要缺点是数据库容量受到物理内存的限制,不能⽤作海量数据的⾼性能读写,因此Redis适合的场景主要局限在较⼩数据量的⾼性能操作和运算上。
⼆.Redis的数据类型Redis ⽀持 5 中数据类型:string(字符串),hash(哈希),list(列表),set(集合),zset(sorted set:有序集合)。每种数据类型的具体命令请参考string
string 是 redis 最基本的数据类型。⼀个 key 对应⼀个 value。string 是⼆进制安全的。也就是说 redis 的 string 可以包含任何数据。⽐如 jpg图⽚或者序列化的对象。string 类型是 redis 最基本的数据类型,string 类型的值最⼤能存储 512 MB。hash
Redis hash 是⼀个键值对(key - value)集合。Redis hash 是⼀个 string 类型的 key 和 value 的映射表,hash 特别适合⽤于存储对象。并且可以像数据库中⼀样只对某⼀项属性值进⾏存储、读取、修改等操作。list
Redis 列表是简单的字符串列表,按照插⼊顺序排序。我们可以⽹列表的左边或者右边添加元素。 list 就是⼀个简单的字符串集合,和 Java中的 list 相差不⼤,区别就是这⾥的 list 存放的是字符串。list 内的元素是可重复的。可以做消息队列或最新消息排⾏等功能。set
redis 的 set 是字符串类型的⽆序集合。集合是通过哈希表实现的,因此添加、删除、查找的复杂度都是 O(1)。redis 的 set 是⼀个 key 对应着多个字符串类型的 value,也是⼀个字符串类型的集合,和 redis 的 list 不同的是 set 中的字符串集合元素不能重复,但是 list 可以。利⽤唯⼀性,可以统计访问⽹站的所有独⽴ ip。Zsetredis zset 和 set ⼀样都是字符串类型元素的集合,并且集合内的元素不能重复。不同的是 zset 每个元素都会关联⼀个 double 类型的分数。redis 通过分数来为集合中的成员进⾏从⼩到⼤的排序。zset 的元素是唯⼀的,但是分数(score)却可以重复。可⽤作排⾏榜等场景。
三.redis适⽤场景1.会话缓存(Session Cache)
最常⽤的⼀种使⽤Redis的情景是会话缓存(session cache)。⽤Redis缓存会话⽐其他存储(如Memcached)的优势在于:Redis提供持久化。当维护⼀个不是严格要求⼀致性的缓存时,如果⽤户的购物车信息全部丢失,⼤部分⼈都会不⾼兴的。2.队列
Reids在内存存储引擎领域的⼀⼤优点是提供 list 和 set 操作,这使得Redis能作为⼀个很好的消息队列平台来使⽤。Redis作为队列使⽤的操作,就类似于本地程序语⾔(如Python)对 list 的 push/pop 操作。3.全页缓存
⼤型互联⽹公司都会使⽤Redis作为缓存存储数据,提升页⾯相应速度。即使重启了Redis实例,因为有磁盘的持久化,⽤户也不会看到页⾯加载速度的下降。4.排⾏榜/计数器
Redis在内存中对数字进⾏递增或递减的操作实现的⾮常好。集合(Set)和有序集合(Sorted Set)也使得我们在执⾏这些操作的时候变的⾮常简单。
四.Redis⾼可⽤架构1.持久化
Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。Redis提供了两种持久化的⽅式,分别是RDB(Redis DataBase)和AOF(Append Only File)。
RDB
简⽽⾔之,就是在不同的时间点,将redis存储的数据⽣成快照并存储到磁盘等介质上,可以将快照复制到其他服务器从⽽创建具有相同数据的服务器副本。如果系统发⽣故障,将会丢失最后⼀次创建快照之后的数据。如果数据量⼤,保存快照的时间会很长。AOF
换了⼀个⾓度来实现持久化,那就是将redis执⾏过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执⾏⼀遍,就可以实现数据恢复了。将写命令添加到 AOF ⽂件(append only file)末尾。
使⽤ AOF 持久化需要设置同步选项,从⽽确保写命令同步到磁盘⽂件上的时机。这是因为对⽂件进⾏写⼊并不会马上将内容同步到磁盘上,⽽是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。选项同步频率always每个写命令都同步,eyerysec每秒同步⼀次,no让操作系统来决定何时同步,always 选项会严重减低服务器的性能,everysec 选项⽐较合适,可以保证系统崩溃时只会丢失⼀秒左右的数据,并且 Redis 每秒执⾏⼀次同步对服务器⼏乎没有任何影响。no 选项并不能给服务器性能带来多⼤的提升,⽽且会增加系统崩溃时数据丢失的数量。随着服务器写请求的增多,AOF ⽂件会越来越⼤。Redis 提供了⼀种将 AOF 重写的特性,能够去除 AOF ⽂件中的冗余写命令。
其实RDB和AOF两种⽅式也可以同时使⽤,在这种情况下,如果redis重启的话,则会优先采⽤AOF⽅式来进⾏数据恢复,这是因为AOF⽅式的数据恢复完整度更⾼。如果你没有数据持久化的需求,也完全可以关闭RDB和AOF⽅式,这样的话,redis将变成⼀个纯内存数据库。2.复制
Redis为了解决单点数据库问题,会把数据复制多个副本部署到其他节点上,通过复制,实现Redis的⾼可⽤性,实现对数据的冗余备份,保证数据和服务的⾼度可靠性。Redis有主从和主备两种⽅式解决单点问题,主备(keepalived)模式下主机备机对外提供同⼀个虚拟IP,客户端通过虚拟IP进⾏数据操作,正常期间主机⼀直对外提供服务,宕机后VIP⾃动漂移到备机上。 主从模式下当Master宕机后,通过选举算法(Paxos、Raft)从slave中选举出新Master继续对外提供服务,主机恢复后以slave的⾝份重新加⼊,此模式下可以使⽤读写分离,如果数据量⽐较⼤,不希望过多浪费机器,还希望在宕机后,做⼀些⾃定义的措施,⽐如报警、记⽇志、数据迁移等操作,推荐使⽤主从⽅式,因为和主从搭配的⼀般还有个管理监控中⼼(哨兵)。
①从数据库向主数据库发送sync(数据同步)命令。
②主数据库接收同步命令后,会保存快照,创建⼀个RDB⽂件。
③当主数据库执⾏完保持快照后,会向从数据库发送RDB⽂件,⽽从数据库会接收并载⼊该⽂件。
④主数据库将缓冲区的所有写命令发给从服务器执⾏。
⑤以上处理完之后,之后主数据库每执⾏⼀个写命令,都会将被执⾏的写命令发送给从数据库。可以同步发送也可以异步发送,同步发送可以不⽤每台都同步,可以配置⼀台master,⼀台slave,同时这台salve⼜作为其他slave的master。异步⽅式⽆法保证数据的完整性,⽐如在异步同步过程中主机突然宕机了,也称这种⽅式为数据弱⼀致性。
注意:在Redis2.8之后,主从断开重连后会根据断开之前最新的命令偏移量进⾏增量复制。
3.哨兵
哨兵是Redis集群架构中⾮常重要的⼀个组件,哨兵的出现主要是解决了主从复制出现故障时需要⼈为⼲预的问题。1.Redis哨兵主要功能
(1)集群监控:负责监控Redis master和slave进程是否正常⼯作
(2)消息通知:如果某个Redis实例有故障,那么哨兵负责发送消息作为报警通知给管理员
(3)故障转移:如果master node挂掉了,会⾃动转移到slave node上
(4)配置中⼼:如果故障转移发⽣了,通知client客户端新的master地址2.Redis哨兵的⾼可⽤
原理:当主节点出现故障时,由Redis Sentinel⾃动完成故障发现和转移,并通知应⽤⽅,实现⾼可⽤性。哨兵机制建⽴了多个哨兵节点(进程),共同监控数据节点的运⾏状况。同时哨兵节点之间也互相通信,交换对主从节点的监控状况。每隔1秒每个哨兵会向整个集群:Master主服务器+Slave从服务器+其他Sentinel(哨兵)进程,发送⼀次ping命令做⼀次⼼跳检测。这个就是哨兵⽤来判断节点是否正常的重要依据,涉及两个新的概念:主观下线和客观下线。⼀个哨兵节点判定主节点down掉是主观下线,只有半数哨兵节点都主观判定主节点down掉,此时多个哨兵节点交换主观判定结果,才会判定主节点客观下线。基本上哪个哨兵节点最先判断出这个主节点客观下线,就会在各个哨兵节点中发起投票机制Raft算法(选举算法),最终被投为领导者的哨兵节点完成主从⾃动化切换的过程。
4.集群
⾄少部署两台Redis服务器构成⼀个⼩的集群,主要有2个⽬的: