Redis事物面試總結(jié),第一次分享說(shuō)的不好大家看文字吧

Redis事物和我們平時(shí)理解的關(guān)系型數(shù)據(jù)庫(kù)是不一樣的,Redis事物在運(yùn)行錯(cuò)誤的情況下,除了執(zhí)行過(guò)程中運(yùn)行錯(cuò)誤的命令之外,其他命令都可以正常執(zhí)行。Redis事物是不支持回滾的。不滿足原子操作,也就是說(shuō)在執(zhí)行多個(gè)命令時(shí)可以被其他命令插入。
Redis事物存在一些缺陷:
- 不滿足原子性;
- 雖然Redis事物可以將多個(gè)請(qǐng)求命令打包發(fā)給Redis服務(wù)器,但是發(fā)送的每個(gè)命令請(qǐng)求都會(huì)與Redis服務(wù)器進(jìn)行網(wǎng)絡(luò)交互,所以還是很浪費(fèi)資源的。
所以,在我們開(kāi)發(fā)過(guò)程中基本上很少使用Redis事物。
如何解決 Redis 事務(wù)的缺陷?
Redis 從 2.6 版本開(kāi)始支持執(zhí)行 Lua 腳本,它和Redis事物很相似,利用Lua腳本可以批量執(zhí)行多個(gè)Redis命令,這些命令會(huì)被提交到Redis服務(wù)器上一次性執(zhí)行完成,大大的減小了網(wǎng)絡(luò)開(kāi)銷。
如果Lua腳本執(zhí)行過(guò)程中出錯(cuò)結(jié)束,那么出錯(cuò)之后的命令是不會(huì)被執(zhí)行的,并且出錯(cuò)之前的命令無(wú)法撤銷,所以Lua腳本不滿足原子性。
使用Lua腳本的好處:
- 減少網(wǎng)絡(luò)開(kāi)銷
- 原子操作:Redis將整個(gè)Lua腳本作為一個(gè)命令執(zhí)行,中間不會(huì)被其他命令插入。
面試加問(wèn):
Redis事物和管道有什么區(qū)別?
1、網(wǎng)絡(luò)開(kāi)銷
客戶端可以通過(guò)管道一次性地發(fā)送多個(gè)命令而不用等服務(wù)器的響應(yīng),等所有命令都執(zhí)行完之后再一次性地讀取響應(yīng),多條命令的網(wǎng)絡(luò)開(kāi)銷相當(dāng)于是一條命令的開(kāi)銷。但是需要注意的一點(diǎn)是,當(dāng)使用管道打包命令時(shí),Redis必須在處理完所有命令之前將結(jié)果緩存起來(lái),所以打包命令越多,消耗的緩存越多,所以使用時(shí)需要注意下。