民科技術速記

熹圜發表於2024-03-10

垃圾萌新,因為要用到一些東西所以現學,隨手記錄一下

內容可能有點勾史


Redis

Ref:https://zhuanlan.zhihu.com/p/469102289

Remote Dictionary Server / 遠端字典服務,開源軟體

基於記憶體的 key-value 的 NOSQL 資料庫


首先想辦法安裝。以下假如安裝目錄是 /etc/redis

/etc/redis/bin 裡是一些常用可執行檔案

  • redis 後臺啟動
redis-server [<configfile>]

其中 <configfile> 是一份配置檔案。示例配置檔案在 /etc/redis/redis.conf,可以 cp 出來然後修改

檢視 redis 是不是後臺活著:

ps aux | grep redis
  • redis 客戶端
redis-cli [-h <host>] [-p <port>]

連線到某 redis 資料庫。host 和 port 可以不填,預設 127.0.0.1:6379

  • 關閉 redis 後臺

法一:首先 ps 一下得到 redis 後臺 pid,然後直接 kill <pid> 紗了。不優雅

法二:開客戶端連線上,然後執行命令 shutdown。或者直接 redis-cli [options] shutdown 也行


作為 key-value 資料庫,redis 儲存的所有 pair 的鍵名 key 都是字串,而 value 支援的資料結構型別有很多種

資料型別有 string,hash,list,set,zset(有序集合)。同時每種資料結構的底層實現有不同種,稱為「內部編碼」,redis 會根據儲存內容自己選擇如何存資料

  • 使用 object encoding <key> 來查詢 <key> 鍵對應的 value 的內部編碼

以下簡介常用命令

完整介紹可以在 redis-clihelp <command>,或者去翻 redis 文件


全域性命令

  • keys <pattern>:Returns all key names that match a pattern.

    比如 keys * 返回所有鍵

  • dbsize:返回鍵總數

  • exiests <key> [<key>...]:檢查鍵是否存在

  • del <key> [<key>...]:刪除鍵

  • expire <key> <second>:設定鍵 <key><second> 後過期

  • ttl <key>:返回 <key> 多長時間後過期

    如果一個鍵未被設定 ttl 那他就是無限期的,ttl 返回 -1

    一個已死的鍵,或者是不存在的鍵(其實是一種東西),ttl 返回 -2

  • type <key>:返回 <key> 所存的值的資料結構型別


string

  • set <key> <value> [<ex> seconds|<px> milliseconds] [nx|xx],設定 kv 對
    • ex:設定秒級過期時間
    • px:毫秒級過期時間
    • nx:鍵必須之前不存在才能設定成功。xx:鍵必須存在才能設定成功。可單獨用 setnxsetxx 替代
  • get <key> 獲取值
  • mset <key> <value> [<key> <value>...]:批次設定值
  • mget <key> [<key>...]:批次獲取值
  • incr <key>:將值為整數字符串的 +1
    • 值不是表示合法整數的字串,返回錯誤
    • 值是整數,返回自增後的結果
    • 鍵不存在,建立鍵,預設初始為 0,在此之上自增 1
  • decr <key>:自減,同上
  • incrby <key> <increment>:增加指定值
  • decrby <key> <increment>:減去指定值
  • incrbyfloat <key> <increment>:浮點

hash

hash 資料結構維護的是一個 hash table,裡面存著一堆 kv 對,被稱為 field-value

當一個雜湊表裡的所有 field 都被刪乾淨了,其 key 和雜湊表自動消失

  • hset <key> <field> <value> [<field> <value>...]

    建立或者修改 <key> 指向的雜湊表裡的若干 field-value pair。返回新建立的 field 有多少個

  • hget <key> <field>:返回 <key> 指向的雜湊表裡 <field> 的 value

  • hdel <key> <field> [<field>...]:刪除 field

  • hlen <key>:返回一個雜湊表裡的 field 個數

  • hmset <key> <field> <value> [<field> <value>...]:批次設定 field-value 對。hmsethset 似乎是效果相同的🤔:如果不存在 field 則建立,如果存在則修改其值

  • hmget <key> <field> [<field>...]:獲取一些 field 對應的 value

  • hexists <key> <field>:檢查某 field 是否存在

  • hkeys <key>:獲取 <key> 指向的雜湊表的所有 field

  • hvals <key>:獲取所有 value

  • hgetall <key>:獲取所有的 field-value 對。返回的陣列裡按照一個 field 一個 value 這樣順序擺放

  • hincrby <key> <field> <increment>:跟 incrby 一樣

  • hincrbyfloat <key> <field> <increment>:浮點

這裡有個比較生動的 hash 示例圖:

lists

底層實現是個雙向連結串列

和 hash 一樣,如果連結串列裡沒元素了連結串列就會自己消失

  • lpush <key> <element> [<element>...]:左 push 元素到連結串列,如果沒有 key 就建立

  • rpush <key> <element> [<element>...]:右 push

  • linsert <key> (before|after) <pivot> <element>:在 key 指向的連結串列裡,找到最左出現的值為 <pivot> 的元素,在其前/後插入新的元素 <element>

    可以把列表看成是一個雙端佇列,支援左右 push,下標由左到右遞增,before 的意思是在靠下標更小的一側插入

  • lrange <key> <start> <stop>:返回一個 list 一個下標範圍內的內容

    • 返回的是 [<start>, <stop>] 這個閉區間內的列表
    • 列表的下標和 python list 同。具體來說:從左往右下標從 0 開始遞增。而且從右至左,有另一種下標 -1,-2,...。
    • 如果 <start> 的位置比 <stop> 靠右,返回空而不報錯

    比如我們可以用 lrange <key> 0 -1 來取得所有元素

  • lindex <key> <index>:根據下標取得元素

  • llen <key>:返回長度

  • lpop <key> [<count>]:lpop 元素。如果不指定 <count> 就 pop 一個

  • rpop <key> [<count>]:rpop 元素

  • lrem <key> <count> <element>:從列表中刪除 <count><element>

    • count > 0:從左到右,刪除最多 count 個元素
    • count < 0:從右到左,刪除最多 abs(count) 個元素
    • count = 0:刪除所有
  • ltrim <key> <start> <end>:修剪 list,使得只保留 [<start>, <end>] 閉區間裡的元素

  • lset <key> <index> <element>:將 <index> 處的元素修改為 <element>

  • blpop <key> [<key>...] <timeout>:在一個或多個 list 「阻塞左彈出」元素

    具體來說,redis 會逐個檢視給出的 list,一旦發現當前考慮到的 list 非空,則左彈出一個元素返回。否則 redis 會開始阻塞,直到給出的 list 裡有一個變為非空,或者到達 timeout 時間

  • brpop <key> [<key>...] <timeout>:阻塞右彈出

利用 lpush + brpop 兩個命令,可以使用 redis 實現類似訊息佇列的效果

set

set 維護無序的 element 集合。當最後一個 element 從 set 刪除時,set 自動消失

  • sadd <key> <element> [<element>...]:新增元素到 key 所指向的 set,如果 key 不存在則建立。返回新新增的元素個數,set 裡已經有的元素不會重複被新增
  • srem <key> <element> [<element>...]:刪除元素。返回被成功刪除的元素個數,如果某元素未在 set 裡出現則忽略
  • smembers <key>:獲取一個 set 裡的所有元素
  • sismember <key> <element>:檢查一個元素是否在一個 set 裡
  • scard <key>:返回一個集合的元素個數,複雜度 O(1)
  • spop <key> [<count>]:從一個集合裡隨機彈出 1 個或至多 count 個元素
  • srandmember <key> [<count>]:從一個集合裡隨機返回 1 個或至多 count 個元素
  • sinter <key> [<key>...]:返回多個集合的交集
  • sunion <key> [<key>...]:返回多個集合的並集
  • sdiff <key> [<key>...]:返回多個集合的差集

未完待續。先發上來玩玩

相關文章