redis的基本类型:string ,list ,set,zset,hash
redis为何这么快:基于内存实现,单线程(不需要各种锁的性能消耗,单线程多进程集群方案)
缓存穿透:数据在缓存数据库中不存在(解决:设置空值但是要有过期时间
缓存雪崩:同一时间大量的的key过期 解决:设置过期时间要随机分散,如果是某一热点的key可以不过期
缓存击穿:访问的数据在缓存中不存在并且有好多请求会直接访问数据库 解决:互斥锁,熔断降级或者是热点信息不过期
如何保证redis的高可用?
redis通过主从加集群架构,实现读写分离,主节点负责写,从节点负责读,主从同步从而实现高并发
redis如何保证原子性?
redis本身是单线程,所以提供的api也是原子操作
使用incr,decr,setnx,加锁
redis的过期策略?
通过惰性删除策略加定期删除策略
解释下这两种策略?
定期删除:是指redis默认以每隔100ms会随机抽取一些设置过期时间的key,检查key是否过期,如果过期就会删除,但有可能有的一些key没有被删除,然后使用惰性删除
惰性删除:是指你查询的key是否过期,如果过期就什么都不给你返回,然后将key删除,如果这种方法还是会有大量的过期key就会走内存淘汰机制
内存淘汰机制:
lru:当内存不足的时候,就会删除最少使用的key
lfu:当内存不足的时候,就会删除使用频率最低的数据淘汰
ttl:挑选将要过期的数据进行淘汰
randow:随机淘汰
不做任何处理:内存满了就会oom
redis有哪些持久化机制
rdb:是redis默认开启的持久化机制,它是根据设置的保存时间,每隔一段时间就会写入数据,默认的文件名是dump.rdb
支持同步,异步,自动配置三种方式
aof:是每执行一次命令就会往文件中写入数据,随着时间的推移就会导致数据量越来越大,然后redis为了解决这一情况,提供了bgrewriteaof命令作用是fork出一条新的进程然后以命令的形式写入到临时文件,完成对aof的重写
支持每修改同步,每秒同步,从不同步
从恢复速度来看aof要弱于rbd,从数据的完整性来看aof要比rdb强
不问的话不要说这个:这两个可以混合使用,redis重启的时候先执行加载rdb文件内容,然后再重放增量aof日志就可以完全代替之前aof的全量文件重放,提高了效率
集群问题:(难点)
redis集群搭建有几种模式:
主从集群模式:redis的主从模式可以一主多从,一主一从,同步的类型可以全量同步和增量同步,主要是实现了读写分离,主节点负责写,从节点负责读,如果主节点挂 了,需要手动切换,在线扩容复杂
sentinel哨兵模式:可以进行对master节点进行监控,如果master节点挂掉,sentinel就会在其他的salve中选举机制中投出一个master节点,选中后将从节点转为主节点然后其他从节点连接新的master.但是扩容还是复杂
cluster集群模式:sentinel每台机器上都储存相同的数据,很浪费资源然后实现分布式储存
主从集群模式中全量和增量复制的实现?
全量同步:一把发生在slave初始阶段,这时salve将全量复制master上的数据具体是:
slave连接master节点,发送sync命令;
master节点收到命令执行bgsave命令生成rdb文件,并使用缓冲区来记录此后执行的命令;
master执行完bgsave命令后,想所有的slave发送快照文件,并在此过程中继续记录执行的写命令;
savle收到快照文件后,丢弃所有的旧数据加载新的数据;
master快照执行完之后就会向salve发送缓冲区中的内容;
slave完成快照后并开始接收命令请求,执行master发来的缓冲区的命令;
slave完成这一系列操作后就开始接收用户的读请求;
增量同步:
主要是全量同步完成之后,主要是master节点没执行一个命令就会向salve发送相同的命令,salve接收执行命令,从而保持主从一致
哨兵模式的是怎么实现的或者原理?
哨兵主要是监控,提醒以及故障转移
每隔哨兵会向其他哨兵。msater.slave定时发送消息,以确保对方是否还存活,如果发现对方在配置的指定时间内为响应,则暂时认为对方已挂
若“哨兵群”中的多数 sentinel 都报告某一 master 没响应,系统才认为该 master “彻底死亡”,通过一定的 vote 算法从剩下的 slave 节点中选一台提升为 master,然后自动修改相关配置。
5、哨兵模式故障迁移流程?
1)首先是从主服务器的从服务器中选出一个从服务器作为新的主服务器。
选点的依据依次是:
网络连接正常 -> 5 秒内回复过 INFO 命令 -> 10*down-after-milliseconds 内与主连接过的 -> 从服务器优先级 -> 复制偏移量 -> 运行id较小的。
2)选出之后通过 slaveif no ont 将该从服务器升为新主服务器;
3)然后再通过 slaveof ip port 命令让其他从服务器复制该信主服务器。
缺点
主从服务器的数据要经常进行主从复制,这样会造成性能下降
当主服务器宕机后,从服务器切换成主服务器的那段时间,服务是不可用的
redis分布式锁
redisd的内存满了几种解决情况?
1.可以在redis.conf文件中调整配置参数的大小
2.过期策略:定期删除加惰性删除
3.内存淘汰策略:lru,lfu,ttl,radom,no
4.有两个命令可以使rdb和aof不会保存过期数据rewriteaof,bgre