10033

String 命令

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

1.常用命令

命令描述
append key value如果key 存在并且是一个字符串,append
将追加value 到末尾.
bitcount key [start] [stop]计算给定字符串中被设置为1 的比特位的数量
bitop operation destkey key对一个或多个二进制的字符串进行位元操作
将结果保存在destkey 上.
decr key将key 中存储的数字值减1
decrby key decrement将key 中存储的数字值减去给定的decrement 值
get key获取key 的值
getbit key offset对key的字符串值,获取指定偏移量(单位bit)
getrange key start end获取key的字符串值的子值
getset key value给定key的值设置为value,返回key 的旧值.
incr key将key 存储的数字值加1
incrby key increment将key 中存储的数字值加上给定的decrement 值
incrbyfloat key increment将key 中存储的数字值加上给定的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 value对key 的字符串值,设置或清除偏移量(单位:bit)
setex key seconds value设置键值对,生存时间单位是秒
setnx key miliseconds vlaue设置键值对,生存时间单位是毫秒
setrange key offset value用value参数覆盖给定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 中,可以获取到big 的ASCII 码的每一位对应的值,也就是0 或1 .

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.offset 从0 开始,小于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"