天天看點

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

程式設計界的國小生

  • 一、help
    • 1.help類型
    • 2.help指令
  • 二、string隻代表字元串類型嗎?
  • 三、正反向索引
    • 1.描述
    • 2.正向索引
    • 3.反向索引
    • 4、驗證正反向索引
  • 四、如何檢視資料類型
    • 1、type
    • 2、object encoding
  • 五、底層存儲機關
    • 1、小常識:二進制安全
    • 2、底層存儲
  • 六、Redis作者細膩的地方
  • 七、總結
  • 八、個人公衆号

一、help

一定要學會用help,且下意識的去用help,而不是去百度翻閱文檔。

一定要學會用help,且下意識的去用help,而不是去百度翻閱文檔。

一定要學會用help,且下意識的去用help,而不是去百度翻閱文檔。

1.help類型

不光可以檢視redis的N大類型,還可以檢視事務、連接配接、叢集等等等等。輸入help 然後按tab鍵就行了。比如下面是看string這個類型的所有api。為什麼說不去看文檔,而是看這個,因為每個版本的指令可能也不同,是以直接help看目前伺服器支援的指令不香嗎?

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

2.help指令

上面是看資料類型的全部指令,這個是看具體某個指令的用法,而不用眼花缭亂的去上面那一坨裡找到這個指令再檢視。比如檢視lpush的用法(lpush是list類型的)。他連哪個版本出的,屬于哪個資料類型(group)都告訴你了。

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号
接下來言歸正傳談論string

二、string隻代表字元串類型嗎?

  • 字元串類型
  • int類型
  • bitmap類型(下個篇幅重點)

三、正反向索引

1.描述

string類型再存儲的時候會建立兩套索引:正向索引、反向索引。

比如我們執行指令

set key hello

2.正向索引

h e l l o
1 2 3 4

3.反向索引

h e l l o
-5 -4 -3 -2 -1

4、驗證正反向索引

下圖對照上圖一起看,我不會騙你的。實戰出真理。
你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

四、如何檢視資料類型

1、type

比如type我們剛才set的key

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

那我們繼續set一個數字呢?然後類型是啥?

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

為什麼還是string?不是說string可以代表int類型嗎? type隻能看大類型,看具體小類型需要

object encoding

2、object encoding

我怎麼知道object有encoding這個關鍵字?object help可看。無須理會emb是什麼意思,知道str是字元串就行。
你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

正因為他是int類型,是以我們才能執行

incr、decrby

等指令。

但是我們給剛才的

key1 append

一個其他數字,然後再看類型,這時候就不是int了,也很好了解,int都不支援append操作,字元串才支援,append完你在incr等指令,就又會變成int。

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

五、底層存儲機關

1、小常識:二進制安全

  • 位元組流
  • 字元流
redis選擇的位元組流,因為位元組在各大語言等都一樣,比如各大語言互動都用json/xml統一一樣,而不是序列化的方式,因為序列化的話可能每種語言不同,都需要自己寫編碼器解碼器,你認為你那邊int是4位元組,我這邊認為是2位元組。結果對不上。我用2位元組取你4位元組溢出了。 是以redis選擇位元組流。是以你set a 111,OBJECT encoding a是int類型,但是strlen a 是3,他不會認為你是int類型就占用4個位元組,長度就是4,他隻會認為你每個1代表一個字元一個位元組,是以長度是3
你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

2、底層存儲

如果存中文會占用幾個位元組?

顯然是根據編碼來的,UTF-8一個中文占用3位元組,GBK一個中文占用2位元組。

先來看utf8的情況

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

再來看gbk的情況

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

很明顯發現utf8是3個位元組存儲空間。gbk是占用兩個位元組。

我用的xshell,xshell更改編碼的方法如下

檔案–屬性–終端–編碼

是以服務端存儲的編碼與用戶端的編碼必須一緻,否則就會出現比如服務端用UTF-8存儲的中文,但是用戶端用的GBK取出的。那麼會導緻亂碼,因為位元組數都不一樣。

可以驗證下:(目前是UTF8)

可以明顯發現取出utf8存儲的中文就能正常顯示,取出gbk存儲的中文則是一個不是我們想要的結果。
你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号

redis-cli --raw

可以顯示出中文。

六、Redis作者細膩的地方

Redis作者很細膩的,處處為我們廣大開發着想。

  • 比如為什麼要有

    getset

    這種指令?

getset

設定新值并将老值傳回,遇到這種場景的話可以減少IO,一個指令直接搞定,否則你可能需要寫2-3個指令才能完成這個操作。

七、總結

  • help指令
  • string能存哪些類型
  • 正反向索引
  • type&object encoding
  • 底層存位元組

八、個人公衆号

微信公衆号【Java碼農社群】

你真的懂Redis的string類型?一、help二、string隻代表字元串類型嗎?三、正反向索引四、如何檢視資料類型五、底層存儲機關六、Redis作者細膩的地方七、總結八、個人公衆号