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叫散列類型渔扎,它提供了字段和字段值的映射。字段值只能是字符串類型信轿,不支持散列類型晃痴、集合類型等其它類型。如下:
思考: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ù)時只是更改前后元素的指針指向即可,速度非匙叮快作岖,然后通過下標查詢元素時需要從頭開始索引,所以比較慢五芝,但是如果查詢前幾個元素或后幾個元素速度比較快痘儡。
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 no
為appendonly 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是只讀的