概览Redis篇二:AOF日志

极客时间《Redis 核心技术与实战》学习笔记 概览Redis篇一:单线程模型 概览Redis篇二:AOF日志 概览Redis篇三:RDB快照 概览Redis篇四:主从 概览Redis篇五:哨兵 概览Redis篇六:切片集群 AOF: Append Only File AOF日志的WAL 数据库中的WAL是Write-Ahead Logging, 为先写日志后执行。而Redis中的WAL为Write Ahead Log,先执行后写日志。 为了避免额外的开销,Redis在向AOF里面记录日志时,不回去对这些命令进行语法检查,因此,如果先记录日志再执行命令的话,日志中有可能记录了错误的命令,Redis在使用日志恢复数据时,就可能会出错。 AOF日志中记录了什么内容 有如下命令: set testkey testvalue 则AOF日志内容为: *3 $3 set $7 testkey $9 testvalue 其中“*3”表示当前命令有3个部分,每部分都由“$+数字”开头,后面紧跟具体的命令、键或值。 AOF的潜在风险 AOF使用先执行,再写日志的方式,这样可以避免记录错误的命令,同时不会阻塞当前的写操作。 但这样也带来了一些潜在风险: 刚执行完一个命令,没来得及记日志就宕机了,这个命令和相应的数据就有丢失的风险。 AOF避免了对当前命令的阻塞,但AOF写日志是在主线程中执行的,可能会给下一个操作带来阻塞风险。 这就需要我们对AOF写日志的实际进行把控。 AOF的三种写回策略 Always,同步写回:每个写命令执行完,立马同步地将日志写回磁盘; Everysec,每秒写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,每隔一秒把缓冲区中的内容写入磁盘; No,操作系统控制的写回:每个写命令执行完,只是先把日志写到 AOF 文件的内存缓冲区,由操作系统决定何时将缓冲区内容写回磁盘。 针对避免主线程阻塞和减少数据丢失问题,这三种写回策略都无法做到两全其美。原因如下: “同步写回”可以做到基本不丢数据,但是它在每一个写命令后都有一个慢速的落盘操作,不可避免地会影响主线程性能; 虽然“操作系统控制的写回”在写完缓冲区后,就可以继续执行后续的命令,但是落盘的时机已经不在 Redis 手中了,只要 AOF 记录没有写回磁盘,一旦宕机对应的数据就丢失了; “每秒写回”采用一秒写回一次的频率,避免了“同步写回”的性能开销,虽然减少了对系统性能的影响,但是如果发生宕机,上一秒内未落盘的命令操作仍然会丢失。所以,这只能算是,在避免影响主线程性能和避免数据丢失两者间取了个折中。 总结一下:...

July 18, 2022 · 1 min · 李昌

概览Redis篇一:单线程模型

极客时间《Redis 核心技术与实战》学习笔记 概览Redis篇一:单线程模型 概览Redis篇二:AOF日志 概览Redis篇三:RDB快照 概览Redis篇四:主从 概览Redis篇五:哨兵 概览Redis篇六:切片集群 Redis单线程模型 Redis 是单线程,主要是指 Redis 的网络 IO 和键值对读写是由一个线程来完成的,这也是 Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。 为什么Redis采用单线程 通常的程序设计都采用多线程来提高性能,获得更快的响应速度。 但采用多线程模型将不可避免地面对以下问题: 多个线程对同一资源的数据竞争 因解决数据竞争而导致的性能损耗 增加系统复杂度,降低系统代码的易调试性和可维护性 为啥Redis单线程还这么快 主要是两点: Redis大部分操作在内存上完成,并采用了高效的数据结构 Redis采用了多路复用机制

July 9, 2022 · 1 min · 李昌

Ubuntu18(WSL2)安装redis

1. 安装并对redis进行配置 更新源并安装redis sudo apt-get update sudo apt-get install redis-server 将redis设置为systemctl sudo vim /etc/redis/redis.conf 找到supervised选项,设置为systemd # If you run Redis from upstart or systemd, Redis can interact with your # supervision tree. Options: # supervised no - no supervision interaction # supervised upstart - signal upstart by putting Redis into SIGSTOP mode # supervised systemd - signal systemd by writing READY=1 to $NOTIFY_SOCKET # supervised auto - detect upstart or systemd method based on # UPSTART_JOB or NOTIFY_SOCKET environment variables # Note: these supervision methods only signal "process is ready....

April 4, 2021 · 2 min · 李昌