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 该选择指定服务器最多保存多少条慢查询日志
redis学习笔记(面试题)的更多相关文章
- redis 学习笔记(6)-cluster集群搭建
上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...
- Redis学习笔记~目录
回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...
- Redis学习笔记4-Redis配置详解
在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...
- Redis学习笔记7--Redis管道(pipeline)
redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...
- Redis学习笔记一:数据结构与对象
1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...
- Redis学习笔记之ABC
Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...
- (转)redis 学习笔记(1)-编译、启动、停止
redis 学习笔记(1)-编译.启动.停止 一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...
- Redis学习笔记(二)-key相关命令【转载】
转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...
- Redis学习笔记(三)Redis支持的5种数据类型的总结
继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...
- Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash
引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...
随机推荐
- 【bzoj3938】 Robot
http://www.lydsy.com/JudgeOnline/problem.php?id=3938 (题目链接) 题意 给出数轴上$n$个点,有$m$个操作,在时间$t$让一个点以一定的速度移动 ...
- Logstash解析Json array
logstash解析json数组是一种常见的需求,我以网上一组数据为例来描述 我们的数据test.json内容如下:(此处我linux上的json文本需要是compact的) {"type& ...
- 使用React.cloneElement()给子组件传值
React提供了一个克隆组件的API: React.cloneElement( element, [props], [...child] ) 可以利用该方法,给子组件传值,使用如下: class Pa ...
- SIFT算法详解
尺度不变特征变换匹配算法详解Scale Invariant Feature Transform(SIFT)Just For Fun zdd zddmail@gmail.com or (zddhub@ ...
- Zookeeper客户端Curator---Getting Started
先说个小插曲,前几天有个网站转载我的文章没有署名作者,我有点不开心就给他们留言了,然后今天一看他们把文章删了.其实我的意思并不是你允许转载,我想表达的是我的付出需要被尊重.也不知道是谁的错~ ==== ...
- zoj 3195(LCA加强版)
传送门:Problem 3195 https://www.cnblogs.com/violet-acmer/p/9686774.html 题意: 给一个无根树,有q个询问,每个询问3个点(a,b,c) ...
- 引入springboot的两种方式以及springboot容器的引入
一.在项目中引入springboot有两种方式: 1.引入spring-boot-starter-parent 要覆盖parent自带的jar的版本号有两种方式: (1)在pom中重新引入这个jar, ...
- redis实现队列
转:https://www.cnblogs.com/nullcc/p/5924244.html 问题:如果一个并发很大的消息应用,想要根据请求的优先级来处理? 答案:用Redis 详解: 一是并发量大 ...
- pyglet and opengl -- 纹理映射以及动画
#-*- coding:gbk -*- #from pyglet.gl import * from OpenGL.GL import * import pyglet from pyglet impor ...
- 第一章:认识Ajax
第一节:Ajax 简介 1,Ajax 是一种网页开发技术,(Asynchronous Javascript + XML)异步JavaScript 和XML:2,Ajax 是异步交互,局部刷新:3,Aj ...