簡簡單單入個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.。
歡迎關注
掃下方二維碼即可關注: