簡簡單單入個Redis的門

Redis介紹

Redis是一種key-value的存儲系統,它是一種nosql(Not Only [SQL])非關係型的資料庫,它支援string(字元串)、list(鏈表)、set(集合)、hash(哈希類型)和zset(sorted set –有序集合)數據類型,這些數據類型有著豐富的操作,且均具有原子性。

Redis基本指令

keys *

前面已經介紹,Redis是一種key-value的存儲系統,** keys * ** 便是查看當前庫里有何鍵;
當前庫中無任何鍵,所以輸入** keys * **則返回(empty list or set);

127.0.0.1:6379> keys *
(empty list or set)

輸入set k1 v1(設置k1的鍵對應的value值為v1)
set k2 v2(設置k2的鍵對應的value值為v2)

127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK

此時再輸入** keys * ** 則返回k2和k1兩個鍵

127.0.0.1:6379> keys *
1) "k2"
2) "k1"

exists < key >

exists < key > 用來判斷某個鍵是否存在;
剛才已經設置了k1和k2兩個鍵;
我們先輸入一下exists k1試試看;

127.0.0.1:6379> exists k1
(integer) 1

我們輸入exists k3試試看

127.0.0.1:6379> exists k3
(integer) 0

我們發現,當存在這個鍵時返回1,當不存在時返回0;

type < key >

type < key > 用來查看某個鍵的類型;
後面介紹了五大數據類型後,一一嘗試此指令;

del < key >

del < key >用來刪除某個鍵;
此時當前庫中有k1和k2兩個鍵,如輸入del k1

127.0.0.1:6379> del k1
(integer) 1

再來查看庫中的鍵,只剩k2了

127.0.0.1:6379> keys *
1) "k2"

如果輸入一個不存在的鍵呢?

127.0.0.1:6379> del k3
(integer) 0

會返回0

expire < key > < seconds >

expire < key > < seconds > 為已經存在的鍵設置過期時間(單位秒)
如輸入expire k2 10,那麼k2鍵將會在10秒後過期;

127.0.0.1:6379> expire k2 10
(integer) 1

10秒後再查看當前庫中的鍵

127.0.0.1:6379> keys *
(empty list or set)

當前庫已經空了;

ttl < key >

ttl < key > 用來查看某個鍵還有多長時間過期:
-1表示永不過期;
-2表示已過期;
依次輸入
set test1 1
set test2 2

127.0.0.1:6379> set test1 1
OK
127.0.0.1:6379> set test2 2
OK

此時庫中有test1和test2兩個鍵
輸入
expire test1 20
意味著給test1設置20秒的過期時間

127.0.0.1:6379> expire test1 20
(integer) 1

一直輸入ttl test1

127.0.0.1:6379> ttl test1
(integer) 16
127.0.0.1:6379> ttl test1
(integer) 12
127.0.0.1:6379> ttl test1
(integer) 8
127.0.0.1:6379> ttl test1
(integer) 2
127.0.0.1:6379> ttl test1
(integer) -2
127.0.0.1:6379> 

可以看到其過期時間,為-2則為已過期
輸入ttl test2查看test2的過期時間

127.0.0.1:6379> ttl test2
(integer) -1

-1表示永不過期

dbsize

此指令用來查看當前redis庫中的key的數量;
目前庫中只有test2一個鍵

127.0.0.1:6379> dbsize
(integer) 1

返回1

flushdb

flushdb用來清空當前庫,將當前庫中所有鍵刪掉

127.0.0.1:6379> flushdb
OK

再輸入dbsize

127.0.0.1:6379> dbsize
(integer) 0

數量已經為0

flushall

此指令用來通殺全部庫;
當redis 伺服器初始化時,會預先分配 16 個資料庫(該數量可以通過配置文件配置),我們只用了16個庫中的一個,使用此命令會清空所有庫中的鍵,慎用。

可存儲的五大數據類型

在介紹前,先輸入flushdb清空下當前redis庫

127.0.0.1:6379> flushdb
OK

String——字元串

redis的鍵可以存儲字元串String類型的值;下面介紹其相關指令:

set < key > < value >

set < key > < value >用來設置鍵值對;
如我依次輸入
set keyString1 abc
set keyString2 123

127.0.0.1:6379> set keyString1 abc
OK
127.0.0.1:6379> set keyString2 123
OK

用type < key >指令查看類型

127.0.0.1:6379> type keyString1
string
127.0.0.1:6379> type keyString2
string

get < key >

此指令用來查詢key對應的值;
如輸入get keyString1

127.0.0.1:6379> get keyString1      
"abc"

append < key > < tailvalue >

此指令用於將給定的< tailvalue >增加到原來< key >對應的value之後;
目前keyString2 對應 “123”;
如輸入append keyString2 xyz

127.0.0.1:6379> append keyString2 xyz
(integer) 6

返回其長度6;
再輸入get keyString2如下

127.0.0.1:6379> get keyString2
"123xyz"

strlen < key >

此指令獲取< key >對應的值的長度;
如下:

127.0.0.1:6379> strlen keyString1
(integer) 3
127.0.0.1:6379> strlen keyString2
(integer) 6

setnx < key > < value >

此指令的用法是:
只有當< key >不存在時才設置鍵值對;

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString2"

此時當前庫中有兩個鍵;
如輸入 setnx keyString3 mnopq

127.0.0.1:6379> setnx keyString3 mnopq
(integer) 1

返回1;
查看當前庫中鍵,查看keyString3對應的值

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> get keyString3
"mnopq"

如輸入 setnx keyString1 mnopq

127.0.0.1:6379> setnx keyString1 mnopq
(integer) 0
127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> get keyString1
"abc"

由此可見,未改變keyString1的值。

incr < key >

此指令用於將key中儲存的數字字元串值增加1 (只能對數字字元串值操作,如果為空,新增值為1);
如輸入以下內容:

127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString3"
3) "keyString2"
127.0.0.1:6379> set keyString4 123456
OK
127.0.0.1:6379> incr keyString4
(integer) 123457
127.0.0.1:6379> get keyString1
"abc"
127.0.0.1:6379> incr keyString1
(error) ERR value is not an integer or out of range
127.0.0.1:6379> incr keyString5
(integer) 1
127.0.0.1:6379> keys *
1) "keyString1"
2) "keyString4"
3) "keyString3"
4) "keyString5"
5) "keyString2"
127.0.0.1:6379> get keyString5
"1"

decr < key >

將key中儲存的數字值字元串減去1 (只能對數字字元串值操作,如果為空,新增值為-1);
與incr < key > 類似

incrby / decrby < key > < 步長 >

將key中存儲的數字值字元串增加/減去自定義步長(只能對數字字元串值操作,如果為空,新增值為步長或者負步長);

mset < key1 > < value1 > < key2 > < value2 > …..

此指令用於同時設置一個或多個 key-value對 ,與set < key > < value >類似,不過是多設置幾個;

mget < key1 > < key2 > < key3 > …..

同時獲取一個或多個 value ;與get < key >類似,不過是獲取多個值;

msetnx < key1 > < value1 > < key2 > < value2 > …..

當且僅當所有給定 key 都不存在時,同時設置一個或多個 key-value 對 ;
與setnx < key > < value >類似;

getrange < key > < 起始位置 > < 結束位置 >

此指令獲得值的範圍(包前也包後)

127.0.0.1:6379> set keyString6 123456abcdef
OK
127.0.0.1:6379> getrange keyString6 0 6
"123456a"
127.0.0.1:6379> getrange keyString6 1 5
"23456"

如想獲取從開始到結束的字元串,結束位置用-1即可;

127.0.0.1:6379> getrange keyString6 0 -1
"123456abcdef"

setrange < key > < 起始位置 > < value2 >

從< 起始位置 >用< value2>開始覆寫< key > 所儲存的字元串值;
如下所示:

127.0.0.1:6379> get keyString6
"123456abcdef"
127.0.0.1:6379> setrange keyString6 2 xyz
(integer) 12
127.0.0.1:6379> get keyString6
"12xyz6abcdef"

setex < key > < 過期時間 > < value >

設置鍵值的同時,設置過期時間,單位秒

127.0.0.1:6379> setex kkk 20 123
OK
127.0.0.1:6379> ttl kkk
(integer) 17
127.0.0.1:6379> ttl kkk
(integer) 12
127.0.0.1:6379> ttl kkk
(integer) 9
127.0.0.1:6379> ttl kkk
(integer) 4
127.0.0.1:6379> ttl kkk
(integer) 1
127.0.0.1:6379> ttl kkk
(integer) -2

getset < key > < value >

以新換舊,設置了新值同時獲得舊值;
如:

127.0.0.1:6379> get keyString1
"abc"
127.0.0.1:6379> getset keyString1 123
"abc"
127.0.0.1:6379> get keyString1
"123"

list——字元串列表

其底層是雙向鏈表,兩端操作性能高,通過索引下標操作中間節點性能較差,下面介紹其指令:

lpush/rpush < key > < value1 > < value2 > < value3 > ….

該指令用於從左邊/右邊插入一個或多個值;
輸入如下:

127.0.0.1:6379> lpush myList1 1 2 3 4 5 6
(integer) 6
127.0.0.1:6379> rpush myList2 a b c d e f
(integer) 6
127.0.0.1:6379> lpush myList3 7 8 9
(integer) 3
127.0.0.1:6379> rpush myList3 x y z
(integer) 6

用type查看類型

127.0.0.1:6379> type myList2
list

myList1從左邊插入,1先進入,2後進入…所以6在最左邊,1在最右邊;
myList2從右邊插入,a先進入,b後進入…a在最左邊,f在最右邊;
myList3先從左邊插入,7先進入,8後進入,9最後進入,所以從左到右依次時,9,8,7;
myList3再從右邊插入,插入後,從左到右依次是,9,8,7,x,y,z;

lrange < key > < start > < stop >

按照索引下標獲得元素(從左到右);

127.0.0.1:6379> lrange myList1 0 -1
1) "6"
2) "5"
3) "4"
4) "3"
5) "2"
6) "1"
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lrange myList3 0 -1
1) "9"
2) "8"
3) "7"
4) "x"
5) "y"
6) "z"
127.0.0.1:6379> lrange myList1 0 2
1) "6"
2) "5"
3) "4"
127.0.0.1:6379> 

lpop/rpop < key >

從左邊/右邊吐出一個值 值在鍵在,值光鍵亡;

127.0.0.1:6379> lpop myList1
"6"
127.0.0.1:6379> lrange myList1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
5) "1"
127.0.0.1:6379> rpop myList1
"1"
127.0.0.1:6379> lrange myList1 0 -1
1) "5"
2) "4"
3) "3"
4) "2"
127.0.0.1:6379> lpop myList1
"5"
127.0.0.1:6379> lpop myList1
"4"
127.0.0.1:6379> lpop myList1
"3"
127.0.0.1:6379> lpop myList1
"2"
127.0.0.1:6379> lpop myList1
(nil)
127.0.0.1:6379> exists myList1
(integer) 0

rpoplpush < key1 > < key2 >

從< key1 >列表右邊吐出一個值,插到< key2 >列表左邊;
如:

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
6) "f"
127.0.0.1:6379> lrange myList3 0 -1
1) "9"
2) "8"
3) "7"
4) "x"
5) "y"
6) "z"
127.0.0.1:6379> rpoplpush myList2 myList3
"f"
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lrange myList3 0 -1
1) "f"
2) "9"
3) "8"
4) "7"
5) "x"
6) "y"
7) "z"

lindex < key > < index >

按照索引下標獲得元素(從左到右)

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> lindex myList2 2
"c"

llen < key > 獲得列表長度

127.0.0.1:6379> llen myList2
(integer) 5
127.0.0.1:6379> llen myList3
(integer) 7

linsert < key > before(after) < value > < newvalue >

此命令為在< key >對應的< value >的前(後)面插入< newvalue >

127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "b"
3) "c"
4) "d"
5) "e"
127.0.0.1:6379> linsert myList2 before b 123
(integer) 6
127.0.0.1:6379> lrange myList2 0 -1
1) "a"
2) "123"
3) "b"
4) "c"
5) "d"
6) "e"

lrem < key > < n > < value >

從左邊刪除n個value(從左到右)
n為正數表示從左往右刪除幾個
n為負數表示從右往左刪幾個
n為0表示刪除所有
如:

127.0.0.1:6379> rpush myList4 1 a 2 b c a 2 1
(integer) 8
127.0.0.1:6379> lrange myList4 0 -1
1) "1"
2) "a"
3) "2"
4) "b"
5) "c"
6) "a"
7) "2"
8) "1"
127.0.0.1:6379> lrem myList4 1 1
(integer) 1
127.0.0.1:6379> lrange myList4 0 -1
1) "a"
2) "2"
3) "b"
4) "c"
5) "a"
6) "2"
7) "1"
127.0.0.1:6379> lrem myList4 1 2
(integer) 1
127.0.0.1:6379> lrange myList4 0 -1
1) "a"
2) "b"
3) "c"
4) "a"
5) "2"
6) "1"
127.0.0.1:6379> lrem myList4 0 a
(integer) 2
127.0.0.1:6379> lrange myList4 0 -1
1) "b"
2) "c"
3) "2"
4) "1"

set——字元串無序集合

底層其實是一個value為null的 hash表,添加,刪除,查找的複雜度都是O(1);
其指令如下:

sadd < key > < value1 > < value2 > …..

將一個或多個 member 元素加入到集合 key 當中,已經存在於集合的 member 元素將被忽略。
如:

127.0.0.1:6379> sadd mySet1 1 2 3 a b c 2 3
(integer) 6
127.0.0.1:6379> sadd mySet2 x y z m n 
(integer) 5

用type查看類型

127.0.0.1:6379> type mySet1
set

smembers < key >

取出該集合的所有值,如:

127.0.0.1:6379> smembers mySet1
1) "1"
2) "3"
3) "2"
4) "b"
5) "c"
6) "a"
127.0.0.1:6379> smembers mySet2
1) "y"
2) "m"
3) "z"
4) "x"
5) "n"

sismember < key > < value >

判斷集合< key >是否為含有該< value >值,有返回1,沒有返回0;
如:

127.0.0.1:6379> sismember mySet1 a
(integer) 1
127.0.0.1:6379> sismember mySet1 123456
(integer) 0

scard < key >

返回該集合的元素個數

127.0.0.1:6379> scard mySet1
(integer) 6
127.0.0.1:6379> scard mySet2
(integer) 5

srem < key > < value1 > < value2 > ….

刪除集合中的某(幾)個元素;

127.0.0.1:6379> smembers mySet2
1) "y"
2) "m"
3) "z"
4) "x"
5) "n"
127.0.0.1:6379> srem mySet2 m
(integer) 1
127.0.0.1:6379> smembers mySet2
1) "z"
2) "x"
3) "y"
4) "n"
127.0.0.1:6379> srem mySet2 x n
(integer) 2
127.0.0.1:6379> smembers mySet2
1) "y"
2) "z"
127.0.0.1:6379> srem mySet2 1 2
(integer) 0

刪除幾個返回幾;

spop < key >

隨機從該集合中吐出一個元素,會從集合中刪除 ;

127.0.0.1:6379> spop mySet1
"3"
127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"

srandmember < key > < n >

隨機從該集合中取出n個值,不會從集合中刪除

127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"
127.0.0.1:6379> srandmember mySet1 2
1) "1"
2) "b"
127.0.0.1:6379> srandmember mySet1 10
1) "c"
2) "1"
3) "b"
4) "2"
5) "a"
127.0.0.1:6379> smembers mySet1
1) "1"
2) "2"
3) "b"
4) "c"
5) "a"

如果超過集合中的個數,則全部返回;

sinter < key1 > < key2 >

返回兩個集合的交集元素;

sunion < key1 > < key2 >

返回兩個集合的並集元素;

sdiff < key1 > < key2 >

返回兩個集合的差集元素;
如:

127.0.0.1:6379> sadd testSet1 a 1 2 x y
(integer) 5
127.0.0.1:6379> sadd testSet2 a b 2 x z
(integer) 5
127.0.0.1:6379> sinter testSet1 testSet2
1) "a"
2) "x"
3) "2"
127.0.0.1:6379> sunion testSet1 testSet2
1) "1"
2) "y"
3) "x"
4) "2"
5) "b"
6) "a"
7) "z"
127.0.0.1:6379> sdiff testSet1 testSet2
1) "y"
2) "1"

hash——string類型的field和value的映射表

hset < key > < field > < value >

給< key >集合中的 < field >鍵賦值< value >

127.0.0.1:6379> hset studentInfo student:001:name testName1
(integer) 1

用type查看類型

127.0.0.1:6379> type studentInfo
hash

hget < key1 > < field >

從< key1 >集合< field > 取出 value

127.0.0.1:6379> hget studentInfo student:001:name
"testName1"

hmset < key1 > < field1 > < value1 > < field2 > < value2 >…

批量設置hash的值;
如:

127.0.0.1:6379> hmset studentInfo student:001:stuid 001 student:001:stuname testName1 student:001:stuage 16
OK

hexists < key > < field >

此命令用來查看哈希表 key 中,給定域 field 是否存在

127.0.0.1:6379> hexists studentInfo student:001:stuname
(integer) 1
127.0.0.1:6379> hexists studentInfo student:001:stusex
(integer) 0

hkeys < key >

此命令用於列出該hash集合的所有field ;

hvals < key >

此命令用於列出該hash集合的所有value;

hgetall < key >

此命令用於列出該hash集合所有的key和value;
如:

127.0.0.1:6379> hkeys studentInfo
1) "student:001:name"
2) "student:001:stuid"
3) "student:001:stuname"
4) "student:001:stuage"
127.0.0.1:6379> hvals studentInfo
1) "testName1"
2) "001"
3) "testName1"
4) "16"
127.0.0.1:6379> hgetall studentInfo
1) "student:001:name"
2) "testName1"
3) "student:001:stuid"
4) "001"
5) "student:001:stuname"
6) "testName1"
7) "student:001:stuage"
8) "16"

hincrby < key > < field > < increment >

為哈希表 key 中的域 field 的值加上增量 increment (需為數值型字元串類型);

127.0.0.1:6379> hget studentInfo student:001:stuage
"16"
127.0.0.1:6379> hincrby studentInfo student:001:stuage 2
(integer) 18

hsetnx < key > < field > < value >

當域 field 不存在時將哈希表 key 中的域 field 的值設置為 value ;

127.0.0.1:6379> hsetnx studentInfo student:001:stuage 36
(integer) 0
127.0.0.1:6379> hsetnx studentInfo student:001:stusex male
(integer) 1
127.0.0.1:6379> hget studentInfo student:001:stusex
"male"

zset——字元串有序集合

它是沒有重複元素的字元串集合。每個成員都關聯了一個評分(score),這個評分(score)被用來按照從最低分到最高分的方式排序集合中的成員。集合的成員是唯一的,但是評分可以是重複的。

zadd < key > < score1 > < value1 > < score2 > < value2 >…

此命令用於將一個或多個 member 元素及其 score 值加入到有序集 key 當中;

127.0.0.1:6379> zadd myZset 10 a 100 b 20 c 1000 d 500 e
(integer) 5

用type命令查看

127.0.0.1:6379> type myZset
zset

如果添加相同元素,相同分數肯定是添加不進去的;
如果添加相同元素,不同分數將分數更改為最新的分數;
如果添加不同元素,相同分數 可以添加進去;

127.0.0.1:6379> zadd myZset 10 a
(integer) 0
127.0.0.1:6379> zadd myZset 10000 a
(integer) 0
127.0.0.1:6379> zadd myZset 6 m 6 n
(integer) 2

zrange < key > < start > < stop > [WITHSCORES]

返回有序集 key 中,下標在< start > < stop >之間的元素,帶WITHSCORES,可以讓分數一起和值返回到結果集。

127.0.0.1:6379> zadd myZset2 10 x 100 y 1000 z
(integer) 3
127.0.0.1:6379> zrange myZset 0 -1
1) "m"
2) "n"
3) "c"
4) "b"
5) "e"
6) "d"
7) "a"
127.0.0.1:6379> zrange myZset 0 -1 WITHSCORES
 1) "m"
 2) "6"
 3) "n"
 4) "6"
 5) "c"
 6) "20"
 7) "b"
 8) "100"
 9) "e"
10) "500"
11) "d"
12) "1000"
13) "a"
14) "10000"

zvrange < key > < start > < stop > [WITHSCORES]

同上,改為從大到小排列。

zrangebyscore key min max [ withscores ] [ limit offset count ]

返回有序集 key 中,所有 score 值介於 min 和 max 之間(包括等於 min 或 max )的成員。有序集成員按 score 值遞增(從小到大)次序排列。

127.0.0.1:6379> zrangebyscore myZset 100 1000
1) "b"
2) "e"
3) "d"
127.0.0.1:6379> zrangebyscore myZset 1000 1000
1) "d"

如果知道一個值的分數,min和max均寫此分數即可;

zrevrangebyscore key max min [ withscores ] [ limit offset count ]

同上,改為從大到小排列。

zincrby < key > < increment > < value >

此指令用於為元素的score加上增量;

127.0.0.1:6379> zadd myZset2 10 x 100 y 1000 z
(integer) 3
127.0.0.1:6379> zincrby myZset2 20 x
"30"
127.0.0.1:6379> zrange myZset2 0 -1 WITHSCORES
1) "x"
2) "30"
3) "y"
4) "100"
5) "z"
6) "1000"

zrem < key > < value >

刪除該集合下,指定值的元素;
如:

127.0.0.1:6379> zrem myZset2 x
(integer) 1
127.0.0.1:6379> zrange myZset2 0 -1 WITHSCORES
1) "y"
2) "100"
3) "z"
4) "1000"

zcount < key > < min > < max >

統計該集合,分數區間內的元素個數;

127.0.0.1:6379> zrange myZset 0 -1 WITHSCORES
 1) "m"
 2) "6"
 3) "n"
 4) "6"
 5) "c"
 6) "20"
 7) "b"
 8) "100"
 9) "e"
10) "500"
11) "d"
12) "1000"
13) "a"
14) "10000"
127.0.0.1:6379> zcount myZset 100 1000
(integer) 3

zrank < key > < value >

返回該值在集合中的排名,從0開始

127.0.0.1:6379> zrank myZset e
(integer) 4

最後

本文介紹了Redis基本指令、可存儲的五大數據類型和這五大數據類型的指令,希望大家可以通過此篇入門Redis.。

歡迎關注

掃下方二維碼即可關注:
微信公眾號:code隨筆

Tags: