Redis 的支持数据类型?
string、hash、list(实现消息队列)、set(利用唯一性)、zset(可以进行排序 )
redis的持久化机制
- RDB 持久化可以在指定的时间间隔类生成的数据集持久化到磁盘。RDB是通过fork子进程来协助完成数据持久化工作的。数据安·全性低,RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候) 。
- AOF文件存储的方式:将每一个收到的写命令都通过write函数追加到文件中。是日志形式,当数据写入内存中的时候,在日志文件下记录下所有写操作。
- RDB的效率高于AOF,AOF文件比RDB更新频率高,优先使用AOF还原数据;AOF比RDB更安全也更大。如果两个都配了优先加载AOF。
redis淘汰策略
- 从已设置过期时间的数据集里面挑选最少使用的数据淘汰
- 从已设置过期时间的数据集里面挑选最近快要过期的数据进行淘汰
- 从所有的数据集里面挑选最少使用的数据进行淘汰。
redis哨兵的工作机制
- 主观下线,每个哨兵进程以每秒一次的频率向整个集群中的master主服务器,Slave从服务器以及其他哨兵进程发送一个PING命令,如果一个实例最后一次回复PING命令的时间超过一个指定的值,那么这个实例就被标记为主观下线状态。
- 客观下线:当有半数以上的哨兵进程在指定的时间范围内确认主服务器进入了主观下线状态,则主服务器会被标记为客观下线。如果没有足够数量的哨兵同意主服务器下线,主服务器的客观下线状态就会被移除。若主服务器重新向哨兵进程发送PING命令返回有效回复,主服务器的主观下线状态就会被移除。
- 哨兵的优点:可以自动切换主从服务器,系统的可用性更高;读写分离,分担了读取数据的压力;数据备份,防止数据丢失。
如何保证缓存和数据库的双写一致性?
采用延时双删的策略。
- 先删除缓存;
- 再写数据库;
- 休眠500毫秒;
- 再次删除缓存
缓存穿透
缓存和数据库中都没有数据,此时用户发起请求,需要去数据库查询数据,如果大量的请求在同一时间获取该key的数据,会导致服务器的压力过大。
解决方案:
- 将不存在的key也存入到redis缓存中, value为空集合,后续的请求就不会访问数据库,而是到缓存中去获取数据。
- 布隆过滤器:用于检索一个元素是否存在于一个集合中。优点是:效率高,缺点是:存在一定的误识别和删除困难。
缓存击穿
缓存中没有数据,但是数据库中有数据(缓存中的数据刚刚过期),此时大量的请求同时访问该key,所有的请求都会到达数据库,导致数据库的压力过大。
解决方案: - 设置热点数据永不过期
- 从数据库中获取可以的操作,进行上锁,其他线程重试。
缓存雪崩
缓存中的数据在同一时间大批量的过期,此时也会造成大量的并发请求到达数据库,造成数据库压力过大。
解决方案: - 设置热点数据永不过期
- 设置缓存中的数据随机过期时间
rabbitMQ执行的原理
- 生产者和消息队列创建连接
- 创建通道
- 创建交换机
- 交换机将消息发送至不同的队列
- 消费者和消息队列建立连接
- 建立通道
- 去对应的队列中获取消息
RabbitMQ什么情况下会出现消息丢失,如何解决