Redis常用命令API整理

點贊多大膽,就有多大產!有支持纔有動力!

乾貨滿滿,擺好姿勢,點贊發車

命令分類

  1. 通用命令
  2. 字符串類型
  3. 哈希類型
  4. 列表類型
  5. 集合類型
  6. 有序集合類型

通用命令

這裏列出我們常用的命令,全部命令請參考redis官網:http://www.redis.cn/commands.html#

keys pattern

說明:遍歷出所有的key,*爲pattern參數,也就是匹配符,類似於正則表達式,keys命令一般不推薦在生產環境中使用,因爲如果我們的key非常多,檢索起來就非常慢,這個命令比較重,而且redis是單線程的會阻塞其他的命令,如果我們需要檢索key,可以使用scan命令

127.0.0.1:6379> keys *
1) "k1"

dbsize

說明:計算key的總數

127.0.0.1:6379> dbsize
(integer) 1

exists key

說明:查看key是否存在,返回值 1存在,0不存在

127.0.0.1:6379> exists k1
(integer) 1
127.0.0.1:6379> exists k2
(integer) 0

del key[key...]

說明:刪除指定的一個key或者一組key,返回值是刪除key的個數

127.0.0.1:6379> del k1
(integer) 1

expire key seconds

說明:設置key的過期時間,單位爲秒,返回值1說明設置成功,返回0說明key不存在或設置失敗

127.0.0.1:6379> expire k4 30
(integer) 1

pexpire key milliseconds

說明:以毫秒爲單位設置過期時間

127.0.0.1:6379> pexpire k5 90000
(integer) 1

ttl key

說明:查看key的過期時間,以秒爲單位,返回值-1永不過期,-2已過期

127.0.0.1:6379> ttl k5
(integer) 87

pttl key

說明:查看key的過期時間以毫秒爲單位

127.0.0.1:6379> pttl k1
(integer) 76151

persist key

說明:移除key的過期時間

127.0.0.1:6379> persist k1
(integer) 1
127.0.0.1:6379> ttl k1
(integer) -1

type key

說明:返回key對應的數據類型,分別爲string、list、set、zset、hash五種數據類型,如果key不存在返回none

127.0.0.1:6379> type k1
string
127.0.0.1:6379> type k2
none

Redis實現原理

數據結構和內部編碼

我們可以參考這位大佬的博文:https://www.cnblogs.com/yangmingxianshen/p/8054094.html,有詳細的數據結構和內部編碼實現,我這裏只做一下總結,Redis中的五種數據結構,每一種都有兩種以上的內部實現,多種內部編碼實現可以在不同應用場景下發揮各自優勢。

redis單線程

redis是單線程的,在同一個瞬間只可能執行一條命令

那麼爲什麼redis的單線程會這麼快呢?

1、主要原因是redis是純內存操作,類似於HashMap,HashMap的優勢就是查找和操作的時間複雜度都是O(1)速度非常快

2、使用多路I/O複用模型,非阻塞I/O

3、單線程避免線程切換和競態消耗,單線程指的是網絡請求模塊使用了一個線程(所以不需考慮併發安全性),即一個線程處理所有網絡請求,其他模塊仍用了多個線程。

注意

1、一次只執行一條命令

2、拒絕長(慢)命令

keys、flushall、flushdb、slow lua script等時間複雜度高的

String

說明

string 是 redis 最基本的類型,你可以理解成與 Memcached 一模一樣的類型,一個 key 對應一個 value。value可以是簡單字符串,也可以是複雜的字符串比如JSON,XML等,也可以是數字(小數、整數),甚至是圖片或者序列化後的對象,value是一個安全的二進制數據,string 類型是 Redis 最基本的數據類型,string 類型的值最大能存儲 512MB。

String類型的使用場景:用來做緩存、計數器、分佈式鎖等等。

常用命令

set key value : 設置 key 對應 string 類型的值, 返回 1 表示成功, 0 失敗。(說明,設置key多次會覆蓋)
setnx(not exist) key value: 如果 key 不存在進行設置,存在就不需要進行設置了,返回0
set key value [ex seconds/px milliseconds]: 設置值的同時設置過期時間
get key: 獲取 key 對應的 string 值,如果 key 不存在返回 nil(在redis中nil代表爲空)
getset key value : 先獲取 key 的值,再設置 key 的值。
mset key1 value1 … : 一次設置多個 key 的值, 成功返回 1 表示所有的值都設置了,失敗返回 0 表示沒有任何值被設置。
mget key1 key2 … keyN : 一次獲取多個 key 的值
msetnx key1 value1 … : 一次設置多個 key 的值,但是不會覆蓋已經存在的 key
incr key: 遞增,注意 incr 一個不是 int 的 value 會返回錯誤,incr 一個不在的 key,則設置 key 值爲 1。
decr key : 遞減, decr 一個不存在 key,則設置 key 值爲-1。
incrby key integer: 對 key 加上指定值 , key 不存在設置 key,並認爲原來的 value是 0。
decrby key integer: 對 key 減去指定值。decrby 完全是爲了可讀性,我們完全可以通過 incrby一個負值來實現同樣效果,反之一樣。
incrbyfloat key float:增加對應的浮點數,沒有減去指定值,我們可以傳入負數來實現該功能
append[key]方法: 字符串追加方法
strlen[key]方法: 獲取字符串的長度
getrange key startindex endstart 獲取指定範圍的字符串
setrange key 10 value(10表示從第幾位開始替換,後面跟上替換的字符串)

Hash

說明

Hash類型是String類型的field和value的映射表,或者說一個String集合。它特別適合存儲對象相比較而言,將一個對象類型存儲在Hash類型裏要比存儲在String類型裏佔用更少的內存空間並方便存取整個對象

Hash應用場景:用一個對象來存儲用戶信息,商品信息,訂單信息等等。

常用命令

hset key field value: 設置 hash field 爲指定值,如果 key 不存在,則創建
hget key field : 獲取指定的 hash field。
hmget key filed1…fieldN : 獲取全部指定的 hash filed。
hmset key filed1 value1 … filedN valueN : 同時設置 hash 的多個 field。
hincrby key field integer: 指定步長增加。成功返回 hash filed 變更後的值。
hexists key field : 檢測指定 field 是否存在。
hdel key field: 刪除指定的 hash field。
hlen key: 返回指定 hash 的 field 數量。
hkeys key: 返回 hash 的所有 field。
hvals key : 返回 hash 的所有 value。
hgetall : 返回 hash 的所有 filed 和 value

與String對比

存儲用戶信息使用String和Hash存儲有什麼區別?

使用String類型存儲

用戶ID爲查找的key,存儲的value用戶對象包含姓名,年齡,生日等信息,如果用普通的key/value結構來存儲,主要有以下2種存儲方式:

方式一:

第一種方式將用戶ID作爲查找key,把其他信息封裝成一個對象以序列化的方式存儲,這種方式的缺點是,增加了序列化/反序列化的開銷,並且在需要修改其中一項信息時,需要把整個對象取回,並且修改操作需要對併發進行保護,引入CAS等複雜問題。

方式二:

第二種方法是這個用戶信息對象有多少成員就存成多少個key-value對,用戶ID+對應屬性的名稱作爲唯一標識來取得對應屬性的值,雖然省去了序列化開銷和併發問題,但是用戶ID爲重複存儲,如果存在大量這樣的數據,內存浪費還是非常可觀的

Hash存儲

Redis的Hash實際是內部存儲的Value爲一個HashMap,並提供了直接存取這個Map成員的接口,Key仍然是用戶ID, value是一個Map,這個Map的key是成員的屬性名,value是屬性值,這樣對數據的修改和存取都可以直接通過其內部Map的Key(Redis裏稱內部Map的key爲field), 也就是通過 key(用戶ID) + field(屬性標籤) 就可以操作對應屬性數據了,既不需要重複存儲數據,也不會帶來序列化和併發修改控制的問題,很好的解決了問題。

List

說明

list 列表是簡單的字符串列表,按照插入順序排序,數據可以重複。你可以添加一個元素到列表的頭部(左邊)或者尾部(右邊),既可以作爲棧,又可以作爲隊列

常用命令

lpush key string: 在 key 對應 list 的頭部添加字符串元素,返回 1 表示成功, 0 表示 key 存在且不是 list 類型。
rpush key string: 在 key 對應 list 的尾部添加字符串元素
llen key: 返回 key 對應 list 的長度, 如果 key 不存在返回 0
lrange key start end: 返回指定區間內的元素, 下標從 0 開始, 負值表示從後面計算, -1 表示倒數第一個元素 , key 不存在返回空列表。
ltrim key start end : 截取 list 指定區間內元素,成功返回 OK, key 不存在返回錯誤。
lset key index value: 設置 list 中指定下標的元素值,成功返回 1, key 或者下標不存在返回錯誤。
lrem key count value : 從 List 的頭部(count 正數)或尾部(count 負數)刪除一定數量(count)匹配 value 的元素,返回刪除的元素數量。count 爲 0 時候刪除全部。
lpop key: 從 list 的頭部刪除並返回刪除元素。
rpop key: 從 list 的尾部刪除並返回刪除元素
rpoplpush source destination: 從source列表中刪除最後一個元素,添加到des列表中第一個
lindex key index: 返回名稱爲key的list中index位置的元素
linsert key BEFORE|AFTER pivot value:把 value 插入存於 key 的列表中在基準值 pivot 的前面或後面

List應用場景:好友列表,粉絲列表,消息隊列,最新消息排行等

Set

說明

set是string類型的無序集合。集合是通過hashtable實現的,概念和數學中集合基本類似,可以交集,並集,差集等等,set中的元素是沒有順序並且不可重複。所以添加,刪除,查找的複雜度都是O(1)

常用命令

sadd key member: 添加一個 string 元素到 key 對應 set 集合中,成功返回 1,如果元素以及在集合中則返回 0, key 對應的 set 不存在則返回錯誤。
srem key member: 從 key 對應 set 中移除指定元素,返回刪除個數,集合中不存在或者key不存在返回 0,如果 key 對應的不是 set 類型的值返回錯誤。
spop key [count]: 刪除並返回 key 對應 set 中隨機的一個元素,如果 set 是空或者 key 不存在返回nil。
srandmember key [count]: 隨機取 set 中的一個元素,但是不刪除元素。
smove srckey dstkey member: 從 srckey 對應 set 中移除 member 並添加到 dstkey 對應 set 中,整個操作是原子的。 成功返回 1,如果 member 在 srckey 中不存在返回 0, 如果 key 不是 set類型返回錯誤。相當於剪切複製
scard key: 返回 set 的元素個數,如果 set 是空或者 key 不存在返回 0。
sismember key member: 判斷 member 是否在 set 中,存在返回 1, 0 表示不存在或者 key 不存在。
sinter key1 key2 …… keyN : 返回所有給定 key 的交集。
sinterstore dstkey key1 … keyN : 返回所有給定 key 的交集, 並保存交集存到 dstkey 下。
sunion key1 key2 … keyN: 返回所有給定 key 的並集。
sunionstore dstkey key1 … keyN: 返回所有給定 key 的並集, 並保存並集到 dstkey
sdiff key1 key2 … keyN: 返回所有給定 key 的差集。
sdiffstore dstkey key1 … keyN: 返回所有給定 key 的差集,並保存差集到 dstkey
smembers key: 返回 key 對應 set 的所有元素,結果是無序的,如果集合中數據很多,不建議使用
scan key:掃描數據

Set應用場景:共同關注、共同喜好、二度好友、分類標籤等功能

sorted set(Zset)

說明

sorted set 是有序集合, 它在 set 的基礎上增加了一個順序屬性(score),這一屬性在添加,修改元素的時候可以指定, 每次指定後, 會自動重新按新的值調整順序。 可以理解了有兩列的mysql 表,一列存 value,一列存score

常用命令

zadd key score member: 添加元素到集合,元素在集合中存在則更新對應 score
zrem key member: 刪除指定元素, 1 表示成功,如果元素不存在返回 0
zincrby key incr member : 增加對應 member 的 score 值, 然後移動元素並保持 skip list 保持有
序。返回更新後的 score 值
zrank key member : 返回指定元素在集合中的排名(下標), 集合中元素是按 score 從小到大排序的
zrevrank key member : 同上,但是集合中元素是按 score 從大到小排序
zrange key start end : 類似 lrange 操作從集合中去指定區間的元素。返回的是有序結果
zrevrange key start end: 同上,返回結果是按 score 逆序的
zrangebyscore key min max: 返回集合中 score 在給定區間的元素
zcount key min max: 返回集合中 score 在給定區間的數量
zcard key: 返回集合中元素個數
zscore key element: 返回給定元素對應的 score

sorted set使用場景:排行榜等

路漫漫其修遠兮,吾將上下而求索

聽說點讚的都有貓了

 

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