redis总结

redis 总结
1.redis是单线程吗
Redis 的单线程主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,
这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,
比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
2.redis既然是单线程,为什么还可以运行的很快
因为它所有的数据都在内存中,所有的运算都是内存级别的运算,
而且单线程避免了多线程的切换性能损耗问题。
正因为 Redis 是单线程,所以要小心使用 Redis 指令,
对于那些耗时的指令(比如keys),一定要谨慎使用,一不小心就可能会导致 Redis 卡顿。
3.Redis 单线程如何处理那么多的并发客户端连接?

redis利用了epoll来实现IO的多路复用,将连接的信息和事件放在队列中,再依次放在文件事务分派器中,事务分派器会将会将事件发送给事务处理器。

4.redis持久化
redis持久化的方式有两种
1.RDB快照

在默认情况下,Redis将内存数据库快照保存在文件名称为dump.rdb的二进制文件中,也可以设置在固定的时间内至少有多少次的改动,内存数据库快照保存一次。
也可以手动输入指令保存数据集,指令save或者bgsave,每次执行指令都会新生成一个以.rdb结尾的文件,并将原有的文件覆盖。

注意:bgsave在数据库快照时依旧可以正常处理写指令
优点:

适合大规模的使用,恢复的速度快。

缺点:

一旦宕机,那么服务器将丢失最近写入、且未保存在快照中的数据。

2.AOF

将修改的每一句指令记录在appendonly.aof文件中,当redis重启时,程序通过执行AOF文件中的指令达到数据重构的效果。
可以配置多久同步磁盘

appendfsync always:每次有新的指令追加AOF文件就同步一次,非常慢相对也非常的安全
appendfsync everysec:每秒同步一次,即便宕机也丢失的是那一秒的数据
appendfsync no:将数据交给操作系统来处理,更快,但不安全
3.混合持久化
  1. 上述两种方式各有优劣,重启Redis,若选择RDB则会面临数据大量丢失,若选择AOF性能较与RDB而言会慢许多,为解决该问题,出现了混合持久化。

  2. 混合持久化,在AOF重写时,不单单是将内存数据转化成指令写入到AOP文件中,它是将重写这一刻前的数据进行RDB快照处理,并将快照内容和增量的AOF指令存在一起,写入到新的AOF文件中,新AOF文件一开始并不以.aof命名,待重写完新的AOF文件才会改名同时覆盖原有的文件。于是在Redis重启时,先加载RDB的内容,后重放AOF增量就可以完全替代之前的AOF全量文件重放。效率大大提高。

4.主从复制

当给master配置了一个save ,不管从库是否第一次连接主库,他都会发送PSYNC给master,当master接收的PSYNC命令,会在后台进行数据持久化,通过bgsave指令,生成最新的rdb快照文件,再此期间,主库可以正常接收客户端的请求,它会把这些可能会修改数据集的请求暂缓在内存中,当持久化完毕后,主库会将最新的快照文件发送给存库,从库将接收的数据进行持久化,后加载到内存中。主库再将 之前暂缓的指令发送给存库。

你可能感兴趣的:(redis,数据库,缓存)