Redis中有幾種比較經常使用基礎的對象,本文將會詳細介紹string、hash、list、set、zset對象底層實現數據結構以及它們的常見應用場景與特色redis
源碼位置位於server.h文件中605行開始算法
typedef struct redisObject {
unsigned type:4;
unsigned encoding:4;
unsigned lru:LRU_BITS;
int refcount;
void *ptr;
} robj;
複製代碼
redis中實際的對象類型,分爲5種0-4聲明。位於文件server.h中466行緩存
#define OBJ_STRING 0 /* String object. */
#define OBJ_LIST 1 /* List object. */
#define OBJ_SET 2 /* Set object. */
#define OBJ_ZSET 3 /* Sorted set object. */
#define OBJ_HASH 4 /* Hash object. */
複製代碼
redis五種對象string、list、hash、set、zset會用到的八種編碼格式,每一種編碼都對應一個數據結構安全
#define OBJ_ENCODING_RAW 0
#define OBJ_ENCODING_INT 1
#define OBJ_ENCODING_HT 2
#define OBJ_ENCODING_ZIPLIST 5
#define OBJ_ENCODING_INTSET 6
#define OBJ_ENCODING_SKIPLIST 7
#define OBJ_ENCODING_EMBSTR 8
#define OBJ_ENCODING_QUICKLIST 9
複製代碼
redis中內存的回收採用了比較簡單的引用計數法進行,每一個對象引用就refcount + 1,當這個引用計數減小爲0時內存就會被回收bash
# 存儲
set key value
# 互斥存儲
# 已存在的key再次存入數據不會更改緩存
setnx key value
# 過時存儲,單位秒
# 設定key過時時間,到期自動刪除
setex key seconds value
# 過時存儲,單位毫秒
psetex key milliseconds value
# 批量存儲
mset key value [key value ...]
# 取值
get key
# 批量取值
mget key [key ...]
# 追加
append key value
# 長度
strlen key
# 自增,只能是int編碼的字符串
incr key
# 自定義步長自增
incrby key increment
# 自減,只能是int編碼的字符串
# 這個能夠減到負數,秒殺扣減庫存啥的想一想能不能用這個命令
decr key
# 自定義步長自減
decrby key increment
複製代碼
配置參數位置位於redis.con文件中1083行和1099行微信
# 建立list並壓入節點
# 壓入節點位於鏈表頭
lpush key value
# 壓入節點位於鏈表尾
rpush key value
# 彈出list頭節點
lpop key
# 彈出list尾節點
rpop key
# 刪除節點
# count > 0 從左開始搜索刪除count數量的value
# count < 0 從右開始搜索刪除|count|數量的value
# count = 0 刪除list中全部value
lrem key count value
# 範圍保留
# -1 表示列表最後一個元素
# -2 表示倒數第二個,以此類推
ltrim key start stop
# 計算長度
llen key
# 索引查詢節點
# index < 0 從右開始搜索
# index > 0 從左開始搜索
lindex key index
# 範圍查詢
# stop = -1 表示全部
lrange key start stop
# 阻塞彈出
# 隊列中沒有節點時會一直等待
# 多個key時表示挨着順序依次檢查,知道找到非空列表爲止
# timeout能夠設置等待時間,0表示一直等待
blpop key [key...] timeout
brpop key [key...] timeout
複製代碼
# 存儲
hset key field value
# 不容許更改存儲
# 若field值存在則本次存儲不會覆蓋原有value值
hsetnx key field value
# 批量存儲
hmset key field value [field value ...]
# 查詢
hget key field
# 批量查詢
hmget key field [field ...]
# 全量查詢
hgetall key
# 全量查詢field值
hkeys key
# 全量查詢value值
hvals key
# 刪除field
hdel key field [field ...]
# 計算鍵值對數量
hlen key
# field存在判斷
hexists key field
# 增量式迭代
# cursor表示迭代開始的遊標
# count 表示迭代返回數據數量
# pattern 表示正則匹配結果限制
hscan key cursor [Count count] [Match pattern]
複製代碼
# 存儲
sadd member [member ...]
# 彈出元素並返回
spop key count
# 查詢全部元素
smembers key [count]
# 計算元素數量
scard key
# 刪除指定元素
srem key member [member ...]
# 判斷元素存在
sismember key member
# 計算給定集合與後續集合差集
# 返回計算結果
sdiff key [key ...]
# 計算給定集合與後續集合差集
# 存儲結果到destination並返回
sdiffstore destination key [key ...]
# 計算給定集合與後續集合交集
# 返回計算結果
sinter key [key ...]
# 計算給定集合與後續集合差集
# 存儲結果到destination並返回
sinterstore destination key [key ...]
# 計算給定集合與後續集合差集
# 返回計算結果
sunion key [key ...]
# 計算給定集合與後續集合差集
# 存儲結果到destination並返回
sunionstore destination key [key ...]
複製代碼
# 存儲
# xx 表示當zset中存在本次插入的member時才存儲
# nx 表示當zset中不存在本次插入的member時才存儲
zadd key [nx|xx] score member [score member ...]
# 查詢排序指定[start,stop]範圍內元素
# withscores 查詢結果順帶返回元素分數
zrange key start stop [withscores]
# 查詢指定元素分數
zscore key member
# 元素數量統計
zcard key
# 返回score位於[min,max]區間的元素數量
zcount key min max
# 對指定元素分數增長incrment值
zincrby key incrment member
# 返回指定分數區間範圍內元素
# withscores 返回時攜帶分數一塊兒返回
# limit offset count表示跳過offset數量結果再返回count數量結果
zrangebyscore key min max [withscores] [limit offset count]
# 倒序返回指定分數區間範圍內元素
# withscores 返回時攜帶分數一塊兒返回
# limit offset count表示跳過offset數量結果再返回count數量結果
zrevrangebyscore key max min [withrescores] [limit offset count]
# 刪除指定分數範圍[min,max]內元素
zremrangebyscore key min max
# 移除指定元素
zrem key member
複製代碼