Redis学习
1、 什么是redis
Redis是一个数据库,他和我们传统的oracle数据库差别是它是基于内存的数据库;因为是基于内存,所以效率就高,在某些场景下就可以对我们传统的关系型数据库做一个补充
2、 redis怎么存储数据
redis基于key-value(键值)来存储数据,它不像关系型数据库那样有数据表,能提供sql查询。redis存储的是相对原始的数据集合及数据类型。
3、Redis基于key-value存储数据,那么key-value具体是什么?
key-value是一一对应的(键值对),一个key只有一个value值,你要找到value值的话,就需要知道key是什么,通过key去找value.
键(key) 值(value)
1 我
2 你
3 他
4、 Redis是基于内存,那么如果服务器异常了,数据是不是都没有了,丢失了
Redis为了确保服务器进程退出,数据意外丢失,提供了2种持久化功能:RDB和AOF。该功能可以将redis在内存中的数据库状态保存到磁盘。从而避免丢失
5、 RDB和AOF解释和区别
RDB:可以手动执行,也可以根据服务器配置选项定期执行,可以将某个时间点的数据库状态保存到RDB文件,该文件是一个压缩的二进制文件,通过该文件可以还原生产RDB文件时点的数据库状态,恢复数据
AOF:append only file.与RDB通过保存数据库中健值对来记录数据库状态不同,AOF是通过保存Redis服务器所执行的写命令来记录数据库状态,因为包含重建数据库状态所需的所有写命令,所有恢复的时候只需要读入并重新执行一遍AOF文件里的保存的写命令就行。
6、 Redis怎么回收内存(redisobject 结构的属性refcount)
Redis是C语言写的,C语言本身不具备自动内存回收,Redis在自己的对象系统中构建了一个引用计数实现内存回收机制,如下:
在创建一个新对象是,引用计数的值会被初始化为1
当对象被一个新程序使用时,它的引用计数会被增1
当对象不再被一个程序使用时,它的引用计数值会被减一
当对象的引用计数变为0时,对象所占用的内存会被释放
7、 reids 数据库数据保存
redis服务器将所有的数据库都保存在redisServer.db数组中,数据库的数量则由redisServer.dbnum属性保存,每个redisdb结构代表一个数据库,每个redis客户端都有自己的目标数据库,当客户端执行数据库写命令或者读命令时候,目标数据库就会成为这些命令操作对象(目标端可以通过select命令来切换目标数据库)
8、 键的生存时间和过期时间(EXPIRE、PEXPIRE)
通过给键设置生存时间或者过期时间,来删除键值。使用EXPIRE或PEXPIRE命令给某个键设置过期时间,这个时间是一个unix时间戳,当键的过期时间来临时,服务器就会自动从数据库中删除这个键。当主服务器删除一个过期建时,它会向所有从服务器发送一条DEL命令,删除过期键
9、 RDB文件生成 SAVE和BGSAVE命令
SAVE名会阻塞redis服务器进程,直到RDB文件创建完毕为止,服务器进程阻塞期间,服务器不能处理任何命令请求
BGSAVE命令会派生一个子进程,然后由子进程负责创建RDB文件,服务器进程(父进程)继续处理命令请求
10、redis客户端
Redis服务器是典型的一对多服务器程序,一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器接收处理发送的请求并向客户端返回命令回复。输入缓冲区记录了客户端命令请求,缓冲区大小不能超过1GB,如果客户端发送的命令请求超过1GB或者不符合协议格式,客户端将被关闭。同样,如果发送给客户端的命令回复的大小超过了输出缓冲区限制时,对应客户端也会被服务器关闭
11、redis服务器
服务器负责与多个客户端建立连接,处理客户端命令请求,在数据库保存命令执行所产生的数据,通过资源管理维持自身运转
12、服务器复制
Redis中,用户可以通过执行SLAVEOF命令(或设置选项),让一个服务器去复制另一个服务器,被复制的服务器叫主服务器(master),复制的叫从服务器(slave),主从服务器双方的数据库保存相同的数据(数据库状态一致)
13、复制偏移量
执行复制的双方,主服务器和从服务器都分部维护一个复制偏移量,比如主从服务器复制偏移量都未10086,主服务器想三个从服务器传播长度为100的字节数据,,主服务器的复制偏移量为10186,三个从服务器在收到主服务器传播的数据后,也会将复制偏移量更新诶10186,通过对比复制偏移量,程序可以很容易的判断主从服务器是否处于一致状态
14、复制积压缓冲区
复制积压缓冲区是由主服务器维护的一个固定长度先进先出的队列,默认1MB,当主服务器进行命令传播时,它不仅会将写命令发送给所以从服务器,也会将写命令入队到复制积压缓冲区,当从服务器断掉时,重新连接主服务器,根据偏移量来判断,如果偏移量之后的数据还存在复制积压缓冲区,那么主服务器将对从服务器执行部分重同步操作,如果在复制积压缓冲区不存在,则对从服务器执行完整重同步操作
15、服务器运行ID
除了复制偏移量,复制积压缓冲区,实现部分重同步还需要用到服务器运行ID,每个redis服务器,不论主从,都有自己的运行ID,运行ID在服务器启动时自动生成,由40个随机的十六进制字符组成,当从服务器对主服务器进行初次复制时,主服务器会将自己的运行ID传送给从服务器,当从服务重新连接上一个主服务器时,从服务器将想当前连接的主服务器发送之前保存的运行ID
16、redis的高可用 :Sentinel(哨兵)
由一个或多个Sentinel实例(instance)组成Sentinel系统,可用监视任意多个主服务器,以及主服务器下的从服务器;并在被监视的主服务器进入下线状态时,自动将下线服务器的某个从服务器升级为新的主服务器,代替原来的主服务器继续处理命令请求。
工作原理:当Sentinel监视到主服务器下线时间超过用户设定的时限,就会对主服务器进行故障转移操作,首先会挑选一个从服务器,将其设置为新的主服务器,之后Sentinel会向原来的所有从服务器发送新的复制指令,让他们成为新的主服务器的从服务器,当所有从服务器开始复制新的主服务器时,故障转移操作执行完毕。同时Sentinel会继续监视已经下线的原主服务器,并在它重新上线时,将它设置为新的主服务器的从服务器(Sentinel是一个运行在特殊模式下的redis服务器,当一个主服务器被判断为下线时,监视的各Sentinel会进行协商,选举一个领头Sentinel,并由领头Sentinel对下线主服务器执行故障转移操作,选举规则是先到先得和半数通过)
17、Redis集群
Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)来进行数据共享,并提供复制和故障转移功能
17.1 节点:一个redis集群由多个节点(node)组成,相互独立的节点通过握手(IP和port)(cluster meet命令),连接起来后组成集群,一个节点就是一个运行在redis集群模式下redis服务器,redis服务器通过cluster-enabled配置项是否为Yes来决定是否开启服务器集群模式
17.2 cluster meet命令实现
通过向节点A发送cluster meet命令,,客户端让接收命令的节点A将另一个节点B添加到A所在的集群里面,首先A与B进行握手,确定彼此存在,节点A为节点B创建一个clusternode结构,并将该结构添加到自己的clusterstate.nodes字典里面,然后节点A将根据cluster meet命令给定的IP 地址和端口号,先节点B发送meet消息,节点B收到A的meet消息后,为A创建clusternode结构,添加到自己的clusterstate.nodes字典里面,向节点A返回一条pong消息,节点A收到消息后,确定了节点B成功收到了自己的meet消息,之后节点A想节点B返回一条ping消息,节点B收到ping消息后,确定A接收到了自己的pong消息,握手完成。之后,节点A将节点B的信息通过gossip协议传播给集群中的其他节点,让其他节点与B握手,直到B为集群所有节点认识
17.3槽指派
Redis集群通过分片的方式来保存数据库中的键值对,集群整个数据库被分为16384个槽(slot)的,数据库中的每个键都属于这16384个槽的其中一个,每个节点可以处理0个或者最多16384个槽。当数据库中的16384个槽都有节点在处理时,集群处于上线状态,如果任何一个槽没有得到处理,集群处于下行状态(fail)。
一个节点会将自己负责处理的槽记录在clusternode结构的slot属性和numlots属性中,同时将自己的slots数组通过消息发送给集群其他节点,以此告知其他节点自己负责处理哪些槽,举例:01,02,03 三个节点组成一个集群,槽0-5000分给01节点,槽5001-10000分给02节点,10001-16383分给03节点,对应的节点只处理自己负责的槽。收到命令时,如果键所在的槽正好是当前节点,就直接处理命令,否则想客户端返回一个moved错误,指引客户端转向正确的节点
Reids集群管理软件reids-trib可以对redis进行重新分片,可以on line进行,集群不需下线
17.4 集群的复制和故障转移
Redis集群的节点分为主节点(master)和从节点(slave),分配了槽的是主节点,从节点用于复制某个主节点,并在被复制的主节点下线时,代替下线主节点继续处理命令请求。
举例:01,02,03是主节点,分配了槽,04,05,06是从节点,如果01处于下线状态,那么集群中仍在运行的几个主节点将在01节点的从节点中选择一个节点做为新的主节点,接管原来01节点处理的槽.
故障检测:集群中每个节点都会定期向集群中的其他节点发送ping消息,如果接收ping消息的节点没有在规定时间内,返回pong消息,那么该节点就会标记为疑似下线。一旦半数以上主节点判断某个主节点为疑似下线,那么该主节点将被标记为已下线。(投票规则),当从节点发现自己负责的主节点进入了下线状态时,从节点将开始对下线的主节点进行故障转移。其中一个从节点被选中为新的主节点,新的主节点会撤销下线主节点的槽指派,并将这些槽指派给自己,新主节点向集群广播一条pong消息,知会其他节点
17.5 消息
集群中各个节点通过发送和接收消息进行通信,GOSSIP协议由meet,ping,pong三种消息实现。Ping消息,检查节点是否在线;pong消息,接收者向发送者返回pong消息,确认消息收到,meet消息, 集群握手
18、慢查询日志
Reids的慢查询日志功能用户记录执行时间超过给定时长的命令请求,用户通过这个功能查收的日志来减少和优化查询速度
服务器配置有2个和慢查询日志相关的选项
Slowlog-log-slower-than ,该选项指定执行时间超过多少微妙的命令请求会被记录到日志上(1秒=100万微妙)
Slowlog-max-len 该选择指定服务器最多保存多少条慢查询日志