Contents

Redis 小記

常常專案使用 redis
但並沒有深入了解
因為 Redis 一般看範例就知道怎麼使用了
真的非常簡單
但我覺得用那麼多次
沒深入了解不是很好
這篇整理一下

安裝

上一篇是用 ansible 安裝 redis
這篇就不做了…

其個更快的話可以用 apt install redis-server

Redis 一般常用類型

  1. String (最大可存 512 MB)
  2. Hash
  3. List
  4. Map
  5. Sorted Map(zmap)

一般常用指令

keys *

一般線上不會用這個指令,好像會有阻塞的可能。

dbsize

回傳 key 的數量。

exists

查詢 key 是否存在。

return 1 存在,0 不存在

del

刪除 key

expire

設定 key 結束時間

ttl

查看 key 剩餘時間

-1 沒有限制
-2 沒有 key 存在

type

查看 key 的類型

incr

會把 key 的 value 加 1

這個是 redis 適合做計數器

類型相關指令

String

set

set

四個 option

setex

setex key second value

跟
set key value
expire key second
一樣動作

set key value ex second

setnx

key 不存在才做設定值

mset

mset key1 value1 key2 value2

可以多個設定值

一般 set
n次set時間=n次網路時間+n次命令
但是 mset 只需要一次網路時間
mset時間=1次網路時間+n次命令

mget

跟 mset 與 set 關係差不多
如上。

找不到會回傳 nil(null)

append

append key value

會在 value 值後面加入新 value 值
就算不存在也不會有問題

strlen

key 的 value 長度
沒資料的話,回傳 0

getset

getset key value
回傳值是舊值

Hash

hset

hset key field value

hset user:1 name josh

hget

hget key field

hget user:1 name

hsetnx

hsetnx key field value

hdel

hdel 刪除 key 的 field

hlen

hlen 抓取 key 的長度

hkeys

這邊 hkeys 跟 key 完全沒有關係
列出 key 裡面的 field

hmset,hmget

hmset key field1 value1 field2 value2 …

hexist

hmget key field1 filed2 …

hvals

hvals key

hgetall

hgetall 會把所有field,value抓出來。
老實說我還不知道這個能做什麼?
會阻塞,可以使用 hscan 代替

hstrlen

抓取 key field 長度

hincrby

hincrby key field 1
回傳累加值

hincrbyfloat

hincrbyfloat key filed
回傳累加值

List

lpush

lpush key value

l => left
在 list 左邊加入 value

rpush

r => right
同上,但家在右邊 list

lpop

l => left
移除(拿出) 左邊 list 的 value

rpop

同上,是右邊

llen

llen list(key)

lrem

lrem list(key) count value

根據參數 count 的值,移除列表中與參數 value 相等的元素。
count 的值可以是以下幾種:
count > 0 : 從表頭開始向表尾搜索,移除與 value 相等的元素,數量為 count 。
count < 0 : 從表尾開始向表頭搜索,移除與 value 相等的元素,數量為 count 的絕對值。
count = 0 : 移除表中所有與 value 相等的值。

LREM key count value — Redis 命令参考

lrange

返回列表 key 中指定區間內的元素,區間以偏移量 start 和 stop 指定。

下標(index)參數 start 和 stop 都以 0 為底,也就是說,以 0 表示列表的第一個元素,以 1 表示列表的第二個元素,以此類推。

你也可以使用負數下標,以 -1 表示列表的最後一個元素, -2 表示列表的倒數第二個元素,以此類推。

LRANGE key start stop — Redis 命令參考

lindex

lindex key index
回傳 list 的位置 value值

brpop

阻塞 rpop

brpush

阻塞 rpush

總整理

新增: rpush lpush linsert
查詢: lrange lindex llen
刪除: lpop rpop lrem ltrim
修改: lset
阻塞動作: blpop brpop

Message Queue 消息對列 是用 lpush,brpop
但跟 lpush ,rpop 不能做嗎?
後來發現 rpop 不會阻塞
在這邊程式用 while 迴圈 CPU 一定會爆表(吃很多資源)

Set

sset

sset key element …

srem

srem key element

scard

算出 set 個數

sismember

set is member ?

判斷 set 裡面有沒有 指定的值

spop

移除一個 set 的值

回傳移除的值

srandmember

srandmember key [count]

隨機回傳 set 的 member(資料)

smember

smember key

回傳 set 所有值(member)

PS: smembers 和 lrange,hgetall 都會造成阻塞可能性。通常會用 sscan 替代

set 運算集

sinter (交集)

sinter key [key …]

sunion (聯集)

sunion key [key …]

sdiff (差集)

sdiff key [key …]

集合存在…

sinterstore destination key [key …]
sunionstore destination key [key …]
sdiffstore destination key [key …]

sorted set

zadd

sadd key [option] score member [score member …]

option
nx: member 必須不存在
xx: member 必須存在
CH:修改從加入新的元素,以改變元件的總數(CH是改變的縮寫)的數目的返回值. 更改的元素是添加的新元素以及已為其更新分數的現有元素. 因此,命令行中指定的具有與過去相同分數的元素將不計算在內. 注意:通常, ZADD的返回值僅計算添加的新元素的數量.這個還不是很懂
ZADD – Redis 中文文檔教程
INCR: 數值累加

zcard

查詢 zset 個數

zsocre

這個很重要。沒有 zget
zscore key member
得到設定分數

排名

zrank

zrank key member

查詢 member 排名
由小到大

zrevrank

zrevrank 排名(倒敘)
由大到小

zrem

zrem key member [member …]

刪除 member

zincrby

zincrby key increment member

給 member 增加 score

zrange,zrevrange

由小到大
zrange key start end [withscores]
由大到小
zrevrange key start end [withscores]

ex: zrange zset 0 100

withscores 是同時返回 score 分數

zrangebyscore, zrevrangebyscore

zrangebyscore key min max [withscores] [limit offset count]

zrevrangebyscore key min max [withscores] [limit offset count]

指定範圍返回 member

-inf,+inf => 無限小,無限大
小括號 ( 大於
ex: zrangebyscore user:rank (200 +inf withscores

zcount

zcount key min max

抓取分數區間的 member 個數

zremrangebyrank , zremrangebyscore

zremrangebyrank key start end

刪除 rank 排名(0開始)

ex: zremrangebyrank user:rank 0 3

zremrangebyscore key min max

zremrangebyscore user:rank (250 +inf

集運算

交集
zinterstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum|min|max]

weight 權重
aggregate 交集後做的 score 動作。預設是 sum

并集

zunionstore destination numkeys key [key …] [weights weight [weight …]] [aggregate sum|min|max]

zset 小結論

set 跟 zset 指令差非常多
一般常用在 排行榜上面

有在思考資料會一直存在 redis ?

經過 Google 一翻,正常會把資料回傳到 MySQL

更多文章

搜尋一些

redis 學習路線

網路上找到的圖

redis.png

一些找網路文章