使用Lua指令碼完成高併發下Redis資料修改
前些天我去面試,面試官問了我一個問題,Redis快取怎麼在高併發情況下保證資料操作的原子性,我當時後懵逼了,於是回來後我就花了點時間想想怎麼去完成這個功能.具體怎麼實現請接著往下看
在看這篇文章的時候希望大家先對Lua有一個瞭解
http://blog.csdn.net/mitu405687908/article/details/51137956
http://redisbook.readthedocs.io/en/latest/feature/scripting.html
Redis相關資料
https://www.cnblogs.com/silent2012/p/5368925.html
在Redis中執行Lua指令碼
http://blog.csdn.net/mn960mn/article/details/51918886
https://www.cnblogs.com/huangxincheng/p/6230129.html
http://blog.csdn.net/u011489043/article/details/78820285
看完了這些,相信大家都對Lua和Redis有一定的瞭解了吧!接下來我就直接貼程式碼了,怎麼實現Redis在高併發環境下對快取資料的修改
Lua指令碼
Java程式碼
設定一個測試值
模擬高併發--開三個執行緒來對name的值進行修改
這裡解釋一下listArgs的引數貌似也傳遞到Lua指令碼中了,但是我沒有用的listArgs的值,後面再研究研究
執行緒啟動:
輸出結果:
上面是結果的一部分,經過我的肉眼仔細排查,結果是完全正確的,意味著我們實現了使用Redis+Lua指令碼完成了對併發狀態下Redis快取資料的操作.在沒有使用鎖的情況下哦!!!!!
使用這種解決方案的專案包括京東的秒殺系統,可以參考http://blog.csdn.net/imxiangzi/article/details/52155451
第一次寫這個東西!~純屬分享 大家看看希望有所幫助 我一開始也查了好多好多資料 包括請教了一名遠在北京的同學(PS:因為技術的邂逅,哈哈)
最後 有什麼不對的歡迎指出 謝謝 大家 互相學習嘛~~~