字符串操做
redis儲存的字符串都是以二進制的形式存在!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或1app
-
二進制數系統中,每一個0或1就是一個比特位(bit),位是數據存儲的最小單位編碼
-
好比字符‘a’的ASII碼是97,轉換爲二進制是01100001spa
-
二進制數的一位所包含的信息就是一比特,如二進制數0100就是4比特code
-
字符-字節-比特,每一個字符根據編碼佔用字節不一樣,8比特(bit)爲1字節blog
-
BITFIELD 該命令將 Redis 字符串視爲一個位數組,而且可以處理具備不一樣位寬和任意非(必要)對齊偏移量的特定整數字段。實際上,使用此命令能夠將位偏移量爲1234的帶符號5位整數設置爲特定值,從偏移量4567中檢索31位無符號整數。rem
-
BITFIELD 可以在同一個命令調用中使用多位字段。它須要執行一系列操做,並返回一個響應數組,其中每一個數組都與參數列表中的相應操做相匹配。字符串
-
如下命令將位偏移量爲100的8位有符號整數加1,並在位偏移量0處獲取4位無符號整數的值get
> 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