1.Redis数据类型

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

 

2.什么是热key?热key问题如何解决?

热key问题就是,突然有几十万的请求去访问redis上的某个特定key,那么这样会造成流量过于集中,达到物理网卡上限,从而导致这台redis的服务器宕机引发雪崩。

redis cluster热分片 redis热key怎么处理_Redis

针对热key的解决方案:

1.提前把热key打散到不同的服务器,降低压力

2.加入二级缓存,提前加载热key数据到内存中,如果redis宕机,走内存查询

 

3.Redis的过期策略有哪些?

1)惰性删除

惰性删除指的是当我们查询key的时候才对key进行检测,如果已经达到过期时间,则删除。显然,他有一个缺点就是如果这些过期的key没有被访问,那么他就一直无法被删除,而且一直占用内存。

redis cluster热分片 redis热key怎么处理_Redis_02

2)定期删除

定期删除指的是redis每隔一段时间对数据库做一次检查,删除里面的过期key。由于不可能对所有key去做轮询来删除,所以redis会每次随机取一些key去做检查和删除。

 

如果惰性+定期都没有删除过期的key怎么办?

假设redis每次定期随机查询key的时候没有删掉,这些key也没有做查询的话,就会导致这些key一直保存在redis里面无法被删除,这时候就会走到redis的内存淘汰机制。

  1. volatile-lru:从已设置过期时间的key中,移出最近最少使用的key进行淘汰
  2. volatile-ttl:从已设置过期时间的key中,移出将要过期的key
  3. volatile-random:从已设置过期时间的key中随机选择key淘汰
  4. allkeys-lru:从key中选择最近最少使用的进行淘汰
  5. allkeys-random:从key中随机选择key进行淘汰
  6. noeviction:当内存达到阈值的时候,新写入操作报错

 

4.Redis的事务机制

redis通过MULTI、EXEC、WATCH等命令来实现事务机制,事务执行过程将一系列多个命令按照顺序一次性执行,并且在执行期间,事务不会被中断,也不会去执行客户端的其他请求,直到所有命令执行完毕。事务的执行过程如下:

  1. 服务端收到客户端请求,事务以MULTI开始
  2. 如果客户端正处于事务状态,则会把事务放入队列同时返回给客户端QUEUED,反之则直接执行这个命令
  3. 当收到客户端EXEC命令时,WATCH命令监视整个事务中的key是否有被修改,如果有则返回空回复到客户端表示失败,否则redis会遍历整个事务队列,执行队列中保存的所有命令,最后返回结果给客户端

WATCH的机制本身是一个CAS的机制,被监视的key会被保存到一个链表中,如果某个key被修改,那么REDIS_DIRTY_CAS标志将会被打开,这时服务器会拒绝执行事务。

 

5.Redis哨兵机制的原理

通过sentinel模式启动Redis后,自动监控master的运行状态,基本原理是:心跳机制+投票裁决

每个sentinel会向其它sentinal、master定时发送消息,以确认对方是否活着,如果发现对方在指定时间内未回应,则暂时认为对方宕机

若哨兵群中的多数sentinel都报告某一master没响应,系统才认为该master真正宕机,通过Raft投票算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置

 

6.Redis主从复制原理

全量同步:

Redis全量复制一般发生在Slave初始化阶段,即slave连接master的时候。这时Slave需要将Master上的所有数据都复制一份。具体步骤如下:

1)slave连接master,发送SYNC命令;

2)master接收到SYNC命名后,开始执行bgsave命令生成rdb文件,并使用缓冲区记录此后执行的所有写命令;

3)master执行完bgsave后,向所有slave发送快照文件,并在发送期间继续记录被执行的写命令;

4)slave收到快照文件后丢弃所有旧数据,载入收到的快照;

5)master快照发送完毕后开始向slave发送缓冲区中的写命令;

6)slave完成对快照的载入,开始接收命令请求,并执行来自master缓冲区的写命令;

增量同步:

Redis增量复制是指Slave初始化后开始正常工作时master发生的写操作同步到从服务器的过程。

增量复制的过程主要是主服务器每执行一个写命令就会向从服务器发送相同的写命令,从服务器接收并执行收到的写命令

 

Redis主从同步策略:

主从刚刚连接的时候,进行全量同步;全同步结束后,进行增量同步。当然,如果有需要,slave 在任何时候都可以发起全量同步。redis 策略是,无论如何,首先会尝试进行增量同步,如不成功,要求从机进行全量同步

 

save和bgSave的区别:

SAVE 和 BGSAVE 两个命令都会调用 rdbSave 函数,但它们调用的方式各有不同:

  • SAVE 直接调用 rdbSave ,阻塞 Redis 主进程,直到保存完成为止。在主进程阻塞期间,服务器不能处理客户端的任何请求。
  • BGSAVE 则 fork 出一个子进程,子进程负责调用 rdbSave ,并在保存完成之后向主进程发送信号,通知保存已完成。 Redis 服务器在BGSAVE 执行期间仍然可以继续处理客户端的请求。