Redis面试题

一、分布式数据库的CAP

1. CAP 简介

Consistency 强一致性

Availability 高可用性

Partition tolerance 分布式容忍性

2. CAP 3进2

CAP理论的核心:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

分布式数据库必须实现分布式容忍性,因此P是我们必须要满足的。

CA:单点集群,满足一致性,可用性,可扩展性不强大 传统关系型数据库:RDBMS

CP:一致性,分布式容忍性的系统,性能不是很高 MongoDB HBase Redis

AP:满足可用性,分布式容忍性,一致性要求低 大多数网站架构的选择

3. BASE

BASE是为了解决关系数据库强一致性与可用性降低而提出的解决方案。放松一致性要求,最终通过最终一致达到要求。

BASE:

基本可用(Basically Available)      软状态 (Soft state)     最终一致(Eventually consistent)

4. 分布式和集群

分布式:不同的多台服务器上面部署不同的服务模块,之间通过Rpc/Rmi之间通信和调用。

集群:不同的服务器上面部署相同的服务模块,通过分布式调度软件进行统一的调度,对外提高服务和访问。

二、redis 数据类型

1. String

String数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字。

常规key-value缓存应用;

常规计数:微博数,粉丝数等。

常用命令:set get decr incr mget mset

2. Hash

hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,vale是一个键值对。

常用命令:hget hset hgetall hmset hmget hdel hkeys hvals

3. List

list 就是链表,Redis list 的应用场景非常多,也是Redis最重要的数据结构之一,比如微博的关注列表,粉丝列表,消息列表等功能都可以用Redis的 list 结构来实现。

Redis list 的实现为一个双向链表,即可以支持反向查找和遍历,更方便操作,不过带来了部分额外的内存开销。

另外可以通过 lrange 命令,就是从某个元素开始读取多少个元素,可以基于 list 实现分页查询,这个很棒的一个功能,基于 redis 实现简单的高性能分页,可以做类似微博那种下拉不断分页的东西(一页一页的往下走),性能高。

常用命令:lpush rpush lpop rpop lrange

4. Set

set 经常用于去重操作,基于set轻易实现交集,并集,差集操作。

比如:在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis可以非常方便的实现如共同关注、共同粉丝、共同喜好等功能。这个过程也就是求交集的过程,具体命令如下:

sinterstore key1 key2 key3     将交集存在key1内

常用命令:

5. Sorted Set

和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。

三、redis 持久化机制

Redis是一个支持持久化的NoSQL数据库,通过持久化机制把内存中的数据同步到硬盘文件来保证数据持久化。当Redis重启后通过把硬盘文件重新加载到内存,就能达到恢复数据的目的。

实现:单独创建fork()一个子进程,将当前父进程的数据库数据复制到子进程的内存中,然后由子进程写入到临时文件中,持久化的过程结束了,再用这个临时文件替换上次的快照文件,然后子进程退出,内存释放。

1. 快照(snapshotting)持久化(RDB)

RDB是Redis默认的持久化方式。按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件。即Snapshot快照存储,对应产生的数据文件为dump.rdb。

针对大规模数据的恢复,对数据恢复的完整性要求不高,缺点:最后一次持久化数据可能丢失。

通过配置文件中的save参数来定义快照的周期。

save 900 1           #在900秒(15分钟)之后,如果至少有1个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

save 300 10          #在300秒(5分钟)之后,如果至少有10个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

save 60 10000        #在60秒(1分钟)之后,如果至少有10000个key发生变化,Redis就会自动触发BGSAVE命令创建快照。

2. AOF(append-only file)持久化

AOF:AOF持久化实时性更好,以日志的形式记录每一个写操作,将每一个写命令通过Write函数追加到文件最后,当Redis重启时通过重新执行文件中保存的写命令来在内存中重建整个数据库的内容。

redis默认没有开启AOF,可以通过appendonly 开启

appendonly yes

在Redis的配置文件中存在三种不同的 AOF 持久化方式

appendfsync always    #每次有数据修改发生时都会写入AOF文件,这样会严重降低Redis的速度
appendfsync everysec  #每秒钟同步一次,显示地将多个写命令同步到硬盘
appendfsync no        #让操作系统决定何时进行同步

重写机制:当aof文件大小超过设定的阈值时,Redis就会启动aof文件的内容压缩。redis会记录上次重写时的aof大小,默认配置是当aof文件大小是上次rewrite后大小的一倍切文件大于64m时触发。

当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。

四、redis 事务

1. redis 事务

可以一次执行多个命令,本质是一组命令的集合。一个事务中的所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞。

部分支持事务,不保证原子性。

一条命令写错所有命令不执行,一条命令运行出错,其他命令照常执行。

2. 操作命令

discard:取消事务
exec:执行事务命令
multi:标记事务块的开始
watch:对key进行监视
unwatch:取消watch命令对key的监视

五、主从复制

1. 主从复制

主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。

读写分离:主机写,从机读。

2. 具体操作

从库配置:slaveof 主库ip 主库端口

通过 info replication 命令查看配置信息。

每次与主机断开,都要重新连接,除非将配置写进redis.conf,主机有的从机都进行备份。第一次备份全量复制,以后都增量复制。重新连接后会自动进行一次全量复制。

常用3招:

一主二仆:一个Master两个Slave

薪火相传:上一个Slave可以是下一个slave的Master,可以有效减轻master的写压力。

反客为主:主机崩了,从机成为主机 slaveof no one

3.哨兵机制

新建 sentinel.conf 文件,添加:

sentinel monitor 被监控主机名字 ip 端口号 1

上面最后一个数字1,表示主机挂掉后salve投票看让谁接替成为主机,得票数多于1的成为主机。

启动哨兵:redis-sentinel /哨兵配置文件路径/sentinel.conf

面试题

单线程的redis为什么这么快

(一)纯内存操作
(二)单线程操作,避免了频繁的上下文切换
(三)采用了非阻塞I/O多路复用机制

有没有尝试进行多机redis 的部署?如何保证数据一致的?

主从复制,读写分离
一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而从数据库一般是只读的,并接收主数据库同步过来的数据,一个主数据库可以有多个从数据库,而一个从数据库只能有一个主数据库。

redis 的线程模型

redis 内部使用文件事件处理器 file event handler,这个文件事件处理器是单线程的,所以 redis 才叫做单线程的模型。它采用 IO 多路复用机制同时监听多个 socket,根据 socket 上的事件来选择对应的事件处理器进行处理。

文件事件处理器的结构包含 4 个部分:

  • 多个 socket
  • IO 多路复用程序
  • 文件事件分派器
  • 事件处理器(连接应答处理器、命令请求处理器、命令回复处理器)

redis 和 memcached 的区别

redis支持更丰富的数据类型(支持更复杂的应用场景):Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。memcache支持简单的数据类型,String。

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

集群模式:memcached没有原生的集群模式,需要依靠客户端来实现往集群中分片写入数据;但是 redis 目前是原生支持 cluster 模式的.

Memcached是多线程,非阻塞IO复用的网络模型;Redis使用单线程的多路 IO 复用模型。

redis 设置过期时间

我们 set key 的时候,都可以给一个 expire time,就是过期时间,通过过期时间我们可以指定这个 key 可以存活的时间。

删除方式:定期删除+惰性删除。

定期删除:间隔时间随机抽取设置了过期时间的key,检查是否过期,过期就删除。

惰性删除:主动去检查系统的key有没有过期,过期删除掉。

redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?)

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

    volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key(这个是最常用的)
    allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
    no-eviction:禁止驱逐数据,也就是说当内存不足以容纳新写入数据时,新写入操作会报错。

redis 集群模式

主从模式:若master挂掉,则redis无法对外提供写服务。

Sentinel 模式:sentinel中文含义为哨兵,顾名思义,它的作用就是监控redis集群的运行状况,当主机挂了后会自动将新的master节点提供给使用者。

Cluster模式:多个redis节点网络互联,数据共享。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值