1.Redis是什么?

image.png
redis是一种非关系型数据库,数据以形式存储在内存中,因此查询速度比较快。支持5种数据结构

  • string 常规的字符串类型
  • list 有序可重复
  • set 无序不重复
  • hash value以键值对的形式存储
  • zset 有序不重复

    2.Redis是否支持事务,请介绍?

    redis是支持事务的,但只能是简单事务,没有回滚机制,如果事务中有执行错误的语句,事务提交后,正确的语句会执行而不会回滚。
    redis事务执行命令:
    #开启事务 multi
    #执行命令
    #提交事务 exec
    #取消事务 discard

    3.Redis的持久化?

    因为redis的数据是存在内存中的,一旦程序关闭,会出现数据的丢失。为解决这个问题,redis提供了2种持久化方案,RDB 和AOF。
    RDB:
    RDB是Redis默认的持久化方案,是基于快照的思想,将内存中的数据以快照的方式生成二进制文件存储到硬盘中。可以自动触发和手动开启
    image.png
    自动触发:修改配置文件的参数 save 30 100 此设置为 30秒内数据有100次操作变化就会触发保存机制。
    手动触发:save 命令 和 bgsave 命令 (save 为同步处理,会阻塞redis;bgsave 是复制一个和主线程一样的子线程进行保存操作)
    AOF:
    与RDB直接备份数据不同,AOF是将每次的写操作进行备份,默认的备份文件为appendonly.aof。AOF需要手动开启。
    image.png
    手动开启:1.将配置文件redis.conf中的appendonly no 改为appendonly yes;
    2.设置备份文件名 appendfilename appendonly.aof;
    3.修改触发方式appendfsync属性,有三种 always、eyerysec、no。
    默认的触发机制为eyerysec,每秒存储一次。always为每条操作后就存储,no为每30秒存储操作一次。
    RDB与AOF差异点:

  • RDB默认开启,AOF需手动开启;

  • RDB性能优于AOF;
  • AOF安全性优于RDB;
  • AOF优先级高于RDB;
  • RDB存储某个时刻的数据快照,AOF存储写命令;
  • RDB在配置触发状态会丢失最后一次快照以后更改的所有数据,AOF默认使用everysec,每秒保存一次,最多丢失两秒以内的数据;
  • 实际开发中,建议2种都开启。

    4.Redis的高可用?

    虽然redis持久化能够保证数据的安全性,但如果服务器发生宕机,数据一样会丢失。要解决这个问题,就要考虑使用搭建集群来保证数据的安全。目前常用的有3种方案,主从复制、哨兵模式、分片集群。
    主从复制:
    image.png
    一主多从,将master上的数据备份到多个slave中。master负责写操作,slave负责读操作,实现读写分离,即保证了数据安全又缓解了主服务器访问压力。若master发生宕机,可手动将slave设置为主节点,slaveof no one。
    哨兵模式:
    image.png
    由于主从复制方案中主节点宕机需要手动处理,为达到自动进行切换,增加哨兵进行监控处理。如图所示,3个哨兵会对主库进行监控,哨兵之间也会进行通信,当有一半哨兵主观判断主库发生问题下线后,会形成客观判断主库宕机,此时会触发新主库切换操作。若后面旧主库重新上线,或作为新主库的从库使用。
    分片集群:
    image.png
    哨兵模式虽然解决了高可用问题,但是主库与从库的数据是一样的,加上哨兵的服务加因此搭建成本比较高。而分片集群在高可用的基础上能够存储更多的数据。
    hash槽,16843个,会平均分配到每个master主库,一份数据会经过CRC16算法得出相应的hash槽值,再存储到相应的分片,这是一种去中心化存储的思想。每个分片又是一个哨兵模式。能很好解决数据的高可用与水平扩展。

    5.Redis的key过期删除策略?

  • 定时删除:使用较少

  • 惰性删除: 当使用时才判断是否过期,是否要删除,对CPU友好但对内存不友好。

image.png

  • 定期删除: 默认每秒10次(可修改,但最好不要超过100)进行扫描,取出20个key判断是否过期,若过期删除后判断数量是否超过25%,超过会重新扫描,若未超过则等待下次扫描。

    image.png

    6.Redis的内存淘汰机制?

    image.png
    redis默认的是noevction模式,即如果内存已满,不删除原有数据,直接返回错误信息,可以跟更改配置文件修改淘汰策略。