第二章· Redis管理實戰

1、數據類型

String: 字符串類型
Hash: 哈希類型
List: 列表類型
Set: 集合類型
Sorted set: 順序集合類型redis

2、管理實戰

1.通用操做

#查看全部的key
127.0.0.1:6379> KEYS *
1) "age"
2) "name"
#判斷key是否存在
127.0.0.1:6379> EXISTS name
(integer) 1
#變動key名
127.0.0.1:6379> RENAME age nianling
#查看key的類型
127.0.0.1:6379> type name
string
#刪除key
127.0.0.1:6379> del name
(integer) 1
#以秒爲單位設置生存時間
127.0.0.1:6379> EXPIRE name 10
(integer) 1
#以毫秒爲單位設置生存時間
127.0.0.1:6379> PEXPIRE name 10000
(integer) 1
#取消剩餘生存時間
127.0.0.1:6379> PERSIST name
(integer) 1

2.strings(字符)類型操做

應用場景:數據庫

常規計數:微博數、粉絲數、直播平臺緩存

增:微信

#設置key
127.0.0.1:6379> set name zls
OK
#設置多個key
127.0.0.1:6379> mset name zls age 18 sex m
OK
#設置值、取值同時進行
127.0.0.1:6379> GETSET name zls
(nil)
127.0.0.1:6379> GETSET name zls
"zls"
#設置值同時設置生存時間
127.0.0.1:6379> set name zls ex 10
OK
#數量遞歸增長
127.0.0.1:6379> incr num
(integer) 1
#指定增長數值
127.0.0.1:6379> incrby num 2
(integer) 8
#數量遞減
127.0.0.1:6379> DECR num
(integer) -1
#指定遞減數
127.0.0.1:6379> DECRBY num 2
(integer) -3
#浮點增長
127.0.0.1:6379> incrbyfloat float 0.6
"0.6"

刪:運維

#刪除已有key
127.0.0.1:6379> DEL num

改:函數

#追加(若該鍵不存在,則建立)
127.0.0.1:6379> APPEND name bgx
(integer) 6
#查看追加內容
127.0.0.1:6379> get name
"zlsbgx"
#修改第N個字符串
127.0.0.1:6379> SETRANGE name 3 a
(integer) 6
#查看結果
127.0.0.1:6379> get name
"zlsagx"

查:code

#獲取key值
127.0.0.1:6379> get name
"zls"
#查看string類型的長度
127.0.0.1:6379> STRLEN name
(integer) 6
#查看指定長度的string類型
127.0.0.1:6379> GETRANGE name  0 4
"zlsag"
#以秒查詢key剩餘生存時間
127.0.0.1:6379> ttl name
(integer) 8
#以毫秒查詢key剩餘生存時間
127.0.0.1:6379> pttl name
(integer) 44016
#獲取多個key值
127.0.0.1:6379> mget name age sex
1) "zls"
2) "18"
3) "m"

應用場景實現:排序

#粉絲數量增長,每點一次關注,都執行如下命令一次
127.0.0.1:6379> incr num
(integer) 1
#取消關注則執行如下命令一次
127.0.0.1:6379> DECR num
(integer) -1
#顯示粉絲數量
127.0.0.1:6379> get num
"6"
#暗箱操做,刷粉絲
127.0.0.1:6379> incrby num 10000
(integer) 10006

3.hash(字典)類型操做

應用場景:遞歸

存儲部分變動的數據,如用戶信息,商品信息等。
最接近表結構的一種類型。索引

增:

#建立car的price值
127.0.0.1:6379> hset car price 500
(integer) 1
#建立car的name值
127.0.0.1:6379> hset car name BMW
(integer) 1
#建立car的date值
127.0.0.1:6379> hset car date 1982
(integer) 1
#設置多個哈希key(相似於MySQL的一個表中的一行數據)
127.0.0.1:6379> hmset teacher name zls age 18 sex m
OK
127.0.0.1:6379> hmset teacher name bgx age 80 sex f
OK

刪:

#刪除hash類型中的一個值
127.0.0.1:6379> HDEL teacher name
(integer) 1
#刪除整個hash類型key
127.0.0.1:6379> DEL teacher
(integer) 1

改:

#修改hash類型值 增長1
127.0.0.1:6379> hincrby myhash num 1
(integer) 1

查:

#獲取car的name值
127.0.0.1:6379> hget car name
"BMW"
#獲取key的所有value和值(運維經常使用)
127.0.0.1:6379> hgetall car
1) "price"
2) "500"
3) "name"
4) "BMW"
5) "date"
6) "1982"
#獲取key中部分值
127.0.0.1:6379> HMGET teacher name sex
1) "zls"
2) "m"

4.List(列表)類型操做

應用場景:

消息隊列系統

好比sina微博:在redis中咱們的最新微博ID使用了常駐緩存,這是一直更新的。
可是作了限制不能超過5000個ID,所以獲取ID的函數會一隻詢問redis。
系統不會像傳統方式那樣「刷新」緩存,redis實例中的信息永遠是一致的。
SQL數據庫(或是硬盤上的其餘類型數據)只是在用戶須要獲取「很遠」的數據時纔會被觸發,而主頁或第一個評論頁是不會麻煩到硬盤上的數據庫了。

增:

#將一個值或者多個值插入列表的表頭(若key不存在,則添加key並依次添加)
127.0.0.1:6379> lpush list zls
(integer) 1
127.0.0.1:6379> lpush list bgx
(integer) 2
127.0.0.1:6379> lpush list oldboy
(integer) 3
127.0.0.1:6379> lpush list alex
(integer) 4
#一行添加
127.0.0.1:6379> lpush teacher zls bgx oldboy alex
(integer) 4
#追加一個value值,若key不存在,則不建立
127.0.0.1:6379> LPUSHX teacher1 zls
(integer) 0
#在bgx前面添加zls
127.0.0.1:6379> linsert teacher before bgx zls
(integer) 6
#在尾部添加key
127.0.0.1:6379> rpush teacher wang5
(integer) 7
#將teacher的尾部元素彈出,再插入到teacher1的頭部
127.0.0.1:6379> rpoplpush teacher teacher1
"wang5"
#查看一個列表內有多少行
127.0.0.1:6379> llen list
(integer) 4

刪:

#刪除key
127.0.0.1:6379> del teacher
(integer) 1
#從頭部開始找,按前後順序,值爲a的元素,刪除數量爲2個,若存在第3個,則不刪除
127.0.0.1:6379> lrem teacher 2 zls
(integer) 2
#從頭開始,索引爲0,1,2的3個元素,其他所有刪除改
127.0.0.1:6379> ltrim teacher 0 2
OK

改:

#從頭開始, 將索引爲1的元素值,設置爲新值 e,若索引越界,則返回錯誤信息
127.0.0.1:6379> lset teacher 1 test
OK
#將 teacher 中的尾部元素移到其頭部
127.0.0.1:6379> rpoplpush teacher teacher
"oldboy"

查:

#列表頭部彈出,彈一行少一行
127.0.0.1:6379> lpop teacher
"zls"
#列表尾部
127.0.0.1:6379> rpop teacher
"wang5"
#查詢索引(頭部開始)
127.0.0.1:6379> lindex list 0
"bgx"
#查詢索引(尾部第一個)
127.0.0.1:6379> lindex list -1
"alex"
#範圍查詢索引
127.0.0.1:6379> lrange list 0 1
1) "bgx"
2) "oldboy"

微博、微信朋友圈場景實現:

#發朋友圈
127.0.0.1:6379> LPUSH wechat "monday,bgx is a bad man"
(integer) 1
127.0.0.1:6379> LPUSH wechat "Tuesday,zls is a nice boy"
(integer) 2
127.0.0.1:6379> LPUSH wechat "Wednesday,alex is a loser"
(integer) 3

#查看朋友圈內容
127.0.0.1:6379> LRANGE wechat 0 -1
1) "Wednesday,zls is a nice boy"
2) "Tuesday,zls is a nice boy"
3) "monday,zls is a nice boy"

5.Set(集合)類型操做

應用場景:

在微博應用中,能夠將一個用戶全部的關注人存在一個集合中,將其全部粉絲存在一個集合。Redis還爲集合提供了求交集、並集、差集等操做,能夠很是方便的實現如共同關注、共同喜愛、二度好友等功能,對上面的全部集合操做,你還可使用不一樣的命令選擇將結果返回給客戶端仍是存集到一個新的集合中。

增:

#若key不存在,建立該鍵及與其關聯的set,依次插入bgx、lidao、xiaomimei若key存在,則插入value中,若bgx在zls_fans中已經存在,則插入了lidao和xiaomimei兩個新成員。
127.0.0.1:6379> sadd zls_fans bgx lidao xiaomimei
(integer) 3

刪:

#尾部的b被移出,事實上b並非以前插入的第一個或最後一個成員
127.0.0.1:6379> spop zls_fans
"bgx"
#若值不存在, 移出存在的值,並返回剩餘值得數量
127.0.0.1:6379> SREM zls_fans lidao oldboy alex
(integer) 1

改:

#將小迷妹從 zls_fans 移到 bgx_fans
127.0.0.1:6379> SMOVE zls_fans bgx_fans xiaomimei
(integer) 1

查:

#判斷xiaomimei是否已經存在,返回值爲 1 表示存在
127.0.0.1:6379> SISMEMBER zls_fans xiaomimei
(integer) 0
127.0.0.1:6379> SISMEMBER bgx_fans xiaomimei
(integer) 1
#查看set中的內容
127.0.0.1:6379> SMEMBERS zls_fans
1) "xiaomimei"
2) "bgx"
3) "lidao"
#獲取Set 集合中元素的數量
127.0.0.1:6379> scard zls_fans
(integer) 0
127.0.0.1:6379> scard bgx_fans
(integer) 1
#隨機的返回某一成員
127.0.0.1:6379> srandmember bgx_fans
"xiaomimei"

#建立三個集合
127.0.0.1:6379> sadd zls_fans bgx lidao xiaomimei
(integer) 3
127.0.0.1:6379> sadd bgx_fans zls lidao xiaomimei
(integer) 2
127.0.0.1:6379> sadd lidao_fans 0
(integer) 1

#1和2獲得一個結果,拿這個集合和3比較,得到每一個獨有的值
127.0.0.1:6379> sdiff zls_fans bgx_fans lidao_fans
1) "bgx"
#3個集和比較,獲取獨有的元素,並存入diffkey 關聯的Set中
127.0.0.1:6379> sdiffstore diffkey zls_fans bgx_fans lidao_fans
(integer) 1
#得到3個集合中都有的元素
127.0.0.1:6379> sinter zls_fans bgx_fans lidao_fans
(empty list or set)    //由於這裏沒有交集,因此返回一個空集合
#把交集存入interkey 關聯的Set中
127.0.0.1:6379> sinterstore interkey bgx_fans lidao_fans
(integer) 0  // 由於這裏沒有交集,因此存入的值爲0
#獲取3個集合中的成員的並集
127.0.0.1:6379> sunion zls_fans bgx_fans lidao_fans
1) "bgx"
2) "xiaomimei"
3) "zls"
4) "lidao"
5) "0"
#把並集存入unionkey 關聯的Set中
127.0.0.1:6379> sunionstore unionkey zls_fans bgx_fans lidao_fans
(integer) 5

6.Sorted-Set(有序集合)類型操做

應用場景:

排行榜應用,取TOP N操做
這個需求與上面需求的不一樣之處在於,前面操做以時間爲權重,這個是以某個條件爲權重,好比按頂的次數排序,這時候就須要咱們的sorted set出馬了,將你要排序的值設置成sorted set的score,將具體的數據設置成相應的value,每次只須要執行一條ZADD命令便可。

增:

#添加兩個分數分別是 2 和 3 的兩個成員
127.0.0.1:6379> zadd myzset 2 "two" 3 "three"
(integer) 2

刪:

#刪除多個成員變量,返回刪除的數量
127.0.0.1:6379> zrem myzset one two
(integer) 1

改:

#將成員 one 的分數增長 2,並返回該成員更新後的分數
127.0.0.1:6379> zincrby myzset 2 one
"2"

查:

#返回全部成員和分數,不加WITHSCORES,只返回成員
127.0.0.1:6379> zrange myzset 0 -1 WITHSCORES
1) "one"
2) "2"
3) "three"
4) "3"
#獲取成員one在Sorted-Set中的位置索引值。0表示第一個位置
127.0.0.1:6379> zrank myzset one
(integer) 0
#獲取 myzset 鍵中成員的數量
127.0.0.1:6379> zcard myzset
(integer) 2
#獲取分數知足表達式 1 <= score <= 2 的成員的數量
127.0.0.1:6379> zcount myzset 1 2
(integer) 1  
#獲取成員 three 的分數 
127.0.0.1:6379> zscore myzset three
"3"
#獲取分數知足表達式 1 < score <= 2 的成員
127.0.0.1:6379> zrangebyscore myzset  1 2
1) "one"
#-inf 表示第一個成員,+inf最後一個成員
#limit限制關鍵字
#2  3  是索引號
zrangebyscore myzset -inf +inf limit 2 3  返回索引是2和3的成員
#刪除分數 1<= score <= 2 的成員,並返回實際刪除的數量
127.0.0.1:6379> zremrangebyscore myzset 1 2
(integer) 1
#刪除位置索引知足表達式 0 <= rank <= 1 的成員
127.0.0.1:6379> zremrangebyrank myzset 0 1
(integer) 1
#按位置索引從高到低,獲取全部成員和分數
127.0.0.1:6379> zrevrange myzset 0 -1 WITHSCORES
#原始成員:位置索引從小到大
      one  0
      two  1
#執行順序:把索引反轉
      位置索引:從大到小
      one 1
      two 0
#輸出結果: 
       two
       one
#獲取位置索引,爲1,2,3的成員
127.0.0.1:6379> zrevrange myzset 1 3
(empty list or set)
#相反的順序:從高到低的順序
#獲取分數 3>=score>=0的成員並以相反的順序輸出
127.0.0.1:6379> zrevrangebyscore myzset 3 0
(empty list or set)
#獲取索引是1和2的成員,並反轉位置索引
127.0.0.1:6379> zrevrangebyscore myzset 4 0 limit 1 2
(empty list or set)
相關文章
相關標籤/搜索