程式設計界的國小生
- 一、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看目前伺服器支援的指令不香嗎?
2.help指令
上面是看資料類型的全部指令,這個是看具體某個指令的用法,而不用眼花缭亂的去上面那一坨裡找到這個指令再檢視。比如檢視lpush的用法(lpush是list類型的)。他連哪個版本出的,屬于哪個資料類型(group)都告訴你了。
接下來言歸正傳談論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、驗證正反向索引
下圖對照上圖一起看,我不會騙你的。實戰出真理。
四、如何檢視資料類型
1、type
比如type我們剛才set的key
那我們繼續set一個數字呢?然後類型是啥?
為什麼還是string?不是說string可以代表int類型嗎? type隻能看大類型,看具體小類型需要
object encoding
2、object encoding
我怎麼知道object有encoding這個關鍵字?object help可看。無須理會emb是什麼意思,知道str是字元串就行。
正因為他是int類型,是以我們才能執行
incr、decrby
等指令。
但是我們給剛才的
key1 append
一個其他數字,然後再看類型,這時候就不是int了,也很好了解,int都不支援append操作,字元串才支援,append完你在incr等指令,就又會變成int。
五、底層存儲機關
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
2、底層存儲
如果存中文會占用幾個位元組?
顯然是根據編碼來的,UTF-8一個中文占用3位元組,GBK一個中文占用2位元組。
先來看utf8的情況
再來看gbk的情況
很明顯發現utf8是3個位元組存儲空間。gbk是占用兩個位元組。
我用的xshell,xshell更改編碼的方法如下
檔案–屬性–終端–編碼
是以服務端存儲的編碼與用戶端的編碼必須一緻,否則就會出現比如服務端用UTF-8存儲的中文,但是用戶端用的GBK取出的。那麼會導緻亂碼,因為位元組數都不一樣。
可以驗證下:(目前是UTF8)
可以明顯發現取出utf8存儲的中文就能正常顯示,取出gbk存儲的中文則是一個不是我們想要的結果。 redis-cli --raw
可以顯示出中文。
六、Redis作者細膩的地方
Redis作者很細膩的,處處為我們廣大開發着想。
- 比如為什麼要有
這種指令?getset
getset
設定新值并将老值傳回,遇到這種場景的話可以減少IO,一個指令直接搞定,否則你可能需要寫2-3個指令才能完成這個操作。
七、總結
- help指令
- string能存哪些類型
- 正反向索引
- type&object encoding
- 底層存位元組
八、個人公衆号
微信公衆号【Java碼農社群】