redis学习笔记(面试题)

时间:2022-09-18 14:52:37

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学习笔记(面试题)的更多相关文章

  1. redis 学习笔记(6)-cluster集群搭建

    上次写redis的学习笔记还是2014年,一转眼已经快2年过去了,在段时间里,redis最大的变化之一就是cluster功能的正式发布,以前要搞redis集群,得借助一致性hash来自己搞shardi ...

  2. Redis学习笔记~目录

    回到占占推荐博客索引 百度百科 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合). ...

  3. Redis学习笔记4-Redis配置详解

    在Redis中直接启动redis-server服务时, 采用的是默认的配置文件.采用redis-server   xxx.conf 这样的方式可以按照指定的配置文件来运行Redis服务.按照本Redi ...

  4. Redis学习笔记7--Redis管道(pipeline)

    redis是一个cs模式的tcp server,使用和http类似的请求响应协议.一个client可以通过一个socket连接发起多个请求命令.每个请求命令发出后client通常会阻塞并等待redis ...

  5. Redis学习笔记一:数据结构与对象

    1. String(SDS) Redis使用自定义的一种字符串结构SDS来作为字符串的表示. 127.0.0.1:6379> set name liushijie OK 在如上操作中,name( ...

  6. Redis学习笔记之ABC

    Redis学习笔记之ABC Redis命令速查 官方帮助文档 中文版本1 中文版本2(反应速度比较慢) 基本操作 字符串操作 set key value get key 哈希 HMSET user:1 ...

  7. (转)redis 学习笔记(1)-编译、启动、停止

    redis 学习笔记(1)-编译.启动.停止   一.下载.编译 redis是以源码方式发行的,先下载源码,然后在linux下编译 1.1 http://www.redis.io/download 先 ...

  8. Redis学习笔记(二)-key相关命令【转载】

    转自 Redis学习笔记(二)-key相关命令 - 点解 - 博客园http://www.cnblogs.com/leny/p/5638764.html Redis支持的各种数据类型包括string, ...

  9. Redis学习笔记(三)Redis支持的5种数据类型的总结

    继续Redis学习笔记(二)来说说剩余的三种数据类型. 三.列表类型(List) 1.介绍 列表类型可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的一段片段.列表类型内部是 ...

  10. Redis学习笔记(二)Redis支持的5种数据类型的总结之String和Hash

    引言 在Redis学习笔记(一)中我们已经会安装并且简单使用Redis了,接下来我们一起来学习下Redis支持的5大数据类型. 简介 Redis是REmote DIctionary Server(远程 ...

随机推荐

  1. 关于OC头文件互相引用的问题

    在OC中头文件互相引用是很常见的一件事,如: A的头文件#import "B.h" 而B的头文件#import "A.h" 这个时候就会出现意想不到的问题.系统 ...

  2. 树形dp+MST-hdu-4126-Genghis Khan the Conqueror

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4126 题目意思: 给一图,n个点,m条边,每条边有个花费,给出q条可疑的边,每条边有新的花费,每条可 ...

  3. php字符串标点等字符截取不乱吗 封装方法

    方法一: /**   +----------------------------------------------------------  * 功能:字符串截取指定长度  * leo.li hen ...

  4. Amazon.com : The Odyssey of the Manual Toothbrusher

    Amazon.com : The Odyssey of the Manual Toothbrusher The Odyssey of the Manual Toothbrusher

  5. ajax 实现修改功能

    这段时间在做项目,发现自己忘得好快呀,幸亏有博客园帮我记着呢,整理博客园简直不要太重要了哦  因为做的是一个内部管理系统,只用了一个主页面,所有的都不允许整个网页刷新,所以我们只能用ajax 来做,当 ...

  6. 安装SSL证书 and 根域名跳转www域名

    1.安装自签证书 自签证书也就是不被公网认可的证书,可在局域网内进行签名认证,其12306也是自签证书,通过证书+nginx代理web服务器 可以实现https连接  一.使用OpenSSL创建证书 ...

  7. 乡下人设计模式——SOLID之六大原则

    S(Single Responsibility Principle):单一责任原则 O(Open Closed Principle):开放封闭原则 L(Liskov Substitution Prin ...

  8. SpringBoot系列: Spring支持的异常处理方式

    ===================================视图函数返回 status code 的方式===================================Spring 有 ...

  9. 网易2018校招内推编程题-堆棋子-C++实现

    链接:https://www.nowcoder.com/questionTerminal/27f3672f17f94a289f3de86b69f8a25b来源:牛客网 [编程题]堆棋子 热度指数:14 ...

  10. Stream基础知识

    Stream API Stream是Java8中处理集合的关键抽象概念,它可以指定你希望对集合进行的操作,但是将执行操作的时间交给具体实现来决定.例如,如果你希望计算某个方法的平均值,你可以在每个元素 ...