面试之--redis常见知识点

1.Memcache和redis的区别?

Memcache:支持简单数据类型,不支持数据持久化存储,不支持主从,不支持分片

Redis:数据类型丰富,支持数据磁盘持久化存储,支持主从,支持分片。

2.redis为什么能这么快?

  • 完全基于内存,绝大部分请求纯粹内存操作,执行效率高

  • 数据结构简单,对数据操作也简单,类似HashMap(O(1))

  • 采用单线程(一个网络),单线程也能处理高并发请求,想多核也可启动多实例。

  • 使用多路I/O复用模型,非阻塞IO

FD:文件描述符,一个打开的文件通过唯一的描述符进行引用

采用I/O多路复用函数,因地制宜,优先选择时间复杂度为O(1)的多路复用函数作为底层实现,以时间复杂度为O(n)的select作为保底。

基于react设计模式监听I/O事件。

3.redis的数据类型

String 最基本最大512MB

Incr 命令自动记录数量,用法:统计用户访问量

Hash(散列)

String元素组成的字典,适合用于存储对象

hmset

hget

List(列表)存储的数组

按照String元素插入顺序排序

lpush key将一个值插入到已存在列表的头部

lrange key 0 10 获取列表指定范围内的元素

lpop key 1ms 移出一个头部元素并获取列表的第一个元素

Blpop key timeout 阻塞直到队列有消息或者超时

Set(集合)

String 类型的无序集合。集合是唯一的

sadd key 向集合添加一个或多个成员

smembers key 返回集合中的所有成员

Sorted Set

有序集合

zadd key score value 向集合添加数据

ZRANGEBYSCORE key min max withscores

从海量key里查询出某一固定前缀的Key

摸清数据规模,问清楚边界

1.Keys a*指令 返回以a开头的key

2.scan 0 match k1* count 10

基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程

0是序号 10为一次取10个元素

不保证每次执行都返回某个给定数量的元素,支持模糊查询

4.如何通过Redis实现分布式锁?

SETNX key value:如果key不存在,则创建并赋值

时间复杂度:O(1)

返回值:设置成功,返回1;设置失败,返回0.

EXPIRE key seconds 设置过期时间

SET KEY value [EX seconds] [Px milliseconds][NX|XX]

EX second:设置键的过期时间,PX过期时间为毫秒

NX :只在键不存在时,才对键进行设置操作

XX:只在键已经存在时,才对键进行设置操作

SET操作成功时,返回OK,否则返回nil

5.如何使用Redis做异步队列?

1.使用list作为队列,RPUSH生产消息,LPOP消费消息

缺点:没有等待队列里有值就直接消费

弥补:在应用层引入sleep机制去调用lpop重试消费

Blpop key timeout 阻塞直到队列有消息或者超时

2.主题订阅者模式pub/sub

SUBSCRIBE key 订阅消息

PUBLISH key value 发布消息

发送者pub发送消息

订阅者订阅任意数量的频道

缺点:消息的发布时无状态的,无法保证可达

6.Redis如何做持久化?

1.Redis(快照)RDB持久化保存某个时间点的全量数据。分为手动触发和自动触发。

手动触发

save和bgsave命令

save:阻塞redis的服务器进程,直到rdb文件被创建完毕。命令调用rdbsave命令。

bgsave:命令fork一个子进程,再由fork出来的子进程调用rdbsave。有一定的延迟。

自动触发

  • 1."save m n”表示m秒内数据集存在n次修改时,自动触发bgsave

  • 2.主从复制时,主节点自动触发

  • 3.执行Debug Reload

  • 4.执行Shutdown且没有开启AOF持久化

bgsave原理

首先检查子进程是否存在,不存在调用rdbSaveBackground,fork 子进程执行rdb操作

主进程响应其它操作

Fork:创建进程,实现了Copy-on-Write,所有资源复制给子进程。

多个调用者请求相同资源,一起读,直到某个调用者试图修改资源时

系统才会真正复制一份副本给调用者,其它仍然不变。

redis中,子进程负责写临时文件,主进程继续处理请求。

缺点:数据量大会由于I/O严重影响性能

可能会因为redis挂掉丢失当前到最近一次快照期间的数据。

2.AOF持久化:保存写状态

  • 记录下除了查询以外的所有变更数据库状态的指令

  • 以append的形式保存到AOF文件中(增量)

配置文件对应appendonly yes 表示开启,

appendfilename 文件地址,

appendfsync always(每修改同步)/no(不同步)/everysec(每秒同步)

命令:config set appendonly yes

缺点:文件不断变大,解决:日志重写

Fork一个 子进程,

子进程把新的aof写到一个临时文件里,不依赖原来的aof文件

主进程持续将新的变动同时写到内存和原来的aof里

主进程获取子进程重写aof的完成信号,往aof同步增量变动

使用新的aof文件替换掉旧的aof文件。

Redis的数据恢复

优先加载aof文件,没有加载rdb文件

RDB和AOF的优缺点

RDB全量数据快照,文件小,恢复快,缺点:但是无法保存最近一次快照之后的数据。

AOF优点:可读性高,适合增量数据,数据不易丢失,缺点:文件体积大,恢复实际时间长。

Redis 4.0后RDB-AOF混合持久化方式

bgsave 做快照,aof做增量

使用pipeline的好处

  • Pipeline和linux的管道类似

  • Redis基于请求/响应模型,单个请求处理需要一一应答

  • Pipeline批量执行指令,节省多次I/O往返时间

  • 有顺序的指令建议分批次送达

7.Redis的同步机制

1.主从同步

①:数据冗余:主从复制实现了数据的热备份,是持久化之外的一种数据冗余方式。

②:故障恢复:当主节点出现问题时,可以由从节点提供服务,实现快速的故障恢复;实际上是一种服务的冗余。换句话说就是主服务器挂掉了,从服务器顶上去。

③:负载均衡:在主从复制的基础上,配合读写分离,可以由主节点提供写服务,由从节点提供读服务(即写Redis数据时应用连接主节点,读Redis数据时应用连接从节点),分担服务器负载;尤其是在写少读多的场景下,通过多个从节点分担读负载,可以大大提高Redis服务器的并发量。

全量同步过程

  • Salve发送sync命令到Master

  • Master启动一个后台进程,将Redis中的快照数据保存到文件中

  • Master将保存数据快照期间接收到的写命令缓存起来

  • Master完成写文件操作后,将该文件发送给Salve

  • Slave 使用新的aof文件替换掉旧的aof文件

  • Master将这期间收集的增量写命令发送给Salve端

增量同步过程

  • Master接收到用户的操作指令,判断是否需要传播到Slave

  • 将操作记录追加到aof文件

  • 将操作传播到slave节点,1对齐主从库,往响应缓存写入指令

  • 将缓存中的数据发送给Slave

主从由于不是高可用的

2.Redis SentInel(Redis哨兵)

redis主从复制的哨兵集群,简单的一句话就是,“时时对主节点进行监控,一旦发现多个从节点都无法正常ping通主节点,哨兵节点就会自我协商推荐某个

从节点进阶为新任盟主成为主节点Master,并同时把旧的主节点变更为从节点。

解决主从同步Master宕机后的主从切换问题

监控:检查主从服务器是否运行正常

提醒:通过API向管理员或者其他应用程序发送故障通知

自动故障迁移:主从切换

1.监控:哨兵Sentinel 节点会定期检测 Redis 数据节点、其余 哨兵Sentinel 节点是否可达。

2.通知:哨兵Sentinel 节点会将故障转移的结果通知给应用方。

3.主节点故障转移:实现从节点晋升为主节点并维护后续正确的主从关系。

4.配置提供者:在 Redis Sentinel 结构中,客户端在初始化的时候连接的是 Sentinel 节点集合,从中获取主节点信息。

5.同时Redis Sentinel 包含了若等个 哨兵Sentinel 节点,这样做也带来了两个好处:

对于节点的故障判断是由多个 哨兵Sentinel 节点共同完成,这样可以有效地防止误判。

哨兵Sentinel 节点集合是由若干个 Sentinel 节点组成的,这样即使个别 Sentinel 节点不可用,整个 Sentinel 节点集合依然是健壮的。

Sentinel 节点本身就是独立的 Redis 节点,只不过它们有一些特殊,它们不存储数据,只支持部分命令哨兵

3.Redis-cluster的集群原理

如何从海量数据里快速找到所需?

一致性hash算法,计算数据所在的redis,

数据倾斜的问题

8.如何解决redis雪崩,穿透,并发

雪崩:redis集群大面积故障,大量数据都过期,大量请求转到mysql数据库

  • 缓存的高可用,集群,哨兵sentinel cluster

  • 服务降级减少对mysql的访问

  • redis备份,持久化

  • 缓存数据的过期时间设计随机

缓存穿透:查询一个不存在的数据

  • 查询数据库为空,可设置一个默认值外带过期时间,当有值了替换掉即可

  • 采用布隆过滤器,将存在可能的数据进行hash运算存放在一个尽可能大的bigmap中然后进行过滤

缓存击穿:数据库有数据,数据过期了,单个数据高并发

添加synchronized锁或reentrantlock锁或分布式锁,在获取锁后设置值

缓存并发

  • redis就是单线程的,按照先到先执行

  • 放到队列一个一个执行

缓存预热

上线后将相关的缓存数据直接加载到缓存系统

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

瞬间的醒悟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值