垃圾萌新,因為要用到一些東西所以現學,隨手記錄一下
內容可能有點勾史
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-cli
裡 help <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
:鍵必須存在才能設定成功。可單獨用setnx
和setxx
替代
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 對。hmset
和hset
似乎是效果相同的🤔:如果不存在 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>...]
:返回多個集合的差集
未完待續。先發上來玩玩