redis面试题

什么是redis?
Redis全称为:Remote Dictionary Server(远程数据服务),是一个基于内存的高性能key-value数据库。

Redis的数据类型?
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

Redis相比Memcached有哪些优势?
(1) Memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型
(2) Redis的速度比Memcached快很多
(3) Redis可以持久化其数据

Redis是单进程单线程的?
Redis是单进程单线程的,redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销。

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

MySQL里有2000w数据,redis中只存20w的数据,如何保证redis中的数据都是热点数据?
redis内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。

Redis 有哪几种数据淘汰策略?
volatile-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(驱逐):禁止驱逐数据

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

Redis常见性能问题和解决方案?
(1) Master最好不要写内存快照,如果Master写内存快照,save命令调度rdbSave函数,会阻塞主线程的工作,当快照比较大时对性能影响是非常大的,会间断性暂停服务。
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。

redis过期键的删除策略?
(1)、定时删除:在设置键的过期时间的同时,创建一个定时器(timer). 让定时器在键的过期时间来临时,立即执行对键的删除操作。
(2)、惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。
(3)、定期删除:每隔一段时间程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。

Redis支持的Java客户端都有哪些?官方推荐用哪个?
Redisson、Jedis、lettuce等等,官方推荐使用Redisson。

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

说说Redis哈希槽的概念?
Redis集群没有使用一致性hash,而是引入了哈希槽的概念,Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪个槽,集群的每个节点负责一部分hash槽

Redis集群会有写操作丢失吗?为什么?
Redis并不能保证数据的强一致性,这意味这在实际中集群在特定的条件下可能会丢失写操作。

Redis集群之间是如何复制的?
异步复制

Redis集群最大节点个数是多少?
16384个(Redis集群有16384个哈希槽)

Redis中的管道有什么用?
一次请求/响应服务器能实现处理新的请求即使旧的请求还未被响应。这样就可以将多个命令发送到服务器,而不用等待回复,最后在一个步骤中读取该答复。
这就是管道(pipelining),是一种几十年来广泛使用的技术。例如许多POP3协议已经实现支持这个功能,大大加快了从服务器下载新邮件的过程。

Pipeline有什么好处,为什么要用pipeline?
可以将多次IO往返的时间缩减为一次,前提是pipeline执行的指令之间没有因果相关性。使用redis-benchmark进行压测的时候可以发现影响redis的QPS峰值的一个重要因素是pipeline批次指令的数目。

怎么理解Redis事务?
事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

Redis事务相关的命令有哪几个?
MULTI、EXEC、DISCARD、WATCH

Redis key的过期时间和永久有效分别怎么设置?
EXPIRE和PERSIST命令。

Redis如何做内存优化?
尽可能使用散列表(hashes),散列表(是说散列表里面存储的数少)使用的内存非常小,所以你应该尽可能的将你的数据模型抽象到一个散列表里面。比如你的web系统中有一个用户对象,不要为这个用户的名称,姓氏,邮箱,密码设置单独的key,而是应该把这个用户的所有信息存储到一张散列表里面.

Redis回收进程如何工作的?
一个客户端运行了新的命令,添加了新的数据。Redis检查内存使用情况,如果大于maxmemory的限制, 则根据设定好的策略进行回收。一个新的命令被执行,等等。所以我们不断地穿越内存限制的边界,通过不断达到边界然后不断地回收回到边界以下。如果一个命令的结果导致大量内存被使用(例如很大的集合的交集保存到一个新的键),不用多久内存限制就会被这个内存使用量超越。

redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)?
快照(snapshotting)持久化(RDB):定时快照
AOF(append-only file)持久化:保存命令

什么是缓存击穿?什么是缓存穿透?
击穿,突然失效,一次性查太多数据库。
穿透,value为空,每次都查数据库。

什么是缓存雪崩?
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,会给后端系统带来很大压力。导致系统崩溃

Redis分布式锁?
Redisson自带官方锁

RLock rLock = getLock();

private RLock getLock() {
    //默认本机
    Redisson redisson = (Redisson) Redisson.create();
    return redisson.getLock("guzy");
}

使用了Redisson
setnx key value 命令+(lua脚本,即加锁和超时一起成功或失败)
只有在 key 不存在时设置 key 的值。设置成功,返回 1 。 设置失败,返回 0

高级数据类型?
只为了解决具体案例了,不具有普遍性。

Bitmaps(只保存0、1,相当于用时间换空间。setbit bit 0 1)
比如:查看哪些电影被点播,哪些电影没有被点播。
每天一条数据(保存如:010101000011110101010101010),进行或操作。
运算:bitop [op] [destkey(保存的新key)] key1 [key2…]
计数:bitcount key [start end]
op有:and or not xor
好处:原来需要上千万的key,现在只要一天一个key。
用处:用于信息状态统计

HyperLoglog
统计重复的数据数量
pfadd key element
pfcount key
pfmerge destkey key1 key2
说明:
基数统计,没有具体数据。
估算算法,数据值有一定误差;
误差范围:0.81%标准错误的进制值
耗空间极小,每个占用12K内存(上限)
pfadd时刚开始很小
pfmerge后,肯定是12K,无论之前多大(哪怕都是1byte)

GEO
添加标点:geoadd key longitude latitude member
获取:geopos key member
计算距离:geodist key member1 member2 [unit]
根据坐标找给定范围内的点:georadius key longitude latitude m|km|ft|mi
根据点找给定范围内的点:georadiusbymember key member radius m|km|ft|mi
获取指定点对应的坐标hash值:geohash key member
说明:
默认返回距离为米
只计算水平,不算高度
找附近的人多像这个

Redis使用场景
String类型应用场景
1、保存单个字符串或者JSON字符串数据
2、二进制安全的,所以可以把图片文件的内容作为字符串来存储
3、计数器:微博数,粉丝数。

Hash类型使用场景
适合存储对象,比存储在String中内存更少
每个hash可以存储2的32次方

List类型的使用场景
对数据量大的集合数据删减:列表数据显示、关注列表、留言评价、热点新闻
任务队列:左进右出,保证先后顺序

Set类型应用场景
唯一性:统计访问的IP、活跃用户等
集合操作:对不同的兴趣圈子取交集

Zset类型应用场景
排行榜

redis事务
redis事务的目的是一次执行多个命令。(事务中,不关心命令执行的成功或者失败)
1、事务中的命令序列化,然后按顺序执行
2、执行中不会被其他命令插入,不许加塞进行

命令
MULTI:标记一个事务的开始
EXEC:执行所有事务内的命令
DISCARD:取消事务,放弃执行事务块内的所有命令
WATCH key [key…]:监视一个或多个key,如果在事务执行之前这个(些)key被其他命令所改动,那么事务被打断
UNWATCH:取消WATCH命令对所有key的监视

错误处理:
执行命令时发生错误(比如:给字符串++),不会影响其他命令,出现错误依次往后执行,不会回滚。
命令出现报告错误(比如一堆乱七八糟的命令),执行时整个的所有队列都会被取消。

watch命令练习
例如:
watch a
multi
get a
incr a
exec(如果在事务过程中,a没有动,事务成功,如果a被改动,事务失败)

应用场景
一组命令必须同时执行,或者都不执行。
我们想要保证一组命令在执行的过程中不被其他命令插入。
如:秒杀手机
存入用户编号的key和移除手机编号的key,需要同时成功或失败

redis持久化
RDB:保存数据
1、save命令
注意:会造成长时间的阻塞
2、bgsave命令:
后台执行保存操作,不是立即执行
3、配置自动执行save second changes
范例:
save 900 1
save 300 10
save 1 10000
优点:数据少;恢复快
缺点:
1)会丢数据
2)bgsave需要子线程,牺牲性能
3)不同版本,数据不兼容

AOF:保存命令
三种策略:
1)always:每次写入,都同步到AOF文件
2)exeryses:每秒存储一次(建议及默认)
3)no:系统控制
优化:重写:bgrewriteof
超时的数据不再写入文件
忽略无效指令(例如set只保留最后一条)
合并指令

主从复制是三个阶段:建立连接阶段、数据同步阶段、命令传播阶段

1、主从连接
1)slave:发送指令:slaveof ip port
2)master:接受指令,相应对方。
3)salve:保存master的ip和端口 masterhost、masterport
4)salve:根据保存的信息创建连接master的scoket
5)salve:周期性发生命令ping
6)master:相应pong
7)salve:auth password
8)master:验证授权
9)salve:发送指令:replconf listening-port
10)master:保存slave的端口
简述:
1)设置master的地址和端口,保存master信息;
2)建立socket连接;
3)发送ping命令(定时任务);
4)身份验证;
5)发送slave端口信息
最后状态:salve处有master的地址和端口,master保留salve的端口
断开指令salve:slave no one

2、数据同步
1)在slave初次连接master后,复制master中的所有数据到slave
2)将slave的数据库状态更新成master当前的数据库状态
过程
1)slave:发送指令:psync2
2)master:执行bgsave
3)master:第一个slave连接时,创建命令缓存区
4)master:生成RDB文件,通过socket发送给slave
5)slave:接受RDB,情况数据,执行RDB文件恢复过程
6)slave:发送命令告知RDB恢复已经完成
7)master:发送复制缓冲区信息
8)slave:接受信息,执行bgrewriteaof,恢复数据
简述:
1)请求同步数据
2)创建RDB同步数据
3)恢复RDB同步数据
4)请求部分同步数据
5)恢复部分同步数据
最后状态:salve处有master全部数据,包括RDB过程接受的数据
master:保存slave当前数据同步的位置
注意:
master
1)如果master数据量巨大,数据同步阶段应避开流量高峰期,避免造成master阻塞,影响业务正常执行
2)复制缓冲区大小设定不合理,会导致数据溢出。如进行全量复制周期太长,进行部分复制时发现数据已经存在丢失的情况,必须进行第二次全量复制,致使slave陷入死循环状态。
3)master单机内存占用主机内存的比例不应该过大,建议使用50-70%的内存,30-50%的内存用于执行bgsave命令和创建复制缓冲区
slave:
1)为避免slave进行全量复制、部分复制时服务器响应阻塞或数据不同步,建议关闭此期间的对外服务
slave-serve-stale-data yes|no
2)数据同步阶段,master发送给slave信息可以理解成master是slave的一个客户端,主动向slave发送命令
3)多个slave同时对master请求同步时,会对宽带造成巨大冲击,适量错峰
4)salve过多时,建议调整拓扑结构,由一主多从,变成树状结构。延迟性较大

3、命令传播阶段
1)当master数据库状态修改后,导致主从服务器数据库状态不一致,此时需要让主从数据同步到一致的状态,同步的动作称为命令传播
2)master将收到的数据变更命令发送给slave,slave接收命令后执行命令。

命令传播阶段的部分复制
复制缓冲区
概念:先进先出的队列,保存执行过的命令;默认1M,数据过大,先进的弹出
作用:部分复制
组成:1)偏移量;2)字节值
工作原理:
1)通过offset区别不同的slave当前数据传播的差异
2)master记录已发送信息对应的offset
2)slave记录已接收信息对应的offset
如果offset不满足,执行全量复制

总述:
建立连接之后,先全量复制,在部分复制,部分复制时,数据保存在复制缓冲区,用offset记录上次获取数据的位置,如果找不到offset,说明数据已经被挤掉,进行全量复制。
缓冲区保存的是修改命令。
master也要保要执行slave的心跳。

哨兵机制
作用:监控、通知、故障自助转移
注意:哨兵也是Redis服务
哨兵数目是单数

一:半数哨兵发现断了,那就是master断了
二:哨兵投票选出一个哨兵类解决这个问题。
选择master
1、在线的
2、相应快的
3、与master断开时间近的
4、优先原则:1)优先级2)offset3)runid
三:新master上任,其他salve连新master

redis集群
流程:现在一个key带着value来到了redis集群,它不知自己该去哪?
1)进行CRC16(key)计算,具体是怎么算的,不知道,就当是hash计算吧。
2)然后对计算出来的值取模,%16384(2的16次方),获得一个数字k
3)它现在知道了,自己的槽是第k个,它随机进了一个redis。
4)这个redis恰好有编号是k的槽,很开心,它保存数据。
5)不开心,这个redis没有k的槽,不过没关系,这台redis保留了所有槽在哪个redis上
6)这个key带着数据开开心心去了指定的redis,找到具体的槽,保存下来了。
总结:这就很好理解,为什么集群最多16364个redis服务了,最小的区域就是槽
那扩容也比较简单了,每个服务自己分一点槽出来,去新的服务。

缓存雪崩处理
道:
页面静态化处理
多级缓存
对数据库优化
灾难预警(监控内存、cpu等)
限流、降级

术:
redis解决方法:
删除key机制切换
过期时间错峰,分类+随机时间
超热数据永久key
定期维护,根据访问量判断是否延期
加锁(慎用)

缓存击穿处理(某一个key过期,访问量过大)
术:
预先设定:对主打信息延长过期时间
现场调整:监控访问量,对激增的数据延长过期时间或设置为永久key
后台刷新数据:启动定时任务,高峰期来临之前,刷新数据有效期
二级缓存:设置不同有效期,不一起淘汰
加锁:慎重

缓存穿透处理(缓存未命中)
缓存null:设定短周期,30-60s
白名单策略:1)对所有的id进行bitmaps,每次都判断;2)保存布隆过滤器。
实时监控:
key加密:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值