- j3_liuliang
- Redis常用API即应用场景开始系列(String),如果觉得有用可以关注博主,不定时更新哦!
一、字符串(String)
1.1 SETNX(setnx)
只有在 key 不存在时设置 key 的值。
Redis Setnx(SET if Not eXists) 命令在指定的 key 不存在时,为 key 设置指定的值。
语法
127.0.0.1:6379> SETNX KEY_NAME VALUE
可以版本:
>= 1.0.0
返回值:
设置成功,返回 1 。 设置失败,返回 0 。
案例
127.0.0.1:6379> flushall #清空数据库
OK
127.0.0.1:6379> exists j3-liuliang 18 #查看key是否存在
(integer) 0
127.0.0.1:6379> setnx j3-liuliang 18 #设置key并赋值
(integer) 1
127.0.0.1:6379> setnx j3-liuliang 28 #尝试覆盖key
(integer) 0 #覆盖失败
127.0.0.1:6379> get j3-liuliang #key没有变化
"18"
127.0.0.1:6379>
1.2 GETRANGE(getrange )
返回key中字符串值得子字符
Redis Getrange 命令用于获取存储在指定 key 中字符串的子字符串。字符串的截取范围由 start 和 end 两个偏移量决定(包括 start 和 end 在内)。
语法
127.0.0.1:6379> GETRANGE KEY_NAME start end
可以版本:
>= 2.4.0
返回值:
截取得到的子字符串。
案例
127.0.0.1:6379> flushall #清空数据库
OK
127.0.0.1:6379> set j3-liuliang "This is my test key" #设置key并赋值
OK
127.0.0.1:6379> getrange j3-liuliang 0 3 #截取key部分内容
"This"
127.0.0.1:6379> getrange j3-liuliang 6 9
"s my"
127.0.0.1:6379> getrange j3-liuliang 0 -1 #截取key得所有内容
"This is my test key"
127.0.0.1:6379>
1.3 MSET(mset)
同时设置一个或多个 key-value 对。
Redis Mset 命令用于同时设置一个或多个 key-value 对。
语法
127.0.0.1:6379> MSET key1 value1 key2 value2 .. keyN valueN
可以版本:
>= 1.0.1
返回值:
总是返回 OK 。
案例
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #同时设置多个key value对
OK
127.0.0.1:6379> get k1 #获取值
"v1"
127.0.0.1:6379> get k2
"v2"
127.0.0.1:6379> get k3
"v3"
127.0.0.1:6379>
1.4 SETEX(setex)
将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。
Redis Setex 命令为指定的 key 设置值及其过期时间。如果 key 已经存在, SETEX 命令将会替换旧的值。
语法
127.0.0.1:6379> SETEX KEY_NAME TIMEOUT VALUE
可以版本:
>= 2.0.0
返回值:
设置成功时返回 OK 。
案例
127.0.0.1:6379> flushall #清空数据库
OK
127.0.0.1:6379> set j3-liuliang 18 #设置key并赋值
OK
127.0.0.1:6379> get j3-liuliang #获取可以得值
"18"
127.0.0.1:6379> setex j3-liuliang 60 28 #设置key如果key存在就覆盖,且设置过期时间60秒,新值28
OK
127.0.0.1:6379> ttl j3-liuliang #查看剩余时间
(integer) 53
127.0.0.1:6379> get j3-liuliang #获取可以得值
"28"
127.0.0.1:6379>
1.5 SET(set)
设置指定 key 的值
Redis SET 命令用于设置给定 key 的值。如果 key 已经存储其他值, SET 就覆写旧值,且无视类型。
语法
127.0.0.1:6379> SET KEY_NAME VALUE
可以版本:
>= 1.0.0
返回值:
在 Redis 2.6.12 以前版本, SET 命令总是返回 OK 。
从 Redis 2.6.12 版本开始, SET 在设置操作成功完成时,才返回 OK 。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set j3-liuliang 18 #设置key并赋值
OK
127.0.0.1:6379> get j3-liuliang #获取key得值
"18"
127.0.0.1:6379> set j3-liuliang 28 #设置key并赋值,key存在则覆盖旧值
OK
127.0.0.1:6379> get j3-liuliang #获取值
"28" #被覆盖了
127.0.0.1:6379>
1.6 GET(get)
Redis Get 命令用于获取指定 key 的值。如果 key 不存在,返回 nil 。如果key 储存的值不是字符串类型,返回一个错误。
语法
127.0.0.1:6379> GET KEY_NAME
可以版本:
>= 1.0.0
返回值:
返回 key 的值,如果 key 不存在时,返回 nil。 如果 key 不是字符串类型,那么返回一个错误。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set j3-liuliang 18 #设置key并赋值
OK
127.0.0.1:6379> get j3-liuliang #获取key
"18"
127.0.0.1:6379> del j3-liuliang #删除key
(integer) 1
127.0.0.1:6379> lpush names j3-liuliang zhangsan #设置list类型key
(integer) 2
127.0.0.1:6379> get names #尝试获取list类型key
(error) WRONGTYPE Operation against a key holding the wrong kind of value
#“对持有错误类型值的键执行错误类型操作”,可以简单理解为就是命令和要执行得key类型不匹配
127.0.0.1:6379>
1.7 GETBIT(getbit)
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
Redis Getbit 命令用于对 key 所储存的字符串值,获取指定偏移量上的位(bit)。
语法
127.0.0.1:6379> GETBIT KEY_NAME OFFSET
可以版本:
>= 2.2.0
返回值:
字符串值指定偏移量上的位(bit,0 或 1 )。
当偏移量 OFFSET 比字符串值的长度大,或者 key 不存在时,返回 0 。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> setbit bitkey 1 1 #给bitkey的key在 1 位上设置值 1(默认为 0 )
(integer) 0
127.0.0.1:6379> setbit bitkey 2 1 #给bitkey的key在 2 位上设置值 1(默认为 0 )
(integer) 0
127.0.0.1:6379> setbit bitkey 3 1 #给bitkey的key在 3 位上设置值 1(默认为 0 )
(integer) 0
127.0.0.1:6379> getbit bitkey 2 #获取bitkey在 2 位上的值(默认为 0 )
(integer) 1
127.0.0.1:6379> getbit bitkey 3 #获取bitkey在 3 位上的值(默认为 0 )
(integer) 1
127.0.0.1:6379> getbit bitkey 4 #获取bitkey在 4 位上的值(默认为 0 )
(integer) 0
127.0.0.1:6379>
1.8 SETBIT(setbit)
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
Redis Setbit 命令用于对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。
语法
127.0.0.1:6379> Setbit KEY_NAME OFFSET
可以版本:
>= 2.2.0
返回值:
指定偏移量原来储存的位。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> setbit bitkey 1 1 #给bitkey的key在 1 位上设置值 1(默认为 0 )
(integer) 0
127.0.0.1:6379> setbit bitkey 2 1 #给bitkey的key在 2 位上设置值 1(默认为 0 )
(integer) 0
127.0.0.1:6379> setbit bitkey 3 1 #给bitkey的key在 3 位上设置值 1(默认为 0 )
(integer) 0
127.0.0.1:6379> getbit bitkey 2 #获取bitkey在 2 位上的值(默认为 0 )
(integer) 1
127.0.0.1:6379> getbit bitkey 3 #获取bitkey在 3 位上的值(默认为 0 )
(integer) 1
127.0.0.1:6379> getbit bitkey 4 #获取bitkey在 4 位上的值(默认为 0 )
(integer) 0
127.0.0.1:6379>
1.9 DECR(decr)
将 key 中储存的数字值减一。
Redis Decr 命令将 key 中储存的
数字值
减一。如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在
64 位(bit)有符号数字
表示之内。
语法
127.0.0.1:6379> DECR KEY_NAME
可以版本:
>= 1.0.0
返回值:
执行命令之后 key 的值。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set money 100 #对存在数字值得key进行 decr
OK
127.0.0.1:6379> decr money #decr操作
(integer) 99
127.0.0.1:6379> decr money
(integer) 98
127.0.0.1:6379> exists math #对不存在得key进行decr
(integer) 0
127.0.0.1:6379> decr math
(integer) -1
127.0.0.1:6379> set name j3-liuliang #对不是数字值得key进行decr
OK
127.0.0.1:6379> decr name
(error) ERR value is not an integer or out of range #出错
127.0.0.1:6379>
1.10 DECRBY(decrby)
key 所储存的值减去给定的减量值(decrement) 。
Redis Decrby 命令将 key 所储存的值减去指定的减量值。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 DECRBY 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
语法
127.0.0.1:6379> DECRBY KEY_NAME DECREMENT_AMOUNT
可以版本:
>= 1.0.0
返回值:
减去指定减量值之后, key 的值。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set money 100 #对存在数字值得key进行 decr
OK
127.0.0.1:6379> decrby money 10 #decr操作
(integer) 90
127.0.0.1:6379> decrby money 10
(integer) 80
127.0.0.1:6379> exists math #对不存在得key进行decr
(integer) 0
127.0.0.1:6379> decrby math 10
(integer) -10
127.0.0.1:6379> set name j3-liuliang #对不是数字值得key进行decr
OK
127.0.0.1:6379> decrby name 10
(error) ERR value is not an integer or out of range #出错
127.0.0.1:6379>
1.11 STRLEN(strlen)
返回 key 所储存的字符串值的长度。
Redis Strlen 命令用于获取指定 key 所储存的字符串值的长度。当 key 储存的不是字符串值时,返回一个错误。
语法
127.0.0.1:6379> STRLEN KEY_NAME
可以版本:
>= 2.2.0
返回值:
字符串值的长度。 当 key 不存在时,返回 0。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set name j3_liuliang #设置key并赋值
OK
127.0.0.1:6379> strlen name #获取存在key的value长度
(integer) 11
127.0.0.1:6379> strlen notkey #获取不存在key的value传长度
(integer) 0
127.0.0.1:6379>
1.12 MSETNX(msetnx)
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。(原子操作,全部成功才成功
)
Redis Msetnx 命令用于所有给定 key 都不存在时,同时设置一个或多个 key-value 对。
语法
127.0.0.1:6379> MSETNX key1 value1 key2 value2 .. keyN valueN
可以版本:
>= 1.0.1
返回值:
当所有 key 都成功设置,返回 1 。 如果所有给定 key 都设置失败(至少有一个 key 已经存在),那么返回 0 。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> msetnx k1 v1 k2 v2 k3 v3 #一次性设置多个不存在的key value
(integer) 1
127.0.0.1:6379> keys *
1) "k1"
2) "k3"
3) "k2"
127.0.0.1:6379> msetnx k1 v1 m1 n1 m2 n2 #当设置得key中有存在的key则全部设置失败(表明是原子操作)
(integer) 0
127.0.0.1:6379>
1.13 INCR(incr)
将 key 中储存的数字值增一
Redis Incr 命令将 key 中储存的数字值增一。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCR 操作。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
语法
127.0.0.1:6379> INCR KEY_NAME
可以版本:
>= 1.0.0
返回值:
执行 INCR 命令之后 key 的值。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set money 100 #设置key并设置数字值
OK
127.0.0.1:6379> incr money #加一
(integer) 101
127.0.0.1:6379> incr money
(integer) 102
127.0.0.1:6379> get money #获取值
"102"
127.0.0.1:6379> exists math #判断key是否存在
(integer) 0
127.0.0.1:6379> incr math #给不存在的key加一,先创建然后加一
(integer) 1
127.0.0.1:6379> get math #获取值
"1"
127.0.0.1:6379> set name j3_liuliang #创建不是数字值得key
OK
127.0.0.1:6379> incr name #加一操作失败
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
1.14 INCRBY(incrby)
将 key 所储存的值加上给定的增量值(increment) 。
Redis Incrby 命令将 key 中储存的数字加上指定的增量值。
如果 key 不存在,那么 key 的值会先被初始化为 0 ,然后再执行 INCRBY 命令。
如果值包含错误的类型,或字符串类型的值不能表示为数字,那么返回一个错误。
本操作的值限制在 64 位(bit)有符号数字表示之内。
语法
127.0.0.1:6379> INCRBY KEY_NAME INCR_AMOUNT
可以版本:
>= 1.0.0
返回值:
加上指定的增量值之后, key 的值。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set money 100 #设置key并设置数字值
OK
127.0.0.1:6379> incrby money 20 #给key值增加 20
(integer) 120
127.0.0.1:6379> incrby money 20
(integer) 140
127.0.0.1:6379> get money #获取key得值
"140"
127.0.0.1:6379> exists day #判断key是否存在
(integer) 0
127.0.0.1:6379> incrby day 10 #给不存在得key进行增加 10 操作,它会先创建对于得key然后加 10
(integer) 10
127.0.0.1:6379> get day #获取key得值
"10"
127.0.0.1:6379> set name j3_liuliang #创建不是数字值得key
OK
127.0.0.1:6379> incrby name 10 ##加操作失败
(error) ERR value is not an integer or out of range
127.0.0.1:6379>
1.15 INCRBYFLOAT(incrbyfloat)
将 key 所储存的值加上给定的浮点增量值(increment) 。
Redis Incrbyfloat 命令为 key 中所储存的值加上指定的浮点数增量值。
如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。
语法
127.0.0.1:6379> INCRBYFLOAT KEY_NAME INCR_AMOUNT
可以版本:
>= 2.6.0
返回值:
执行命令之后 key 的值。
案例
127.0.0.1:6379> flushall
OK
# 值和增量都不是指数符号
127.0.0.1:6379> set money 100.50
OK
127.0.0.1:6379> incrbyfloat money 0.3
"100.8"
# 值和增量都是指数符号
127.0.0.1:6379> set pai 314e-2
OK
127.0.0.1:6379> get pai # 用 SET 设置的值可以是指数符号
"314e-2"
127.0.0.1:6379> incrbyfloat pai 0 # 但执行 INCRBYFLOAT 之后格式会被改成非指数符号
"3.14"
127.0.0.1:6379> get pai
"3.14"
127.0.0.1:6379> incrbyfloat pai 0.1
"3.24"
# 可以对整数类型执行
127.0.0.1:6379> set money 100
OK
127.0.0.1:6379> incrbyfloat money 0.1
"100.1"
127.0.0.1:6379> set km 3.0
OK
127.0.0.1:6379> get km # SET 设置的值小数部分可以是 0
"3.0"
127.0.0.1:6379> incrbyfloat km 1.000000000000000 # 但 INCRBYFLOAT 会将无用的 0 忽略掉,有需要的话,将浮点变为整数
"4"
127.0.0.1:6379> get km
"4"
127.0.0.1:6379>
1.16 SETRANGE(setrange)
用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。
Redis Setrange 命令用指定的字符串覆盖给定 key 所储存的字符串值,覆盖的位置从偏移量 offset 开始。
语法
127.0.0.1:6379> SETRANGE KEY_NAME OFFSET VALUE
可以版本:
>= 2.2.0
返回值:
被修改后的字符串长度。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set mykey "the is a good key" #设置key
OK
127.0.0.1:6379> setrange mykey 9 AAA #从指定位置开始覆盖key得值
(integer) 17
127.0.0.1:6379> get mykey #获取覆盖后得值
"the is a AAAd key"
127.0.0.1:6379>
1.17 PSETEX(psetex)
这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。
Redis Psetex 命令以毫秒为单位设置 key 的生存时间。
语法
127.0.0.1:6379> PSETEX key1 EXPIRY_IN_MILLISECONDS value1
可以版本:
>= 2.6.0
返回值:
设置成功时返回 OK 。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> psetex name 20000 j3_liuliang #以毫秒单位设置key得过期时间
OK
127.0.0.1:6379> pttl name #查看key得过期时间,毫秒值
(integer) 16577
127.0.0.1:6379> get name #在未过期时间内获取key
"j3_liuliang"
127.0.0.1:6379> pttl name #过期后
(integer) -2
127.0.0.1:6379> get name #获取过期后的key值
(nil)
127.0.0.1:6379>
1.18 APPEND(append)
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
Redis Append 命令用于为指定的 key 追加值。
如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。
如果 key 不存在, APPEND 就简单地将给定 key 设为 value ,就像执行 SET key value 一样。
语法
127.0.0.1:6379> APPEND KEY_NAME NEW_VALUE
可以版本:
>= 2.0.0
返回值:
追加指定值之后, key 中字符串的长度。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> exists name #查看key是否存在
(integer) 0
127.0.0.1:6379> append name j3_liuliang #给不存在的key 追加字符串
(integer) 11
127.0.0.1:6379> get name #获取key对应得值
"j3_liuliang"
127.0.0.1:6379> set j3_liuliang 18 #设置key并赋值
OK
127.0.0.1:6379> append j3_liuliang 0 #给存在得key追加值
(integer) 3
127.0.0.1:6379> get j3_liuliang #查看追加后得key的值
"180"
127.0.0.1:6379>
1.19 GETSET(getset)
将给定 key 的值设为 value ,并返回 key 的旧值(old value)。
Redis Getset 命令用于设置指定 key 的值,并返回 key 旧的值。
语法
127.0.0.1:6379> GETSET KEY_NAME VALUE
可以版本:
>= 1.0.0
返回值:
返回给定 key 的旧值。 当 key 没有旧值时,即 key 不存在时,返回 nil 。
当 key 存在但不是字符串类型时,返回一个错误。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> exists name #判断key是否存在
(integer) 0
127.0.0.1:6379> getset name j3_liuliang #对不存在的key进行getset
(nil) #先返回nil然后给name设置值j3_liuliang
127.0.0.1:6379> get name #获取key的值
"j3_liuliang"
127.0.0.1:6379> set mykey name:j3_liulaing #设置key并赋值
OK
127.0.0.1:6379> getset mykey name:liuliang #对存在的key进行 getset
"name:j3_liulaing" #先是返回key的值,然后将新值覆盖给key
127.0.0.1:6379> get mykey #获得覆盖后的值
"name:liuliang"
127.0.0.1:6379>
1.20 MGET(mget)
获取所有(一个或多个)给定 key 的值。
Redis Mget 命令返回所有(一个或多个)给定 key 的值。 如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。
语法
127.0.0.1:6379> MGET KEY1 KEY2 .. KEYN
可以版本:
>= 1.0.0
返回值:
一个包含所有给定 key 的值的列表。
案例
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> set k1 v1 #设置key并赋值
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> mget k1 k2 k3 #一次性获取多个key的值,不存在的则返回nil
1) "v1"
2) "v2"
3) (nil)
127.0.0.1:6379>
二、应用场景
-
单值缓存:商品库存,key=商品id,value=库存数量
(set,get)
-
对象缓存:
- set 存储用户信息,key=user:id value=json格式数据
mset
批量存储用户信息,适用于数据不断变化的应用场景,
如用户微信余额
,存取方便,效率高
-
分布式锁:
适用场景:在一个集群环境下,多个web应用时对同一个商品进行抢购和减库存操作时,
可能出现超卖时会用到分布式锁
SETNX
命令(SET if Not eXists)
语法:SETNX key value
功能:当且仅当 key 不存在,将 key 的值设为 value ,并返回1;
若给定的 key 已经存在,则 SETNX 不做任何动作,并返回0。 -
计算器:文章
访问量
,每当用户访问,阅读数加1(incr)
-
共享session:出于负载均衡的考虑,分布式服务会将用户信息的访问均衡到不同服务器上,用户刷新一次访问可能会需要重新登录,为避免这个问题可以用redis将用户session集中管理,在这种模式下只要保证redis的高可用和扩展性的,每次获取用户更新或查询登录信息都直接从redis中集中获取。
-
**限速:**处于安全考虑,每次进行登录时让用户输入手机验证码,为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率。
-
分布式系统全局序列号:
- 适用场景:一般数据库表的主键用自增长序列号,假如系统压力大,后端做了分库分表,
数据库自带的auto_increment就不适用了,可以使用redis的自增,由于Redis为单进程单线程模式, 采用队列模式将并发访问变成串行访问,且多客户端对Redis的连接并不存在竞争关系。
incr orderId redis压力大
incr orderId 1000 提升性能,降低redis压力
假设有3台机器访问redis,利用redis的特点:单线程
incrby orderid 1000 //每台每次拿1000,01000,10012000,2001~3000
拿完后再各自慢慢处理这1000的容量 - 适用场景:一般数据库表的主键用自增长序列号,假如系统压力大,后端做了分库分表,
结束语
- 本文结合Redis中文网和博主的实践案例所写,下期写List类型
- 由于博主才疏学浅,难免会有纰漏,假如你发现了错误或偏见的地方,还望留言给我指出来,我会对其加以修正。
- 如果你觉得文章还不错,你的转发、分享、点赞、留言就是对我最大的鼓励。
- 感谢您的阅读,十分欢迎并感谢您的关注。