天天看點

Redis學習筆記二:基本指令與使用場景

作者: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)

更早以前(來自資料庫)

架構如下:

Redis學習筆記二:基本指令與使用場景

執行順序

Redis學習筆記二:基本指令與使用場景

示例

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 , 復原是沒有辦法處理這些情況的。

繼續閱讀