redis面试题和关键技术点

1.1、主从复制

        通过配置两台(或多台)数据库的主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。

    1.2、redis主从复制

        redis 支持 master-slave(主从)模式,redisserver 可以设置为另一个 redis server 的主机(从机),从机定期从主机拿数据。特殊的,一个从机同样可以设置为一个 redis server 的主机,master以写为主,slaver以读为主。

   1、启动三台装有redis的centos

        2、确定主从关系,将那两台作为从

        3、用vim编辑从服务器的redis.conf(自己的启动配置文件)

            命令 vim /usr/local/redis/etc/redis.conf

            3.1 slaveof 192.168.0.100 6379    格式是 slaveof  主机ip  主机端口

            3.2 #bind127.0.0.1    注销绑定,可以允许所有的ip连接登录到这台redis服务上

            3.3 protected-mode no    关闭保护模式

        注意:还需要开放6379端口,centos7 默认使用的防火墙是firewall即使关闭防火墙也还是连不上端口

            1、systemctl status firewalld 查看防火墙状态

            2、systemctl start firewalld 启动防火墙

            3、firewall-cmd --zone=public --add-port=6379/tcp --permanent 永久开放6379端口

            4、firewall-cmd --reload 更新防火墙规则

            5、systemctl restart firewalld.service 重启防火墙

            6、firewall-cmd --query-port=6379/tcp 查询是否开放了6379端口

            7、systemctl stop firewalld 关闭防火墙

        4、检查从机是否能访问主机的6379端口 

            命令 telnet 192.168.0.104 6379 测试端口

            使用 Ctrl + ] 退出telnet连接 quit退出

1.6、redis主从复制的特点

        1、master可以有多台slave

        2、除了多个slave连到相同master外,slave也可以连接到其它slave形成图状结构

        3、主从复制不会阻塞master,也就是说当一个或多个slave与master连接进行复制时,master可以继续处理客户端发来的请求

         4、主从复制可以用来提高系统的伸缩性,我们可以用多个slave专门负责客户端的读请求,可以做数据冗余

  2.1、redis哨兵机制

        有了主从复制的实现以后,如果我们想对主从服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制。在2.6版本中的哨兵为1.0版本,并不稳定,会出现各种各样的问题,在2.8版本以后的哨兵功能才稳定起来。

        顾名思义,哨兵的含义就是监控Redis系统的运行状态。可以启动多个哨兵,去监控Redis数据库的运行状态。其主要功能有两点:

            1、监控主数据库和从数据库是否正常运行。

            2、主数据库出现故障时,可以自动将从数据库转换为主数据库,实现自动切换。

2.2、哨兵机制的实现步骤

        在其中的一个slave配置哨兵(也可以配置在主服务器)

        注意:因为原来的slave1、slave2会被自动选举为主服务器所以在它的配置文件中要配置(#bind127.0.0.1 protected-mode no 以及开放6379端口),最好使用telnet +ip + 端口 测试一下。

           1、copy 文件/usr/local/redis/redis-4.0.8/sentinel.conf(自己的redis的sentinel.conf文件) 到 /usr/local/redis/etc路径中命令 cp  /usr/local/redis/redis-4.0.8/sentinel.conf  /usr/local/redis/etc/

           2、修改 sentinel.conf 文件  vim/usr/local/redis/etc/sentinel.conf

                1) dir "/usr/local/redis/etc"    数据存放目录

                2) protected-mode no    关闭保护模式

                3) sentinel monitor mymaster192.168.43.201 6379 1    格式是master 的名称、 ip 、地址、端口号,以及失败时选出master的投票数量

                4) sentineldown-after-milliseconds mymaster5000    超时5000毫秒为宕机

                5) sentinelparallel-syncsmymaster 2     从服务器的个数

3、redis的持久化机制

    Redis是一个支持持久化的内存数据库,也就是说redis需要经常将内存中的数据同步到硬盘里面来保证数据的持久化。Redis支持两种持久化的实现,snapshotting (rdb)的持久化机制(快照)、append-only file(缩写aof)的持久化机制,可以通过启动配置文件(redis.conf)进行指定,默认采用rdb

3.1、snapshotting (rdb)的持久化机制

        Snapshotting机制,将内存中的数据以快照的方式写入到二进制文件中。默认的文件名称为dump.rdb.可以通过配置设置自动做快照持久化的方式。我们可以配置redis在n秒内如果超过m个写入就自动做快照。

        注意配置dir "/usr/local/redis/etc/" 指定dump.rdb文件的存放路径

        在配置文件redis.cof里面,snapshotting的默认配置为:

            save 900 1               900秒内执行1次写操作,自动做快照。

            save 300 10             300秒内执行10次写操作,自动做快照。

            save 60 10000         60秒内执行10000次写操作,自动做快照。

    3.2、append-only file(aof)的持久化机制

        append-only file方式,有点类似Oracle的日志文件。 由于快照方式是经过一定的时间间隔做一次快照,所以可能会在redis发生意外的情况下丢失最后一次快照后的所有修改的数据。aof 比快照方式有更好的持久化性能,是因为由于在使用aof 的时候,redis会将每一个收到的写命令都通过write 函数追加到文件里面,当redis重新启动的时候会重新执行文件中保存的写命令来在内存里面重建数据库的内容。默认的文件名为appendonly.aof

        注意配置dir "/usr/local/redis/etc/" 指定appendonly.aof文件的存放路径

        aof 常见的设置:

            appendonly yes         启动aof 的持久化机制,同时快照方式的持久化机制会失去作用 

            appendfsync always     收到写命令就立即持久化到磁盘,效率最慢,但是保证完全的持久化 (通常采用)

            appendfsync everysec   每秒钟写入磁盘一次,在性能和持久化方面做了很好的折中 

            appendfsync no         完全依赖os 性能最好,持久化没有保证 

        进行检测

            配置完毕之后启动redis服务,会在/usr/local/redis/etc/目录下出现appendonly.aof文件,因为没有做任何操作所以是空白的

注意

1.当启动哨兵模式之后,如果你的master服务器宕机之后,哨兵自动会在从redis服务器里面 投票选举一个master主服务器出来;这个主服务器也可以进行读写操作!

2.如果之前宕机的主服务器已经修好,可以正式运行了。那么这个服务器只能进行读的操作,会自动跟随由哨兵选举出来的新服务器!

1、Sentinel的作用:

A、Master 状态监测

B、如果Master 异常,则会进行Master-slave 转换,将其中一个Slave作为Master,将之前的Master作为Slave 

C、Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换 

2、Sentinel的工作方式:

1):每个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其他 Sentinel 实例发送一个 PING 命令。

2):如果一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。 

3):如果一个Master被标记为主观下线,则正在监视这个Master的所有 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。 

4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 。

5):在一般情况下, 每个 Sentinel 会以每 10 秒一次的频率向它已知的所有Master,Slave发送 INFO 命令 。

6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的所有 Slave 发送 INFO 命令的频率会从 10 秒一次改为每秒一次 。

7):若没有足够数量的 Sentinel 同意 Master 已经下线, Master 的客观下线状态就会被移除。 

若 Master 重新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。

1、什么是Redis?

redis 是一个基于内存的高性能key-value数据库

2、Redis相比memcached有哪些优势?

  • redis与 memcached相比,redis支持key-value数据类型,同事支持list、set、hash等数据结构的存储。
  • redis支持数据的备份,即master-slave模式的数据备份。
  • redis支持数据的持久化。
  • redis在很多方面支持数据库的特性,可以这样说他就是一个数据库系统,而memcached只是简单地K/V缓存。
  • 它们在性能方面差别不是很大,读取方面尤其是针对批量读取性能方面memcached占据优势。当然redis也有他的优点,如持久性、支持更多的数据结构。
  • 所以在选择方面如果有持久方面的需求或对数据类型和处理有要求的应该选择redis。
  • 如果简单的key/value 存储应该选择memcached。

3、Redis支持哪几种数据类型?

String

正常的key

正常的value

Hash

正常的Key 如用户ID

HashMap(field,value) 代表对象

List

链表名字

每个子元素都是string类型的双向链表

Set

Set名字

string类型的无序集合

Zset

Zset名字

一列存 value,一列存顺序

4、Redis主要消耗什么物理资源?

5、Redis的全称是什么?

Redis是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API6、Redis有哪几种数据淘汰策略?

7、Redis官方为什么不提供Windows版本?

8、一个字符串类型的值能存储最大容量是多少?

项目中使用redis存储,key-value方式,在Redis中字符串类型的Value最多可以容纳的数据长度是512M 

9、为什么Redis需要把所有数据放到内存中?

Redis为了达到最快的读写速度将数据都读到内存中,并通过异步的方式将数据写入磁盘。所以Redis具有快速和数据持久化的特性。如果不将数据放到内存中,磁盘的I/O速度会严重影响redis的性能。在内存越来越便宜的今天,redis将会越来越受欢迎。如果设置了最大使用的内存,则数据已有记录数达到内存限值后将不能继续插入新值。

10、Redis集群方案应该怎么做?都有哪些方案?

Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接

 1、所有的redis节点彼此互联(PING-PONG机制),内部使用二进制协议优化传输速度和带宽。

     2、节点的fail是通过集群中超过半数的节点检测失效时才生效。

     3、客户端与redis节点直连,不需要中间proxy层.客户端不需要连接集群所有节点,连接集群中任何一个可用节点即可。

     4、redis-cluster把所有的物理节点映射到[0-16383]slot上(不一定是平均分配),cluster 负责维护node<->slot<->value。

     5、Redis集群预分好16384个桶,当需要在 Redis 集群中放置一个 key-value 时,根据 CRC16(key) mod 16384的值,决定将一个key放到哪个桶中。

11、Redis集群方案什么情况下会导致整个集群不可用?

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用

12、MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?

相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

redis 提供 6种数据淘汰策略:

voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

  13、Redis有哪些适合的场景?

一:缓存——热数据二:计数器三:队列四:位操作(大数据处理)五:分布式锁与单线程机制六:最新列表七:排行榜

14、Redis支持的Java客户端都有哪些?官方推荐用哪个?

Redisson,Jedis,lettuce等等,官方推荐使用Redisson。

15、Redis和Redisson有什么关系?

Redisson - 是一个高级的分布式协调Redis客服端,能帮助用户在分布式环境中轻松实现一些Java的对象 

支持Redis多种连接模式 集群模式,单例模式,哨兵模式,主从模式

16、Jedis与Redisson对比有什么优缺点?

Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持;Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上。

17、Redis如何设置密码及验证密码?

配置文件参数:requirepass 查询密码 config get requirepass

18、说说Redis哈希槽的概念?

Redis 集群中内置了 16384 个哈希槽,当需要在 Redis 集群中放置一个 key-value

时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 取模,

这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,redis 会根据节点数量大

致均等的将哈希槽映射到不同的节点。

19、redis 集群过程1:当一个从数据库启动时,会向主数据库发送sync命令,

2:主数据库接收到sync命令后会开始在后台保存快照(执行rdb操作),并将保存期间接收到的命令缓存起来

3:当快照完成后,redis会将快照文件和所有缓存的命令发送给从数据库。

4:从数据库收到后,会载入快照文件并执行收到的缓存的命令

20、Redis集群会有写操作丢失吗?为什么?

21、Redis集群之间是如何复制的?

22、Redis集群最大节点个数是多少?

一个redis集群的搭建,最少需要6个节点,构成3组服务节点;每组服务节点包括两个节点(Master-Slave)

23、Redis集群如何选择数据库?

24、怎么测试Redis的连通性?

25、Redis中的管道有什么用?

26、怎么理解Redis事务?

27、Redis事务相关的命令有哪几个?

28、Redis key的过期时间和永久有效分别怎么设置?

29、Redis如何做内存优化?

30、Redis回收进程如何工作的?

31、Redis回收使用的是什么算法?

32、Redis如何做大量数据插入?

33、为什么要做Redis分区?

34、你知道有哪些Redis分区实现方案?

35、Redis分区有什么缺点?

36、Redis持久化数据和缓存怎么做扩容?

37、分布式Redis是前期做还是后期规模上来了再做好?为什么?

38、Twemproxy是什么?

39、支持一致性哈希的客户端有哪些?

40、Redis与其他key-value存储有什么不同?

41、Redis的内存占用情况怎么样?

42、都有哪些办法可以降低Redis的内存使用情况呢?

43、查看Redis使用情况及状态信息用什么命令?

44、Redis的内存用完了会发生什么?

45、Redis是单线程的,如何提高多核CPU的利用率?

46、一个Redis实例最多能存放多少的keys?List、Set、Sorted Set他们最多能存放多少元素?

47、Redis常见性能问题和解决方案?

48、Redis提供了哪几种持久化方式?

提供了多种不同级别的持久化方式:一种是RDB,另一种是AOF.

RDB 持久化可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)。

AOF 持久化记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据集。 AOF 文件中的命令全部以 Redis 协议的格式来保存,新命令会被追加到文件的末尾。 Redis 还可以在后台对 AOF 文件进行重写(rewrite),使得 AOF 文件的体积不会超出保存数据集状态所需的实际大小。Redis 还可以同时使用 AOF 持久化和 RDB 持久化。 在这种情况下, 当 Redis 重启时, 它会优先使用 AOF 文件来还原数据集, 因为 AOF 文件保存的数据集通常比 RDB 文件所保存的数据集更完整。你甚至可以关闭持久化功能,让数据只在服务器运行时存在。

49、如何选择合适的持久化方式?

50、修改配置不重启Redis会实时生效吗?

一下配置文件修改需要重启:

1.appendfsync no

appendfsync这是为no,redis不会主动调用fsync将日志同步到磁盘,此时,依赖操作系统,大多数Linux操作系统,每隔30s,调用一次fsync,将缓冲区日志同步到磁盘

2.appendfsync everysec

redis每隔1秒,调用fsync,将缓冲区数据写入磁盘,如果fsync超过1是,就会延迟到第二秒时fsync,但是最多2s,

3.appendfsync always

每一个写操作,redis都会调用fsync,将缓冲区数据写入磁盘,这样数据最安全,但是性能下降!

分布式缓存对应需要的实现组件有:

一个缓存监控、迁移、管理中心。 

一个自定义的客户端组件,上图中的SmartClient。 

一个无状态的代理服务。 

N台服务器。

1. 使用redis有哪些好处?

(1) 速度快,因为数据存在内存中,类似于HashMap,HashMap的优势就是查找和操作的时间复杂度都是O(1)

(2) 支持丰富数据类型,支持string,list,set,sorted set,hash

(3) 支持事务,操作都是原子性,所谓的原子性就是对数据的更改要么全部执行,要么全部不执行

(4) 丰富的特性:可用于缓存,消息,按key设置过期时间,过期后将会自动删除

2. redis相比memcached有哪些优势?

(1) memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型

(2) redis的速度比memcached快很多

(3) redis可以持久化其数据

3. redis常见性能问题和解决方案:

(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件

(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次

(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内

(4) 尽量避免在压力很大的主库上增加从库

(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...

这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

4. mySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据

 相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰

volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰

volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰

allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰

allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰

no-enviction(驱逐):禁止驱逐数据

5. Memcache与Redis的区别都有哪些?

1)、存储方式

Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。

Redis有部份存在硬盘上,这样能保证数据的持久性。

2)、数据支持类型

Memcache对数据类型支持相对简单。

Redis有复杂的数据类型。

3)、使用底层模型不同

它们之间底层实现方式 以及与客户端之间通信的应用协议不一样。

Redis直接自己构建了VM 机制 ,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

4),value大小

redis最大可以达到1GB,而memcache只有1MB

6. Redis 常见的性能问题都有哪些?如何解决?

1).Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务,所以Master最好不要写内存快照。

2).Master AOF持久化,如果不重写AOF文件,这个持久化方式对性能的影响是最小的,但是AOF文件会不断增大,AOF文件过大会影响Master重启的恢复速度。Master最好不要做任何持久化工作,包括内存快照和AOF日志文件,特别是不要启用内存快照做持久化,如果数据比较关键,某个Slave开启AOF备份数据,策略为每秒同步一次。

3).Master调用BGREWRITEAOF重写AOF文件,AOF在重写的时候会占大量的CPU和内存资源,导致服务load过高,出现短暂服务暂停现象。

4). Redis主从复制的性能问题,为了主从复制的速度和连接的稳定性,Slave和Master最好在同一个局域网内

7, redis 最适合的场景

Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?

       如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:

     1 、Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。

     2 、Redis支持数据的备份,即master-slave模式的数据备份。

     3 、Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。

(1)、会话缓存(Session Cache)

最常用的一种使用Redis的情景是会话缓存(session cache)。用Redis缓存会话比其他存储(如Memcached)的优势在于:Redis提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用Redis来缓存会话的文档。甚至广为人知的商业平台Magento也提供Redis的插件。

(2)、全页缓存(FPC)

除基本的会话token之外,Redis还提供很简便的FPC平台。回到一致性问题,即使重启了Redis实例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似PHP本地FPC。

再次以Magento为例,Magento提供一个插件来使用Redis作为全页缓存后端

此外,对WordPress的用户来说,Pantheon有一个非常好的插件  wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

(3)、队列

Reids在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得Redis能作为一个很好的消息队列平台来使用。Redis作为队列使用的操作,就类似于本地程序语言(如Python)对 list 的 push/pop 操作。

如果你快速的在Google中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的就是利用Redis创建非常好的后端工具,以满足各种队列需求。例如,Celery有一个后台就是使用Redis作为broker,你可以从这里去查看。

(4),排行榜/计数器

Redis在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(Sorted Set)也使得我们在执行这些操作的时候变的非常简单,Redis只是正好提供了这两种数据结构。所以,我们要从排序集合中获取到排名最靠前的10个用户–我们称之为“user_scores”,我们只需要像下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执行:

ZRANGE user_scores 0 10 WITHSCORES

Agora Games就是一个很好的例子,用Ruby实现的,它的排行榜就是使用Redis来存储数据的,你可以在这里看到。

(5)、发布/订阅

最后(但肯定不是最不重要的)是Redis的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用Redis的发布/订阅功能来建立聊天系统!(不,这是真的,你可以去核实)。

Redis提供的所有特性中,我感觉这个是喜欢的人最少的一个,虽然它为用户提供如果此多功能。

猜你喜欢

转载自blog.csdn.net/u010705742/article/details/85695332
今日推荐