Redis入門教程(二)

来源:https://www.cnblogs.com/jichi/archive/2019/03/14/10527917.html
-Advertisement-
Play Games

推薦閱讀: Redis入門教程(一)https://www.cnblogs.com/jichi/p/10285346.html 5. Redis 的數據結構 5.1 Redis 數據結構介紹 redis是一種高級的key-value的存儲系統, 其中value支持五種數據類型。 1、字元串(Stri ...


推薦閱讀:

Redis入門教程(一)https://www.cnblogs.com/jichi/p/10285346.html

5. Redis 的數據結構

5.1 Redis 數據結構介紹

redis是一種高級的key-value的存儲系統, 其中value支持五種數據類型。

1、字元串(String)

2、哈希(hash)

3、字元串列表(list)

4、字元串集合(set)

5、有序字元串集合(sorted set)

而關於key 的定義呢,需要大家註意的幾點:

1key 不要太長, 最好不要操作1024 個位元組,這不僅會消耗記憶體還會降低查找效率

2key 不要太短,如果太短會降低key 的可讀性

3在項目中, key 最好有一個統一的命名規範

5.2 存儲string

5.2.1 概述

字元串類型是Redis中最為基礎的數據存儲類型,它在Redis中是二進位安全的,這便意味著該類型在存入和獲取的數據相同。在Redis中字元串類型的Value最多可以容納的數據長度為512M。

5.2.2 常用命令

5.2.2.1 賦值

• set key value:設定key 持有指定的字元串value,如果該key 存在則進行覆蓋操作。總是返回ok。

5.2.2. 2 取值

• get key :獲取key 的value 。如果與該key 關聯的value 不是String 類型,redis將返回錯誤信息,因為get 命令只能用於獲取String value;如果該key 不存在,返回(nil)。

• getset key value:先獲取該key 的值,然後在設置該key 的值。

5.2.2.3 刪除

• del key:刪除指定key

5.2.2.4 數值增減

• incr key :將指定的key 的value 原子性的遞增1.如果該key 不存在,其初始值為0 ,在incr之後其值為1 。如果value的值不能轉成整型,如hello,該操作將執行失敗井返回相應的錯誤信息。

• decr key : 將指定的key 的value 原子性的遞減1.如果該key 不存在,其初始值為0 , 在decr 之後其值為-1 。如果value的值不能轉成整型,如hello,該操作將執行失敗並返回相應的錯誤信息。

5.2.2.5其他命令

• incrby key increment :將指定的key 的value 原子性增加increment,如果該key 不存在,器初始值為0 , 在incrby 之後,該值為increment 。如果該值不能轉成整型,如hello 則失敗井返回錯誤信息。

• append key value:拼湊字元串。如果該key存在,則在原有的value 後追加該值;如果該key 不存在,則重新創建一個key/value

5.3 存儲hash

5.3.1 概述

Redis中的Hash 類型可以看成具有String Key 和String Value 的map 容器。所以該類型非常適合於存儲值對象的信息。如UsernamePassword 和Age 等。如果Hash 中包含很少的欄位,那麼該類型的數據也將僅占用很少的磁碟空間。每一個Hash 可以存儲4294967295 個鍵值對。

5.3.2 常用命令

5.3.2.1 賦值

• hset key field value:為指定的key設定field/value對(鍵值對)。

• hmset key field value [field2 value2 ... ]:設置key中的多個filed/value。

5.3.2.2 取值

• hget key field:返回指定的key中的field的值

• hmget key fileds:獲取key 中的多個filed 的值

• hgetall key:獲取key 中的所有filed-value

5.3.2.3 刪除

• hdel key field [field …]:可以刪除一個或多個欄位,返回值是被刪除的欄位個數

• del key:刪除整個 list

5.3.2.4 增加數字

• hincrby key field increment:設置key 中filed 的值增加increment,如:age增加20

5.3.3 自學命令

• hexists key field:判斷指定的key 中的filed 是否存在

• hlen key:獲取key 所包含的field 的數量

• hkeys key :獲得所有的key

• hvals key:獲得所有的value

5.4 存儲list

5.4.1 概述

在Redis中,List類型是按照插入順序排序的字元串鏈表。和數據結構中的普通鏈表一樣,我們可以在其頭部(left)和尾部(right)添加新的元素。在插入時,如果該鍵並不存在, Red is將為該鍵創建一個新的鏈表。與此相反,如果鏈表中所有的元素均被移除,那麼該鍵也將會被從資料庫中刪除。

List 中可以包含的最大元素數量是4294967295 。

從元素插入和刪除的效率視角來看, 如果我們是在鏈表的兩頭插入或刪除元素, 這將會是非常高效的操作,即使鏈表中己經存儲了百萬條記錄,該操作也可以在常量時間內完成。然而需要說明的是, 如果元素插入或刪除操作是作用於鏈表中間, 那將會是非常低效的。相信對於有良好數據結構基礎的開發者而言,這一點並不難理解。

1ArrayList使用數組方式存儲數據,所以根據索引查詢數據速度快,而新增或者刪除元素時需要涉及到位移操作,所以比較慢。

2LinkedList 使用雙向鏈接方式存儲數據,每個元素都記錄前後元素的指針,所以插入、刪除數據時只是更改前後元素的指針指向即可,速度非常快,然後通過下標查詢元素時需要從頭開始索引,所以比較慢。

5.4.2 常用命令

5.4.2.1 兩端添加

• lpush key values[valuel value2 ... ]:在指定的key 所關聯的list 的頭部插入所有的values,如果該key 不存在,該命令在插入之前創建一個與該key 關聯的空鏈表,之後再向該鏈表的頭部插入數據。插入成功,返回元素的個數。

• rpush key values[valuelvalue2... ]:在該list 的尾部添加元素。

5.4.2.2 查看列表

• lrange key start end : 獲取鏈表中從start 到end 的元素的值,start、end 從0 開始計數;也可為負數,若為-1 則表示鏈表尾部的元素,- 2則表示倒數第二個,依次類推..

5.4.2.3 兩端彈出

• lpop key:返回並彈出指定的key 關聯的鏈表中的第一個元素, 即頭部元素。如果該key 不存在,返回nil;若key 存在,則返回鏈表的頭部元素。

• rpop key:從尾部彈出元素。

5.4.2.4 獲取列表中元素的個數

• llen key:返回指定的key 關聯的鏈表中的元素的數量。

5.4.3 擴展命令(瞭解)

• lpushx key value:僅當參數中指定的key 存在時,向關聯的list的頭部插入value。如果不存在,將不進行插入。

• rpushx key value:在該list的尾部添加元素

• lrem key count value:刪除count個值為value的元素,如果count 大於0,從頭向尾遍歷並刪除count 個值為value 的元素,如果count 小於0,則從尾向頭遍歷並刪除。如果count 等於0,則刪除鏈表中所有等於value 的元素。

• lset key index value:設置鏈表中的index的腳標的元素值,0代錶鏈表的頭元素,-1代錶鏈表的尾元素。操作鏈表的腳標不存在則拋異常。

• linsert key before I after pivot value : 在pivot 元素前或者後插入value 這個元素。

• rpoplpush resource destination:將鏈表中的尾部元素彈出井添加到頭部。[迴圈操作]

5.4.4 使用場景

rpoplpush的使用場景:

Redis鏈表經常會被用於消息隊列的服務,以完成多程式之間的消息交換。假設一個應用程式正在執行LPUSH操作向鏈表中添加新的元素,我們通常將這樣的程式稱之為"生產者(Producer)",而另外一個應用程式正在執行RPOP 操作從鏈表中取出元素,我們稱這樣的程式為"消費者(Consumer)"。如果此時,消費者程式在取出消息元素後立刻崩潰,由於該消息已經被取出且沒有被正常處理,那麼我們就可以認為該消息己經丟失,由此可能會導致業務數據丟失,或業務狀態的不一致等現象的發生。然而通過使用RPOPLPUSH 命令,消費者程式在從主消息隊列中取出消息之後再將其插入到備份隊列中,直到消費者程式完成正常的處理邏輯後再將該消息從備份隊列中刪除。同時我們還可以提供一個守護進程,當發現備份隊列中的消息過期時,可以重新將其再放回到主消息隊列中,以使其它的消費者程式繼續處理。

5.5存儲set

5.5.1 概述

在Redis中,我們可以將Set類型看作為沒有排序的字元集合,和List類型一樣,我們也可以在該類型的數據值上執行添加、刪除或判斷某一元素是否存在等操作。需要說明的是,這些操作的時間複雜度為O(1),即常量時間內完成操作。Set可包含的最大元素數量是4294967295。

和List 類型不同的是, Set集合中不允許出現重覆的元素,這一點和C++標準庫中的set容器是完全相同的。換句話說,如果多次添加相同元素, Set中將僅保留該元素的一份拷貝。和List 類型相比, Set 類型在功能上還存在著一個非常重要的特性,即在伺服器端完成多個Sets之間的聚合計算操作,如unions、intersections 和differences。由於這些操作均在服務端完成,因此效率極高,而且也節省了大量的網路IO開銷。

5.5.2 常用命令

5.5.2.1 添加/刪除元素

• sadd key values[value1、value2 …]:向set中添加數據,如果該key 的值己有則不會重覆添加

• srem key members [member1、member2...]:刪除set 中指定的成員

5.5.2.2 獲得集合中的元素

• smembers key:獲取set 中所有的成員

• sismember key member:判斷參數中指定的成員是否在該set中,1表示存在,0示不存在或者

該key 本身就不存在。(無集合中有多少元素都可以極速的返回結果)

5.5.2.3 集合的差集運算A-B

• sdiff key1 key2:返回key1與key2中相差的成員,而且與key的順序有關。即返問空值。

5.5.2.4 集合的交集運算A n B

• sinter key1 key2 key3 . . .:返回交集。

5.5.2.5 集合的並集運算A U B

• sunion key1 key2 key3 . . . :返回並集。

5.5.3 擴展命令( 瞭解)

• scard key:獲取set 中成員的數量

• srandmember key:隨機返回set 中的一個成員

• sdiffstore destination key1 key2 ...:將key1、key2相差的成員存儲在destination 上

• sinterstore destination key[key ...]:將返回的交集存儲在destination 上

• sunionstore destination key[key ...]:將返回的並集存儲在destination 上

5.5.4 使用場景

1、可以使用Redis的Set數據類型跟蹤一些唯一性數據,比如訪問某一博客的唯一IP 地址信息。對於此場景,我們僅需在每次訪問該博客時將訪問者的IP 存入Red is 中, Set 數據類型會自動保證IP

地址的唯一性。

2、充分利用Set 類型的服務端聚合操作方便、高效的特性,可以用於維護數據對象之間的關聯關係。

比如所有購買某一電子設備的客戶ID被存儲在一個指定的Set 中,而購買另外一種電子產品的客戶ID被存儲在另外一個Set 中,如果此時我們想獲取有哪些客戶同時購買了這兩種商品時,Set 的intersections命令就可以充分發揮它的方便和效率的優勢了。

5.6 存儲sortedset

5.6.1 概述

Sorted-Set和Set 類型極為相似,它們都是字元串的集合,都不允許重覆的成員出現在一個Set中。它們之間的主要差別是Sorted-Set 中的每一個成員都會有一個分數(score)與之關聯, Redis正是通過分數來為集合中的成員進行從小到大的排序。然而需要額外指出的是, 儘管Sorted-Set 中的成員必須是唯一的,但是分數(score)卻是可以重覆的。

在Sorted-Set 中添加、刪除或更新一個成員都是非常快速的操作,其時間複雜度為集合中成員數量的對數。由於Sorted-Set 中的成員在集合中的位置是有序的,因此,即便是訪問位於集合中部的成員也仍然是非常高效的。事實上,Redis所具有的這一特征在很多其它類型的資料庫中是很難實現的,換句話說,在該點上要想達到和Red is 同樣的高效,在其它資料庫中進行建模是非常困難的。

例如: 游戲排名、微博熱點話題等使用場景。

5.6.2 常用命令

5.6.2.1 添加元素

• zadd key score member score2 member2 ...:將所有成員以及該成員的分數存放到sorted-set 中。

如果該元素己經存在則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,

不包含之前已經存在的元素。

5.6.2.2 獲得元素

• zscore key member:返回指定成員的分數

• zcard key:獲取集合中的成員數量

5.6.2.3 刪除元素

• zrem key member[member…]:移除集合中指定的成員,可以指定多個成員。

5.6.2.4 範圍查詢

• zrange key start end [withscores]:獲取集合中腳標為start-end 的成員,[with scores]參數表明返回的成員包含其分數。

• zremrangebyrank key start stop : 按照排名範圍刪除元素

• zremrangebyscore key min max : 按照分數範圍刪除元素

5.6.3 擴展命令(瞭解)

• zrangebyscore key min max [withscores] [limit offset count]: 返回分數在[min, max]的成員並按照分數從低到高排序。

[withscores]:顯示分數

[limit offset count]: offset表明從腳標為offset的元素開始並返回count 個成員。

• zincrby key increment member:設置指定成員的增加的分數。返回值是更改後的分數。

• zcount key min max : 獲取分數在[min,max]之間的成員

• zrank key member:返回成員在集合中的排名。(從小到大)

• zrevrank key member:返回成員在集合中的排名。(從大到小>

5.6.4 使用場景

1、可以用於一個大型線上游戲的積分排行榜。每當玩家的分數發生變化時,可以執行ZADD 命令更新玩家的分數,此後再通過ZRANGE 命令獲取積分TOPTEN 的用戶信息。當然我們也可以利用ZRANK命令通過username 來獲取玩家的排行信息。最後我們將組合使用ZRANGE 和ZRANK 命令快速的獲取和某個玩家積分相近的其他用戶的信息。

2Sorted-Set 類型還可用於構建索引數據。

6. keys 的通用操作

• keys pattern:獲取所有與pattern匹配的key,返回所有與該key匹配的keys。*表示任意一個或多個字元,?表示任意一個字元。

• del key1 key2 ...:刪除指定的key

• exists key:判斷該key是否存在, 1代表存在,0代表不存在

• rename key newkey:為當前的key 重命名

• expire key:設置過期時間,單位:秒

• ttl key:獲取該key 所剩的超時時間,如果沒有設置超時,返回-1。如果返回表示超時不存在。

• type key:獲取指定key 的類型。該命令將以字元串的格式返回。

listsethash 和zset ,如果key 不存在返回none 。

7.Redis 特性

7. 1 多資料庫

7.1.1 概念

一個Redis實例可以包括多個資料庫, 客戶端可以指定連接某個redis實例的哪個資料庫, 就好比一個mysql中創建多個資料庫,客戶端連接時指定連接哪個資料庫。

一個redis實例最多可提供16個資料庫,下標從0 到15,客戶端預設連接第0 號資料庫,也可以通過select選擇連接哪個資料庫,如下連接1 號庫:

連接0 號資料庫:

7.1.2 將newkey移植到1號庫

• move newkey 1 : 將當前庫的key 移植到1 號庫中

7.2 伺服器命令

• ping:測試連接是否存活

//執行下麵命令之前,我們停止redis伺服器

redis 127.0.0.1:6379> ping

Could not connect to Redis at 127.0.0.1:6379: Connection refused

• echo:在命令行列印一些內容

• select:選擇資料庫。Redis資料庫編號從0~15,可以選擇任意一個資料庫來進行數據的存取。

當選擇16 時,報錯,說明沒有編號為16的這個資料庫

• quit:退出連接

• dbsize:返回當前資料庫中key 的數目。

• info:獲取伺服器的信息和統計。

• flushdb:刪除當前選擇資料庫中的所有key。

• flushall:刪除所有資料庫中的所有key 。

在本例中我們先查看了一個1號資料庫中有一個key,然後我切換到0號庫執行flushall命令,結果1 號庫中的key 也被清除了,說明命令工作正常。

7.3 消息訂閱與發佈

• subscribe channel:訂閱頻道,例:subscribe mychat,訂閱mychat 這個頻道

• psubscribe channel*:批量訂閱頻道,例: psubscribe s*,訂閱以s開頭的頻道

• publish channel content:在指定的頻道中發佈消息,如publish mychat 'today is a newday'

•步驟1:在第一個連接中,訂閱mychat頻道。此時如果沒有人"發佈"消息,當前視窗處於等待狀態。

•步驟2:在另一個視窗中,在mychat頻道中,發佈消息。

•步驟3:再第三個視窗,批量訂閱以my 開頭所有頻道。

•步驟4:在第二個視窗,分別在"mychat"和"mychat2"發佈消息。

7.4redis 事務

7.4.1 概念

和眾多其它資料庫一樣,Redis作為NoSQL資料庫也同樣提供了事務機制。在Redis中,MU LTI/EXEC/DISCARD/這三個命令是我們實現事務的基石。

7.4.2 redis 事務特征

1、在事務中的所有命令都將會被串列化的順序執行,事務執行期間,Redis不會再為其它客戶端的請求提供任何服務, 從而保證了事物中的所有命令被原子的執行

2、和關係型資料庫中的事務相比, 在Redis 事務中如果有某一條命令執行失敗,其後的命令仍然會被繼續執行。

3、我們可以通過MULTI 命令開啟一個事務,有關係型資料庫開發經驗的人可以將其理解為BEGIN TRANSACTION語句。在該語句之後執行的命令都將被視為事務之內的操作,最後我們可以通過執行EXEC/DISCARD命令來提交/回滾該事務內的所有操作。這兩個Redis命令可被視為等同於關係型資料庫中的COMMIT/ROLLBACK 語句。

4、在事務開啟之前,如果客戶端與伺服器之間出現通訊故障並導致網路斷開,其後所有待執行的語句都將不會被伺服器執行。然而如果網路中斷事件是發生在客戶端執行EXEC 命令之後,那麼該事務中的所有命令部會被伺服器執行。

5當使用Append-Only模式時, Redis會通過調用系統函數write將該事務內的所有寫操作在本次調用中全部寫入磁碟。然而如果在寫入的過程中出現系統崩潰,如電源故障導致的宕機,那麼此時也許只有部分數據被寫入到磁碟,而另外一部分數據卻已經丟失。Redis伺服器會在重新啟動時執行一系列必要的一致性檢測, 一旦發現類似問題, 就會立即退出並給出相應的錯誤提示。

此時,我們就要充分利用Redis工具包中提供的redis-check-aof 工具,該工具可以幫助我們定位到數據不一致的錯誤,並將己經寫入的部分數據進行回滾。修複之後我們就可以再次重新啟動Redis伺服器了。

7.4.3 命令解釋

• multi:開啟事務用於標記事務的開始,其後執行的命令都將被存入命令隊列,直到執行EXEC時,這些命令才會被原子的執行,類似與關係型資料庫中的:begi n transaction

• exec:提交事務,類似與關係型資料庫中的:commit

• discard:事務回滾,類似與關係型資料庫中的:rollback

7.4.4 測試

7.4.4.1 正常執行事務

• 步驟1:在視窗1,設置num,並設置數據

• 步驟2:在視窗2, num累加1,並獲得數據

• 步驟3:在視窗1,獲得數據

• 步驟4:在視窗1,開啟事務,多次累加數據。

• 步驟5:在視窗2,獲得數據

• 步驟6:提交事務

7.4.4.2 回滾

7.4.4.3 失敗命令

8.redis持久化

8.1 概述

Redis的高性能是由於其將所有數據都存儲在了記憶體中,為了使Redis在重啟之後仍能保證數據不丟失,需要將數據從記憶體中同步到硬碟中,這一過程就是持久化。

Redis支持兩種方式的持久化,一種是RDB方式,一種是AOF方式。可以單獨使用其中一種或將二者結合使用。

1、RDB 持久化(預設支持,無需配置)

該機制是指在指定的時間問隔內將記憶體中的數據集快照寫入磁碟。

2、AOF 持久化

該機制將以日誌的形式記錄伺服器所處理的每一個寫操作,在Redis伺服器啟動之初會讀取該文件來重新構建資料庫,以保證啟動後資料庫中的數據是完整的。

3、無持久化

我們可以通過配置的方式禁用Redis伺服器的持久化功能,這樣我們就可以將Redis視為一個功能加強版的memcached了。

4、redis可以同時使用RDB 和AOF

8.2RDB

8.2.1 優勢

1、一旦採用該方式,那麼你的整個Redis資料庫將只包含一個文件,這對於文件備份而言是非常完美的。比如,你可能打算每個小時歸檔一次最近24 小時的數據,同時還要每天歸檔一次最近30天的數據。通過這樣的備份策略,一旦系統出現災難性故障, 我們可以非常容易的進行恢復。

2、對於災難恢復而言,RDB是非常不錯的選擇。因為我們可以非常輕鬆的將一個單獨的文件壓縮後再轉移到其它存儲介質上

3、性能最大化。對於Redis的服務進程而言,在開始持久化時,它唯一需要做的只是fork

出子進程,之後再由子進程完成這些持久化的工作,這樣就可以極大的避免服務進程執行操

作了。

4、相比於AOF 機制,如果數據集很大,RDB的啟動效率會更高。

8.2.2 劣勢

1、如果你想保證數據的高可用性,即最大限度的避免數據丟失,那麼RDB 將不是一個很好的選擇。

因為系統一旦在定時持久化之前出現宕機現象,此前沒有來得及寫入磁碟的數據都將丟失。

2、由於RDB是通過fork 子進程來協助完成數據持久化工作的,因此,如果當數據集較大時,可能會導致整個伺服器停止服務幾百毫秒,甚至是1 秒鐘

8.2.3 配置說明Snapshotting

8.2.3.1 快照參數設置

• save 900 1 #每900秒(15分鐘)至少有1 個key發生變化,則dump 記憶體快照。

• save 300 10 #每300秒(5分鐘)至少有10 個key 發生變化,則dump 記憶體快照。

• save 60 10000 #每60 秒(1 分鐘)至少有10000個key 發生變化,則dump 記憶體快照。

8.2.3.2 保存位置設置

8.3AOF

8.3.1 優勢

1、該機制可以帶來更高的數據安全性, 即數據持久性。Red is 中提供了3 中同步策略, 即每秒同步、每修改同步和不同步。事實上,每秒同步也是非同步完成的,其效率也是非常高的,所差的是一旦系統出現右機現象, 那麼這一秒鐘之內修改的數據將會丟失。而每修改同步, 我們可以將其視為同步持久化,即每次發生的數據變化都會被立即記錄到磁碟中。可以預見, 這種方式在效率上是最低的。至於無同步,無需多言,我想大家都能正確的理解它。

2、由於該機制對日誌文件的寫入操作採用的是append 模式,因此在寫入過程中即使出現宕機現象,也不會破壞日誌文件中己經存在的內容。然而如果我們本次操作只是寫入了一半數據就出現了系統崩潰問題,不用擔心,在Redis下一次啟動之前,我們可以通過red is-check-aof 工具來幫助我們解決數據一致性的問題。

3如果日誌過大,Redis可以自動啟用rewrite機制。即Redis 以append 模式不斷的將修改數據寫入到老的磁碟文件中, 同時Redis 還會創建一個新的文件用於記錄此期間有哪些修改命令被執行。

因此在進行rewrite 切換時可以更好的保證數據安全性。

4、AOF 包含一個格式清晰、易於理解的日誌文件用於記錄所有的修改操作。事實上,我們也可以通過該文件完成數據的重建。

8.3.2 劣勢

1、對於相同數量的數據集而言,AOF文件通常要大於RDB 文件

2、根據同步策略的不同,AOF在運行效率上往往會慢於RDB。總之,每秒同步策略的效率是比較高的,同步禁用策略的效率和RDB 一樣高效。

8.3.3 配置AOF

8.3.3.1 配置信息

• always #每次有數據修改發生時都會寫入AOF 文件

• everysec #每秒鐘同步一次, 該策略為AOF 的預設策略

• no #從不同步。高效但是數據不會被持久化

重寫AOF :若不滿足重寫條件時,可以手動重寫,命令: bgrewriteaof

策略的選擇:

 

8.3.3.2 數據恢復演示

1flushall操作清空資料庫

2、及時關閉redis 伺服器( 防止dump . rdb )。shutdown nosave

3、編輯aof文件,將日誌中的flushall命令刪除並重啟服務即可

• 步驟1 : 開啟a op , 並設置成總是保存。然後重啟red is 。

• 步驟2 : 在視窗1 進行若幹操作

• 步驟3 : 在視窗1 , 清空資料庫

• 步驟4 : 在視窗2 , 關閉redis

• 步驟5 : 修改"appendonly.aof"文件,將最後的命令"flushall"刪除

• 步驟6 : 在視窗1 啟動redis,然後查詢資料庫內容

9.redis 使用場景

1、取最新N 個數據的操作

比如典型的取你網站的最新文章,通過下麵方式,我們可以將最新的5000 條評論的ID 放在Red is的Li st 集合中, 並將超出集合部分從資料庫獲取

2排行榜應用,取TOP N 操作

這個需求與上面需求的不同之處在於, 前面操作以時間為權重,這個是以某個條件為權重,比如按頂的次數排序,這時候就需要我們的sorted set 出馬了,將你要排序的值設置成so rted set 的sco re ,將具體的數據設置成相應的va lu e , 每次只需要執行一條ZADD 命令即可。

3需要精準設定過期時間的應用

比如你可以把上面說到的sorted set 的score 值設直成過期時間的時間戳, 那麼就可以簡單地通過過期時間排序,定時清除過期數據了,不僅是清除Redis 中的過期數據,你完全可以把Redis 里這個過期時間當成是對資料庫中數據的索引, 用Redis來找出哪些數據需要過期刪除,然後再精準地從資料庫中刪除相應的記錄。

4、計數器應用

Redis的命令都是原子性的,你可以輕鬆地利用INCR , DECR 命令來構建計數器系統。

5Uniq操作,獲取某段時間所有數據排重值

這個使用Redis 的set數據結構最合適了,只需要不斷地將數據往set中扔就行了, set 意為集合, 所以會自動排重。

6、實時系統,反垃圾系統

通過上面說到的set 功能,你可以知道一個終端用戶是否進行了某個操作,可以找到其操作的集合併進行分析統計對比等。

7Pub/Sub 構建實時消息系統

Redis的Pub/Sub 系統可以構建實時的消息系統,比如很多用Pub/Sub構建的實時聊天系統的例子。

8、構建隊列系統

使用list 可以構建隊列系統,使用sorted set 甚至可以構建有優先順序的隊列系統。

此為本人學習筆記總結,整合網上資料。希望大家能順利入門。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在啟動調試以及設置斷點之後,就到了我們非常關鍵的一步-查看變數。GDB調試最大的目的之一就是走查代碼,查看運行結果是否符合預期。既然如此,我們就不得不瞭解一些查看各種類型變數的方法,以幫助我們進一步定位問題。 ...
  • "Efficient data transfer through zero copy" "Zero Copy I: User Mode Perspective" 0. 前言 在閱讀RocketMQ的官方文檔時,發現Chapter6.1中關於零拷貝的敘述中有點不理解,因此查閱了相關資料,來解釋文中的說 ...
  • 英語原文地址: htttp://devicetree.org/Device_Tree_Usage 本文介紹如何為新的機器或板卡編寫設備樹(Device Tree), 它旨在概要性的介紹設備樹概念,以及如何使用它們來描述機器或者板卡。 有關設備樹數據格式的完整技術描述,請參閱ePAPR v1.1規範。 ...
  • mysql實現讀寫分離的方式 mysql 實現讀寫分離的方式有以下幾種: 程式修改mysql操作,直接和資料庫通信,簡單快捷的讀寫分離和隨機的方式實現的負載均衡,許可權獨立分配,需要開發人員協助。 amoeba,直接實現讀寫分離和負載均衡,不用修改代碼,有很靈活的數據解決方案,自己分配賬戶,和後端數據 ...
  • 前言:說到Linux我們都知道那是相當相當得重要得啊,在電腦這個行業,開發運維都是離不開它得。我作為一個準畢業生,智商可能不太夠,只能自己笨鳥先飛,自己操作起來咯。俗話說的好,好記性不如難筆頭嘛。而且nginx這個東西也是非常非常的重要,於是我決定安裝nginx,這樣不僅能熟悉linux得命令,學 ...
  • 安裝通用軟體 : ping , telnet , lrzsz , zip , wget 安裝ping軟體,用於測試當前伺服器與其他伺服器之間的網路通暢情況,和Windows的Ping類似 執行ping的安裝指令 : sudo yum install initscripts 如果當前用戶為非管理員許可權... ...
  • 下載Linux伺服器連接軟體,市面上有Putty,FinalShell等,我以FinalShell為例,下載地址為 :http://www.hostbuf.com/t/988.html,軟體安裝結束後如下圖所示 : 雙擊FinallShell,打開軟體,界面如下圖所示 : 點開文件夾圖標,選擇SSH... ...
  • win10版本家庭中文版: 運行應用程式報錯: 解決辦法(親試): 1.進入”控制面板“--”用戶賬戶“--”用戶賬戶“,選擇”更改用戶賬戶控制設置“,選擇最後一項,點擊”確定“按鈕,如下圖: 2.按【win+R】快捷鍵打開運行,輸入gpedit.msc,如下圖: 問題:運行後提示找不到gpedit ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...