redis string


10033

String 命令

字符串数据类型的相关命令.

1.常用命令

命令描述
append key value如果key 存在并且是一个字符串,append
将追加value 到末尾.
bitcount key [start] [stop]计算给定字符串中被设置为1 的比特位的数量
bitop operation destkey key对一个或多个二进制的字符串进行位元操作
将结果保存在destkey 上.
decr keykey 中存储的数字值减1
decrby key decrementkey 中存储的数字值减去给定的decrement
get key获取key 的值
getbit key offsetkey的字符串值,获取指定偏移量(单位bit)
getrange key start end获取key的字符串值的子值
getset key value给定key的值设置为value,返回key 的旧值.
incr keykey 存储的数字值加1
incrby key incrementkey 中存储的数字值加上给定的decrement
incrbyfloat key incrementkey 中存储的数字值加上给定的decrement
给定的浮动数
mget key1 [key2 ...]获取一个或多个给定的key 的值
mset key value [key value]同时设置一个或多个键值对
msetnx key value [key value]key 不存在时,设置一个或多个键值对
psetex key milliseconds value设置键值对,并设置单位为毫秒的生存时间
set key value设置一个键值对
setbit key offset valuekey 的字符串值,设置或清除偏移量(单位:bit)
setex key seconds value设置键值对,生存时间单位是秒
setnx key miliseconds vlaue设置键值对,生存时间单位是毫秒
setrange key offset valuevalue参数覆盖给定key 存储的字符串值,从
偏移量offset 开始
strlen key返回key 存储的字符串长度.

2.基本设置

  1. set:生成一个键值对
SET key value [EX seconds] [PX milliseconds] [NX|XX]
# 将字符串值 value 关联到 key
  • 如果key 已经有其他值,set 会覆盖新值,无视类型.ttl 被清除,并重新开始.
  • EX second :设置过期时间,单位秒. SET key value EX second 效果等同于 SETEX key second value.
  • PX millsecond:设置过期时间,单位毫秒.SET key value PX millisecond 效果等同于 PSETEX key millisecond value .
  • NX :只有键不存在时,才对键进行设置操作.SET key value NX = SETNX key value
  • XX:只有键存在时,才对键进行操作.
  1. get :获取键的值
get key
# 对不存在的键设值
127.0.0.1:6379> get key
"value"
127.0.0.1:6379> set key new-value
OK
# 对存在的键设值
127.0.0.1:6379> get key
"new-value"
# 设置超时时间
127.0.0.1:6379> set key-with-expire-time hello ex 10
OK
127.0.0.1:6379> get key-with-expire-time
"hello"
# 10秒之后获取
127.0.0.1:6379> get key-with-expire-time
(nil)

# 如果服务器返回OK,那么客户端获取锁
# 如果服务器返回 NIL,客户端获取锁失败

3.bitmap 位图设置

位图是指对数据的最小单位bit 位进行操作.比如,字符串big

b --> ASCII码 98 --> 二进制是 01100010
i --> ASCII码105 --> 二进制为 01101001
g --> ASCII码103 --> 二进制为 01100111

redis 中,可以获取到bigASCII 码的每一位对应的值,也就是01 .

127.0.0.1:6379> set key-big big
OK
127.0.0.1:6379> get key-big
"big"
127.0.0.1:6379> getbit key-big 0
(integer) 0
127.0.0.1:6379> getbit key-big 1
(integer) 1
127.0.0.1:6379> getbit key-big 2
(integer) 1
127.0.0.1:6379> getbit key-big 3
(integer) 0
# 对比字母 b 的二进制 01100010 可以看到获取二进制的一致
# 从0 位开始获取.

常用的命令是:

  1. setbit key offset value :对key 所存储的字符串值,设置或清除指定偏移量上的位bit.offset0 开始,小于2的32次方.(字符串最大可存储512M)
  2. getbit key offset :对key 所存储的字符串,获取指定偏移量上的位bit
127.0.0.1:6379> get key-big
"big"
127.0.0.1:6379> setbit key-big 7 1    # 因为是从0开始,指定的是第8位上变成1,也就是 01100011=> c
(integer) 0
127.0.0.1:6379> get key-big
"cig"
  1. bitcount key [start] [stop] :计算给定的字符串中,被设置为1 的比特位的数量.
127.0.0.1:6379> bitcount key-big
(integer) 13
  1. bittop operation destkey key [key...] : 做多个bitmap的and(交集)or(并集)not(非)or(异或)操作并将结果保存在destkey中 .

bitmap 位图应用:假如一个网站有1亿用户,user_id 用的是整型,长度为32位,每天有5千万独立用户访问,如何判断哪些用户访问了网站.

  1. set 来保存数据,运行一天占用的内存为:
32bit * 50000000 = (4bytes * 50000000) / 1024 /1024  大约占用200MB
  1. 使用bitmap 保存数据.在user_id 的索引上设置为1 ,没有访问的user_id 索引位置为0,运行一天占用的内存为:
1bit * 100000000 = 100000000 / 1024 /1024/ 8  约为12.5MB

使用bitmap 可以节省大量的内存资源.

4.setrange\getrange

  1. setrange key offset value :用value参数覆盖给定key 存储的字符串值,从偏移量offset 开始.不存在的key 被当做空白字符串处理.如果给定的字符串比偏移量小,中间的空白会用零字节(\x00) 填充.(offset从0开始)
  2. getrange key start end :返回key 中字符串的子字符串,可以给定负数,-1 表示最后一个.
127.0.0.1:6379> set greeting 'hello world'
OK
127.0.0.1:6379> get greeting
"hello world"
127.0.0.1:6379> SETRANGE greeting 6 'redis'
(integer) 11
127.0.0.1:6379> get greeting
"hello redis"

127.0.0.1:6379> get greeting
"hello redis"
127.0.0.1:6379> getrange greeting 1 5
"ello "
127.0.0.1:6379> getrange greeting 0 5
"hello "

127.0.0.1:6379> getrange greeting -3 -1
"dis

5.getset

getset key value

将给定的key 的值设置为value ,并返回key 的旧值.

127.0.0.1:6379> get greeting
"hello redis"
127.0.0.1:6379> getset greeting 'test'
"hello redis"
127.0.0.1:6379> get greeting
"test"

6.递减

  1. decr key :key 存储的数字值减1,如果key 不存在,key 的值会先初始化为0,然后再执行,如果值包含错误的类型,或字符串的值不能表示为数字,那么返回一个错误.
# 对存在的 key 操作
127.0.0.1:6379> set failure_times 10
OK
127.0.0.1:6379> get failure_times
"10"
127.0.0.1:6379> decr failure_times
(integer) 9
127.0.0.1:6379> decr failure_times
(integer) 8
127.0.0.1:6379> decr failure_times
(integer) 7

# 对不存在的值操作
127.0.0.1:6379> EXISTS count
(integer) 0
127.0.0.1:6379> decr count
(integer) -1
127.0.0.1:6379> decr count
(integer) -2
  1. decrby key decrement :对key 存储的值减去decrement .如果key 不存在,那么key 先被初始化为0 ,然后再执行.如果值包含错误的类型,或字符串的值不能表示为数字,那么返回一个错误.
# 对存在的 key 操作
127.0.0.1:6379> set count 100
OK
127.0.0.1:6379> get count 
"100"
127.0.0.1:6379> decrby count 20
(integer) 80
127.0.0.1:6379

# 对不存在的key 操作
127.0.0.1:6379> EXISTS pages
(integer) 0
127.0.0.1:6379

7.递增

  1. incr key :key 存储的数字值加1,如果key 不存在,key 的值会先初始化为0,然后在执行,如果值包含错误的类型,或字符串的值不能表示为数字,那么返回一个错误.
  2. incrby key increment :对key 存储的值加上decrement .如果key 不存在,那么key 先被初始化为0 ,然后再执行.如果值包含错误的类型,或字符串的值不能表示为数字,那么返回一个错误.
  3. incrbyfloat key increment:对key 存储的值加上浮点数decrement .如果key 不存在,那么key 先被初始化为0 ,然后再执行.key increment 可以使用指数符号. INCRBYFLOAT的计算结果也最多只能表示小数点的后十七位 .
# 值和增量都不是指数符号

redis> SET mykey 10.50
OK
redis> INCRBYFLOAT mykey 0.1
"10.6"


# 值和增量都是指数符号
redis> SET mykey 314e-2
OK
redis> GET mykey                # 用 SET 设置的值可以是指数符号
"314e-2"
redis> INCRBYFLOAT mykey 0      # 但执行 INCRBYFLOAT 之后格式会被改成非指数符号
"3.14"

# 可以对整数类型执行
redis> SET mykey 3
OK
redis> INCRBYFLOAT mykey 1.1
"4.1"

# 后跟的 0 会被移除
redis> SET mykey 3.0
OK
redis> GET mykey                                    # SET 设置的值小数部分可以是 0
"3.0"
redis> INCRBYFLOAT mykey 1.000000000000000000000    # 但 INCRBYFLOAT 会将无用的 0 忽略掉,有需要的话,将浮点变为整数
"4"
redis> GET mykey
"4"

文章作者: 文彦
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 文彦 !
评论
  目录