网站建设整改落实情况,网站后台文章编辑不了,美橙互联网站备案,百度收录提交申请1、说一说你在项目中的redis的应用场景#xff1f;
需要频繁查询的数据#xff0c;分布式锁#xff0c;spring session
5大value类型#xff1a;string hash list set zset基本上就是缓存为的是服务无状态#xff0c;延申思考#xff0c;看你的项目有哪些数据结构或对象…1、说一说你在项目中的redis的应用场景
需要频繁查询的数据分布式锁spring session
5大value类型string hash list set zset基本上就是缓存为的是服务无状态延申思考看你的项目有哪些数据结构或对象在单机里需要单机锁在多机需要分布式锁抽出来放入redis里面无锁化
2、redis是单线程还是多线程
redis不同版本之间采用的线程模型是不一样的在redis4.0版本之前使用的是单线程模型在4.0版本之后 增加了多线程的支持。在4.0之前虽然我们说redis是单线程也只是说它的网络I/O线程以及Set和Get操作是由一个线程完成的。但是redis的持久化、集群同步还是使用其他线程来完成。4.0之后添加了多线程的支持主要体现在大数据的异步删除功能上例如unlink key、flushdb async、flushall async等
3、为什么Redis在4.0之前会选择使用单线程而且使用单线程还那么快
为什么选择使用单线程呢个人觉得主要是使用简单不存在锁竞争可以在无锁的情况下完成所有操作不存在死锁和线程切换带来的性能和时间上的开销但同时单线程也不能完全发挥出多核CPU的性能。 至于为什么单线程那么快我觉得主要有以下几个原因
redis的大部分操作都在内存中完成内存中的执行效率本身就很快并且采用了高效的数据结构比如哈希表和跳表。使用单线程避免了多线程的竞争省去了多线程切换带来的时间和性能开销并且不会出现死锁。采用I/O多路复用机制处理大量客户端的Socket请求因为这是基于非阻塞的I/O模型这就让redis可以高效地进行网络通信I/O的读写流程也不再阻塞。
4、Redis是如何实现数据不丢失的呢
redis数据是存储在内存中的为了包装数据不丢失那就要把数据从内存存储到磁盘上以便在服务器重启后还能够从磁盘中恢复原有数据这就是redis的数据持久化。redis数据持久化有三种方式。
AOF 日志Append Only File文件追加方式记录所有的操作命令并以文本的形式追加到文件中。RDB 快照Redis DataBase将某一个时刻的内存数据以二进制的方式写入磁盘。混合持久化方式Redis 4.0 新增了混合持久化的方式集成了 RDB 和 AOF 的优点。
5、 AOF和 RDB的实现原理
AOF采用的是写后日志的方式Redis先执行命令把数据写入内存然后再记录日志到文件中。AOF日志记录的是操作命令不是实际的数据如果采用AOF方法做故障恢复时需要将全量日志都执行一遍。 RDB采用的是内存快照的方式它记录的是某一时刻的数据而不是操作所以采用RDB方法做故障恢复时只需要直接把RDB文件读入内存即可实现快速恢复。
6、我们平常使用的MySQL采用的是“写前日志”为什么AOF要采用写后日志的方式呢
这个主要是由于redis在写入日志之前不对命令进行语法检查所以只记录执行成功的命令避免出现错误命令的情况而且在命令执行后再写日志不会阻塞当前的写操作。
7、那后写日志又有什么风险呢
数据可能丢失如果redis刚执行完成命令此时发生故障宕机会导致此条命令存在丢失的风险。可能阻塞其他的操作APF日志其实也是在主线程中执行所以当redis把日志写入到磁盘文件中的时候还是会阻塞后续的操作无法执行。
8、RDB做快照时会阻塞线程吗
redis提供了两个命令来生成RDB快照文件分别是save和bgsave。save命令在主线程中执行会导致阻塞。而bgsave命令则会创建一个子进程用于写入RDB文件的操作避免了对主线程的阻塞这也是redis RDB的默认配置。
9、RDB做快照的时候数据能修改吗
save是同步的会阻塞客户端命令bgsave的时候是可以修改的。
10、那redis是怎么解决在bgsave做快照的时候允许数据修改呢
这里主要是利用bgsave的子线程实现的具体操作如下
如果主线程执行读操作则主线程和bgsave子进程互相不影响如果主线程执行写操作则被修改的数据会复制一份副本然后bgsave子进程会把该副本数据写入RDB文件在这个过程中主线程仍然可以修改原来的数据
11、Redis如何实现高可用吧
Redis实现高可用主要有三种方式主从复制、哨兵模式以及 Redis 集群。
主从复制 将从前的一台 Redis 服务器同步数据到多台从 Redis 服务器上即一主多从的模式这个跟MySQL主从复制的原理一样。 哨兵模式 使用 Redis 主从服务的时候会有一个问题就是当 Redis 的主从服务器出现故障宕机时需要手动进行恢复为了解决这个问题Redis 增加了哨兵模式因为哨兵模式做到了可以监控主从服务器并且提供自动容灾恢复的功能。 Redis Cluster集群 Redis Cluster 是一种分布式去中心化的运行模式是在 Redis 3.0 版本中推出的 Redis 集群方案它将数据分布在不同的服务器上以此来降低系统对单主节点的依赖从而提高 Redis 服务的读写性能。
12、使用哨兵模式在数据上有副本数据做保证在可用性上又有哨兵监控一旦master宕机会选举salve节点为master节点这种已经满足了我们的生产环境需要那为什么还需要使用集群模式呢
哨兵模式归根结底还是主从模式在主从模式下我们可以通过增加salve节点来扩展读并发能力但是没办法扩展写能力和存储能力存储能力只能是master节点能够承载的上限。所以为了扩展写能力和存储能力我们就需要引入集群模式。
13、集群中那么多Master节点redis cluster在存储的时候如何确定选择哪个节点呢
Redis Cluster采用的是类一致性哈希算法实现节点选择的Redis Cluster将自己分成了16384个Slot槽位哈希槽类似于数据分区每个键值对都会根据它的 key被映射到一个哈希槽中具体执行过程分为两大步。
根据键值对的 key按照 CRC16 算法计算一个 16 bit 的值。再用 16bit 值对 16384 取模得到 0~16383 范围内的模数每个模数代表一个相应编号的哈希槽。
每个Redis节点负责处理一部分槽位假如你有三个master节点 ABC每个节点负责的槽位如下
redis节点负责的槽位节点10-5460节点25461-10921节点310922-16383
这样就实现了cluster节点的选择。