一、字符串操作
1. set命令
1)set命令詳解
- 基本語法與參數
- 命令格式:set key value [ex 秒數]/[px 毫秒數][nx]/[xx]
- 有效期設置:
- ex參數:以秒為單位設置過期時間,如set a 1 ex 10表示10秒有效
- px參數:以毫秒為單位設置過期時間,如set a 1 px 9000表示9秒有效
- 注意事項:
- ex和px不要同時使用,否則以后面的參數為準
- 例如set a 1 ex 100 px 9000實際以9000毫秒為準
- 條件參數nx/xx
- nx(not exist):
- 僅當key不存在時才執行操作
- 示例:set site www.baidu.com nx,若site已存在則操作無效
- xx(exist):
- 僅當key存在時才執行操作(相當于修改)
- 示例:set site www.google.com xx,若site不存在則操作無效
- 默認行為:
- 不加參數時:key不存在則創建,存在則修改
- nx(not exist):
- 有效期沖突處理
- 沖突規則:
- 當ex和px同時指定時,以后面的參數為準
- 示例:set search www.baidu.com ex 10 px 1567實際以1567毫秒為準
- 實際應用:
- 建議只使用一種時間單位(秒或毫秒)
- 毫秒級精度更高,適合需要精確控制的場景
- 相關輔助命令
- ttl命令:查看key剩余生存時間(秒)
- pttl命令:查看key剩余生存時間(毫秒)
- persist命令:移除key的過期時間,使其永久有效
- flushdb命令:清空當前數據庫所有key
- 批量操作命令
- mset命令:一次性設置多個鍵值對
- 示例:mset key1 v1 key2 v2...
- mget命令:一次性獲取多個key的值
- 示例:mget key1 key2...
- mset命令:一次性設置多個鍵值對
2)mset命令
- 批量設置:一次性設置多個鍵值對,語法為mset key1 value1 key2 value2...
- 實例演示:如mset a aman b bold c controller d diamond同時設置四個鍵值
- 效率優勢:相比多次使用set命令,減少網絡往返時間,提升操作效率
- 注意事項:所有鍵值必須成對出現,若參數數量為奇數會報錯
3)mget命令
- 批量獲取:一次性獲取多個鍵的值,語法為mget key1 key2...
- 實例演示:如mget a b c可同時獲取鍵a、b、c對應的值
- 返回值順序:返回值的順序與請求鍵的順序嚴格對應
- 特殊處理:當某個鍵不存在時,返回列表中對應位置顯示(nil)
- 性能對比:與循環執行get命令相比,顯著減少網絡開銷
- 相關字符串操作
- 過期時間設置:
- ex參數設置秒級過期(如set a 1 ex 10)
- px參數設置毫秒級過期(如set a 1 px 9000)
- 同時存在時以后出現的參數為準
- 條件設置:
- nx:僅當鍵不存在時設置(類似setnx)
- xx:僅當鍵存在時設置
- 字符串修改:
- setrange key offset value:從指定偏移量開始修改字符串
- 偏移量超長時自動用0x00填充(如setrange greet 6 !)
4)setrange命令
- 基本功能
- 命令格式: setrange key offset value
- 核心作用: 修改字符串中指定偏移位置的字節內容
- 操作原理: 從字符串的offset偏移位置開始,用value值進行覆蓋替換
- 基礎示例
- 示例演示:
- 偏移規則: 字符串偏移量從0開始計算,如"hello"中h=0,e=1,l=2...
- 邊界情況處理
- 超長偏移處理: 當offset超過原字符串長度時,中間空缺部分會自動用
0x000x000x00
填充 - 填充示例:
- 內存變化: 命令返回值為修改后的字符串總長度
- 實戰案例
- 應用場景: 可用于實現文字游戲功能
- 案例演示:
- 注意事項: 替換內容長度可以與原內容不同,但會影響最終字符串長度
- 特殊字符處理
- 空位填充: 偏移量超過字符串長度時,中間空位會顯示為
0x000x000x00
- 顯示效果: 在Redis客戶端中會直接顯示為\x00字符
- 內存占用: 這些填充字符會占用實際存儲空間
5)append命令
- 功能描述: 將指定value追加到key的原值末尾
- 語法格式: append key value
- 操作示例:
- 原值"he11o\x00!"執行append word @@后變為"he11o\x00!@@"
- 演示了在字符串尾部追加內容的實際效果
- 特點:
- 操作簡單直接,類似字符串拼接
- 會修改原始鍵值對內容
- 返回值為操作后字符串的總長度
6)getrange命令
- 功能描述: 獲取字符串中指定范圍的子串
- 語法格式: getrange key start stop
- 下標規則:
- 左數從0開始,右數從-1開始
- 示例:getrange title 0 3返回"chin"
- 示例:getrange title 1 -2返回"hines"
- 邊界情況:
- 當
start>=lengthstart >= lengthstart>=length
時返回空字符串 - 當
stop>=lengthstop >= lengthstop>=length
時截取至字符串結尾 - 當start位置在stop右邊時返回空字符串
- 當
- 注意事項:
- 范圍包含start和stop位置字符
- 支持正負索引混合使用
7)getset命令
- 功能描述: 獲取舊值并設置新值
- 語法格式: getset key newvalue
- 特點:
- 原子性操作,保證線程安全
- 返回值為修改前的舊值
- 示例:set cnt 0后執行getset會返回0
- 使用場景:
- 需要獲取當前值并更新的場景
- 計數器等需要原子操作的場景
8)setrange命令
- 功能描述: 從指定位置開始修改字符串內容
- 語法格式: setrange key offset value
- 操作示例:
- setrange word 2 ??將"he11o"修改為"he??o"
- setrange word 6 !在超出位置填充空字節后添加字符
- 特點:
- 可以覆蓋原有內容
- 當offset超過原字符串長度時用空字節(
\x00\x00\x00
)填充 - 返回值為修改后字符串的總長度
- 與append區別:
- setrange可指定修改位置
- append只能在末尾追加
9)getrange命令
- 基本語法: getrange key start stop
- 作用: 獲取字符串中
[start,stop][start,stop][start,stop]
范圍的子串 - 下標規則:
- 左數從
000
開始 - 右數從
?1-1?1
開始(倒數第一個字符)
- 左數從
- getrange命令使用示例
- 正向索引示例:
- set title 'chinese'后
- getrange title 0 3返回"chin"
- 解釋: 包含第0到第3個字符(含兩端)
- 反向索引示例:
- getrange title 1 -2返回"hines"
- 應用場景: 如處理動詞時去掉"ing"后綴
- 例:getrange status 0 -4可取出"work"(原詞為"working")
- 正向索引示例:
- 特殊情況處理
- 邊界條件:
- 空字符串情況:
- 當
start≥lengthstart \geq lengthstart≥length
(超出字符串長度) - 當
startstartstart
在stopstopstop
右邊(如start=6start=6start=6
,stop=3stop=3stop=3
)
- 當
- 截斷處理:
- 當
stop≥lengthstop \geq lengthstop≥length
時自動截取至字符串結尾
- 當
- 空字符串情況:
- 記憶要點:
- 范圍包含兩端字符(閉區間)
- 反向索引時
?1-1?1
表示最后一個字符 - 無效范圍返回空字符串而非報錯
- 相關命令:
- getset key newvalue: 獲取舊值并設置新值
- 示例:計數器場景中getset cnt 1返回"0"并更新值為1
- 邊界條件:
10)getset命令
- 功能特點:同時執行獲取舊值和設置新值兩個操作,原子性保證數據一致性
- 典型應用:狀態更新場景(如睡眠->起床->工作狀態變更)
- 返回值說明:返回的是被替換前的舊值
- 操作示例:
- 效率優勢:相比先get再set的兩步操作,減少網絡往返時間
11)incr和decr命令
- incr和decr的基本操作
- 基礎功能:
- incr key:將key存儲的值加1,返回增加后的值
- decr key:將key存儲的值減1,返回減少后的值
- 特殊處理:
- 不存在的key會被當作0處理后再執行操作
- 數值范圍限制為64位有符號整數
- 操作示例:
- 基礎功能:
- 應用場景:秒殺和搶票設計
- 設計原理:利用內存操作的高性能和原子性特征
- 實現方案:
- 初始化商品數量:set product_count 100000
- 用戶搶購時執行:decr product_count
- 返回值≥0表示搶購成功,<0表示庫存不足
- 優勢分析:
- 避免直接操作關系型數據庫
- 資格確認與實際訂單分離
- 支持高并發請求處理
- 注意事項:需要后續異步處理真實訂單數據
- incrby和decrby命令
- 擴展功能:
- incrby key increment:按指定整數值增加
- decrby key decrement:按指定整數值減少
- incrbyfloat key increment:支持浮點數增量
- 操作示例:
- 使用場景:適用于需要批量調整數值的場景,如積分批量增減、年齡跨年更新等
12)incrby和decrby命令
- 整型增減:
- incrby key number:將鍵值增加指定整數,如incrby age 90將age從2增加到92
- decrby key number:將鍵值減少指定整數,如decrby age 3將age從19減少到16
- 基礎命令incr/decr是增減1的特例,如decr age使20變為19
- 浮點增減:
- incrbyfloat key floatnumber:支持浮點數增量,如incrbyfloat age 3.5使92變為95.5
- 特殊場景:適用于需要半歲概念的場景(如29.5歲),演示中通過incrbyfloat age 0.5實現
13)setbit命令
- 位讀取:
- getbit key offset:獲取值二進制表示的指定位(左起從0編號)
- 示例:字符'A'的二進制中,第1位為1,第2位為0,第7位為1
- 位修改:
- setbit key offset value:設置指定位的值并返回舊值
- 注意事項:
- offset過大會自動填充中間位為0
- 演示中將字符'Q'通過位操作變為'q'(修改第7位)
- 位運算:
- BITOP operation destkey key1 [key2...]:支持AND/OR/NOT/XOR四種位運算
- 特殊限制:NOT操作只能對單個key進行
- 案例:通過bitop or char char lower實現大小寫轉換
14)例題:字母大小寫轉換
- ASCII碼與大小寫轉換原理
- 大小寫ASCII碼差異:大寫字母與小寫字母在ASCII碼表中相差32,例如大寫A是65,小寫a是97。
- 二進制位規律:大寫字母與小寫字母的二進制表示在第5位(從右數第3位)不同,大寫為0,小寫為1。如A(65)是01000001,a(97)是01100001。
- 轉換方法:通過位操作直接加減32即可實現大小寫轉換,比if-else判斷更高效。
- Redis位操作命令
- setbit命令:
- 功能:設置指定偏移量上的二進制位值
- 語法:setbit key offset value
- 返回值:該位上的舊值
- 注意事項:offset過大會自動填充0
- getbit命令:
- 功能:獲取指定偏移量上的二進制位值
- 語法:getbit key offset
- 編號規則:從左從0開始編號
- setbit命令:
- BITOP位運算
- 功能:對多個key進行位運算并將結果保存到目標key
- 支持的運算:AND(與)、OR(或)、NOT(非)、XOR(異或)
- 語法:BITOP operation destkey key1 [key2...]
- 應用場景:可用于批量處理二進制數據,如同時修改多個標志位
- 通用大小寫轉換實現
- 核心思路:利用ASCII碼中大小寫字母固定的32差值
- 優勢:無需逐個字母判斷,通過統一位操作即可完成
- 實現步驟:
- 獲取字符的ASCII碼值
- 通過位操作修改第5位
- 將結果寫回Redis
- 效率對比:比傳統的條件判斷方法更高效,特別適合批量處理
2. setbit命令詳解
- 基本原理:通過修改ASCII碼的二進制位實現大小寫轉換
- 關鍵位:ASCII碼中第2位(偏移量2)決定大小寫,1為小寫,0為大寫
- 操作示例:
- 將字符'A'變為'a':setbit char 2 1
- 將字符'b'變為'B':setbit char 2 0
- 獲取字符值:get char
1)例題:設置字符為小寫
- 解題步驟:
- 確定要修改的位偏移量(ASCII碼第2位)
- 使用setbit命令將該位設為1
- 驗證結果使用get命令
- 關鍵點:無論原字符是什么,通過修改第2位都能實現大小寫轉換
1)setbit命令的注意事項
- 參數限制:
- offset最大值為
232?12^{32}-1232?1
(4294967295) - 超過限制會報錯:"ERR bit offset is not an integer or out of range"
- offset最大值為
- 自動填充:當offset過大時,中間會自動填充0
- 內存影響:大offset操作會占用大量內存(最大512MB)
- 位操作原理
- 內存計算:
- 最大offset為N時,需要
(N+1)/8(N+1)/8(N+1)/8
個字節 2322^{32}232
位 = 512MB內存
- 最大offset為N時,需要
- 驗證方法:
- 嘗試setbit char 4294967296 1會報錯
- setbit char 4294967295 1可以成功
- 內存計算:
- BITOP命令
- 操作類型:AND、OR、NOT、XOR
- 使用示例:
- bitop or char char lower 將字符轉為小寫
- NOT操作只能對單個key進行
- 注意事項:操作結果會保存到destkey中
3. bitop命令
1)bitop命令介紹
- 基本語法: bitop operation destkey key1 [key2...]
- 操作類型:
- AND: 按位與操作
- OR: 按位或操作
- NOT: 按位非操作(注意:NOT操作只能對單個key執行)
- XOR: 按位異或操作
- 存儲機制: 將操作結果保存到destkey中
- 字符串限制:
- offset最大值為
232?12^{32}-1232?1
- 由此可推出最大字符串長度為512MB
- offset最大值為
2)bitop操作示例
- setbit使用:
- setbit lower 7 0:將lower鍵的第7位設為0
- setbit lower 2 1:將lower鍵的第2位設為1
- get操作驗證:
- get lower:查看設置后的二進制值
- set char Q:設置字符'Q'
- bitop or char char lower:對char和lower執行OR操作后存回char
- 結果驗證:get char返回"q",說明大小寫轉換成功
3)位操作與字符串變化
- 位操作本質:
- 通過設置特定bit位(如第2位)為1,創建"觸發器鍵"
- OR操作特性:任何值與觸發器OR操作后,對應位必然變為1
- AND操作特性:與特定掩碼AND操作可清除指定位
- 最大偏移量驗證:
- setbit char 4294967295 1:成功設置最大偏移量
- setbit char 4294967296 1:報錯"bit offset out of range"
- 內存計算:
- 最大字符串值計算公式:
232?2?3=512MB2^{32}*2^{-3}=512MB232?2?3=512MB
- 每個字節對應8個bit位
- 最大字符串值計算公式:
4)大小寫轉換操作
- 小寫轉換器:
- setbit lower 2 1:設置第2位為1(ASCII大小寫差異位)
- 任何字符與lower執行OR操作后,對應字母變為小寫
- 示例:'Q'(01010001)OR lower → 'q'(01110001)
- 大寫轉換器:
- 創建特定掩碼(如11011111)
- 通過AND操作清除第5位實現大寫轉換
- 實際應用:
- 注意事項:
- NOT操作只能作用于單個key
- 位操作會直接修改原始值,建議先備份重要數據
- 大偏移量操作可能影響性能,需謹慎使用
二、知識小結
知識點 | 核心內容 | 關鍵參數/用法 | 應用場景 |
SET命令 | 設置字符串類型鍵值 | EX(秒級過期)、PX(毫秒級過期)、NX(僅不存在時設置)、XX(僅存在時更新) | 緩存設置、分布式鎖 |
MSET/MGET | 批量設置/獲取多個鍵值 | 原子性操作多個鍵值對 | 初始化配置、批量數據查詢 |
SETRANGE | 修改字符串指定偏移量內容 | offset(從0開始)、自動用0x00填充空缺 | 字符串局部修改、掩碼處理 |
GETRANGE | 獲取字符串子串 | 支持負偏移量(從-1開始反向計數) | 提取固定格式數據(如文件擴展名) |
APPEND | 字符串追加操作 | 自動擴展原始字符串 | 日志追加、消息隊列 |
INCR/DECR | 原子增減操作 | INCRBY/DECRBY指定步長、INCRBYFLOAT浮點增減 | 計數器、秒殺庫存控制 |
位操作 | 二進制位級別操作 | SETBIT(設置特定位)、BITOP(位運算AND/OR/XOR) | 布隆過濾器、權限位圖 |
GETSET | 獲取舊值并設置新值 | 原子性取值+更新操作 | 狀態機轉換記錄 |
字符串限制 | 最大長度限制 | 通過位偏移推算最大支持512MB字符串 | 大數據存儲場景 |