Redis是一個開源的使用ANSI C語言編寫、遵守BSD協定、支援網路、可基於記憶體亦可持久化的日誌型、Key-Value數據庫,並提供多種語言的API。
它通常被稱爲數據結構伺服器,因爲值(value)可以是 字串(String), 雜湊(Hash), 列表(list), 集合(sets) 和 有序集合(sorted sets)等型別。
String是Redis最基本的數據型別,上面的簡介中也說到Redis是用c語言開發的。但是Redis中的字串和c語言中的字串型別卻是有明顯的區別;
string型別是Redis最基本的數據型別,一個redis中字串value最多可以是512M
基本命令
命令 | 說明 | 案例 |
---|---|---|
set | 新增key-value | set username admin |
get | 根據key獲取數據 | get username |
strlen | 獲取key的長度 | strlen key |
exists | 判斷key是否存在 | exists name 返回1存在 0不存在 |
del | 刪除redis中的key | del key |
keys | 用於查詢符合條件的key | keys * 查詢redis中全部的key;keys n?me 使用佔位符獲取數據;keys nam* 獲取nam開頭的數據 |
mset | 賦值多個key-value | mset key1 value1 key2 value2 key3 value3 |
mget | 獲取多個key的值 | mget key1 key2 |
append | 對某個key的值進行追加 | append key value |
type | 檢查某個key的型別 | type key |
select | 切換redis數據庫 | select 0-15 redis中共有16個數據庫 |
flushdb | 清空單個數據庫 | flushdb |
flushall | 清空全部數據庫 | flushall |
incr | 自動加1 | incr key |
decr | 自動減1 | decr key |
incrby | 指定數值新增 | incrby 10 |
decrby | 指定數值減 decrby 10 | |
expire | 指定key的生效時間 單位秒 | expire key 20 key20秒後失效 |
pexpire | 指定key的失效時間 單位毫秒 | pexpire key 2000;key 2000毫秒後失效 |
ttl | 檢查key的剩餘存活時間 | ttl key |
persist | 復原key的失效時間 | persist key |
setex(set with expire)鍵秒值
setex:設定帶過期時間的key,動態設定。
setex 鍵 秒值 真實值
setnx(set if not exist)
setex(set with expire)鍵秒值/setnx(set if not exist)
**應用場景:**保證圖片(Base64);統計粉絲數;包含使用者資訊
Redis中的List集合是雙端回圈列表,分別可以從左右兩個方向插入數據.
底層實際是個鏈表
List集合可以當做佇列使用,也可以當做棧使用
佇列:存入數據的方向和獲取數據的方向相反
棧:存入數據的方向和獲取數據的方向相同
基本命令
命令 | 說明 | 案例 |
---|---|---|
lpush | 從佇列的左邊入隊一個或多個元素 | LPUSH key value [value …] |
rpush | 從佇列的右邊入隊一個或多個元素 | RPUSH key value [value …] |
lpop | 從佇列的左端出隊一個元素 | LPOP key |
rpop | 從佇列的右端出隊一個元素 | RPOP key |
lpushx | 當佇列存在時從佇列的左側入隊一個元素 | LPUSHX key value |
rpushx | 當佇列存在時從佇列的右側入隊一個元素 | RPUSHx key value |
lrange | 從列表中獲取指定返回的元素 | LRANGE key start stop |
Lrange key 0 -1 | 獲取全部佇列的數據 | |
lrem | 從存於 key 的列表裏移除前 count 次出現的值爲 value 的元素 | |
Lset | 設定 index 位置的list元素的值爲 value | LSET key index value |
效能總結
它是一個字串鏈表,left、right都可以插入新增;
如果鍵不存在,建立新的鏈表;
如果鍵已存在,新增內容;
如果值全移除,對應的鍵也就消失了。
鏈表的操作無論是頭和尾效率都極高,但假如是對中間元素進行操作,效率就很慘淡了。
應用場景:阻塞佇列
Redis hash 是一個鍵值對集合。
Redis hash是一個string型別的field和value的對映表,hash特別適合用於儲存物件。
類似Java裏面的Map<String,Object>
Hash物件的實現方式有兩種分別是ziplist、hashtable,其中hashtable的儲存方式key是String型別的,value也是以key value的形式進行儲存。
字典型別的底層就是hashtable實現的,明白了字典的底層實現原理也就是明白了hashtable的實現原理,hashtable的實現原理可以於HashMap的是底層原理相類比
例子:User物件{id:2,name:小明,age:19}
基本命令:
命令 | 說明 | 案例 |
---|---|---|
hset | 爲物件新增數據 | hset key field value |
hget | 獲取物件的屬性值 | hget key field |
hexists | 判斷物件的屬性是否存在 | HEXISTS key field;1表示存在 0表示不存在 |
hdel | 刪除hash中的屬性 | hdel user field [field …] |
hgetall | 獲取hash全部元素和值 | HGETALL key |
hkyes | 獲取hash中的所有欄位 | HKEYS key |
hlen | 獲取hash中所有屬性的數量 | hlen key |
hmget | 獲取hash裏面指定欄位的值 | hmget key field [field …] |
hmset | 爲hash的多個欄位設定值 | hmset key field value [field value …] |
hsetnx | 設定hash的一個欄位,只有當這個欄位不存在時有效 | HSETNX key field value |
hstrlen | 獲取hash中指定key的長度 | HSTRLEN key field |
hvals | 獲取hash的所有值 | HVALS user |
Set(集合)
Redis的Set是string型別的無序集合。它是通過HashTable實現實現的,
基本命令
命令 | 說明 |
---|---|
sadd key value | 向set新增元素 |
srem key value | 從set中移除元素 |
smembers key | 取出所有set元素 |
sismember key value | 檢視value是否存在set中 |
sunion key1 key2 … keyn | 將所有key合併後取出來,相同的值只取一次 |
scard key | 獲取set中元素的個數 |
srandmember key | return a random element from a set, without removing the element.隨機取出一個 |
sdiff key1 key2 … keyn | 獲取第一set中不存在後面幾個set裡的元素。 |
sdiffstore dstkey key1 key2 … keyn | 和sdiff相同,獲取key1中不存在其他key裡的元素,但要儲存到dstkey中。 |
sinter key1 key2 … keyn | 取出這些set的交集 |
sinterstore dstkey key1 key2 … keyn | 取出這些key的交集並儲存到dstkey |
smove srckey dstkey member | 將元素member從srckey中轉移到dstkey中,這個操作是原子的。 |
應用場景:去重、抽獎、共同好友、二度好友
基本命令
zset(sorted set:有序集合)
Redis zset 和 set 一樣也是string型別元素的集合,且不允許重複的成員。
不同的是每個元素都會關聯一個double型別的分數。
redis正是通過分數來爲集閤中的成員進行從小到大的排序。zset的成員是唯一的,但分數(score)卻可以重複
實現原理
與set無順序儲存不同,Zset按score順序進行儲存,這也是爲什麼基本操作都是O(log(N))複雜度。
Redis使用兩種結構儲存zset,在數據個數較少時使用ziplist,數量超出閾值時使用skiplist,閾值通過zset-max-ziplist-entries and zset-max-ziplist-value設定
redis zset內部實現
Redis Zset 實現原理
命令 | 說明 |
---|---|
zadd key score member | 向有序set中新增元素member,其中score爲分數,預設升序; |
zrange key start end [withscores] | 獲取按score從低到高索引範圍內的元素,索引可以是負數,-1表示最後一個,-2表示倒數第二個,即從後往前。withscores可選,表示獲取包括分數。 |
zrevrange key start end [withscores] | 同上,但score從高到低排序。 |
zcount key min man | 獲取score在min和max範圍內的元素的個數 |
zcard key | 獲取集閤中元素的個數。 |
zincrby key increment member | 根據元素,score原子增加increment. |
zremrangebyscore key min max | 清空集合內的score位於min和max之間的元素。 |
zrank key member | 獲取元素的索引(照score從低到高排列)。 |
zrem key member | 移除集閤中的該元素 |
zscore key member | 獲取該元素的score |
應用場景:排行榜前前10名的選手
最詳細的redis五種數據結構詳解
https://juejin.im/post/6844904192042074126
Redis 和 I/O 多路複用
https://draveness.me/redis-io-multiplexing/
中文文件
http://www.redis.cn/