字符串操作


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