作者:Grey
原文位址: Redis學習筆記二:基本指令與使用場景
參考:
Redis學習筆記一:安裝和配置
https://www.redis.com.cn/redis-vs-memcached.html
其中有一個比較重要的差別是關于其提供的資料結構差別
Memcached
在其資料結構中僅使用字元串和整數。是以,您儲存的所有内容都可以是字元串或整數。它很複雜,因為對于整數,您可以做的唯一資料操作是添加或減去它們。如果需要儲存數組或對象,則必須先将它們序列化然後儲存。要閱讀它們,您需要取消序列化。
Redis
具有更強大的資料結構,它不僅可以處理字元串整數,還可以處理二進制安全字元串,二進制安全字元串清單,二進制安全字元串集和有序集。
關于Redis的資料結構:https://zhuanlan.zhihu.com/p/270592490
假設jack這名使用者,分别在第6天,第23天,第134天,和第364天登入了系統。
可以執行如下指令:
統計jack登入的天數,直接可以通過:
假設某個電商網站做活動,在某天要派送禮物,假設這個網站有2億使用者,請問應該備貨多少禮物比較适合
思路:
首先,可以考慮一下統計整個網站的活躍使用者有多少,比如我們設定三天,1号,2号,3号,統計三天登入的使用者獲得一個近似的活躍使用者的數量:
然後通過:
然後求這個destkey中含有的1的數量,即為比較活躍的使用者(派發禮物需要準備的禮物數量)
都可以使用Redis的incr方法,這樣就可以規避并發下,對資料庫的事務操作,完全由redis記憶體操作代替
參考大量初始化資料
如果需要考慮擷取實時資料和曆史資料
關于實時資料
pub/sub功能
關于曆史消息
三天前(sorted_set)
更早以前(來自資料庫)
架構如下:
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5SZ3U2MiNWMhFTNlJjN3ADNwY2Y1gzMiJDN0gTN0UTOm9CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
執行順序
示例
watch用法
啟動兩個redis用戶端,redis-client-1,redis-client-2
在redis-client-1中執行:
在redis-client-2中執行:
然後再回到redis-client-1,執行:
此時,在任意用戶端執行:
拿到的k1值是aa,說明事務沒有更新成功,因為在watch這段時間内,k1的值被修改了。
執行UNWATCH
然後重新執行
k1的值可以正常在事務階段被修改了。
摘自:http://www.redis.cn/topics/transactions.html
如果你有使用關系式資料庫的經驗, 那麼 “Redis 在事務失敗時不進行復原,而是繼續執行餘下的指令”這種做法可能會讓你覺得有點奇怪。
以下是這種做法的優點:
Redis 指令隻會因為錯誤的文法而失敗(并且這些問題不能在入隊時發現),或是指令用在了錯誤類型的鍵上面:這也就是說,從實用性的角度來說,失敗的指令是由程式設計錯誤造成的,而這些錯誤應該在開發的過程中被發現,而不應該出現在生産環境中。
因為不需要對復原進行支援,是以 Redis 的内部可以保持簡單且快速。
有種觀點認為 Redis 處理事務的做法會産生 bug , 然而需要注意的是, 在通常情況下, 復原并不能解決程式設計錯誤帶來的問題。 舉個例子, 如果你本來想通過 INCR 指令将鍵的值加上 1 , 卻不小心加上了 2 , 又或者對錯誤類型的鍵執行了 INCR , 復原是沒有辦法處理這些情況的。