【Redis學習】Redis筆記(一)——特點、基礎命令和資料結構
- 更新時間:2018-10-13
Redis的特性
- 速度快
- 持久化(斷電不丟資料)
- 多種資料結構
- 支援多種客戶端語言
- 功能豐富
- 操作簡單
- 主從複製
- 高可用,分散式
Redis的通用命令
-
keys:計算鍵
key * # 遍歷所有key
keys命令支援正則匹配,如
keys h*
表示便利店以h開頭的所有key。因為redis是單執行緒,keys命令一般不在生產環境中使用。
keys *怎麼用?
- 熱備從節點
- scan
-
dbsize:計算key的總數
dbsize
時間複雜度是O(1),可以在線上隨意使用
-
exists:判斷key是否存在
exists key
時間複雜度是O(1),存在返回1,不存在返回0
-
del:刪除指定的key,可以同時刪除多個
del key
成功刪除返回1,如果key不存在返回0
-
expire:給key設定過期時間
expire key seconds
-
ttl:檢視剩餘過期時間
tth key
返回-2表明key已經不存在,被刪除了;返回-1表明key存在,但沒有設定過期時間
-
persist:撤銷過期時間
persist key
-
type:返回key的型別
type key
時間複雜度
命令 時間複雜度 keys O(n) dbsize O(1) del O(1) exists O(1) expire O(1) type O(1)
資料結構和內部編碼
資料結構
-
string
-
結構和命令
- 可以是“字串”、“數字”、“二進位制”
- value limited:Up to 512MB
-
使用場景
- 快取
- 計數器
- 分散式鎖
-
常用命令
get key
mget key1 key2 ...
:批量獲取key,原子操作mset key1 value1 key2 value2 ...
:批量設定key-value
set key
set key value
:不管key是否存在,都設定setnx key value
:key不存在時才設定set key value xx
:key存在時才設定
del key
incr
:自增1decr
:與incr
相反incrby
:自增kdecrby
:與incrby
相反 -
查缺補漏
getset key newvalue
:設定新的value並返回舊的value,O(1)append key value
:將value追加到舊的value,O(1)strlen key
:返回字串的長度(注意中文,每個中文佔2個位元組),O(1)incrbyfloat key 1.1
:自增浮點數,自減時設定負值就okgetrange key start end
:獲取字串指定下標的所有值setrange key index value
:設定指定下標多有對應的值
命令 複雜度 set key value
O(1) get key
O(1) del key
O(1) setnx
orsetxx
O(1) incr
ordecr
O(1) mget
ormset
O(n) -
-
hash
- 特點
- 鍵值結構:key field value
- 常用命令
hget key field
:獲取hash key對應field的value,O(1)hset key field
:設定hash key對應field的value,O(1)hdel key field
:刪除hash key對應field的value,O(1)hexists key field
:判斷hash key是否有field,O(1)hlen key
:獲取hash key field的數量hmget key field1 field2 ...
:批量獲取hash key的一批field對應的值,O(n)hmset key1 field1 key2 field2...
:批量設定hash key的一批field value,O(n)
- 查缺補漏
hsetnx key field value
:設定hash key對應field的value,如果field已經存在,則失敗,O(1)hincrby key field intCounter
:hash key對應的field的value自增intCounter,O(1)hincrbyfloat key field floatCountry
:hincrby浮點數版,O(1)
- 特點
-
list
-
特點
- 有序
- 可重複
- 左右兩邊插入彈出
-
常用命令
-
rpush key value1 value2...
:從列表右邊插入值 -
lpush key value1 value2...
:從列表左邊插入值 -
linsert key before|after value newValue
:在列表指定的值前|後插入值 -
lpop key
:從左邊彈出元素 -
rpop key
:從右邊彈出元素 -
lrem key count value
:根據count的值,從列表中刪除所有value相等的項,O(n)(1)count>0,從左到右,刪除最多count個value相等的項
(2)count<0,從右到左,刪除最多count個value相等的項
(3)count=0,刪除所有value相等的項
-
ltrim key start end
:按照索引範圍修建列表 -
lrange key start end
:獲取列表指定索引範圍所有item,包含end -
lindex key index
:獲取列表索引對應的value -
llen key
:獲取列表長度 -
lset key index newValue
:設定列表指定索引值為newValue
-
-
查缺補漏
blpop key timeout
:lpop 阻塞版本,timeout是阻塞超時時間,timeout=0為永遠不阻塞,O(1)brpop key timeout
:rpop阻塞版本,timeout是阻塞超時時間,timeout=0為永遠不阻塞,O(1)
-
Tips
LPUSH + LPOP = Stack
LPUSH + RPOP = Queue
LPUSH + LTRIM = Capped Collection
LPUSH + BRPOP = Message Queue
-
-
set
- 特點
- 無序
- 不重複
- 常用命令
sadd key element
:向集合key新增element,如果element已經存在,則新增失敗
- 查缺補漏
- 特點
-
zset
-
記錄網站訪問量
incr userid:pageview
hincrby user:1:info pageview count
單執行緒架構
redis是單執行緒架構,命令是序列的,上一個命令執行完了才會執行下一條命令。
-
單執行緒為什麼這麼快?
1.純記憶體:記憶體的響應速度快(主要原因)
2.非阻塞IO
3.避免前程切換和竟態消耗
單執行緒
- 拒絕長命令,如:keys,flushall,flushdb,slow lua script,multi/exec,operate big value
- redis其實不是完全單執行緒
- fysnc file descriptor
- close file descriptor