redis系列(二)- 語法與命令

redis系列文章:
redis系列(一)- 安裝與啓動
redis系列(二)- 語法與命令redis

1、簡述

Redis支持的鍵值類型有:String字符類型、map散列類型、list列表類型、set集合類型、sortedset有序集合類型。本篇將對這些鍵值類型在使用上進行總結,並介紹下Keys命令,雖然語法簡單,但因爲數量過多,還須要咱們多多實踐。數據庫

2、String字符類型

一、賦值

語法:SET key valuejson

127.0.0.1:6379> set test 123
OK複製代碼

二、取值

語法:GET key數組

127.0.0.1:6379> get test
"123「複製代碼

三、取值並賦值

語法:GETSET key value緩存

127.0.0.1:6379> getset s2 222
"111"
127.0.0.1:6379> get s2
"222"複製代碼

四、設置/獲取多個鍵值

語法:bash

  • MSET key value [key value …]
  • MGET key [key …]
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> mget k1 k3
1) "v1"
2) "v3"複製代碼

五、刪除

語法:DEL keyapp

127.0.0.1:6379> del test
(integer) 1複製代碼

六、數值增減

a. 遞增數字

當存儲的字符串是整數時,redis提供一個實用的命令INCR,其做用是讓當前鍵值遞增,並返回遞增後的值。post

語法:INCR keyui

127.0.0.1:6379> incr num
(integer) 1
127.0.0.1:6379> incr num
(integer) 2
127.0.0.1:6379> incr num
(integer) 3複製代碼

b. 增長指定整數

語法:INCRBY key incrementspa

127.0.0.1:6379> incrby num 2
(integer) 5
127.0.0.1:6379> incrby num 2
(integer) 7
127.0.0.1:6379> incrby num 2
(integer) 9複製代碼

c. 遞減數值

語法:DECR key

127.0.0.1:6379> decr num
(integer) 9
127.0.0.1:6379> decr num
(integer) 8複製代碼

d. 減小指定整數

語法:DECRBY key decrement

127.0.0.1:6379> decr num
(integer) 6
127.0.0.1:6379> decr num
(integer) 5
127.0.0.1:6379> decrby num 3
(integer) 2
127.0.0.1:6379> decrby num 3
(integer) -1複製代碼

七、向尾部追加值

append的做用是向鍵值的末尾追加value。若是鍵不存在則將該鍵的值設置爲value,即至關於set key value。返回值是追加後字符串的總長度。

語法:APPEND key value

127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> append str " world!"
(integer) 12
127.0.0.1:6379> get str
"hello world!"複製代碼

八、獲取字符串長度

STRLEN命令返回鍵值的長度,若是鍵不存在則返回0.

語法:STRLEN key

127.0.0.1:6379> strlen str
(integer) 0
127.0.0.1:6379> set str hello
OK
127.0.0.1:6379> strlen str
(integer) 5複製代碼

3、map散列類型

在redis中,map也叫hash。假設有User對象以JSON序列化的形式存儲到Redis中,User對象有id,username、password、age、name等屬性,存儲的過程以下:

保存、更新: User對象 --> json(string) --> redis 。

若是在業務上只是更新age屬性,其餘的屬性並不作更新我應該怎麼作呢? 若是仍然採用上邊的方法在傳輸、處理時會形成資源浪費,下邊講的hash能夠很好的解決這個問題。

redis hash介紹

hash叫散列類型,它提供了字段和字段值的映射。字段值只能是字符串類型,
不支持散列類型、集合類型等其餘類型。以下:

一、賦值

HSET命令不區分插入和一時更新操做,當執行插入操做時HSET命令返回1,當執行更新操做時返回0。

一次設置一個字段值

語法:HSET key field value

127.0.0.1:6379> hset user username zhangesan
(integer) 1複製代碼

一次設置多個字段值

語法:HMSET key field value [field value...]

127.0.0.1:6379> hmset user age 20 username lisi
OK複製代碼

當字段不存在時賦值,相似HSET,區別在於若是字段存在,該命令不執行任何操做

語法:HSETNX key field value

127.0.0.1:6379> hsetnx user age 30 
(integer) 0複製代碼

若是user中沒有age字段,則設置age值爲30,不然不作任何操做。

二、取值

一次獲取一個字段值

語法:HGET key field

127.0.0.1:6379> hget user username
"zhangesan"複製代碼

一次獲取多個字段值

語法:HMGET key filed[field...]

127.0.0.1:6379> hmget user age username
1) "20"
2) "lisi"複製代碼

獲取全部字段值

語法:HGETALL key

127.0.0.1:6379> hgetall user
1) "age"
2) "20"
3) "username"
4) "lisi"複製代碼

三、刪除字段

能夠刪除一個或多個字段,返回值是被刪除的字段個數。

語法:HDEL key field [field...]

127.0.0.1:6379> hdel user age
(integer) 1
127.0.0.1:6379> hdel user age name
(integer) 0
127.0.0.1:6379> hdel user age username
(integer) 1複製代碼

四、增長數字

語法:HINCRBY key field increment

127.0.0.1:6379> hincrby user age 2    將用戶的年齡加2
(integer) 22
127.0.0.1:6379> hget user age        獲取用戶的年齡
"22「複製代碼

五、判斷字段是否存在

語法:HEXISTS key field

127.0.0.1:6379> hexists user age    查看user中是否有age字段
(integer) 1
127.0.0.1:6379> hexists user name    查看user中是否有name字段
(integer) 0複製代碼

六、只獲取字段名或字段值

語法:

  • HKEYS key
  • HVALS key
127.0.0.1:6379> hmset user age 20 name lisi
    OK
    127.0.0.1:6379> hkeys user
    1) "age"
    2) "name"
    127.0.0.1:6379> hvals user
    1) "20"
    2) "lisi"複製代碼

七、獲取字段數量

語法:HLEN key

127.0.0.1:6379> hlen user
(integer) 2複製代碼

4、list列表類型

Arraylist和linkedlist的區別

  • ArrayList是使用數組來存儲數據,特色:查詢快、增刪慢
  • LinkedList是使用雙向鏈表存儲數據,特色:增刪快、查詢慢,可是查詢鏈表兩端的數據也很快。

redis的list採用鏈表來存儲,故對於redis的list數據類型的操做,是操做list的兩端數據來操做的。

一、向列表兩端增長元素

向列表左邊增長元素

語法:LPUSH key value [value...]

127.0.0.1:6379> lpush list1 1 2 3
(integer) 3複製代碼

向列表右邊增長元素

127.0.0.1:6379> rpush list1 4 5 6
(integer) 3複製代碼

二、查看列表

LRANGE命令是列表類型最經常使用的命令之一,獲取列表中的某一片斷,將返回start、stop之間的全部元素(包含兩端的元素),索引從0開始。索引能夠是負數,如:「-1」表明最右邊的一個元素。

語法:LRANGE key start stop

127.0.0.1:6379> lrange list1 0 2
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> lrange list1 0 -1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "6"複製代碼

三、從列表兩端彈出元素

LPOP命令從列表左邊彈出一個元素,會分兩步完成:
第一步:裝列表左邊的元素從列表中移除
第二步:返回被移除的元素值。

語法:

  • LPOP key
  • RPOP key
127.0.0.1:6379> lpop list1
    "1"
    127.0.0.1:6379> rpop list1
    "6"複製代碼

四、獲取列表中元素的個數

語法:LLEN key

127.0.0.1:6379> llen list1
(integer)4複製代碼

五、刪除列表中指定的值

LREM命令會刪除列表中前count個值爲value的元素,返回實際刪除的元素個數。根據count值的不一樣,該命令的執行方式會有所不一樣。

  • 當count>0時,LREM會從列表左邊開始刪除。
  • 當count<0時,LREM會從列表右邊開始刪除。
  • 當count=0時,LREM刪除全部值爲value的元素。

語法:LREM key count value

127.0.0.1:6379> lrem list1 1 4    從左邊開始刪除值爲4的元素
(integer)1複製代碼

六、獲取/設置指定索引的元素值

得到指定索引的元素值

語法:LINDEX key index

127.0.0.1:6379> lindex list1 2
"5"複製代碼

設置指定索引的元素值

語法:LSET key index value

127.0.0.1:6379> lset list1 2 4
OK
127.0.0.1:6379> lrange list1 0 -1
1) "2"
2) "3"
3) "4"複製代碼

七、只保留列表指定片斷

指定範圍和LRANGE一致

語法:LTRIM key start stop

127.0.0.1:6379> lrange list1 0 -1
1) "2"
2) "3"
3) "4"
127.0.0.1:6379> ltrim list1 0 1
OK
127.0.0.1:6379> lrange list1 0 -1
1) "4"複製代碼

八、向列表中插入元素

該命令首先會在列表中從左到右查找值爲pivot的元素,而後根據第二個參數是BEFORE仍是AFTER來決定將value插入到該元素的前面仍是後面。

語法:LINSERT key BEFORE|AFTER pivot value

127.0.0.1:6379> lrange list1 0 -1
1) "4"
127.0.0.1:6379> linsert list1 after 4 5
(integer) 2
127.0.0.1:6379> lrange list1 0 -1
1) "4"
2) "5"複製代碼

九、將元素從一個列表轉移到另外一個列表中

語法:RPOPLPUSH source destination

127.0.0.1:6379> rpoplpush list1 list2
"5"
127.0.0.1:6379> lrange list2 0 -1
1)"5"
127.0.0.1:6379> lrange list1 0 -1
1) "4"複製代碼

5、set集合類型

set(集合)與list(列表)的區別:

  • 集合類型:無序、不可重複
  • 列表類型:有序、可重複

一、增長/刪除元素

語法:SADD key member [member...]

127.0.0.1:6379> sadd set1 a b c
(integer)3
127.0.0.1:6379> sadd set1 a
(integer)0複製代碼

語法:SREM key memeber [member...]

127.0.0.1:6379> srem set1 c d    d不在集合中,故只移除c
(integer)1複製代碼

二、獲取集合中全部元素

語法:SMEMBERS key

127.0.0.1:6379> smemebers set1
1)"b"
1)"a"複製代碼

三、判斷元素是否在集合中

語法:SISMEMBER key member

127.0.0.1:6379> sismember set1 a
(integer)1
127.0.0.1:6379> sismember set1 h
(integer)0複製代碼

四、運算命令

a. 集合的差集運算 A - B

屬於A而且不屬於B的元素構成的集合。

語法:SDIFF key [key...]

127.0.0.1:6379> sadd setA 1 2 3
(integer)3
127.0.0.1:6379> sadd setB 2 3 4
(integer)3
127.0.0.1:6379> sdiff setA setB
1)"1"
127.0.0.1:6379> sdiff setB setA
1)"4"複製代碼

b. 集合的交集運算 A ∩ B

屬於A且屬於B的元素構成的集合。

語法:SINTER key [key...]

127.0.0.1:6379> sinter setA setB
1)"2"
2)"3"複製代碼

c. 集合的並集運算 A ∪ B

屬於A或者屬於B的元素構成的集合。

語法:SUNION key [key...]

127.0.0.1:6379> sunion setA setB
1) "1"
2) "2"
3) "3"
4) "4"複製代碼

五、獲取集合中元素的個數

語法:SCARD key

127.0.0.1:6379> smembers setA
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> scard setA
(integer)3複製代碼

六、從集合中彈出一個元素

注意:因爲集合是無序的,因此SPOP命令會從集合中隨機選擇一個元素彈出。

語法:SPOP key

127.0.0.1:6379> spop setA
"1"複製代碼

6、sortedset有序集合類型

Sortedset又叫zset,是有序集合,可排序,可是惟一。Sortedset與set不一樣之處是,會給set中的元素添加一個分數,而後經過這個分數進行排序。

一、增長元素

向有序集合中加入一個元素和該元素的分數,若是該元素已經存在則會用新的分數替換原有的分數。返回值是新加入到集合中的元素個數,不包含以前已經存在的元素。

語法:ZADD key score member [score member...]

127.0.0.1:6379> zadd scoreboard 80 zhangesan 89 lisi 94 wangwu
(integer)3
127.0.0.1:6379> zadd scoreboard 97 lisi
(integer)0複製代碼

二、獲取元素的分數

語法:ZSCORE key member

127.0.0.1:6379> zscore scoreboard lisi
"97"複製代碼

三、刪除元素

移除有序集key中的一個或多個成員,不存在的成員將被忽略。
當key存在但不是有序集類型時,返回一個錯誤。

語法:ZREM key member [member...]

127.0.0.1:6379> zrem scoreboard lisi
(integer)1複製代碼

四、獲取排名在某個範圍的元素列表

a. 按照元素分數從小到大的順序返回索引從start到stop之間的全部元素(包含兩端的元素)

語法:ZRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zrange scoreboard 0 2
1)"zhangesan"
2)"wangwu"
3)"lisi"複製代碼

b. 按照元素分數從大到小的順序返回索引從start到stop之間的全部元素(包含兩端的元素)

語法:ZREVRANGE key start stop [WITHSCORES]

127.0.0.1:6379> zrevrange scoredboard 0 2
1)"lisi"
2)"wangwu"
3)"zhangesan"複製代碼

若是須要得到元素的分數,能夠在命令尾部加上WITHSCORES參數

127.0.0.1:6379> zrange scoreboard 0 1 WITHSCORES
1) "zhangsan"
2) "80"
3) "wangwu"
4) "94"複製代碼

五、獲取元素的排名

a. 從小到大

語法:ZRANK key member

127.0.0.1:6379> zrank scoreboard lisi
(integer)0複製代碼

b. 從大到小

語法:ZREVRANK key member

127.0.0.1:6379> zrevrank scoreboard zhangsan
(integer)1複製代碼

六、獲取指定分數範圍的元素

語法:ZRANGEBYSCORE key min max [WITHSCORES][LIMIT offset count]

127.0.0.1:6379> zrangebyscore scoreboard 90 97 WITHSCORES
1) "wangwu"
2) "94"
3) "lisi"
4) "97"
127.0.0.1:6379> zrangebyscore scoreboard 70 100 limit 1 2
1) "wangwu"
2) "lisi"複製代碼

七、增長某個元素的分數

返回值是更改後的分數

語法:ZINCRBY key increment member

127.0.0.1:6379> zincrby scoreboard 4 lisi
"101"複製代碼

八、獲取集合中元素的數量

語法:ZCARD key

127.0.0.1:6379> zcard scoreboard
(integer)3 複製代碼

九、得到指定分數範圍內的元素個數

語法:ZCOUNT key min max

127.0.0.1:6379> zcount scoreboard 80 90
(integer) 1複製代碼

十、按照排名範圍刪除元素

語法:ZREMRANGEBYRANK key start stop

127.0.0.1:6379> zremrangebyrank scoreboard 0 1
(integer)2
127.0.0.1:6379> zrange scoreboard 0 -1
1)"lisi"複製代碼

十一、按照分數範圍刪除元素

語法:ZREMRANGEBYSCORE key min max

127.0.0.1:6379> zadd scoreboard 84 zhangsan
(integer)1
127.0.0.1:6379> zremrangebyscore scoreboard 80 100
(integer)1複製代碼

7、Keys命令

一、keys

返回知足給定pattern的全部key

127.0.0.1:6379> keys mylist*
1) "mylist"
2) "mylist5"
3) "mylist6"
4) "mylist7"
5) "mylist8"複製代碼

二、exists

確認一個key是否存在
示例:從結果來看,數據庫中不存在HongWan這個key,可是age這個key是存在的

127.0.0.1:6379> exists HongWan
(integer)0
127.0.0.1:6379> exists age
(integer)1複製代碼

三、del

刪除一個key

127.0.0.1:6379> del age
(integer)1
127.0.0.1:6379> exists age
(integer)0複製代碼

四、rename

重命名key
示例:把age改爲age_new。

127.0.0.1:6379> keys *
1) "age"
127.0.0.1:6379> rename age age_new
OK
127.0.0.1:6379>keys *
1) "age_new"複製代碼

五、type

返回值的類型
示例:判斷出值的類型

127.0.0.1:6379> type addr
string
127.0.0.1:6379> type myzset2
set
127.0.0.1:6379> type mylist
list複製代碼

六、設置key的生存時間

redis在實際使用過程當中更多的是用做緩存,然而緩存的數據通常都是須要設置生存時間的,即:到期後數據銷燬。

EXPIRE key seconds            設置key的生存時間(單位:秒)key在多少秒後會自動刪除
TTL key                        設置key剩餘的生存時間
PERSIST key                    清除生存時間
PEXPIRE key milliseconds    生存時間設置單位爲:毫秒複製代碼

示例:

127.0.0.1:6379> set test 1        設置test的值爲1
OK
127.0.0.1:6379> get test        獲取test的值
"1"
127.0.0.1:6379> EXPIRE test 5    設置test的生存時間爲5秒
(integer)1
127.0.0.1:6379> TTL test        查看test的生於生成時間還有1秒刪除
(integer)1
127.0.0.1:6379> TTL test
(integer) -2
127.0.0.1:6379> get test        獲取test的值,已經刪除
(nil)複製代碼
相關文章
相關標籤/搜索