1、Redis单线程为什么这么快?
    答:1)是在内存中进行操作的;
    2)redis的数据结构简单,没有复杂的各种表结构
    3)采用的是单线程,避免了多线程的频繁上下文切换带来的问题,并且是基于多路复用IO。
    2、redis的持久化机制?
    答:1)RDB方式:将某一个时刻的内存数据,就是快照,写入到磁盘中。
    手动触发:bgsave,会创建一个子进程去进行持久化。
    自动触发:save m n,表示m秒内有n个key发生了变化就用bgsave进行一次持久化。
    缺点是无法做到实时持久化,数据库故障可能会丢失数据;会复制一个子进程来处理消耗一些资源。
    AOF方式:用日志的方式来记录每次操作的过程,记录的是数据产生的过程。每次重启会加载aof文件进行数据恢复。所有写命令都会加到aof缓冲区,根据同步策略将缓冲区中命令写到文件中。
    同步策略有每次写命令都同步,每秒同步,还有种是操作系统来同步。
    缺点:文件大,恢复速度慢。
    3、过期键的删除策略?
    答:定时删除:当key到了时间就立即给他清除掉,这样对cpu压力很大。
    惰性删除:当一个key过期后不会立即对他清除,当再次获取他的时候才对他进行删除。
    定期删除:在每秒中有固定的时间去对到期的数据进行删除,会从数据库中的expires区随机选择W个数据,若删除的key大于0.25W,就继续重复操作,如果删除的key小于0.25key就继续轮询下一个数据库。
    4、redis分布式锁底层是如何实现的?
    答:用setnx实现,如果key不存在才能获取到锁,如果key存在就获取不到。在操作完将这个锁给删除掉。如果中途发生宕机,还可以给锁加个过期时间,如果时间过了就强行给释放掉这个锁。
    5、redis和mysql是如何保证数据一致的?
    答:1)先更新mysql,再更新redis;万一redis更新失败,数据还是不一样。
    2)先删除redis缓存数据,再更新mysql,当再次查询的时候将数据添加到缓存中,这种方案在高并发下性能低,如果线程1删除了redis缓存再更新mysql,此时另一个线程查询,会把老数据加载到redis中,还是出现数据不一致的问题。
    3)延时双删,先删除redis缓存,再更新mysql,延迟几百毫秒后再删除redis缓存,这样确保了更新完mysql数据之后清除redis缓存,再查询数据会保持一致。