概述
Redis中的字符串直接按照二進制的數據存儲,不會有任何的編碼轉換,因此存放什么樣,取出來的時候就什么樣。而MySQL默認的字符集是拉丁文,如果插入中文就會失敗
Redis中的字符串類型不僅可以存放文本數據,還可以存放整數,JSON,xml,圖片,視頻,音頻等等(但是音頻視頻的體積很大,Redis中對String類型限制大小為512mb)
常用命令
SET
通過自動補全可以看到set命令的完整語法
Redis文檔中語法格式說明:
符號 | 解釋 |
---|---|
[ ] | 代表可選項,[ ]和[ ]之間可以同時存在 |
| | 代表或者的意思,多個|只能出現一個 |
value后面的ex|px代表著過期時間
也就是說
set key value ex 10
等價于
set key value
expire key 10
通過簡化代碼數量,減少網絡通信的次數,提升顯效率
并且,一句代碼還可以保證原子性,Redis分布式鎖中會有所體現,后面的blog會詳細講解
除此以外,還可以這樣寫set命令
setnx
setex
如果key存在,新的value覆蓋了舊的value,數據的類型可能會被改變,key的生存時間也會失效
演示代碼
使用flushall可以清除Redis中所有key
ex
nx
xx
setnx
setnx key seconds
setex
setex key value seconds
psetex
psetex key millionseconds
GET
獲取key對應的value
需要注意的是,get只適用于字符串類型,如果是其他類型則會報錯
MSET
一次插入多個鍵值對,key和value交替寫,時間復雜度O(N),N是key的數量
MGET
一次獲取多個value,時間復雜度O(N),N是key的數量
增減命令
將string類型的value當作數字,進行加減操作,時間復雜度都是O(1)
命令 | 操作 |
---|---|
incr | value + 1 |
incrby | value + n |
decr | value - 1 |
decrby | value - n |
incrbyfloat | value +/- 小數 |
incr
incr key
此時的key必須是一個64位內的整數,操作的返回值就是value+1后的結果(相當于++i)
如果key不是合理整數則報錯
如果直接incr一個不存在的key,那么就會把這個key的value當作0
incrby
incrby key increment
同理,如果針對一個不存在的key進行incrby,那么會將這個key的value當作0處理
decr
邏輯和incr一致
decr key
decrby
邏輯和incrby一致
decrby key decrement
incrbyfloat
其他邏輯和incrby一致,但是由于沒有decrbyfloat,因此只能通過incrbyfloat key -n的操作來實現減法
incrbyfloat key increment
append
如果key存在,拼接key對應的value和給定字符串的內容,返回拼接完的字符串有多少個字節(utf8中的一個漢字通常是3個字節)
append key value
如果key不存在,那么和直接使用set一樣
如果插入漢字,取出的時候客戶端不會自動翻譯二進制數據,而是將二進制轉換為十六進制
可以在Redis啟動的時候加上–raw的選項,就可以解決上述問題了,退出Redis使用ctrl + d
getrange
相當于Java中的substring,切分value中的部分字符串,范圍由start和end確定(左閉右閉區間)
Redis中的下標從1開始,并且支持負數,如果是-1那就代表倒數第一個元素 = len - 1
getrange key start end
但是,由于中文一般是3個字節,那么在使用getrange后,切割的結果可能不是一個完整的漢字了
setrange
將字符串中的部分子串替換為別的內容,返回值是替換之后的字符串長度
setrange key offset value
其中的offset是從第幾個字節開始替換,替換的長度就是value的長度
如果對一個不存在的key進行setrange,并不會報錯,而是在偏移量之前添加空字節0x00
同樣的,如果value是一段中文,那么setrange可能會出錯
strlen
獲取字符串的長度,單位是字節,如果value不是string類型,則報錯,如果key不存在,返回0
strlen key
String的編碼方式
編碼方式 | 說明 |
---|---|
int | 64位/8字節的整數 |
embstr | 壓縮字符串 小于等于39個字節的字符串 |
raw | 普通字符串 大于39個字節的字符串 |
通過object encoding key可以查看對應key的編碼方式
在Redis中,存儲小數其實和存儲一個字符串一樣,因此每次對小數進行算數操作,都需要把字符串轉換為小數,然后再進行計算,算完再轉為小數
string類型的應用場景
作為緩存直接返回數據
上述策略中,隨著時間推移,越來越多的key從mysql中存入Redis,使Redis的數據變得過多,那么有如下兩種解決方案
- 設置key的過期時間
- Redis提供淘汰策略
計數功能
Redis中只記錄視頻的播放次數,并且異步同步數據到統計數據的數據庫
共享會話
http中的cookie是用來實現用戶信息的保存的,其需要session的配合完成。服務器這邊存儲了用戶的數據,而cookie是讓瀏覽器存儲用戶的身份標識(sessionId)
但如果應用了分布式系統,存在多個應用服務器。與用戶登錄時可能將用戶會話信息存儲在a服務器中,但是用戶下次訪問請求可能發送到c服務器中,而c服務器中沒有用戶的會話信息
解決方法是:所有的服務器都把用戶的會話信息存放在Redis中
手機驗證碼
服務器將用戶的手機號當作key,驗證碼當作value存放在Redis中,并設置過期時間,用戶在指定時間內提交驗證碼給服務器,服務器通過手機號向Redis獲得正確的驗證碼,并與用戶發送過來的進行比對,返回true或false