redis实现及原理分析-redis 原理及实现
Redis 这东西,说白了就是个内存里的数据库,但它年轻时还是个争气的小东西。它最早也就是为了解决那个年代——90 年代,咱们如何用几行代码搞定上千个线程并发读写文件这种老大难难题而生的。
那时候没服务器集群,内存就是 CPU 能装下的全体东西。Redis 一启动就是如此卷的,就是冲着那个“多路复用”去的。 它的工作原理实际上就俩字:内存。但内存这东西,你得想清楚如何玩。Redis 核心就是利用 Linux 的内存映射技术,也就是.flatMap 技术,把服务器上的磁盘文件映射到进程的虚拟内存空间里。
这没啥高深奥义,就是把硬盘的物理块直接塞进进程地址空间,这样读写速度瞬间拔高到接近 CPU 时钟频率。
不过话说回来,磁盘读写没如此快,故此 Redis 默认配置里一直在疯狂往自己的内存池塞东西,这一填就是几兆几字节,直到你把数据写盘了,它才会去压盘轮询。
这时候,内存就是它的高光时刻,只要内存够大,读写就能跑通。 那它是如何保证这些快的数据不被其他进程抢走的呢?这就得提到它最骚的机制了:AOF(Append Only File,只读追加文件)。大家可能都知道 Redis 有持久化,就是把数据写进磁盘,但大量人不知道这背后的原理就是 AOF。就像咱们写日记,要是不小心关机了,日记就没了。AOF 就是预备一个超大文件,记录每一个写入的原子操作。Redis 就是如此个“日志式”的,每次写数据,它先在内存里搞定。
要是进程挂了,这个日志文件就留着,下次启动,系统直接读取日志去重建内存中的数据结构。
这样就算进程重启,数据也不会丢。 不过,要是进程重启了,内存里的数据还得重新来一遍。
这时候 Redis 就不得不依赖那堆 AOF 日志了。加载 AOF 日志的速度多关键啊,要是加载慢,咱们刚刚造好的人头就废了。
故此 Redis 默认是开启 AOF 的,保证数据不丢。但在日常高并发场景下,要是那日志加载忒慢,中间那段工夫 Redis 就空转了,可用率直接掉到 0。
这时候 Redis 就会挺痛苦,出于它得等待 AOF 加载搞定才能持续服务,就像你等着对方把账本读完再签字。
不过好在,目前的 Redis 有几种策略,比如自动回写要么二进制格式,能尽量平滑这个过程,让服务能稳当点转起来。 说到数据一致性,这确实是 Redis 一直纠结的难题。
特别是写多读少的场景,一旦两个线程与此同时写数据,是不是就报错了?理论上,要是并发度够高,数据冲突会害得整个系统不可用,这就是所谓的“不可抢占资源”。
可是,Redis 有个智慧的办法:它不会确实不准并发,而是采取“先提交删,后提交写”的策略。 举个例子,假设两个用户与此同时想删除“张三”的数据,系统里只有一个删除命令。按照严格的事务逻辑,两个请求都应当黄了。但 Redis 为了快,它会先提交那个删除操作(哪怕它还没真正把“张三”删掉),然后等待那个写入操作提交成功,再拍板是否提交删除。
这样,数据实际上是被删掉的,只是那个写入请求还没彻底生效。
这别看牺牲了点原子性,但极大提升了系统的吞吐量。对于大多数高并发场景,这绝对是性价比最高的妥协,毕竟速度才是王道。 再者说,Redis 的持久化策略也有点意思。它赞成 AOF 和 RDB 两种。RDB 就是定期快照,比如每秒存一次,那就不占内存了,启动也快。但缺点是要是快照忒快,可能会丢失中间的状态,害得数据重建时不连续。而 AOF 更细粒度,每个操作都存,保证数据整个,但启动慢,好办卡死。中间人就是这两个策略的博弈者,选哪个,得看你的场景是更看重稳,还是更看重快。 还有那个缓存穿透、击穿、雪崩,这三大坑,实际上就是对 Redis 特性的放大效应。
比如缓存穿透,就是刷了垃圾数据进去,请求进来,缓存直接回,但没真正降解,反而把服务器压爆了。出于数据根本没落盘,只是挂在那儿原地抖动。
这就是缓存能带来“假保险”的缘由。而击穿,是出于热点数据被击穿,瞬间被所有用户访问,害得大量连接黄了,直到超时。 不过 Redis 也不是没缺点。它是单线程操作的,这意味着它没有真正的多路复用本事。
要是是 TCP 长连接,数据就是一个接一个地喂进去,处理一个再处理下一个。而真正的多路复用,一般是用 UDP 实现的,准一个连接管多个数据块,这样吞吐量才能上去。
故此 Redis 在处理网络IO 密集型负载时,显得有点“笨”,毕竟它的内核机制就是这样设计的。 总的来说,Redis 就是个用内存换速度的工具。它通过 AOF 保证数据不灭,通过先删后写平衡冲突,用定期快照管住内存压力。它不是完美的数据库,不是线程保险的,但在做缓存加速这块,它确实做到了极致。
每次看到它炸出内存上的提示符,都让人认定它是个特别能干的“内存怪胎”。
声明:演示网站所有内容,若无特殊说明或标注,均来源于网络转载,仅供学习交流使用,禁止商用。若本站侵犯了你的权益,可联系本站删除。
