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