【Redis】基礎知識

Redis 5.0.7。

Redis 常用命令、5 種數據類型。

常用命令

DEL key【刪除一個 key,所有類型都可以刪除】

DUMP key【序列化給定 key,返回被序列化的值】

EXISTS key【判斷 key 是否存在】

EXPIRE key second【設置 key 的過期時間】

TTL key 【查看 key 的剩餘時間,默認 -1 表示永久,-2 表示已經過期】

PERSIST key 【移除 key 的過期時間】

KEY pattern 【查詢給定模式的 key】

RANDOMKEY 【隨機返回一個 key】

RANAME key newkey 【修改 key 的名稱】

MOVE key db 【將 key 移動到其他數據庫中】

TYPE key 【返回 key 所儲存的值的類型】

注意:

  1. KEY pattern 的 pattern 爲 *代表所有,?代表單個字符。

  2. key 可以是中文,例如:set 你好 hello,但是 redis-cli 顯示不出來中文,查詢時候得用中文查詢。

    127.0.0.1:6379[1]> set 你好 hello
    OK
    127.0.0.1:6379[1]> keys *
    1) "\xe4\xbd\xa0\xe5\xa5\xbd"
    2) "a"
    127.0.0.1:6379[1]> get 你好
    "hello"
    
  3. key 不要太長,儘量不要超過 1024 字節。不僅消耗內存,也會降低查找的效率。

  4. key 不要太短,太短可讀性會降低。

  5. 一個項目中,key 最好使用統一的命名模式,如 user:123:password

  6. key 區分大小寫。

EXPIRE key second 的使用場景:

  1. 限時的優惠活動
  2. 網站數據緩存
  3. 手機驗證碼
  4. 限制網站訪客頻率

數據類型

string

string 類型是二進制安全的,redis 的 string 可以包含任何數據,如圖像、序列化對象。一個鍵最多能存儲512MB。二進制安全是指,在傳輸數據的時候,能保證二進制數據的信息安全,也就是不會被篡改、破譯;如果被攻擊,能夠及時檢測出來。

  • SET key val

    SETNX key val【當 key 不存在時設置 key 的值(SET if Not eXists)】

  • 刪除就用 del 就可以咯

  • INCR key【key 對應的 val 自增 1,如果 key 不存在,val 初始化爲 0 再自增1】

    INCRBY key num【num 是增量】

    DECR key 【自減,同上 INCR】

    DECRBY key num 【num 是負增量】

    APPEND key val【字符串拼接,如果不存在則創建並賦值 val】

    GETSET key value【設定 key 的值,並返回 key 的舊值。當 key 不存在,返回 nil】

  • GET key【獲取 key 的 val】

    GETRANGE key start end【獲取 key 中字符串的子字符串,從 start 開始,end 結束】

    MGET key1 [key2 …] 【獲取多個 key】

    GETSET key value【設定 key 的值,並返回 key 的舊值。當 key 不存在,返回 nil】

    STRLEN key 【返回 key 對應 val 的字符串長度】

string 類型的使用場景:

  1. String 通常用於保存單個字符串或 JSON 字符串數據。
  2. 因爲 String 是二進制安全的,所以可以把保密要求高的圖片文件內容作爲字符串來存儲。
  3. 計數器,常規 Key-Value 緩存應用,如微博數、粉絲數。INCR 本身就具有原子性特性,所以不會有線程安全問題。

hash

Redis hash 是一個 string 類型的 field 和 value 的映射表,hash特別適用於存儲對象。每個 hash 可以存儲2^32-1個鍵值對。可以看成 key 和 value 的 map 容器。相比於 JSON,hash 佔用很少的內存空間。

  • HSET key field value【爲指定的 key 設定 field 和 value】

    HMSET key field value [field1 value1 …] 【爲 key 增加多個 field value 映射】

  • HDEL key field [field1 …]【刪除一個或多個指定字段】

  • 修改使用 HSET、HMSET 即可

  • HGET key field【獲取指定字段的 value】

    HMGET key field [field1 …] 【獲取多個字段的 value】

    HGETALL key【返回 key 對應的所有的值】

    HKEYS key 【返回 key 對應的所有 field】

    HLEN key 【獲取 field 的個數】

注意:

  1. s 是一個 string 類型的數據 key,HSET 是不可以覆蓋其數據的。

  2. 但是 h 是一個 hash 類型的數據 key,SET 是可以用字符串覆蓋其中的數據的。

  3. 相比於存儲對象的 string 類型的 json 串,json 串修改單個屬性需要將整個值取出來。而 hash 不需要。

  4. 相比於多個 key-value 存儲對象,hash 節省了很多內存空間。

  5. 如果 hash 的屬性值被刪除完,那麼 hash 的 key 也會被 redis 刪除。

list

類似於 Java 中的 Linklist 類型。

  • LPUSH key val1 [val2 …]【頭插法將 val 插入】

    RPUSH key val1 [val2 …]【尾插發將 val 插入】

    LPUSHX key val1 [val2 …]【從左側插入值,如果 list 不存在,則不操作】

    RPUSHX key val1 [val2 …]【從右側插入值,如果 list 不存在,則不操作】

  • LPOP key【從左側 pop 一個元素】

    RPOP key【從右側 pop】

    BLPOP key [key1 …] timeout【移除並獲取列表第一個元素,如果列表沒有元素會阻塞列表到等待超時或發現可彈出元素爲止,timeout 單位秒】

    BRPOP key [key1 …] timeout【類似上面】

    LTRIM key start stop【對列表進行修改,讓列表只保留指定區間的元素,不在指定區間的元素就會被刪除】

  • LSET key index value【指定索引的值修改】

    LINSERT key BEFORE|AFTER pivot value【在列表元素前或則後插入元素】

  • LLEN key【獲取 key 對應的 list 長度】

    LINDEX key index【獲取指定 index 的元素】

    LRANGE key start stop【獲取列表指定範圍的元素,stop 爲 -1 表示最後一個,-2 表示倒數第二個…】

  • 其他

    RPOPLPUSH list1 list2【移除 list1 最後一個元素,並將該元素添加到 list2 左邊並返回此元素】

    用此命令可以實現訂單下單流程、用戶系統登錄註冊短信等。

應用場景:

  1. 對數據大的集合數據刪減

    列表顯示、關注列表、粉絲列表、留言評價…分頁、熱點新聞等。

  2. 任務隊列

    list 通常用來實現一個消息隊列,而且可以確保先後順序,不必像 MySQL 那樣通過 order by 來排序。

set

唯一、無序。

  • SADD key value1 [value2 …] 【向集合添加成員】

  • SREM key member1 [member2 …]【移除集合中一個或多個成員】

    SPOP key【移除並返回集合中的一個隨機元素】

  • SMOVE source destination member【將member元素從source集合移動到destination集合】

  • SCARD key【返回集合成員數】

    SMEMBERS key【返回集合中所有成員】

    SISMEMBER key member【判斷 memeber 元素是否是集合 key 成員的成員】

    SRANDMEMBER key [count]【返回集合中一個或多個隨機數】

  • 其他

    SDIFF key1 key2【差集;集合1 - 集合2(集合1有的集合2沒有的)】

    SDIFFSTORE destination key1 key2【返回集合差集並存儲在 destination 中】

    SINTER key1 key2【交集】

    SINTERSTORE destination key1 key2【交集放在 dest 中】

    SUNION key1 key2【並集】

    SUNIONSTORE destination key1 key2【同理】

對兩個集合間的數據[計算]進行交集、並集、差集運算。

使用姿勢:

  1. 以非常方便的實現如共同關注、共同喜好、二度好友等功能。

    對上面的所有集合操作,你還可以使用不同的命令選擇將結果返回給客戶端還是存儲到一個新的集合中。

  2. 利用唯一性,可以統計訪問網站的所有獨立 IP。

zset

有序且不重複。每個元素都會關聯一個 double 類型的分數,Redis 通過分數進行從小到大的排序。分數可以重複。

  • ZADD key score1 member1 [score2 member2 …]

  • ZREM key member1 [member2 …]【移除指定元素】

    ZREMRANGE key start stop【移除有序集合中給定的排名區間的所有成員(第一名是0)(低到高排序)】

    ZREMRANGEBYSCORE key min max【移除有序集合中給定的分數區間的所有成員】

  • ZCARD key【獲取 key 中元素的數量】

    ZCOUNT key min max【計算在有序集合中指定區間(min-max)分數的成員數】

    ZRANK key member【返回元素的索引】

    ZRANGE key start stop【返回索引 start-stop 的元素,stop=-1 表示最後一個元素,從小到大】

    ZREVRANGE key start stop【從大到小】

使用姿勢:

  1. 常用於排行榜(成績、積分榜)。
  2. 還可以用 zset 來做帶權重的隊列,讓重要的任務先執行。

其他功能特性

發佈、訂閱

Redis 發佈訂閱 (pub/sub) 是一種消息通信模式:發送者(pub)發送消息,訂閱者(sub)接收消息。

Redis 客戶端可以訂閱任意數量的頻道。

比如:你和你的好兄弟都訂閱了關注了共青團中央的頻道,當共青團中央發送一條動態的時候你和你的好兄弟都會受到這條動態消息。

命令:

SUBSCRIBE channel1 [channel2 …]【訂閱一個或多個頻道】

PSUBSCRIBE pattern1 [pattern2 …]【訂閱符合 pattern 的頻道】

PUBLISH channel message【向指定頻道發送message】

UNSUBSCRIBE [channel [channel …]]【退訂指定頻道】

PUNSUBSCRIBE [pattern [pattern …]]【退訂符合 pattern 的頻道】

使用姿勢:

  1. 構建實時的消息系統,比如普通聊天、羣聊等功能。
  2. 博客網站訂閱,當作者發佈就可以推送給粉絲。
  3. 微信公衆號模式。

多數據庫

SELECT db 切換到 db(0 ~ 15)

MOVE key db 將 key 移動到某個 db

FLUSHDB 清空當前數據庫

FLUSHALL 清空所有數據庫

事物

事務可以一次執行多個命令,按順序地串行化執行,執行過程中不允許其他命令插入執行序列中。

  1. Redis 會將一個事務中的所有命令序列化,然後按順序執行。
  2. 執行中不會被其他命令插入,不允許加塞行爲。

MULTI 標記一個事物的開始。

DISCARD 取消事物,放棄執行事物塊內的所有命令。

EXEC 執行事物。

WATCH key [key …] 監視一個/多個 key,如果事物執行之前 key 被其他命令所改動,那麼事物將被打斷。

UNWATCH 取消 WATCH 命令對所有 key 的監視。

栗子1:正常用法

127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> get account:a
QUEUED
127.0.0.1:6379> get account:b
QUEUED
127.0.0.1:6379> DECRby account:a 50
QUEUED
127.0.0.1:6379> INCRBY account:b 50
QUEUED
127.0.0.1:6379> exec 
1) "80"
2) "10"
3) (integer) 30
4) (integer) 60

栗子2:類似於運行時錯誤

127.0.0.1:6379> MULTI 
OK
127.0.0.1:6379> set hello hello
QUEUED
127.0.0.1:6379> incr hello
QUEUED
127.0.0.1:6379> get hello
QUEUED
127.0.0.1:6379> exec 
1) OK
2) (error) ERR value is not an integer or out of range
3) "hello"

栗子3:類似於編譯錯誤

127.0.0.1:6379> MULTI 
OK
127.0.0.1:6379> set aaa 123
QUEUED
127.0.0.1:6379> fsadadasd
(error) ERR unknown command `fsadadasd`, with args beginning with: 
127.0.0.1:6379> get aaa
QUEUED
127.0.0.1:6379> exec
(error) EXECABORT Transaction discarded because of previous errors.

栗子4:WATCH 被打斷的用法

127.0.0.1:6379> WATCH account:b
OK
127.0.0.1:6379> MULTI
OK
127.0.0.1:6379> get account:b
QUEUED
127.0.0.1:6379> incrby account:b 10
QUEUED
127.0.0.1:6379> exec
(nil)  # 在另一個終端改變了 account:b 的值,所以執行事物的結果是 nil

持久化

  1. RDB

    RDB 是 Redis 默認持久化機制。RDB 相當於快照,保存的是一種狀態。

    保存速度、還原速度極快、適用於災難備份。

    小內存的機器不符合使用。RDB機制符合要求(配置文件中的規則)就會快照。

  2. AOF

    如果 Redis 意外 down 掉,RDB 方式會丟失最後一次快照後的所有修改。如果要求應用不能丟失任何修改,可以採用 AOF 持久化方式。

    AOF:Append-Only File:Redis會將沒一個收到寫命令都追加到文件中(默認是appendonly.aof)。當Redis重啓時會通過重新執行文件中的寫命令重建整個數據庫的內容。

    產生問題:有些命令是多餘的,比如執行了 100 次incr num,99 次都是多餘的。


參考:

https://blog.csdn.net/qq_33423418/article/details/101351944


EOF

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章