赞
踩
RDB:Redis DataBase
在指定的时间间隔内将内存的数据集快照写入磁盘,实际操作过程是fork一个子进程,先将数据集写入临时文件,写入成功后,再替换之前的文件,用二进制压缩存储
优点:
缺点:
AOF:Append Only File
以日止的形式记录服务器所处理的每一个些,删除操作,查询操作不会记录,以文本的方式记录,可以打开文件看到的详细的操作记录。
优点:
1.数据安全,Redis中提供了三种同步策略,即每秒同步,每修改同步和不同步。事实上,每秒同步也是异步完成的,其效率也是非常高的,所得是一旦系统出现宕机现象,那么一秒钟之内修改的数据将会丢失。而每修改同步那我们将其视为同步持久化,即每次发生的数据变化都被会立即记录到磁盘中。
2.通过append模式写文件,即使中途服务器宕机也不会破坏已经存在的内容,可以通过redis-check-aof工具解决数据一致性问题
3.AOF机制的rwriter模式,定期对AOF文件进行重写,以达到压缩的目的
缺点:
1.AOF文件比RDB文件大,且恢复速度慢
2.数据集大的时候,比RDB启动效率低
3.运行效率没有RDB高
AOF文件比RDB更新频率高,优先使用AOF还原数据
AOF比RDB更安全也更大
RDB性能比AOF好
如果两个都配了,优先加载AOF
Redis是key-value数据库,我们可以设置Redis中缓存的key的过期时间。Redis的过期策略就是指当Redis中缓存的key过期了,Redis如何处理
(expires字典会保存所有设置了过期时间的key的过期时间数据,其中,key是指键空间的某个键的指针,value是盖键的毫秒精度的UNIX时间戳表示的过期时间。键空间是指该Redis集群中保存的所有键。)
Redis中同时使用了惰性过期和定期过期两种过期策略
Redis基于Reactor模式开发了网络时间处理器,这个处理器叫做文件事件处理器file event handler。这个文件事件处理器,它是单线程的,所以Redis才叫做单线程的模型,它采用IO多路复用机制来监听多个Socket,根据Socket上的时间类型来选择对应的事件处理器来处理这个事件。可以实现高性能的网络通信模型,又可以跟内部其他线程的模块进行拼接,保证了Redis内部的线程模型的简单性。
文件事件处理器的结构包含四个部分:多个Socket,IO多路复用程序,文件事件分派器以及事件处理器(命令请求处理器,命令回复处理器,连接应答处理器等)
多个Socket可能并发地产生不同的操作,每个操作对应不同的文件事件,但是IO多路复用程序会监听多个Socket,会将SOcket放入一个队列中排队,每次队列中取出一个Socket个事件分派器,事件分派器把Socket个对应的事件处理器。
然后一个Socket的事件处理完之后,IO多路复用程序才会将队列的下一个Socket给事件分派器。文件事件分派器会根据每个Socket当前产生的时间,来选择对应的事件处理器来处理。
1.纯内存操作
2.核心是基于非阻塞的IO多路复用机制
3.单线程反而避免了多线程的频繁上下文切换带来的性能问题
简述Redis的事务实现
1.事务开始
MULTI命令的执行,标志着一个事务的开始。MULTI命令会将客户端状态的flags属性打开REDIS-MULTI标识来完成的
2.命令入队
当一个客户端切换到事务状态之后,服务器会根据这个客户端发送的命令来执行不同的操作。如果客户端发送的命令为MULTI,EXEC,WATCH,DISCARD中的一个,立即执行这个命令,否则将命令放入一个事务队列里面,然后向客户端返回QUEUE回复
事务队列时依照FIFO的方式保存入队的命令
3.事务执行
客户端发送EXEC命令。服务器执行EXEC命令逻辑
redis不支持事务回滚机制,但是它会检查每一个事务中的命令是否错误
Redis的事务不只是检查哪些程序员自己的逻辑错误.例如对String类型的数据库键执行HashMap类型的操作!
主从
哨兵模式:
sentinel,哨兵是redis集群中非常重要的一个组件,主要有以下功能:
哨兵用于实现redis集群的高分用,本身也是分布式的,作为一个哨兵集群去运行,互相协同工作
Redis Cluster是一种服务端Sharding技术,3.0版本开始正式提供。采用slot(槽)的概念,一共分成16384个槽。将请求发送到任意结点,接受到请求的节点会将查询请求发送给正确的节点上执行
方案说明:
在redis cluster架构下,每个redis要放开两个端口号,比如一个是6397,另外一个就是加1w的端口号,比如16379
16379端口号是用来进行节点间通信的,也就是cluster bus的通信,用来进行故障检测,配置更新,故障转移授权。cluster bus用了另外一种二进制的协议,gossip协议,用于节点间进行高效的数据交换,占用更少的网络带宽和处理时间。
优点:
缺点:
Redis Sharding是Redis Cluster出来之前,业界普遍使用的多Redis实例集群方法。其主要思想是采用哈希算法将Redis数据的key进行散列,通过hash函数,特定的key会映射到特定的Redis节点上,java redis客户端驱动jedis,支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool
优点:
优势在于非常简单,服务器端的Redis实例彼此独立,相互无关联,每个Redis实例像单服务器一样运行,非常容易线性拓展,系统的灵活性很强
缺单:
由于Sharding处理放到客户端,规模进一步扩大时会给运维带来挑战
客户端Sharding不支持动态增删节点。服务端Redis实例化群拓扑结构有变化时,每个客户端都需要更新调整,连接不能共享,当应用规模增大时买资源浪费制约优化
通过执行salveof命令或设置slaveof选项,让一个服务器去复制另外一个服务器的数据。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库,而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。
全量复制:
1.主节点通过bgsave命令fork子线程进行RDB持久化,该过程是非常消耗CPU,内存(页表复制)、硬盘IO的
2.主节点通过网络将RDB文件发送给从节点,对主节点的宽带会带来很大的消耗
3.从节点清空老数据,载入新RDB文件的过程是阻塞的,无法响应客户端的命令,如果从节点执行bgrewriteaof,也会带来额外的消耗
部分复制:
1.赋值偏移量:执行复制的双方,主从节点分别维护一个复制偏移量offset
2.复制积压缓冲区:主节点内部维护了一个固定长度的,先进先出(FIFO)队列,做为赋值积压缓冲区,当主从节点offset的差距过大超过缓冲区长度时,将无法执行部分复制,只能执行全量复制
3.服务器运行ID(runid):每个Redis结点,都有其运行ID,运行ID由结点在启动时自动生成,主节点会将自己的运行ID发送给从节点,从节点会将主节点的运行ID存起来。从节点Redis断开重连时的时候,就是根据运行ID来判断同步的进度:
过程原理:
缓存雪崩是指缓存同一时间大面积的失效,所以,后面的请求都会落到数据库上,造成数据库短时内承受大量请求而崩掉
解决方案:
缓存击穿是指缓存和数据库中都没有的数据,导致所有的请求都落到受苦上,造成数据库短时内承受大量请求而崩掉
解决方案:
缓存击穿是指缓存中没有但数据库中有的数据(一般是缓存时间到期),这是由于并发用户特别多,同时读缓存没读到数据,又同时去数据库取数据,引起数据库压力瞬间增大,造成过大压力,和缓存雪崩不同的是,缓存击穿指并发查同一条数据,缓存雪崩是不同数据都过期了,很多数据都查不到从而查数据库。
解决方案:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。