03_Redis數(shù)據(jù)類型和數(shù)據(jù)操作的命令

redis主題

01_Redis介紹和安裝運行
02_Jedis的介紹和使用
03_Redis數(shù)據(jù)類型和數(shù)據(jù)操作的命令
04_Redis集群

01-string字符串

介紹
  redis中沒有使用C語言的字符串表示邦投,而是自定義一個數(shù)據(jù)結(jié)構(gòu)叫SDS(simple dynamic string)即簡單動態(tài)字符串鸭栖。
  打開下載的redis源碼包,找到src下的sds.h文件查看sds源碼:

struct sdshdr {
    //字符串長度
    unsigned int len;
    //buf數(shù)組中未使用的字節(jié)數(shù)量
    unsigned int free;
    //用于保存字符串
    char buf[];
};

c語言對字符串的存儲是使用字符數(shù)組,遇到'\0'字符則認為字符串結(jié)束窗价,redis的字符串可以存儲任何類型的數(shù)據(jù)见芹,因為任何類型數(shù)據(jù)都可以表示成二進制,sds結(jié)構(gòu)中的char buf[]就是存儲了二進制數(shù)據(jù)辕近。
  redis的字符串是二進制安全的,什么是二進制安全?簡單理解就是存入什么數(shù)據(jù)取出的還是什么數(shù)據(jù)逾礁。redis中的sds不像c語言處理字符串那樣遇到'\0'字符則認證字符串結(jié)束,它不會對存儲進去的二進制數(shù)據(jù)進行處理访惜,存入什么數(shù)據(jù)取出還是什么數(shù)據(jù)嘹履。

命令

  • 賦值:SET key value
127.0.0.1:6379> set str1 nihao
OK
  • 取值:GET key
127.0.0.1:6379> get str1
"nihao"

當鍵不存在時返回空結(jié)果腻扇。
GETSET key value
取值時同時對key進行賦值操作。

  • 刪除:Del key
127.0.0.1:6379> del str1
(integer) 1
127.0.0.1:6379> get str1
(nil)
  • 數(shù)值增減
  • 遞增數(shù)字:INCR key
    當存儲的字符串是整數(shù)時砾嫉,Redis提供了一個實用的命令I(lǐng)NCR幼苛,其作用是讓當前鍵值遞增,并返回遞增后的值焕刮。
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
  • 增加指定的整數(shù) :INCRBY key increment
    示例:
127.0.0.1:6379> incrby num 2
(integer) 5
127.0.0.1:6379> incrby num 3
(integer) 8
127.0.0.1:6379> get num
"8"
  • 遞減數(shù)值:DECR key
127.0.0.1:6379> decr num
(integer) 7
  • 其他命令(自學(xué))
  • 減少指定的整數(shù) :DECRBY key decrement
    示例:
127.0.0.1:6379> decrby num 2
(integer) 5
127.0.0.1:6379> decrby num 3
(integer) 2
127.0.0.1:6379> get num
"2"
  • 向尾部追加值 :APPEND key value
    APPEND的作用是向鍵值的末尾追加value舶沿。如果鍵不存在則將該鍵的值設(shè)置為value,即相當于 SET key value配并。返回值是追加后字符串的總長度括荡。
127.0.0.1:6379> set str1 hello
OK
127.0.0.1:6379> append str1 " world!"
(integer) 12
127.0.0.1:6379> get str1
"hello world!"
  • 獲取字符串長度 :STRLEN key
    STRLEN命令返回鍵值的長度,如果鍵不存在則返回0溉旋。
127.0.0.1:6379> strlen str1
(integer) 12
127.0.0.1:6379> strlen str11
(integer) 0
  • 同時設(shè)置/獲取多個鍵值 :
    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> get k2
"v2"
127.0.0.1:6379> mget k2 k3
1) "v2"
2) "v3"

應(yīng)用

  • 自增主鍵
    商品編號一汽、訂單號采用string的遞增數(shù)字特性生成。
    定義商品編號key:items:id
127.0.0.1:6379> INCR items:id
(integer) 2
127.0.0.1:6379> INCR items:id
(integer) 3

java代碼參考測試工程低滩。

02-hash散列

  • 使用string的問題
      假設(shè)有User對象以JSON序列化的形式存儲到Redis中召夹,User對象有id,username恕沫、password监憎、age、name等屬性婶溯,存儲的過程如下: 保存鲸阔、更新:
    User對象 --> json(string) --> redis
      如果在業(yè)務(wù)上只是更新age屬性,其他的屬性并不做更新我應(yīng)該怎么做呢迄委? 如果仍然采用上邊的方法在傳輸褐筛、處理時會造成資源浪費,下邊講的hash可以很好的解決這個問題叙身。

  • redis hash介紹
      hash叫散列類型渔扎,它提供了字段和字段值的映射。字段值只能是字符串類型信轿,不支持散列類型晃痴、集合類型等其它類型。如下:

    user對象的hash散列類型

    思考:redis hash存儲比關(guān)系數(shù)據(jù)庫的好處财忽?

  • 命令

  • 賦值
    HSET key field value 一次只能設(shè)置一個字段值

127.0.0.1:6379> hset user username zhangsan 
(integer) 1

HMSET key field value [field value ...] 一次可以設(shè)置多個字段值

127.0.0.1:6379> hmset user age 20 username lisi 
OK
  • 取值
    HGET key field 一次只能獲取一個字段值
127.0.0.1:6379> hget user username
"zhangsan"

HMGET key field [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"

HSET命令不區(qū)分插入和更新操作倘核,當執(zhí)行插入操作時HSET命令返回1,當執(zhí)行更新操作時返回0.

  • 刪除字段
    可以刪除一個或多個字段即彪,返回值是被刪除的字段個數(shù)
    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 
  • 增加數(shù)字
    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“
  • 其它命令(自學(xué))
    ①判斷字段是否存在
    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

HSETNX key field value
當字段不存在時賦值紧唱,類似HSET,區(qū)別在于如果字段已經(jīng)存在,該命令不執(zhí)行任何操作漏益。

127.0.0.1:6379> hsetnx user age 30  如果user中沒有age字段則設(shè)置age值為30酬凳,否則不做任何操作
(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"

③獲取字段數(shù)量
HLEN key

127.0.0.1:6379> hlen user
(integer) 2
  • 應(yīng)用
    商品信息
    商品id、商品名稱遭庶、商品描述宁仔、商品庫存、商品好評
    定義商品信息的key:
    商品1001的信息在 redis中的key為:items:1001
    存儲商品信息
127.0.0.1:6379> HMSET items:1001 id 3 name apple price 999.9
OK

獲取商品信息

127.0.0.1:6379> HGET items:1001 id
"3"
127.0.0.1:6379> HGETALL items:1001
1) "id"
2) "3"
3) "name"
4) "apple"
5) "price"
6) "999.9"

java代碼參考測試工程峦睡。

03-list列表

  • ArrayList與LinkedList的區(qū)別
      ArrayList使用數(shù)組方式存儲數(shù)據(jù)翎苫,所以根據(jù)索引查詢數(shù)據(jù)速度快,而新增或者刪除元素時需要設(shè)計到位移操作榨了,所以比較慢煎谍。
      LinkedList使用雙向鏈接方式存儲數(shù)據(jù),每個元素都記錄前后元素的指針龙屉,所以插入呐粘、刪除數(shù)據(jù)時只是更改前后元素的指針指向即可,速度非匙叮快作岖,然后通過下標查詢元素時需要從頭開始索引,所以比較慢五芝,但是如果查詢前幾個元素或后幾個元素速度比較快痘儡。
添加節(jié)點

刪除節(jié)點
  • redis list介紹
      列表類型(list)可以存儲一個有序的字符串列表,常用的操作是向列表兩端添加元素枢步,或者獲得列表的某一個片段沉删。
      列表類型內(nèi)部是使用雙向鏈表(double linked list)實現(xiàn)的,所以向列表兩端添加元素的時間復(fù)雜度為0(1)醉途,獲取越接近兩端的元素速度就越快矾瑰。這意味著即使是一個有幾千萬個元素的列表,獲取頭部或尾部的10條記錄也是極快的隘擎。

  • 命令

  • 向列表兩端增加元素殴穴。
    LPUSH key value [value ...]
    RPUSH key value [value ...]
    向列表左邊增加元素

127.0.0.1:6379> lpush lkey1 123
(integer) 1
127.0.0.1:6379> lpush lkey1 1 2 3
(integer) 4

向列表右邊增加元素

127.0.0.1:6379> rpush lkey1 4 5 6
(integer) 7
127.0.0.1:6379> lrange lkey1 0 -1
1) "3"
2) "2"
3) "1"
4) "123"
5) "4"
6) "5"
7) "6"
  • 查看列表
    LRANGE key start stop
    LRANGE命令是列表類型最常用的命令之一,獲取列表中的某一片段嵌屎,將返回start推正、stop之間的所有元素(包含兩端的元素),索引從0開始宝惰。索引可以是負數(shù),如:“-1”代表最后邊的一個元素再沧。
127.0.0.1:6379> lrange lkey1 0 3
1) "3"
2) "2"
3) "1"
4) "123"
127.0.0.1:6379> lrange lkey1 0 -1
1) "3"
2) "2"
3) "1"
4) "123"
  • 從列表兩端彈出元素
    LPOP key
    RPOP key
    LPOP命令從列表左邊彈出一個元素尼夺,會分兩步完成,第一步是將列表左邊的元素從列表中移除,第二步是返回被移除的元素值淤堵。
127.0.0.1:6379> lpop lkey1
"3"
127.0.0.1:6379> rpop lkey1
"6"
127.0.0.1:6379> lrange lkey1 0 -1
1) "2"
2) "1"
3) "123"
4) "4"
5) "5"
  • 獲取列表中元素的個數(shù)
    LLEN key
127.0.0.1:6379> llen lkey1
(integer) 5

其他命令(自學(xué))

  • 刪除列表中指定的值
    LREM key count value
    LREM命令會刪除列表中前count個值為value的元素寝衫,返回實際刪除的元素個數(shù)。根據(jù)count值的不同拐邪,該命令的執(zhí)行方式會有所不同:
      當count>0時慰毅, LREM會從列表左邊開始刪除。
      當count<0時扎阶, LREM會從列表后邊開始刪除汹胃。
      當count=0時, LREM刪除所有值為value的元素东臀。
127.0.0.1:6379> lrange lkey1 0 -1
1) "2"
2) "1"
3) "123"
4) "4"
5) "5"
127.0.0.1:6379> lrem lkey1 0 123
(integer) 1
127.0.0.1:6379> lrange lkey1 0 -1
1) "2"
2) "1"
3) "4"
4) "5"
127.0.0.1:6379> lrem lkey1 1 2
(integer) 1
127.0.0.1:6379> lrange lkey1 0 -1
1) "1"
2) "4"
3) "5"
  • 獲得/設(shè)置指定索引的元素值
    LINDEX key index
    LSET key index value
127.0.0.1:6379> lrange lkey1 0 -1
1) "1"
2) "4"
3) "5"
127.0.0.1:6379> lindex lkey1 2
"5"
127.0.0.1:6379> lset lkey1 2 5
OK
  • 只保留列表指定片段着饥,指定范圍和LRANGE一致
    LTRIM key start stop
127.0.0.1:6379> lrange lkey1 0 -1
1) "1"
2) "4"
3) "5"
127.0.0.1:6379> ltrim lkey1 0 1
OK
127.0.0.1:6379> lrange lkey1 0 -1
1) "1"
2) "4"
  • 向列表中插入元素
    LINSERT key BEFORE|AFTER pivot value
    該命令首先會在列表中從左到右查找值為pivot的元素,然后根據(jù)第二個參數(shù)是BEFORE還是AFTER來決定將value插入到該元素的前面還是后面惰赋。
127.0.0.1:6379> lrange lkey1 0 -1
1) "1"
2) "4"
127.0.0.1:6379> linsert lkey1 after 4 3
(integer) 3
127.0.0.1:6379> lrange lkey1 0 -1
1) "1"
2) "4"
3) "3"
  • 將元素從一個列表轉(zhuǎn)移到另一個列表中
    RPOPLPUSH source destination
127.0.0.1:6379> lrange lkey1 0 -1
1) "1"
2) "4"
3) "3"
127.0.0.1:6379> rpoplpush lkey1 lkey2
"3"
127.0.0.1:6379> lrange lkey1 0 -1
1) "1"
2) "4"
127.0.0.1:6379> lrange lkey2 0 -1
1) "3"

應(yīng)用

  • 商品評論列表
    思路:
    在redis中創(chuàng)建商品評論列表
      用戶發(fā)布商品評論宰掉,將評論信息轉(zhuǎn)成json存儲到list中。
      用戶在頁面查詢評論列表赁濒,從redis中取出json數(shù)據(jù)展示到頁面轨奄。
    定義商品評論列表key:
      商品編號為1001的商品評論key:items: comment:1001
192.168.101.3:7001> LPUSH items:comment:1001 '{"id":1,"name":"商品不錯,很好>苎住戚绕!","date":1430295077289}'

java代碼參考測試工程。

04-set集合

  • redis set介紹
    在集合中的每個元素都是不同的枝冀,且沒有順序舞丛。


    集合類型和列表類型的對比

      集合類型的常用操作是向集合中加入或刪除元素、判斷某個元素是否存在等果漾,由于集合類型的Redis內(nèi)部是使用值為空的散列表實現(xiàn)球切,所有這些操作的時間復(fù)雜度都為0(1)。
    Redis還提供了多個集合之間的交集绒障、并集吨凑、差集的運算。

  • 命令
  • 增加/刪除元素
    SADD key member [member ...]
    SREM key member [member ...]
  • 獲得集合中的所有元素
    SMEMBERS key
    判斷元素是否在集合中户辱,無論集合中有多少元素都可以極速的返回結(jié)果鸵钝。
    SISMEMBER key member
127.0.0.1:6379> sadd skey1 1 2 3 4 5
(integer) 5
127.0.0.1:6379> smembers skey1
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
127.0.0.1:6379> srem skey1 1
(integer) 1
127.0.0.1:6379> smembers skey1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> sismember skey1 1
(integer) 0
127.0.0.1:6379> sismember skey1 2
(integer) 1

測試元素的唯一性

127.0.0.1:6379> smembers skey1
1) "2"
2) "3"
3) "4"
4) "5"
127.0.0.1:6379> sadd skey1 2 3
(integer) 0
127.0.0.1:6379> sadd skey1 6 7
(integer) 2
127.0.0.1:6379> smembers skey1
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"

其他命令

  • 集合的差集運算 A-B
    屬于A并且不屬于B的元素構(gòu)成的集合。

    SDIFF key [key ...]
127.0.0.1:6379> sadd skey2 2 3 4 5 8 9 10
(integer) 7
127.0.0.1:6379> smembers skey1
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"
127.0.0.1:6379> smembers skey2
1) "2"
2) "3"
3) "4"
4) "5"
5) "8"
6) "9"
7) "10"
127.0.0.1:6379> sdiff skey1 skey2
1) "6"
2) "7"
  • 集合的交集運算 A ∩ B
    屬于A且屬于B的元素構(gòu)成的集合庐镐。

    SINTER key [key ...]
127.0.0.1:6379> sinter skey1 skey2
1) "2"
2) "3"
3) "4"
4) "5"
  • 集合的并集運算 A ∪ B
    屬于A或者屬于B的元素構(gòu)成的集合

    SUNION key [key ...]
127.0.0.1:6379> sunion skey1 skey2
1) "2"
2) "3"
3) "4"
4) "5"
5) "6"
6) "7"
7) "8"
8) "9"
9) "10"

其它命令(自學(xué))

  • 獲得集合中元素的個數(shù)
    SCARD key
  • 從集合中彈出一個元素
    SPOP key
    注意:由于集合是無序的恩商,所有SPOP命令會從集合中隨機選擇一個元素彈出
127.0.0.1:6379> scard skey1
(integer) 6
127.0.0.1:6379> scard skey2
(integer) 7
127.0.0.1:6379> spop skey2
"10"
127.0.0.1:6379> smembers skey2
1) "2"
2) "3"
3) "4"
4) "5"
5) "8"
6) "9"
127.0.0.1:6379> spop skey2
"9"
127.0.0.1:6379> smembers skey2
1) "2"
2) "3"
3) "4"
4) "5"
5) "8"

05-sorted set有序集合(zset)

  • redis sorted set介紹
     在集合類型的基礎(chǔ)上有序集合類型為集合中的每個元素都關(guān)聯(lián)一個分數(shù),這使得我們不僅可以完成插入必逆、刪除和判斷元素是否存在在集合中怠堪,還能夠獲得分數(shù)最高或最低的前N個元素揽乱、獲取指定分數(shù)范圍內(nèi)的元素等與分數(shù)有關(guān)的操作。
    在某些方面有序集合和列表類型有些相似粟矿。
      1凰棉、二者都是有序的。
      2陌粹、二者都可以獲得某一范圍的元素撒犀。
    但是,二者有著很大區(qū)別:
      1掏秩、列表類型是通過鏈表實現(xiàn)的或舞,獲取靠近兩端的數(shù)據(jù)速度極快,而當元素增多后哗讥,訪問中間數(shù)據(jù)的速度會變慢嚷那。
      2、有序集合類型使用散列表實現(xiàn)杆煞,所有即使讀取位于中間部分的數(shù)據(jù)也很快魏宽。
      3、列表中不能簡單的調(diào)整某個元素的位置决乎,但是有序集合可以(通過更改分數(shù)實現(xiàn))
      4队询、有序集合要比列表類型更耗內(nèi)存。
  • 命令
  • 增加元素
      向有序集合中加入一個元素和該元素的分數(shù)构诚,如果該元素已經(jīng)存在則會用新的分數(shù)替換原有的分數(shù)蚌斩。返回值是新加入到集合中的元素個數(shù),不包含之前已經(jīng)存在的元素范嘱。
    ZADD key score member [score member ...]
    獲取元素的分數(shù)
    ZSCORE key member
  • 刪除元素
    ZREM key member [member ...]
    移除有序集key中的一個或多個成員送膳,不存在的成員將被忽略。
    當key存在但不是有序集類型時丑蛤,返回一個錯誤叠聋。
  • 獲得排名在某個范圍的元素列表
    獲得排名在某個范圍的元素列表
    ZRANGE key start stop [WITHSCORES]照元素分數(shù)從小到大的順序返回索引從start到stop之間的所有元素(包含兩端的元素)
    ZREVRANGE key start stop [WITHSCORES]照元素分數(shù)從大到小的順序返回索引從start到stop之間的所有元素(包含兩端的元素)
    如果需要獲得元素的分數(shù)的可以在命令尾部加上WITHSCORES參數(shù)
127.0.0.1:6379> zadd zkey1 80 zhangsan 70 lisi 92 wangwu
(integer) 3
127.0.0.1:6379> zscore zkey1 lisi
"70"
127.0.0.1:6379> zrange zkey1 0 -1
1) "lisi"
2) "zhangsan"
3) "wangwu"
127.0.0.1:6379> zrange zkey1 0 -1 withscores
1) "lisi"
2) "70"
3) "zhangsan"
4) "80"
5) "wangwu"
6) "92"
127.0.0.1:6379> zrevrange zkey1 0 -1 withscores
1) "wangwu"
2) "92"
3) "zhangsan"
4) "80"
5) "lisi"
6) "70"
127.0.0.1:6379> zrem zkey1 wangwu
(integer) 1
127.0.0.1:6379> zrange zkey1 0 -1 withscores
1) "lisi"
2) "70"
3) "zhangsan"
4) "80"

其他命令

  • 獲得指定分數(shù)范圍的元素
    ZRANGEBYSCORE key min max [WITHSCORES] [LIMIT offset count]
127.0.0.1:6379> zadd zkey1 86 wangwu
(integer) 1
127.0.0.1:6379> zrangebyscore zkey1 80 87 withscores
1) "zhangsan"
2) "80"
3) "wangwu"
4) "86"
127.0.0.1:6379> zrangebyscore zkey1 80 85 withscores
1) "zhangsan"
2) "80"
  • 增加某個元素的分數(shù),返回值是更改后的分數(shù)受裹。
    ZINCRBY key increment member
    給lisi加4分
127.0.0.1:6379> zincrby zkey1 4 lisi
"74"
127.0.0.1:6379> zrange zkey1 0 -1 withscores
1) "lisi"
2) "74"
3) "zhangsan"
4) "80"
5) "wangwu"
6) "86"
  • 獲得集合中元素的數(shù)量
    ZCARD key
127.0.0.1:6379> zcard zkey1
(integer) 3
  • 獲得指定分數(shù)范圍內(nèi)的元素個數(shù)
    ZCOUNT key min max
127.0.0.1:6379> zcount zkey1 80 86
(integer) 2
  • 按照排名范圍刪除元素
    ZREMRANGEBYRANK key start stop
  • 按照分數(shù)范圍刪除元素
    ZREMRANGEBYSCORE key min max
127.0.0.1:6379> zremrangebyrank zkey1 0 1
(integer) 2
127.0.0.1:6379> zremrangebyscore zkey1 80 90
(integer) 1
127.0.0.1:6379> zrange zkey1 0 -1 withscores
(empty list or set)
  • 獲取元素的排名
    ZRANK key member
    ZREVRANK key member
    從小到大
127.0.0.1:6379> zrank zkey1 lisi
(integer) 0

從大到小

127.0.0.1:6379> zrevrank zkey1 lisi
(integer) 2

應(yīng)用

  • 商品銷售排行榜
    根據(jù)商品銷售量對商品進行排行顯示碌补,定義sorted set集合,商品銷售量為元素的分數(shù)棉饶。
    定義商品銷售排行榜key:items:sellsort
    寫入商品銷售量:
    商品編號1001的銷量是9厦章,商品編號1002的銷量是10
    192.168.101.3:7007> ZADD items:sellsort 9 1001 10 1002
    商品編號1001的銷量加1
    192.168.101.3:7001> ZINCRBY items:sellsort 1 1001
    商品銷量前10名:
    192.168.101.3:7001> ZRANGE items:sellsort 0 9 withscores
    java代碼參考測試工程。

06-keys命令

  • 設(shè)置key的生存時間
      Redis在實際使用過程中更多的用作緩存照藻,然而緩存的數(shù)據(jù)一般都是需要設(shè)置生存時間的袜啃,即:到期后數(shù)據(jù)銷毀。
    EXPIRE key seconds     設(shè)置key的生存時間(單位:秒)key在多少秒后會自動刪除
    TTL key          查看key生于的生存時間
    PERSIST key         清除生存時間
    PEXPIRE key milliseconds   生存時間設(shè)置單位為:毫秒
    例子:
192.168.101.3:7002> set test 1      設(shè)置test的值為1
OK
192.168.101.3:7002> get test            獲取test的值
"1"
192.168.101.3:7002> EXPIRE test 5    設(shè)置test的生存時間為5秒
(integer) 1
192.168.101.3:7002> TTL test            查看test的生于生成時間還有1秒刪除
(integer) 1
192.168.101.3:7002> TTL test
(integer) -2
192.168.101.3:7002> get test            獲取test的值岩梳,已經(jīng)刪除
(nil)
  • 其他命令(自學(xué))
  • keys
    返回滿足給定pattern 的所有key
redis 127.0.0.1:6379> keys mylist*
1) "mylist"
2) "mylist5"
3) "mylist6"
4) "mylist7"
5) "mylist8"
  • exists
    確認一個key 是否存在
redis 127.0.0.1:6379> exists HongWan
(integer) 0
redis 127.0.0.1:6379> exists age
(integer) 1
redis 127.0.0.1:6379>

從結(jié)果來數(shù)據(jù)庫中不存在HongWan 這個key囊骤,但是age 這個key 是存在的

  • del
    刪除一個key
redis 127.0.0.1:6379> del age
(integer) 1
redis 127.0.0.1:6379> exists age
(integer) 0
redis 127.0.0.1:6379>

從結(jié)果來數(shù)據(jù)庫中不存在HongWan 這個key晃择,但是age 這個key 是存在的

  • rename
    重命名key
redis 127.0.0.1:6379[1]> keys *
1) "age"
redis 127.0.0.1:6379[1]> rename age age_new
OK
redis 127.0.0.1:6379[1]> keys *
1) "age_new"
redis 127.0.0.1:6379[1]>

age 成功的被我們改名為age_new 了

  • type
    返回值的類型
redis 127.0.0.1:6379> type addr
string
redis 127.0.0.1:6379> type myzset2
zset
redis 127.0.0.1:6379> type mylist
list
redis 127.0.0.1:6379>

這個方法可以非常簡單的判斷出值的類型

07-服務(wù)器命令

  • ping
    測試連接是否存活
redis 127.0.0.1:6379> ping
PONG

//執(zhí)行下面命令之前冀值,我們停止redis 服務(wù)器

redis 127.0.0.1:6379> ping
Could not connect to Redis at 127.0.0.1:6379: Connection refused

//執(zhí)行下面命令之前也物,我們啟動redis 服務(wù)器

not connected> ping
PONG
redis 127.0.0.1:6379>

第一個ping 時,說明此連接正常
第二個ping 之前列疗,我們將redis 服務(wù)器停止滑蚯,那么ping 是失敗的
第三個ping 之前,我們將redis 服務(wù)器啟動抵栈,那么ping 是成功的

  • echo
    在命令行打印一些內(nèi)容
redis 127.0.0.1:6379> echo HongWan
"HongWan"
redis 127.0.0.1:6379>
  • select
    選擇數(shù)據(jù)庫告材。Redis 數(shù)據(jù)庫編號從0~15,我們可以選擇任意一個數(shù)據(jù)庫來進行數(shù)據(jù)的存取古劲。
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> select 16
(error) ERR invalid DB index
redis 127.0.0.1:6379[16]>

當選擇16 時斥赋,報錯,說明沒有編號為16 的這個數(shù)據(jù)庫

  • quit
    退出連接产艾。
redis 127.0.0.1:6379> quit
  • dbsize
    返回當前數(shù)據(jù)庫中key 的數(shù)目疤剑。
redis 127.0.0.1:6379> dbsize
(integer) 18
redis 127.0.0.1:6379>

結(jié)果說明此庫中有18 個key

  • info
    獲取服務(wù)器的信息和統(tǒng)計。
redis 127.0.0.1:6379> info
redis_version:2.2.12
redis_git_sha1:00000000
redis_git_dirty:0
arch_bits:32
multiplexing_api:epoll
process_id:28480
uptime_in_seconds:2515
uptime_in_days:0
闷堡、隘膘、、杠览、弯菊、
、踱阿、管钳、、软舌、
  • flushdb
    刪除當前選擇數(shù)據(jù)庫中的所有key才漆。
redis 127.0.0.1:6379> dbsize
(integer) 18
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> dbsize
(integer) 0
redis 127.0.0.1:6379>

在本例中我們將0 號數(shù)據(jù)庫中的key 都清除了。

  • flushall
    刪除所有數(shù)據(jù)庫中的所有key葫隙。
redis 127.0.0.1:6379[1]> dbsize
(integer) 1
redis 127.0.0.1:6379[1]> select 0
OK
redis 127.0.0.1:6379> flushall
OK
redis 127.0.0.1:6379> select 1
OK
redis 127.0.0.1:6379[1]> dbsize
(integer) 0
redis 127.0.0.1:6379[1]>

在本例中我們先查看了一個1 號數(shù)據(jù)庫中有一個key栽烂,然后我切換到0 號庫執(zhí)行flushall 命令,結(jié)果1 號庫中的key 也被清除了恋脚,說是此命令工作正常腺办。

08-持久化(了解)

  • redis持久化方案:
  • rdb:可以設(shè)置間隔多長時間保存一次(Redis不用任何配置默認的持久化方案)
      優(yōu)點:讓redis的數(shù)據(jù)存取速度變快
      缺點:服務(wù)器斷電時會丟失部分數(shù)據(jù)(數(shù)據(jù)的完整性得不到保證)
  • aof:可以設(shè)置實時保存
      優(yōu)點:持久化良好,能包裝數(shù)據(jù)的完整性
      缺點:大大降低了redis系統(tǒng)的存取速度

注意:因為在開發(fā)中,redis都用來做緩存數(shù)據(jù)庫糟描,完整性數(shù)據(jù)保存在關(guān)系型數(shù)據(jù)庫(如mysql)中怀喉,當數(shù)據(jù)丟失時,可以從關(guān)系型數(shù)據(jù)庫中再讀取一次船响,所以在開發(fā)中一般選擇rdb方案

  • 修改配置文件躬拢,來修改持久化方案
  • 停止redis服務(wù)器:./redis-cli shutdown
  • 編輯redis.conf文件躲履,修改appendonly noappendonly yes(yes表示aof,no表示rdf聊闯,默認為rdf)
  • 啟動服務(wù):./redis-server redis.conf

09-主從復(fù)制(了解)

  • 什么是主從復(fù)制
      持久化保證了即使redis服務(wù)重啟也不會丟失數(shù)據(jù)工猜,因為redis服務(wù)重啟后會將硬盤上持久化的數(shù)據(jù)恢復(fù)到內(nèi)存中,但是當redis服務(wù)器的硬盤損壞了可能會導(dǎo)致數(shù)據(jù)丟失菱蔬,如果通過redis的主從復(fù)制機制就可以避免這種單點故障篷帅,如下圖:


  • 說明
  • 主redis中的數(shù)據(jù)有兩個副本(replication)即從redis1和從redis2,即使一臺redis服務(wù)器宕機其它兩臺redis服務(wù)也可以繼續(xù)提供服務(wù)拴泌。
  • 主redis中的數(shù)據(jù)和從redis上的數(shù)據(jù)保持實時同步魏身,當主redis寫入數(shù)據(jù)時通過主從復(fù)制機制會復(fù)制到兩個從redis服務(wù)上。
  • 只有一個主redis蚪腐,可以有多個從redis箭昵。
  • 主從復(fù)制不會阻塞master,在同步數(shù)據(jù)時回季,master 可以繼續(xù)處理client 請求
  • 一個redis可以即是主又是從家制,如下圖:


  • 主從復(fù)制過程
    在redis2.8版本之前主從復(fù)制過程如下圖:



    復(fù)制過程說明:
    1、slave 服務(wù)啟動茧跋,slave 會建立和master 的連接慰丛,發(fā)送sync 命令。
    2瘾杭、master啟動一個后臺進程將數(shù)據(jù)庫快照保存到RDB文件中
    注意:此時如果生成RDB文件過程中存在寫數(shù)據(jù)操作會導(dǎo)致RDB文件和當前主redis數(shù)據(jù)不一致诅病,所以此時master 主進程會開始收集寫命令并緩存起來。
    3粥烁、master 就發(fā)送RDB文件給slave
    4贤笆、slave 將文件保存到磁盤上,然后加載到內(nèi)存恢復(fù)
    5讨阻、master把緩存的命令轉(zhuǎn)發(fā)給slave
    注意:后續(xù)master 收到的寫命令都會通過開始建立的連接發(fā)送給slave芥永。
    當master 和slave 的連接斷開時slave 可以自動重新建立連接。如果master 同時收到多個slave 發(fā)來的同步連接命令钝吮,只會啟動一個進程來寫數(shù)據(jù)庫鏡像埋涧,然后發(fā)送給所有slave。

完整復(fù)制的問題:
  在redis2.8之前從redis每次同步都會從主redis中復(fù)制全部的數(shù)據(jù)奇瘦,如果從redis是新創(chuàng)建的從主redis中復(fù)制全部的數(shù)據(jù)這是沒有問題的棘催,但是,如果當從redis停止運行耳标,再啟動時可能只有少部分數(shù)據(jù)和主redis不同步醇坝,此時啟動redis仍然會從主redis復(fù)制全部數(shù)據(jù),這樣的性能肯定沒有只復(fù)制那一小部分不同步的數(shù)據(jù)高次坡。

  • 部分復(fù)制



    部分復(fù)制說明:
      從機連接主機后呼猪,會主動發(fā)起 PSYNC 命令画畅,從機會提供 master的runid(機器標識,隨機生成的一個串) 和 offset(數(shù)據(jù)偏移量宋距,如果offset主從不一致則說明數(shù)據(jù)不同步)轴踱,主機驗證 runid 和 offset 是否有效, runid 相當于主機身份驗證碼乡革,用來驗證從機上一次連接的主機寇僧,如果runid驗證未通過則摊腋,則進行全同步沸版,如果驗證通過則說明曾經(jīng)同步過,根據(jù)offset同步部分數(shù)據(jù)兴蒸。

  • 主從配置
    我們在同一臺主機上啟動兩個redis视粮,來實現(xiàn)主從復(fù)制

  • 將redis的安裝目錄下的dump.rdb刪除,也就是將以前保存的數(shù)據(jù)刪掉橙凳,要實現(xiàn)主從復(fù)制必須保證兩個redis的數(shù)據(jù)一致蕾殴。所以刪除以前的數(shù)據(jù)

  • 創(chuàng)建目錄:mkdir 6380

  • 復(fù)制redis/bin中的文件到/6380下,cp bin/* 6380/

  • 切換到6380下:cd 6380/

  • 編輯6380下的redis.conf岛啸,vi redis.conf

  • 修改端口為6380:port 6380

  • 設(shè)置主redis的ip和port:slaveof ip 6379;(ip替換成真正的ip)

  • 保存退出

  • 一定要先啟動主redis(端口號為6379的redis)钓觉,再啟動從redis(端口號為6380的redis)

  • 進主redis的redis-cli,保存一條數(shù)據(jù)

  • 停止主redis服務(wù)坚踩,進入從redis的redis-cli荡灾,查看數(shù)據(jù)

  • 進入指定ip和指定端口的redis-cli,./redis-cli -h 你的ip -p 6380

  • 從redis不能使保存和跟新數(shù)據(jù)數(shù)據(jù)瞬铸,因為從redis是只讀的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末批幌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子嗓节,更是在濱河造成了極大的恐慌荧缘,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,126評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拦宣,死亡現(xiàn)場離奇詭異尚猿,居然都是意外死亡,警方通過查閱死者的電腦和手機培他,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評論 2 382
  • 文/潘曉璐 我一進店門危纫,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人掰派,你說我怎么就攤上這事从诲。” “怎么了靡羡?”我有些...
    開封第一講書人閱讀 152,445評論 0 341
  • 文/不壞的土叔 我叫張陵系洛,是天一觀的道長俊性。 經(jīng)常有香客問我,道長描扯,這世上最難降的妖魔是什么定页? 我笑而不...
    開封第一講書人閱讀 55,185評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮绽诚,結(jié)果婚禮上典徊,老公的妹妹穿的比我還像新娘。我一直安慰自己恩够,他們只是感情好卒落,可當我...
    茶點故事閱讀 64,178評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蜂桶,像睡著了一般儡毕。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上扑媚,一...
    開封第一講書人閱讀 48,970評論 1 284
  • 那天腰湾,我揣著相機與錄音,去河邊找鬼疆股。 笑死费坊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的旬痹。 我是一名探鬼主播附井,決...
    沈念sama閱讀 38,276評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼唱凯!你這毒婦竟也來了羡忘?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 36,927評論 0 259
  • 序言:老撾萬榮一對情侶失蹤磕昼,失蹤者是張志新(化名)和其女友劉穎卷雕,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體票从,經(jīng)...
    沈念sama閱讀 43,400評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡漫雕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,883評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了峰鄙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浸间。...
    茶點故事閱讀 37,997評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖吟榴,靈堂內(nèi)的尸體忽然破棺而出魁蒜,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評論 4 322
  • 正文 年R本政府宣布兜看,位于F島的核電站锥咸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏细移。R本人自食惡果不足惜搏予,卻給世界環(huán)境...
    茶點故事閱讀 39,213評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望弧轧。 院中可真熱鬧雪侥,春花似錦、人聲如沸精绎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捺典。三九已至鸟廓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間襟己,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評論 1 260
  • 我被黑心中介騙來泰國打工牍陌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留擎浴,地道東北人。 一個月前我還...
    沈念sama閱讀 45,423評論 2 352
  • 正文 我出身青樓毒涧,卻偏偏與公主長得像贮预,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子契讲,可洞房花燭夜當晚...
    茶點故事閱讀 42,722評論 2 345

推薦閱讀更多精彩內(nèi)容