字符串操作
redis儲存的字符串都是以二進制的形式存在!
字符串類型的內部編碼有3種:
int:8個字節的長整型。
embstr:小於等於39個字節的字符串。
raw:大於39個字節的字符串。
Redis會根據當前值的類型和長度決定使用哪種內部編碼實現。
命令 | 操作 | 返回值 |
---|---|---|
set(K key, V value) | void | |
set(K key, V value, long timeout, TimeUnit unit) | 過期時間,TimeUnit時間格式 | void |
set(K key, V value, Duration timeout) | Duration過期時間 | void |
setIfAbsent(K key, V value) | 如果不存在則設置【setnx】 | Boolean |
setIfAbsent(K key, V value, long timeout, TimeUnit unit) | Boolean | |
setIfAbsent(K key, V value, Duration timeout) | Boolean | |
setIfPresent(K key, V value) | 如果存在則設置【setex】 | Boolean |
setIfPresent(K key, V value, long timeout, TimeUnit unit) | Boolean | |
setIfPresent(K key, V value, Duration timeout) | Boolean | |
multiSet(Map<? extends K, ? extends V> map) | 設置多個鍵值對【mset】 | void |
multiSetIfAbsent(Map<? extends K, ? extends V> map) | 如果不存在則設置多個鍵值對 | Boolean |
get(Object key) | 獲取 | Object V |
getAndSet(K key, V value) | 獲取原值同時設置新值【getset】 | Object V |
multiGet(Collection<K> keys) | 獲取集合【mget】 | List<V> |
increment(K key) | 自增操作(鍵不存在則創建並按照初始值0自增)【incr】 | Long |
increment(K key, long delta) | 增加數操作【incrby】 | Long |
increment(K key, double delta) | 增加浮點數【incrbyfloat】 | Double |
decrement(K key) | 自減【decr】 | Long |
decrement(K key, long delta) | 減去操作【decrby】 | Long |
append(K key, String value) | 追加值【append】 | Integer |
get(K key, long start, long end) | 獲取指定位置的字符【getrange】 | String |
set(K key, V value, long offset) | 設置指定位置的字符(覆蓋后面的長度)【setrange】 | void |
size(K key) | 值長度【strlen】 | Long |
setBit(K key, long offset, boolean value) | 設置或者清除指定位置的值(二進制)【setbit】 | Boolean |
getBit(K key, long offset) | 獲取比特位的值 | Boolean |
bitField(K key, BitFieldSubCommands subCommands) | 見下方說明 | List<Long> |
getOperations() | RedisOperations<K, V> |
-
setBit和getBit都是對二進制進行操作。因為redis儲存的字符串都是以二進制的形式存在,所以這里是設置二進制偏移位置上的值,將其設置為0或1
-
二進制數系統中,每個0或1就是一個比特位(bit),位是數據存儲的最小單位
-
比如字符‘a’的ASII碼是97,轉換為二進制是01100001
-
二進制數的一位所包含的信息就是一比特,如二進制數0100就是4比特
-
字符-字節-比特,每個字符根據編碼占用字節不同,8比特(bit)為1字節
-
BITFIELD 該命令將 Redis 字符串視為一個位數組,並且能夠處理具有不同位寬和任意非(必要)對齊偏移量的特定整數字段。實際上,使用此命令可以將位偏移量為1234的帶符號5位整數設置為特定值,從偏移量4567中檢索31位無符號整數。
-
BITFIELD 能夠在同一個命令調用中使用多位字段。它需要執行一系列操作,並返回一個響應數組,其中每個數組都與參數列表中的相應操作相匹配。
-
以下命令將位偏移量為100的8位有符號整數加1,並在位偏移量0處獲取4位無符號整數的值
> BITFIELD mykey INCRBY i5 100 1 GET u4 0 1) (integer) 1 2) (integer) 0
支持的子命令和整數類型
- GET <type> <offset> - 返回指定的位域。
- SET <type> <offset> <value> - 設置指定的位域並返回其舊值。
- INCRBY <type> <offset> <increment> - 遞增或遞減(如果給定負遞增)指定的位域並返回新值。
還有一個子命令通過設置溢出行為來改變連續的 INCRBY子 命令調用的行為:
- OVERFLOW [WRAP|SAT|FAIL]在期望整數類型的情況下,可以通過i為有符號整數和u無符號整數加上整數類型的位數來構成它。例如u8,一個8位的無符號整數,i16是一個16位的有符號整數。支持的類型對於有符號整數最多為64位,對於無符號整數最多為63位。使用無符號整數的限制是由於當前Redis協議無法將64位無符號整數作為答復返回。位和位置偏移有兩種方式可以指定位域命令中的偏移量。如果指定了一個沒有任何前綴的數字,它將被用作字符串內的基於零的位偏移量。但是如果偏移量前綴為a#字符,指定的偏移量乘以整數類型的寬度,例如:BITFIELD mystring SET i8#0 100 i8#1 200將設置第一個i8整數在偏移量0和第二個偏移量為8.這種方式你沒有如果你想要的是一個給定大小的整數數組,你可以在你的客戶端內部進行數學運算。溢出控制使用該OVERFLOW命令,用戶可以通過指定一個來微調增量的行為或減少溢出(或下溢)以下行為:
- WRAP:環繞,包含有符號和無符號整數。在無符號整數的情況下,包裝類似於以整數可以包含的最大值(C標准行為)來執行操作。使用帶符號整數,而不是包裝意味着溢出重新開始朝向最負值,並且溢出朝向最正值,例如,如果i8整數設置為127,則將其遞增1 -128。
- SAT:使用飽和算術,即在下溢時將該值設置為最小整數值,並在溢出時將其設置為最大整數值。例如,i8從數值120開始遞增一個以10 為增量的整數將導致數值127,並且進一步增量將始終使數值保持在127.在下溢時發生同樣的情況,但是朝向該數值被阻塞在最大負值。
- FAIL:在這種模式下,沒有檢測到溢出或下溢操作。相應的返回值設置為 NULL,以向調用者發送信號。 請注意,每條OVERFLOW語句只影響子命令列表中后面的 INCRBY命令,直到下一條OVERFLOW語句為止。
> BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1 1) (integer) 1 2) (integer) 1 > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1 1) (integer) 2 2) (integer) 2 > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1 1) (integer) 3 2) (integer) 3 > BITFIELD mykey incrby u2 100 1 OVERFLOW SAT incrby u2 102 1 1) (integer) 0 2) (integer) 3