您好,登錄后才能下訂單哦!
redis是日常開發中最常的非關系型數據庫,可以說只要是個項目基本都會使用到。常用來做數據緩存、分布式鎖等等。redis的基本安裝內容就不說了(在之前的博客搭建系列里面有提到redis的安裝使用,如果不會的可以看一下),后面更新會說一下其配置文件中主要的配置信息。
redis常用的數據類型str、hash、list、set、zset,但是最常用的應該就是前三種,這篇文章里面就是用來記錄和說明這前三種數據類型常使用的命令。雖然在實際開發過程中很少使用這些命令,但是了解這些命令,會更有利于對redis相關API的理解和使用。
redis為什么速度這么快,這是面試常見的面試題,更是項目中使用它的原因。
字符串類型是最常用的,可能很多簡單小型項目用來緩存數據都只會用到這一種數據類型。
set key value [ex seconds] [px milliseconds] [nx|xx]
:存儲數據,key是鍵唯一,值是字符串類型,用來存儲真正的數據信息,ex和px表示設置其有效時間,對應的單位分別是秒和毫秒,nx和xx表示存儲數據是否可以被覆蓋,如果key已經存在,返回為0,表示沒有設置成功,如果key不存在返回為1,表示設置成功,xx是set命令默認的存儲方式,可覆蓋
### 直接存儲數據
set name joker
### 加上有效時間為10秒
set name joker ex 10
### 加上有效時間為10000毫秒
set name joker px 10000
### 不可覆蓋+有效時間
set name itcrud ex 10 nx
這里需要注意,當使用nx或者xx的時候,前面需要有有效時間,如果只需要使用nx,不需要設置有效時間也是可以的,但是命令是不同,看下面setnx
命令。
get key
:根據key獲取value值
get name
mset keys values
:批量存儲鍵值數據,如果客戶端同時有大量數據執行存儲,每條數據都連接一次redis,會增大連接過程的資源消耗,效率上也會大打折扣,這時便可以使用批量存儲方式
## 同時設置三條數據,key分別是:name、age、blog,值分別是:joker、30、blog.itcrud.com
mset name joker age 30 blog blog.itcurd.com
mget keys
:輸入批量鍵,獲取批量的值,多個key用空格隔開即可
mget name age blog
incr key
:key對應value值自增1操作,比如投票的時候常用,value必須為整數才可以
incr age
incrby key increment
:key對應的value值增長increment指定的值,value同樣要為整數
incrby age 3
decr key
:key對應value值減1的操作,value必須為整數
decr age
decrby key decrement
:key對應value值減decrement指定的值,value必須為整數
decrby age 1
incrbyfloat key increment
:key對應的value值增加increment指定的值,value可以為整數或者浮點數都可以
incrbyfloat score 1.1
setnx key value
:不可覆蓋的設置值,當key已經存在,setnx返回為0,表示沒有設置成功,如果key不存在返回為1,表示設置成功
setnx name joker
strlen key
:獲取key對應的value值長度
strlen name
getrange key start end
:截取字符串,包含start和end
## 獲取的字符串為"it"
set name itcrud
getrange name 0 1
hash結構的如圖所示:
hash類型很適合存儲一些對象信息。把field變為字段名,把字段值變為filed對應的value值,其中數據的唯一標識放在key上面。
hset key field value
:設置值
hset user:1 name joker
hmset key fields values
:批量設置值
hmset user:1 name joker age 30 blog blog.itcrud.com
hget kye field
:獲取單個值
hget user:1 name
hmget key fileds
:批量獲取值
hget user:1 name age blog
hgetall key
:獲取key下的所有鍵值對
hgetall user:1
hdel key fields
:刪除key下的某個鍵值對,支持批量刪除,指定多個field即可
hdel user:1 name age
hlen key
:獲取當前key下鍵值對的數量
hlen user:1
hexists key field
:查詢key下,指定的field是否存在,
hexists user:1 name
hkeys key
:獲取key下所有的filed列表
hkeys user:1
hvals key
:獲取key下的所有value列表
hvals user:1
hincrby key field increment
:對key的field對應value值做增加的操作,增加的值為increment指定的值,只支持整數
hincrby user:1 age 2
hincrbyfloat key field increment
:對key的field對應value值做增加的操作,增加的值為increment指定的值,可以是整數或者浮點數
hincrbyfloat user1 score 1.1
list最常見的是被用為隊列,一個key下面可以存儲一個有序的字符串隊列,單個隊列可以存儲2的32次方減1個元素。基本的數據結構圖如下:
rpush key values
:從右側推入元素,可以同時推入多個
## 從右側依次推入a、b、c三個元素
rpush itcrud a b c
lpush key values
:從左側推入元素,可以同時推入多個
## 從左側依次推入a、b、c三個元素
lpush itcrud a b c
lrange key start end
:根據index獲取指定范圍內的元素,包含start和end的元素
## 獲取全量元素,0表示左側開始的第一個元素,-1表示從右側開始的第一個元素
lrange itcrud 0 -1
linsert key before|after pivot value
:在指定元素的前面或者后面插入元素
## 在b的前面插入新元素m
linsert itcrud before b m
lindex key index
:獲取指定index位置的元素
lindex itcrud -2
llen key
:獲取列表的長度
llen itcrud
lpop key
:從左側彈出元素
lpop itcrud
rpop key
:從右側彈出元素
rpop itcrud
說明:關于list的index還是需要說一下,當index計數是從左到右,就是從0開始。但是index計數是從右到左,就是從-1開始。如下圖:
三種數據類型都已經說完了,但是這里還需要補充一個內容,是平時我們項目中使用redis的習慣,以及其他主要的使用習慣的對比。
直接用字符串的方式存儲(分散存儲),存儲方式如下:
set user:1:name joker
set user:1:age 30
set user:1:gender male
這種存儲的缺點是鍵的冗余太多,我們都知道redis是存儲在內存里面,內存空間是很珍貴的,這個存儲太浪費啦,另外這樣存儲過于分散,不利于使用。缺點和優點都是相對的,這樣存儲更為直觀。但是實際上這個優點并沒有什么用。
將對象序列化成字符串,存儲方式如下:
## 將user序列化成json字符串:jsonUser
set user:1 jsonUser
優點:編程簡單,序列化合理,內存使用率高
缺點:序列化的反序列化過程以及客戶端和服務端建立連接有一定的開銷。如果只是修改用戶中的一個字段,都需要經歷查詢、反序列化、修改值、序列化、再set設置值。
hmset user:1 name joker age 30 gender male
優點:簡單直觀,相對于序列化內存消耗會高一點,每次修改只需要建立一次連接,操作簡便
缺點:要控制ziplist與hashtable兩種編碼轉換,且hashtable會消耗更多的內存
三種方式各有優缺點,可以對比使用,沒有絕對的優勢,也沒有絕對的劣勢,看實際項目的需求,我們項目里使用的第二種方式,序列化對象,因為json轉換對象很方便。如果是采用第三種,在數據和對象的轉換過程會更為復雜。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。