字符串操做
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