天天看點

【Redis】redis資料結構和常用指令Redis資料結構Redis的多資料庫Redis常用指令

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号資料庫:

【Redis】redis資料結構和常用指令Redis資料結構Redis的多資料庫Redis常用指令

可以通過

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的生存時間:緩存的資料一般都是需要設定生存時間的,即:到期後資料銷毀。

  • expire key seconds

    :設定key的生存時間(機關:秒)key在多少秒後會自動删除
  • ttl key

    :檢視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

指令不區分插入和更新操作,當執行插入操作時

hset

指令傳回1,當執行更新操作時傳回0
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