Redis String、数值、位图

1/10/2023 Redis

# Redis String、数值

# 1. String类型

# SET key value [选项]

  • EX seconds – 设置键key的过期时间,单位时秒
  • PX milliseconds – 设置键key的过期时间,单位时毫秒
  • NX – 只有键key不存在的时候才会设置key的值
  • XX – 只有键key存在的时候才会设置key的值

# MSET k1 v1 k2 v2

  • MSET是原子的,所以所有给定的keys是一次性set的。客户端不可能看到这种一部分keys被更新而另外的没有改变的情况。

# MSETNX key value [key value...]

  • 设置多个key value 仅当key不存在,只要有一个key已经存在,MSETNX一个操作都不会执行
  • 1 如果所有的key被set
  • 0 如果没有key被set(至少其中有一个key是存在的)
redis> MSETNX key1 "Hello" key2 "there"
(integer) 1
redis> MSETNX key2 "there" key3 "world"
(integer) 0
redis> MGET key1 key2 key3
1) "Hello"
2) "there"
3) (nil)
redis>
1
2
3
4
5
6
7
8
9

# SETEX key value

  • 设置key对应字符串value,并且设置key在给定的seconds时间之后超时过期。这个命令等效于执行下面的命令:
127.0.0.1:6379> SETEX name 10 zhangsan
OK
127.0.0.1:6379> TTL name
(integer) 6
127.0.0.1:6379> TTL name
(integer) 4
127.0.0.1:6379> 
1
2
3
4
5
6
7

# PSETEX key milliseconds value

# SETNX

  • key设置值为value,如果key不存在,这种情况下等同SET (opens new window)命令。 当key存在时,什么也不做。SETNX是”SET if Not eXists”的简写
127.0.0.1:6379> SETNX name zhangsan
(integer) 1
127.0.0.1:6379> SETNX name zhangsan1
(integer) 0

# 第一次设置成功
# 第二次设置失败
1
2
3
4
5
6
7

# SETRANGE key offset value

这个命令的作用是覆盖key对应的string的一部分,从指定的offset处开始,覆盖value的长度。如果offset比当前key对应string还要长,那这个string后面就补0以达到offset。不存在的keys被认为是空字符串,所以这个命令可以确保key有一个足够大的字符串,能在offset处设置value。

注意,offset最大可以是229-1(536870911),因为redis字符串限制在512M大小。如果你需要超过这个大小,你可以用多个keys。

警告:当set最后一个字节并且key还没有一个字符串value或者其value是个比较小的字符串时,Redis需要立即分配所有内存,这有可能会导致服务阻塞一会。在一台2010MacBook Pro上,set536870911字节(分配512MB)需要~300ms,set134217728字节(分配128MB)需要~80ms,set33554432比特位(分配32MB)需要~30ms,set8388608比特(分配8MB)需要8ms。注意,一旦第一次内存分配完,后面对同一个key调用SETRANGE (opens new window)就不会预先得到内存分配。

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> setrange name 0 hello
(integer) 8
127.0.0.1:6379> get name
"hellosan"
127.0.0.1:6379> setrange name 10 hello
(integer) 15
127.0.0.1:6379> get name
"hellosan\x00\x00hello"
1
2
3
4
5
6
7
8
9
10

# GET key

  • 返回keyvalue。如果key不存在,返回特殊值nil。如果keyvalue不是string,就返回错误,因为GET只处理string类型的values

# MGET key [key...]

  • 返回所有指定的key的value。对于每个不对应string或者不存在的key,都返回特殊值nil。正因为此,这个操作从来不会失败。

# APPEND key value

  • 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND (opens new window) 将类似于 SET (opens new window) 操作。

  • **返回值:**返回append后字符串值(value)的长度。

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> APPEND name " hello world"
(integer) 20
127.0.0.1:6379> get name
"zhangsan hello world"
1
2
3
4
5
6

# STRLEN key

  • 返回key的string类型value的长度。如果key对应的非string类型,就返回错误。
127.0.0.1:6379> STRLEN name
(integer) 20
1
2

# GETSET

自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。

GETSET (opens new window)可以和INCR (opens new window)一起使用实现支持重置的计数功能。举个例子:每当有事件发生的时候,一段程序都会调用INCR (opens new window)给key mycounter加1,但是有时我们需要获取计数器的值,并且自动将其重置为0。这可以通过GETSET mycounter “0”来实现:

**返回值:**返回之前的旧值,如果之前Key不存在将返回nil

127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> getset name lisi
"zhangsan"
127.0.0.1:6379> get name
"lisi"
1
2
3
4
5
6

# GETRANGE key start end

警告:这个命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。 返回key对应的字符串value的子串,这个子串是由start和end位移决定的(两者都在string内)。可以用负的位移来表示从string尾部开始数的下标。所以-1就是最后一个字符,-2就是倒数第二个,以此类推。

这个函数处理超出范围的请求时,都把结果限制在string内。

127.0.0.1:6379> set name zhangsannihao
OK
127.0.0.1:6379> getrange name 0 10
"zhangsannih"
127.0.0.1:6379> getrange name 0 -1
"zhangsannihao"
1
2
3
4
5
6

# 2. 数值类型

# DECR key

  • 对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。

返回值: 减小之后的value

127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> decr age
(integer) 9
1
2
3
4

# DECRBY key decrement

  • 将key对应的数字减decrement。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。

返回值: 减小之后的value

127.0.0.1:6379> set age 10
OK
127.0.0.1:6379> decrby age 3
(integer) 7
1
2
3
4

# INCR key

对存储在指定key的数值执行原子的加1操作。

如果指定的key不存在,那么在执行incr操作之前,会先将它的值设定为0

如果指定的key中存储的值不是字符串类型(fix:)或者存储的字符串类型不能表示为一个整数,

那么执行这个命令时服务器会返回一个错误(eq:(error) ERR value is not an integer or out of range)。

这个操作仅限于64位的有符号整型数据

注意: 由于redis并没有一个明确的类型来表示整型数据,所以这个操作是一个字符串操作。

执行这个操作的时候,key对应存储的字符串被解析为10进制的64位有符号整型

返回值: 执行递增操作后key对应的值。

# INCRBY key increment

  • 将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0。如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。

# INCRBYFLOAT key increment

通过指定浮点数key来增长浮点数(存放于string中)的值. 当键不存在时,先将其值设为0再操作.下面任一情况都会返回错误:

  • key 包含非法值(不是一个string).
  • 当前的key或者相加后的值不能解析为一个双精度的浮点值.(超出精度范围了)

如果操作命令成功, 相加后的值将替换原值存储在对应的键值上, 并以string的类型返回. string中已存的值或者相加参数可以任意选用指数符号,但相加计算的结果会以科学计数法的格式存储. 无论各计算的内部精度如何, 输出精度都固定为小数点后17位.

**返回值:**当前key增加increment后的值

127.0.0.1:6379> set num 20
OK
127.0.0.1:6379> incrbyfloat num 5.5
"25.5"
1
2
3
4
Last Updated: 2/14/2023, 6:20:07 PM