响应版主号召,发点入门教学文章 - 简单说下redis主从复制过程以及小弟我发现的一个导致小弟我线上业务出bug的不起眼特性
响应版主号召,发点入门教学文章 - 简单说下redis主从复制过程以及我发现的一个导致我线上业务出bug的不起眼特性
写在前面:
虽然和php没啥直接关系,但我想现在redis是非常主流的,看着很多朋友在抱怨效率低下且还在实时查着mysql。因此介绍下redis,毕竟是内存,读写速度超过磁盘n个档次,并且redis学习成本比起mysql、mongo、cassandra这些低很多。绝对值得你去尝试。
如果您是新手,您可以仔细看下redis的同步方式,了解个大概。
如果您是redis的老用户,就当我给您提个醒,那个细节很不起眼,但确实可能会在将来影响到您。
此文并不是redis的教程文章,也不是深入redis源代码分析的核心原理介绍。我只是想从一个特别的角度让大家看到redis的好处,以及一些需要注意的地方。如果有需要,我以后会重点介绍一些redis的使用细节,参数设置之类的。跟一些精通linux c、擅长分析源码的大牛比起来我还是入门级的,如果有错误之处,请直接指出,不甚感激!
redis的数据持久化有两种方案:
1 写aof文件
2 写快照rdb文件
如果两种同时打开,redis启动后会优先尝试从aof文件中恢复数据。另外如果做主从,redis以slave会向master拉aof文件来实现主从同步的目的。
快照rdb就不说了,这里主要说一下aof。当你在redis中执行了一条命令后,redis就会以追加方式写入aof文件中。
我在本机先开好两个redis server,一个监听12345端口做master。另一个监听12346端口做slave。
然后redis-cli连接redis-server master,并写入一个测试用的值:
同样再来个redis-cli连接redis-server slave,可以看到,这个值被同步过来了。
现在我们看一下master和redis的aof文件,可以看到,完全一致。
master:
slave:
现在我从master中删了这个mytestkey,也会写入aof文件,并且会同步到slave。
master中执行del mytestkey:
查看slave的aof文件,注意最后三行,已经同步过来了。
这就是redis主从同步的基本原理。
在redis中执行的命令,会被写入aof文件,并且在master中执行的命令,会将aof文件同步到slave(准确的说是由slave向master发送sync命令拉aof文件)。
但也有例外:
刚才我新建了一个key,又把它删除了,那么库里应该啥都没了。这时如果我再删除,就等于是删除一个不存在的key,redis会返回:(integer) 0。flushdb是清库操作,无论库里是否有数据,都会返回ok。
那么这条两条命令在库里没有数据的情况下,是否会被写入aof文件并且同步呢?
答案是否定的,它并没有第二次写入del mytestkey,也没有写入flushdb。同样更不会同步给slave的aof文件。
我之所以要提这一点,是因为前两天因为这个性质导致线上业务出了个重大bug。我们线上业务是多台php web server+多台redis。redis同样也做了主从,主从关系采用单向链表式结构。即master->slave->slave->slave...master中存储着所有slave需要的公共数据。而每一台slave,都需要写自己独特的cache,因为一台php web server读一台redis slave。这样看似完美,即做到了redis的负载均衡,又避免了内存数据冗余。我们为了避免cache的冗余。也为了避免cache key的冲突(其实这个很好解决,加个key前缀就可以解决了),就违背了主从同步的核心理念 - 数据一致性,每台php web server都向自己对应的那台slave中写入数据。cache毕竟是cache,这些cache会造成数据更新的问题,我没有在set的时候给key设置失效时间。而是采用事件驱动的方式来统一一次性清除掉所有机器上的cache。
每天晚上有一系列脚本,用来更新所有redis中的公共数据,公共数据和cache存储在不同的分区中,假如公共数据存储在0库,那cache就存储在1库。我向master执行
select 0
flushdb
select 1
flushdb
接下来问题就来了,由于master的cache分区1库中一条数据都没有。所以这条flushdb实际并不会写入本机aof文件,更不会被同步到各个slave。结果就是cache根本没被清理掉,造成第二天数据没更新的bug,这里我也没设置monitor,第二天被n多部门追问起来才知道出了问题,找了一下午才找到原因。被一通谴责。。。。
解决方案嘛也很简单:
A 修改为统一向master写数据
B 晚上脚本在master上清理cache分区时,先随便set一个key,然后再执行flushdb
为了数据不冗余,也为了偷懒(这样改动最小),我采取了Plan B。
最后为了追根究底,我去看了redis的源码,发现在写aof模块中,果然有那么一段,大概意思就是执行del或flushdb之类的命令时发现没什么可释放的,就不向aof文件中追加此命令。另外,info、monitor这种和监控相关的,不对数据产生影响的命令也不会写入aof文件。
------解决方案--------------------
用了Mysql的内存表 深深的知道 内存和硬盘上数据读取的差距.redis还没部署 基本上都是memcache
------解决方案--------------------
不错 mark
------解决方案--------------------
灰常不错,了解一个。。。
------解决方案--------------------
赞,有机会也想学学PHP编程
------解决方案--------------------
------解决方案--------------------
------解决方案--------------------
支持一个 :)
------解决方案--------------------
多谢 ShadowSniper大哥!
------解决方案--------------------
感谢楼主分享
------解决方案--------------------
php新手路过
------解决方案--------------------
不错,有机会学习一下
------解决方案--------------------
了解啦,谢谢分享!
------解决方案--------------------
小顶一下下
------解决方案--------------------
了解啦,谢谢分享!

PHP仍然流行的原因是其易用性、靈活性和強大的生態系統。 1)易用性和簡單語法使其成為初學者的首選。 2)與web開發緊密結合,處理HTTP請求和數據庫交互出色。 3)龐大的生態系統提供了豐富的工具和庫。 4)活躍的社區和開源性質使其適應新需求和技術趨勢。

PHP和Python都是高層次的編程語言,廣泛應用於Web開發、數據處理和自動化任務。 1.PHP常用於構建動態網站和內容管理系統,而Python常用於構建Web框架和數據科學。 2.PHP使用echo輸出內容,Python使用print。 3.兩者都支持面向對象編程,但語法和關鍵字不同。 4.PHP支持弱類型轉換,Python則更嚴格。 5.PHP性能優化包括使用OPcache和異步編程,Python則使用cProfile和異步編程。

PHP主要是過程式編程,但也支持面向對象編程(OOP);Python支持多種範式,包括OOP、函數式和過程式編程。 PHP適合web開發,Python適用於多種應用,如數據分析和機器學習。

PHP起源於1994年,由RasmusLerdorf開發,最初用於跟踪網站訪問者,逐漸演變為服務器端腳本語言,廣泛應用於網頁開發。 Python由GuidovanRossum於1980年代末開發,1991年首次發布,強調代碼可讀性和簡潔性,適用於科學計算、數據分析等領域。

PHP適合網頁開發和快速原型開發,Python適用於數據科學和機器學習。 1.PHP用於動態網頁開發,語法簡單,適合快速開發。 2.Python語法簡潔,適用於多領域,庫生態系統強大。

PHP在現代化進程中仍然重要,因為它支持大量網站和應用,並通過框架適應開發需求。 1.PHP7提升了性能並引入了新功能。 2.現代框架如Laravel、Symfony和CodeIgniter簡化開發,提高代碼質量。 3.性能優化和最佳實踐進一步提升應用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP類型提示提升代碼質量和可讀性。 1)標量類型提示:自PHP7.0起,允許在函數參數中指定基本數據類型,如int、float等。 2)返回類型提示:確保函數返回值類型的一致性。 3)聯合類型提示:自PHP8.0起,允許在函數參數或返回值中指定多個類型。 4)可空類型提示:允許包含null值,處理可能返回空值的函數。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

MantisBT
Mantis是一個易於部署的基於Web的缺陷追蹤工具,用於幫助產品缺陷追蹤。它需要PHP、MySQL和一個Web伺服器。請查看我們的演示和託管服務。

Dreamweaver Mac版
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

WebStorm Mac版
好用的JavaScript開發工具