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.基本设置
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
:只有键存在时,才对键进行操作.
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 位开始获取.
常用的命令是:
setbit key offset value
:对key
所存储的字符串值,设置或清除指定偏移量上的位bit
.offset
从0
开始,小于2的32次方.(字符串最大可存储512M
)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"
bitcount key [start] [stop]
:计算给定的字符串中,被设置为1
的比特位的数量.127.0.0.1:6379> bitcount key-big (integer) 13
bittop operation destkey key [key...]
: 做多个bitmap的and(交集)or(并集)not(非)or(异或)
操作并将结果保存在destkey
中 .
bitmap
位图应用:假如一个网站有1亿用户,user_id
用的是整型,长度为32位,每天有5千万独立用户访问,如何判断哪些用户访问了网站.
- 用
set
来保存数据,运行一天占用的内存为:32bit * 50000000 = (4bytes * 50000000) / 1024 /1024 大约占用200MB
- 使用
bitmap
保存数据.在user_id
的索引上设置为1
,没有访问的user_id
索引位置为0
,运行一天占用的内存为:1bit * 100000000 = 100000000 / 1024 /1024/ 8 约为12.5MB
使用
bitmap
可以节省大量的内存资源.
4.setrange\getrange
setrange key offset value
:用value
参数覆盖给定key
存储的字符串值,从偏移量offset
开始.不存在的key
被当做空白字符串处理.如果给定的字符串比偏移量小,中间的空白会用零字节(\x00
) 填充.(offset
从0开始)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.递减
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
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.递增
incr key
:key
存储的数字值加1
,如果key
不存在,key
的值会先初始化为0
,然后在执行,如果值包含错误的类型,或字符串的值不能表示为数字,那么返回一个错误.incrby key increment
:对key
存储的值加上decrement
.如果key
不存在,那么key
先被初始化为0
,然后再执行.如果值包含错误的类型,或字符串的值不能表示为数字,那么返回一个错误.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"