Redis學習筆記2 五大數據類型之字符串

一、Redis常用命令

  1. 設置鍵的值
    語法:set key value [ex seconds] [px seconds] [nx|xx]
    選項:
  • ex seconds:給鍵設置秒級的過期時間
  • px milliseconds:給鍵設置毫秒級的過期時間
  • nx:當鍵不存在時才能設置成功,用於新增
  • xx:當鍵存在時才設置成功,用於更新

新增一個鍵name並設置值:

127.0.0.1:6379> set name jingjing
OK

用選項xx更新一下鍵name的值:

127.0.0.1:6379> set name wen xx
OK
127.0.0.1:6379> get name
"wen"

此外redis還提供了setexsetnx兩個命令,它們的作用與選項exnx一樣:

127.0.0.1:6379> setex name 20 wen    #用setex爲鍵name設置20秒的過期時間
OK
127.0.0.1:6379> ttl name             #用ttl查看鍵name還剩多少時間過期
(integer) 14
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> set name wen ex 20   #用ex選項爲鍵name設置秒級過期時間20秒
OK
127.0.0.1:6379> ttl name
(integer) 0
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> set name wen        #由於鍵name已經過期,所以重新設置
OK
127.0.0.1:6379> exists name
(integer) 1
127.0.0.1:6379> set name jingjing nx     #用參數nx設置已存在的鍵name
(nil)                                    #因爲鍵name已經存在,所以設置不成功
127.0.0.1:6379> setnx name jingjing      #用命令setnx設置已存在的j鍵name
(integer) 0                              #因爲鍵name已經存在,所以設置不成功,但是注意到返回的值與使用參數ex設置時返回的不一樣
127.0.0.1:6379> get name    
"wen"

命令setnx在實際中有什麼用呢?我們知道redis是單線程命令處理機制,那麼當有多個用戶同時執行setnx key_name key_value時,由命令setnx的特性可以得知只有一個客戶端能設置成功,所以setnx可以作爲分佈式鎖的一種實現方案。

  1. 獲取鍵值
    語法:get key_name
    獲取鍵name的值:
127.0.0.1:6379> get name
"wen"

如果鍵不存在的話,會返回nil空值:

127.0.0.1:6379> get test
(nil)
  1. 批量設置鍵值:
    語法:mset key_name key_value [key_name key_value ...]
    通過mset一次性設置三個鍵值對:
127.0.0.1:6379> mset name jingjing job dba country china
OK
127.0.0.1:6379> get name
"jingjing"
127.0.0.1:6379> get job 
"dba"
127.0.0.1:6379> get country
"china"
  1. 批量獲取鍵值
    語法:mget key_name [key_name ...]
    獲取剛纔創建的三個鍵的值:
127.0.0.1:6379> mget name job country
1) "jingjing"
2) "dba"
3) "china"
4) (nil)
#當鍵不存在的時候,返回nil空值,結果的順序是按照傳入鍵的順序返回

很顯然批量操作可以提高效率,如果不使用mget命令的話,獲取n個鍵值需要執行n次get命令,其消耗的時間如下:
n次get時間=n次網絡時間+n次命令執行時間
如下圖所示,展示了不用mget命令的時間開銷:
在這裏插入圖片描述
當我們使用mget命令後,時間開銷大大降低,如下圖所示:
1次mget時間=1次網絡時間+n次命令執行時間
在這裏插入圖片描述
redis每秒可以實現數萬級別的讀寫操作,這是指redis服務器端的處理速度,但是用戶除了等待處理時間,還要等待網絡傳輸時間,假設網絡時間是1毫秒,而命令執行時間是0.1毫秒,那麼計算1次mget命令的時間開銷與執行1000次get命令的時間開銷對比如下表所示:

Operation Time
1000次get 1000x1+1000x0.1=1100ms=1.1s
1次mget 1x1+1000x0.1=101ms=0.101s

可以看出時間相差近十倍,對於開發者來說redis的性能已經很好了,大多數時間開銷都是在網絡時間上,所以學會使用批量處理,會使得我們的效率變高,也能使應用更加穩定,但是批量操作不是無限制的,注意命令的數量就好,如果過多會造成redis的噩夢------堵塞!

  1. 計數
    語法:incr key_name

incr命令用於對鍵值做自增操作,返回的結果有3種情況:

  • 鍵的值不是整數,則返回錯誤
127.0.0.1:6379> incr name
(error) ERR value is not an integer or out of range
  • 鍵的值是整數,返回鍵的值增加1
127.0.0.1:6379> set x 1
OK
127.0.0.1:6379> incr x
(integer) 2
  • 鍵的值不存在,則按照0自增,返回結果1
127.0.0.1:6379> incr y
(integer) 1

除了incr命令,redis還提供了decr自減、incrby指定自增步長、decrby指定自減步長、incrbyfloat自增浮點數

127.0.0.1:6379> incrby x 2
(integer) 4
127.0.0.1:6379> incrby x 2
(integer) 6
127.0.0.1:6379> incrby x 2
(integer) 8
127.0.0.1:6379> decrby x 2
(integer) 6
127.0.0.1:6379> incrbyfloat x 1.5
"7.5"

二、不常用的命令

  1. 追加值
    語法:append key_name key_value

append可以向字符串後追加值,如:

127.0.0.1:6379> set a hello
OK
127.0.0.1:6379> append a world
(integer) 10
127.0.0.1:6379> get a
"helloworld"
  1. 字符串長度
    語法:strlen key_name
127.0.0.1:6379> strlen a
(integer) 10
  1. 設置並返回值
    語法:getset key_name key_value

get一樣getset會設置鍵的值,但是會返回原來的值:

127.0.0.1:6379> getset b helloworld
(nil)
127.0.0.1:6379> getset b hellowen
"helloworld"
  1. 設置指定位置的字符
    語法:setrange key_name offset key_value
127.0.0.1:6379> set c pest
OK
127.0.0.1:6379> setrange c 0 b
(integer) 4
127.0.0.1:6379> get c
"best"
  1. 獲取字串
    語法:getrange key_name start end
127.0.0.1:6379> getrange c 0 1        #偏移量是從0開始計算,返回鍵c的前兩個字符
"be"

在這裏插入圖片描述

三、Redis的字符串數據類型的內部編碼
語法:object encoding key_name
字符串類型的內部編碼有如下3種:

  • int:8個字節的長整形
  • embstr:小於等於39個字節的字符串
  • raw:大於39個字節的字符串

redis會根據當前值的類型和長度決定使用何種內部編碼實現
整數類型:

127.0.0.1:6379> set d 12345
OK
127.0.0.1:6379> object encoding d
"int"
127.0.0.1:6379> strlen d
(integer) 5

小於等於39字節的字符串:

127.0.0.1:6379> set test "Redis  is pretty charming"
OK
127.0.0.1:6379> object encoding test
"embstr"
127.0.0.1:6379> set test "Redis  is pretty charming"
OK
127.0.0.1:6379> strlen test
(integer) 25

大於39個字節的字符串:

127.0.0.1:6379> get test
"Redis  is pretty charming,i am going to love it,do you love it?"
127.0.0.1:6379> object encoding test
"raw"
127.0.0.1:6379> strlen test
(integer) 63
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章