Redis是一種基于記憶體的資料庫,并且提供一定的持久化功能,它是一種鍵值(key-value)資料庫,使用 key 作為索引找到目前緩存的資料,并且傳回給程式調用者。
Redis資料結構
目前的 Redis 支援 6 種資料類型,它們分别是字元串(String)、清單(List)、集合(set)、哈希結構(hash)、有序集合(zset)和基數(HyperLogLog)
資料類型 | 資料類型存儲的值 | 說明 |
---|---|---|
String(字元串) | 可以儲存字元串、整數和浮點數 | 可以對字元串進行操作,比如增加字元串或者求字串;如果是整數或者浮點數,可以實作計算,比如自增等 |
List(清單) | 它是一個連結清單,它的每一個節點都包含一個字元串 | Redis支援從連結清單的兩端插入或者彈出節點,或者通過偏移對它進行裁剪;還可以讀取一個或者多個節點,根據條件删除或者查找節點等 |
Set(集合) | 它是一個收集器,但是是無序的,在它裡面每一個元素都是一個字元串,而且是獨一無二,各不相同的 | 可以新增、讀取、删除每個元素;檢測一個元素是否在集合中;計算它和其它集合的交集、并集和差集等;随機從集合中讀取元素 |
Hash(哈希散清單) | 它類似于Java語言中的Map,是一個鍵值對應的無序清單 | 可以增、删、改、查單個鍵值對,也可以擷取所有的鍵值對 |
ZSet(有序集合) | 它是一個有序的集合,可以包含字元串、整數、浮點數、分值(score)、元素的排序是依據分值的大小來決定的 | 可以增、删、改、查根據分值的範圍或者成員來擷取對應的元素 |
HyperLogLog(基數) | 它的作用是計算重複的值,以确定存儲的數量 | 隻提供基數的運算,不提供傳回的功能 |
Redis的多資料庫
在說常用指令前,先了解一下redis的多資料庫。一個redis執行個體key包括多個資料庫,用戶端可以指定連接配接某個redis執行個體的哪個資料庫,就好比一個mysql中建立多個資料庫,用戶端連接配接時指定連接配接哪個資料庫。一個redis執行個體最多可提供16個資料庫,下标從0-15,用戶端預設連接配接第0号資料庫:
可以通過
select
選擇連接配接哪個資料庫,如下連接配接1号庫:
192.168.159.129:6379> select 1
OK
192.168.159.129:6379[1]> keys *
(empty list or set)
Redis常用指令
Key鍵值的基本指令
keys
:傳回滿足給定pattern 的所有key
keys user* //查詢以user開頭的key
keys * //查詢所有的key
exists key
:确認一個key 是否存在,存在傳回1
192.168.159.129:6379> exists password1
(integer) 0
192.168.159.129:6379> exists password
(integer) 1
del key
:删除一個key
192.168.159.129:6379> del password1 //文法: del key 删除存在的key傳回1,不存在的key傳回0
(integer) 0
192.168.159.129:6379> del password
(integer) 1
rename oldkey newkey
:重命名key
192.168.159.129:6379> rename k1 k2
OK
192.168.159.129:6379> keys *
1) "k2"
2) "username"
type key
:傳回值的類型
192.168.159.129:6379> type username
string
設定key的生存時間:緩存的資料一般都是需要設定生存時間的,即:到期後資料銷毀。
-
:設定key的生存時間(機關:秒)key在多少秒後會自動删除expire key seconds
-
:檢視key剩餘的生存時間ttl key
-
:清除生存時間persist key
192.168.159.129:6379> set a1 123
OK
192.168.159.129:6379> expire a1 60
(integer) 1
192.168.159.129:6379> ttl a1
(integer) 49
192.168.159.129:6379> ttl a1
(integer) 46
192.168.159.129:6379> persist a1
(integer) 1
192.168.159.129:6379> ttl a1
(integer) -1
info
:擷取伺服器資訊和統計
flushdb
:删除目前選擇資料庫中的所有key
flushall
:删除所有資料庫中的所有key(謹慎使用)
String類型
指派文法:
set key value
192.168.159.129:6379> set k1 lisi
OK
取值文法:
get key
192.168.159.129:6379> get k1
"list"
設定多個鍵文法:
mset key value [key value …]
192.168.159.129:6379> mset s1 zhangsan s2 lisi
OK
擷取多個鍵值文法:
mget key [key …]
192.168.159.129:6379> mget s1 s2
1) "zhangsan"
2) "lisi"
删除文法:
del key
192.168.159.129:6379> del s2
(integer) 1
192.168.159.129:6379> get s2
(nil)
字元串數字的遞增與遞減
遞增數字:當存儲的字元串是整數時,Redis提供了一個實用的指令 incr
,其作用是讓目前鍵值遞增,并傳回遞增後的值。
遞增數字文法:
incr key
192.168.159.129:6379> set num 1
OK
192.168.159.129:6379> get num
"1"
192.168.159.129:6379> incr num
(integer) 2
遞減數值文法:
decr key
192.168.159.129:6379> get num
"3"
192.168.159.129:6379> decr num
(integer) 2
增加指定的整數文法:
incrby key increment
192.168.159.129:6379> get num
"4"
192.168.159.129:6379> incrby num 5
(integer) 9
減少指定的整數文法:
decrby key decrement
192.168.159.129:6379> get num
"9"
192.168.159.129:6379> decrby num 6
(integer) 3
Hash散列
hash叫散列類型,它提供了字段和字段值的映射。字段值隻能是字元串類型,不支援散列類型、集合類型等其它類型。相當于是對象格式的存儲。
指派文法:
hset key field value
設定一個字段值,指令不區分插入和更新操作,當執行插入操作時
hset
指令傳回1,當執行更新操作時傳回0
hset
192.168.159.129:6379> hset user1 username '張三'
(integer) 1
192.168.159.129:6379> hset user1 username '李四'
(integer) 0
取值文法:
hget key field
192.168.159.129:6379> hget user1 username
李四
設定多個字段文法:
hmset key field value [field value ...]
192.168.159.129:6379> hmset user1 password 123 age 18
OK
取多個值文法:
hmget key field [field ...]
192.168.159.129:6379> hmget user1 password age
123
18
擷取所有字段值文法:
hgetall key
192.168.159.129:6379> hgetall user1
username
李四
password
123
age
18
删除字段文法:
hdel key field [field ...]
192.168.159.129:6379> hdel user1 username
1
192.168.159.129:6379> hgetall user1
password
123
age
18
List隊列
Redis的list是采用連結清單來存儲,雙向連結清單存儲資料,特點:增删快、查詢慢(Linkedlist)。這個隊列是有序的。
向清單左邊增加元素:
lpush key value [value ...]
從清單左邊彈出元素:
lpop key
(臨時存儲,彈出後從隊列中清除)
192.168.159.129:6379> lpush alist a1 a2 a3
3
192.168.159.129:6379> lpop alist
a3
向清單右邊增加元素:
rpush key value [value ...]
從清單右邊彈出元素:
rpop key
192.168.159.129:6379> rpush blist b1 b2 b3
3
192.168.159.129:6379> rpop blist
b3
擷取清單中元素的個數:
llen key
192.168.159.129:6379> llen blist
2
檢視清單文法:
lrange key start stop
- 将傳回start、stop之間的所有元素(包含兩端的元素),索引從0開始,可以是負數,如:“-1”代表最後的一個元素。
192.168.159.129:6379> lrange blist 0 1
b1
b2
臨時存儲,先進先出。使用雙向連結清單:
1、左邊進,右邊出
192.168.159.129:6379> lpush stulist stu1 stu2 stu3 stu4
4
192.168.159.129:6379> rpop stulist
stu1
192.168.159.129:6379> rpop stulist
stu2
2、右邊進,左邊出
192.168.159.129:6379> rpush userlist user1 user2 user3 user4
4
192.168.159.129:6379> lpop userlist
user1
192.168.159.129:6379> lpop userlist
user2
Set集合
Set集合類型:無序、不可重複
增加元素文法:
sadd key member [member ...]
192.168.159.129:6379> sadd slist stu1 stu2
2
删除元素文法:
srem key member [member ...]
192.168.159.129:6379> srem slist stu2
1
獲得集合中的所有元素:
smembers key
192.168.159.129:6379> smembers slist
stu1
判斷元素是否在集合中:
sismember key member
192.168.159.129:6379> smembers slist
stu1
stu3
stu4
192.168.159.129:6379> sismember slist stu1
1
192.168.159.129:6379> sismember slist stu2
0
Zset有序集合
Sortedset又叫zset,是有序集合,可排序的,但是唯一。 Sortedset和set的不同之處,是會給set中的元素添加一個分數,然後通過這個分數進行排序。
增加元素:
zadd key score member [score member ...]
- 向有序集合中加入一個元素和該元素的分數(score),如果該元素已經存在則會用新的分數替換原有的分數。
- 添加帶分數(可用學生成績,銷售數量等來做分數,友善計算排序):
192.168.159.128:6379> zadd num1 90 stu1 80 stu2 70 stu3
3
獲得排名在某個範圍的元素清單,并按照元素分數降序傳回:
zrevrange key start stop [WITHSCORES]
獲得元素的分數的可以在指令尾部加上WITHSCORES參數
應用:商品銷售量,學生排名等
192.168.159.128:6379> zadd num1 90 stu1 80 stu2 70 stu3
3
192.168.159.128:6379> zrevrange num1 0 3 withscores
stu1
90
stu2
80
stu3
70
擷取元素的分數:
zscore key member
192.168.159.128:6379> zadd num1 55 stu4
1
192.168.159.128:6379> zscore num1 stu4
55
删除元素:
zrem key member [member ...]
192.168.159.128:6379> zrevrange num1 0 4
stu1
stu2
stu3
stu4
192.168.159.128:6379> zrem num1 stu4
1
192.168.159.128:6379> zrevrange num1 0 4
stu1
stu2
stu3
給某一個屬性加分數或減分,減分時使用負數:
zincrby key increment member
192.168.159.128:6379> zscore num1 stu1
90
192.168.159.128:6379> zincrby num1 5 stu1
95
192.168.159.128:6379> zincrby num1 -10 stu1
85
HyoperLogLog基數
HyperLogLog是一種使用随機化的算法,以少量記憶體提供集合中唯一進制素數量的近似值。
HyperLogLog 可以接受多個元素作為輸入,并給出輸入元素的基數估算值:
- 基數:集合中不同元素的數量。比如 {‘apple’, ‘banana’, ‘cherry’, ‘banana’, ‘apple’} 的基數就是 3 。
- 估算值:算法給出的基數并不是精确的,可能會比實際稍微多一些或者稍微少一些,但會控制在合理的範圍之内。
HyperLogLog 的優點是,即使輸入元素的數量或者體積非常非常大,計算基數所需的空間總是固定的、并且是很小的。
在 Redis 裡面,每個 HyperLogLog 鍵隻需要花費 12 KB 記憶體,就可以計算接近 2^64 個不同元素的基數。這和計算基數時,元素越多耗費記憶體就越多的集合形成鮮明對比。
但是,因為 HyperLogLog 隻會根據輸入元素來計算基數,而不會儲存輸入元素本身,是以 HyperLogLog 不能像集合那樣,傳回輸入的各個元素。
HyperLogLog 相關的一些基本指令:
指令 | 說明 |
---|---|
pfadd key element [element …] | 将指定的元素添加到指定的HyperLogLog 中 |
pfcount key [key …] | 傳回給定 HyperLogLog 的基數估算值 |
pfmerge destkey sourcekey [sourcekey …] | 将多個 HyperLogLog 合并為一個 HyperLogLog |
示例:
192.168.159.128:6379> pfadd mykey "redis" "java" "mysql"
1
192.168.159.128:6379> pfcount mykey
3