单线程
- 一次只运行一条命令
- 拒绝使用长/慢命令
- 其实并不是单线程 有些操作使用独立线程
通用命令
- keys
- dbsize
- exists
- delete [ ...]
- expire
- type
keys *
遍历所有的 key
kyes [正则表达式]
遍历所有的 key
keys 命令一般不在生产环境中使用(因为生产环境中键值对极多)
dbsize
计算 key 的总数
exists
检测 key 是否存在(存在则返回1,不存在返回0)
del
删除指定的键值对
expire
key 在 seconds 秒后过期
ttl
查询 key 的剩余过期时间(返回 -1 表示没有过期设置;返回 -2 表示过期删除)
persist key
去掉 key 的过期设置
type
返回 key 的类型
字符串命令
Redis 中的键(key)都是字符串,但是值可以有多种类型(常见五种)。
字符串类型的值(Value)最大不能超过 512M(已经足够大了)。
一般情况下,考虑到并发、流量等问题,通常字符串类型的值最大也只是 百K 级别。
使用场景:
- 缓存
- 计数器
- 分布式锁
主要命令:
- get
- set
- del
get set del
Set 命令
Set 命令用于设置某个键值对的值(String),具体是哪个简直对由参数 key 决定。
如果键值对中已有值,Set 就覆写旧值,且无视旧类型(即,赋完值后为String型)。
语法
set <key> <value>
返回值
在 Redis 2.6.12 以前版本, Set 命令总是返回 OK 。<br>
从 Redis 2.6.12 版本开始, Set 在设置操作成功完成时,才返回 OK 。
实例
首先,我们在 redis 中创建一个 key 并设置值。
对不存在的键进行设置
redis 127.0.0.1:6379> SET key "value"
OK
redis 127.0.0.1:6379> GET key
"value"
对已存在的键进行设置
redis 127.0.0.1:6379> SET key "new-value"
OK
redis 127.0.0.1:6379> GET key
"new-value"
带参数的 Set 命令
set
无论 key 是否存在,都进行设置
set NX
key 不存在,才设置;等同于 setnx
逻辑上,这是“新增”操作
set XX
key 存在,才设置
逻辑上,这是“更新”操作
Get
Get 命令用于获取某个键值对的值(String),具体是哪个键值对由参数 key 决定。
如果键值对不存在,则返回 nil 。
如果键值对的值部分并非字符串类型,则返回一个错误。
语法
get <key>
返回值
返回 key 对应的值,如果不存在时,则返回 nil。<br>
如果 key 对应的值不是字符串类型,则返回一个错误。
实例
对不存在的 key 或字符串类型 key 进行 Get
redis> GET db
(nil)
redis> SET db redis
OK
redis> GET db
"redis"
对不是字符串类型的 key 进行 GET
redis> DEL db
(integer) 1
redis> LPUSH db redis mongodb mysql
(integer) 3
redis> GET db
(error) ERR Operation against a key holding the wrong kind of value
del
del 命令用于删除某个键值对。
如果 key 代表的键值对不存在,则该操作无任何效果。
实际上 del 命令是一个通用命令,各种类型结构都有这个命令。
语法
del <key>
返回值
被删除的键值对的数量。
实例
首先,我们在 redis 中创建一个 key 并设置值 。
redis 127.0.0.1:6379> SET w3ckey redis
OK
现在我们删除已创建的 key 。
redis 127.0.0.1:6379> DEL w3ckey
(integer) 1
案例:
- 计数器:记录网站每个用户个人主页的访问量
- 缓存:缓存视频的基本信息(视频本身在 MySQL 中)
- 分布式 id 生成
次要命令
- incr
- decr
- incrby
- decrby
前提要求,value 必须是数值型字符串
incr
key 对应的 val 自增 1 。
如果 键值对 不存在,那么会新增该 键值对 其值会先被初始化为 0 ,然后再执行 incr 操作
语法
incr <key>
返回值
执行完 Incr 命令之后,键值对 的值。
实例
redis> SET page_view 20
OK
redis> INCR page_view
(integer) 21
redis> GET page_view # 数字值在 Redis 中以字符串的形式保存
"21"
decr 命令
decr 命令将某个 键值对 的 数值型字符串值 减一。
如果 键值对 不存在,那么会新建该键值对,并将其值初始化为 0 ,然后再执行 decr 操作。
语法:
decr <key>
返回值:
新值,即减 1 之后的值
实例:
对存在的数字值 key 进行 decr
redis> SET failure_times 10
OK
redis> DECR failure_times
(integer) 9
对不存在的 key 值进行 decr
redis> EXISTS count
(integer) 0
redis> DECR count
(integer) -1
对存在但不是数值的 key 进行 Decr
redis> SET company YOUR_CODE_SUCKS.LLC
OK
redis> DECR company
(error) ERR value is not an integer or out of range
incrby
incrby 命令用于将某个 键值对 中的 数字型字符串值 加上指定的增量值。
如果 键值对 不存在,那么会新建键值对,并将其值初始化为 0 ,然后再执行 incrby 命令。
语法:
incrby <key> <amount>
返回值:
新值。即,增加指定增量之后的值。
实例:
key 存在且是数字值
redis> SET rank 50
OK
redis> INCRBY rank 20
(integer) 70
redis> GET rank
"70"
key 不存在时
redis> EXISTS counter
(integer) 0
redis> INCRBY counter 30
(integer) 30
redis> GET counter
"30"
key 不是数字值时
redis> SET book "long long ago..."
OK
redis> INCRBY book 200
(error) ERR value is not an integer or out of range
decrby
decrby 命令用于将某个键值对的值减去指定的减量值,具体是哪个键值对由参数 key 决定。
要求键值对的值必须是数字型字符串。
如果键值对不存在,那么将新建键值对,将其值初始化为 0 ,然后再执行 Decrby 操作。
如果键值对额值不是 String 类型,或不是数字型 String 类型,那么返回一个错误。
语法:
decrby <key> <amount>
返回值:
新值。即,减去指定量之后的值。
实例:
对已存在的 key 进行 DECRBY
redis> SET count 100
OK
redis> DECRBY count 20
(integer) 80
对不存在的 key 进行DECRBY
redis> EXISTS pages
(integer) 0
redis> DECRBY pages 10
(integer) -10
其他命令
- mget
- mset
mget ...
批量获得 key 对应的值
原子操作,O(n) 复杂度
mset ...
批量设置键值对
它们的使用价值在于能节省网络流量和时间。
- getset
- append
- strlen
getset
为键值对设置一个新值,于此同时返回原来的值
append
将 val 追加到键值对的值后
strlen
返回字符串的长度(注意中文)
- incrbyfloat
- getrange
- setrange
incrbyfloat
键值对的值自增,val为浮点型字符串
并没有浮点自减命令,但是可以传入一个负数实现自检减功能
getrange
获得指定范围区间中的值,包括
setrange
为值的指定区间赋值
4. Strlen
Strlen 命令用于获取某个键值对的值(String)的长度,具体是哪个键值对由参数 key 决定。
当键值对储存的不是字符串型的值时,返回一个错误。
语法
Strlen key
返回值
字符串值的长度。
当 key 对应的值不存在时,返回 0。
实例
获取字符串的长度
redis> SET mykey "Hello world"
OK
redis> STRLEN mykey
(integer) 11
不存在的 key 长度为 0
redis> STRLEN nonexisting
(integer) 0
5. Getset
Getset 命令用于设置某个键值对的值(String),并返回该键值对的旧值,具体是哪个键值对由参数 key 决定 。
语法
Getset key value
返回值
返回所指定的键值对的旧值。
当所指定的 key-value 不存在时,返回 nil 。
当所指定的 key-value 的值部分不是字符串类型时,返回一个错误。
实例
首先,设置 mykey 的值并截取字符串。
redis 127.0.0.1:6379> GETSET mynewkey "This is my test key"
(nil)
redis 127.0.0.1:6379> GETSET mynewkey "This is my new value to test getset"
"This is my test key"
6. Getrange
Getrange 命令用于获取某个键值对的值(String)的一个子字符串,具体是哪个键值对由参数 key 决定。
字符串的截取范围由索引参数 start 和 end 决定(范围涵盖 start 和 end )。
语法
Getrange key start end
返回值
截取得到的子字符串。
实例
首先,设置 mykey 的值并截取字符串。
redis 127.0.0.1:6379> SET mykey "This is my test key"
OK
redis 127.0.0.1:6379> GETRANGE mykey 0 3
"This"
redis 127.0.0.1:6379> GETRANGE mykey 0 -1
"This is my test key"
7. Append
Append 命令用于为某个 键值对 的值(String)拼接追加新内容,具体是哪个键值对由参数 key 决定。
如果 键值对 存在并且值为字符串, Append 命令将 value 追加原值的末尾。
如果 键值对 不存在, Append 就简单地将等同于 Set key value 。
语法
Append key value
返回值
追加指定值之后, 键值对中值的长度。
实例
对不存在的 key 执行 APPEND
redis> EXISTS myphone # 确保 myphone 不存在
(integer) 0
redis> APPEND myphone "nokia" # 对不存在的 key 进行 APPEND ,等同于 SET myphone "nokia"
(integer) 5 # 字符长度
对已存在的字符串进行 APPEND
redis> APPEND myphone " - 1110" # 长度从 5 个字符增加到 12 个字符
(integer) 12
redis> GET myphone
incr "nokia - 1110"
12. Incrbyfloat
Incrbyfloat 命令用于为某个 键值对 中所储存的值加上指定的浮点数增量值,具体是哪个键值对由参数 key 决定。
要求键值对的值的必须是可以被解析为双精度浮点值的字符串。
如果 key 不存在,那么 INCRBYFLOAT 会先将 key 的值设为 0 ,再执行加法操作。
Redis 内部使用科学计数法存储浮点数值字符串,输出精度都固定为小数点后17位。
语法
Incrbyfloat key amount
返回值
执行命令之后 键值对 的新值。
实例
值和增量都不是指数符号
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.000000000000 # 但 INCRBYFLOAT 会无略掉无意义的 0 ,甚至简化为整数
"4"
redis> GET mykey
"4"