redis基本命令
dbsize查询当前数据库内容长度flushdb删除当前数据库中所有数据flushall删除所有数据库中所有数据ping心跳命令,检测客户端与 Redis 的连接是否正常set <key> <value>将指定key-value 写入到当前DBget <key>读取指定key的value值select 5选择数据库quit/exit退出Redis客户端redis-cli shutdown关闭Redis服务
Key操作命令
keys
- 格式
KEYS pattern
查找所有符合给定模式 pattern 的 key, pattern 为正则表达式
KEYS 的速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。所以生产环境中一般不使用该命令,而使用 scan 命令代替
exists
- 格式
EXISTS key
检查给定 key 是否存在
若 key 存在,返回 1,反之 0
del
- 格式
DEL key [key ...]
删除给定的一个或多个 key。不存在的 key 会被忽略
返回被删除 key 的数量
rename
- 格式
RENAME key newKey
将 key 改为 newKey
当 key 与 newKey 相同,或者 key 不存在时,返回一个错误。当 newkey 已经存在时,RENAME 命令将覆盖旧值。改名成功后提示 OK,失败时候返回一个错误
move
- 格式
MOVE key db
将当前数据库的 key 移动到给定的数据库 db 当中
如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果,移动成功返回 1,反之 0
type
- 格式
TYPE key
返回 key 所储存的值的类型
返回值有以下六种
- none(key 不存在)
- string
- list
- set
- zset
- hash
expire 与 pexpire
- 格式
EXPIRE key seconds
为给定 key 设置生存时间。当 key 过期时(生存时间为 0),它会被自动删除。expire 的时间单位为秒,pexpire 的时间单位为毫秒。在 Redis 中,带有生存时间的 key 被称为'易失的'(volatile)
ttl 与 pttl
- 格式
TTL key
TTL,time to live,返回给定 key 的剩余生存时间
其返回值存在三种可能
- 当 key 不存在时,返回 -2
- 当 key 存在但没有设置剩余生存时间时,返回 -1
- 否则,返回 key 的剩余生存时间,ttl 命令返回的时间单位为秒,而 pttl 命令返回的时间单位为毫秒
persist
- 格式
persist key
去除给定 key 的生存时间,将这个 key 从'易失的'转换成'持久的'
当生存时间移除成功时,返回 1;若 key 不存在或 key 没有设置生存时间,则返回 0
randomkey
- 格式
RANDOMKEY
从当前数据库中随机返回(不删除)一个key
当前数据库不为空时,返回一个 key。当数据库为空时,返回nil
scan
- 格式
SCAN cursor [MATCH pattern] [COUNT count] [TYPE type]
用于迭代数据库中的 key
- cursor:本次迭代开始的游标
- pattern:本次迭代要匹配的 key 的模式
- count:本次迭代要从数据集里返回多少元素,默认值为 10
- type:本次迭代要返回的 value 的类型,默认为所有类型
使用间断的,负数,超出范围的或者其他非正常的游标来执行增量式迭代
不会造成服务器崩溃。
当数据量很大时,count 的数据量的指定可能会不起作用,Redis 会自动调整每次的遍历数目。由于 scan 命令每次执行都只会返回少量元素,所以该命令可以用于生产环境
String 型 Value 操作命令
set
- 格式
SET key value [EX seconds | PX milliseconds] [NX|XX]
SET 除了可以直接将 key 的值设为 value 外,还可以指定一些参数
- EX seconds:为当前 key 设置过期时间,单位秒。等价于 SETEX 命令
- PX milliseconds:为当前 key 设置过期时间,单位毫秒。等价于 PSETEX 命令
- NX:指定的 key 不存在才会设置成功,用于添加指定的 key。等价于 SETNX 命令
- XX:指定的 key 必须存在才会设置成功,用于更新指定 key 的 value
getset
- 格式
GETSET key value
将给定 key 的值设置为value,并返回 key 的旧值
当 key 存在但不是字符串类型时,返回一个错误;当 key 不存在时,返回nil
mset 与 msetnx
- 格式
MSET/MSETNX key value [key value ...]
同时设置一个或多个 key-value 对
如果某个给定 key 已经存在,那么 MSET 会用新值覆盖原来的旧值,如果这不是你所希望的效果,请考虑使用 MSETNX 命令;他只会在所有给定 key 都不存在的情况下进行操作操作,某些给定 key 被更新而另一些给定 key 没有改变的情况不可发生
mget
- 格式
MGET key [key ...]
返回(一个或多个)给定 key 的值
如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil,因此,该命令永不失败
append
- 格式
APPEND key value
如果 key 已经存在并且是一个字符串,APPEND 命令将 value 追加到 key 原来的值的末尾。如果 key 不存在,append 就简单的将给定的 key 设为 value,就像执行 SET key value 一样
追加之后,返回 key 中字符串的长度
incr 与 decr
- 格式
incr key或decr key
increment 自动递增,将 key 中存储的数字值增一
decrement 自动递减,将 key 中存储的数字值减一
如果 key 不存在,那么 key 的值会先被初始化为 0,然后在执行增一/减一操作。如果值不能表示为数字,那么返回一个错误提示。如果执行正确,则返回增一/减一后的值
incrby 与 decrby
- 格式
incrby key increment或decrby key decrement
将 key 中存储的数字值增加/减少指定的数值,这个数值只能是整数,可以是负数,但不能是小数
如果 key 不存在,那么 key 的值会先被初始化 0,然后再执行操作,同 incr/decr
incrbyfloat
- 格式
incrbyfloat key increment
为 key 中所储存的值加上浮点数增量,没有 decrbyfloat
strlen
- 格式
strlen key
查看 key 中字符串长度
getrange
- 格式
getrange key start end
返回 key 中字符串值的子字符串,字符串的截取范围由 start 和 end 两个偏移量决定,包括 start 和 end 在内
end 必须要比 start 大,支持负数偏移量,表示从字符串最后开始计数,-1 表示最后一个字符,以此类推
setrange
- 格式
setrange key offset value
用 offset 参数替换给定 key 所储存的字符串值 str,从偏移量 offset 开始
当 offset 值大于 str 长度时,中间使用零字节\x00填充,对于不存在的 key 当作空串处理
应用场景
数据缓存
Redis 作为数据缓存层,MySQL 作为数据存储层。应用服务器首先从 Redis 中获取数据,如果缓存层中没有,则从 MySQL 中获取后先存入缓存层再返回给应用服务器
共享 Session
对于一个分布式应用系统,如果将类似用户登陆信息这样的 Session 数据保存在提供登陆服务的服务器中,那么如果用户再次提交像收藏,支付等请求时可能会出现的问题:在提供收藏,支付等服务的服务器中并没有该用户的 Session 数据,从而导致该用户需要重新登录。对于用户来说这是不能接受的。
此时,可以将系统中所有用户的 Session 数据全部保存到 Redis 中,用户在提交新的请求后,系统先从 Redis 中查找相应的 Session 数据,如果存在,则再进行相关操作,否则跳转到登录页面。这样就不会引发'重新登录问题'
限制器
Redis 可以结合 key 的过期时间与 incr 命令来完成限速,防止 DoS 攻击
Hash 型 Value 操作命令
Hash 表就是一个映射表 Map,也是由键-值对构成的,为了与整体的 key 进行区分,这里的键称为 field,值称为 value。注意,Redis 的 Hash 表中的 field-value 对均为 String 类型
hset
- 格式
HSET key field value
将 hash 表 key 中的域 field 的值设为 value
如果 key 不存在,一个新的哈希表被创建并进行 HSET 操作,返回1。已存在则覆盖,返回0
hget
- 格式
hget key <field>
同 String
hmset
- 格式
hmset key field value [field value ...]
同 String
hmget
- 格式
hmget key field [field ...]
同 String
hgetall
- 格式
hgetall key
获取 key 中所有 field 和 value 值
hkeys
- 格式
hkeys key
获取 key 中所有 field 值
hlen
- 格式
hlen key
获取 key 的 长度
略(大多与String命令同)
应用场景
存储对象数据,对对象属性的修改再=在 Redis 中就可以直接完成,其不像 String 型 Value 存储对象,那个对象是序列化过的,例如序列化为 JSON 串,对对象属性值的修改需要先反序列化为对象后再修改,修改后再序列化为 JSON 串后写入到 Redis
List 型 Value 操作命令
lpush/rpush
- 格式
LPUSH key value [value ...]或RPUSH key value [value ...]
表头/表尾添加元素
linsert
- 格式
LINSERT key BEFORE|AFTER pivot value
将值 value 插入到列表 ley 当中,位于元素 pivot 之前或之后
lpop/rpop
- 格式
LPOP key [count]或RPOP key [count]
从列表 key 的表头/表尾移除 count 个元素,并返回移除的元素,count 默认值 1
当 key 不存在时,返回 nil
blpop/brpop
- 格式
Blpop key [key ...] timeout或brpop key [key ..] timeout
列表的阻塞式(blocking)弹出,命令。它们是 LPOP/RPOP 的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLpop/Brpop 命令阻塞,知道等待 timeout 超时或发现可弹出元素为止
rpoplpush
- 格式
rpoplpush source destnation
将source 列表的尾元素,放到 destnation 列表的表头
brpoplpush
rpoplpush 的阻塞版本
lrem
- 格式
lrem key count value
根据参数 count 的值,移除列表中与参数 value 相等的元素
count值为下列几种
- count > 0:从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count
- count < 0:从表尾开始向表头搜索
- count = 0:移除表中所有与 value 相等的值
返回被移除元素的数量,当 key 不存在时,返回 0
ltrim
- 格式
LTRIM key start stop
对一个列表进行修剪,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
下表参数 start 和 stop 都以 0 为底,如果 start > stop,返回空列表,如果 stop < end,Redis 将 stop 的值设置为 end
应用场景
通过构建不同的数据结构来实现相应的业务功能
- 列(lpush + lpop)
- 队列(lpush + rpop)
- 阻塞式消息队列(lpush + brpop)
- 动态有限集合(lpush + ltrim)
Set 型 Value 操作命令
Set 型的底层是 Hash 表,Set 中的元素具有无序性与不可重复性
sadd
- 格式
SADD key member [member ...]
将一个或多个 member 元素加入到集合 key 中,已经存在于集合的 member 元素将被忽略
key 不存在,则创建。当 key 不是集合类型时,返回一个错误
smembers
- 格式
SMEMBERS key
查看 key 中的所有值
scard
- 格式
SCARD key
返回 Set 集合的长度
sismember
- 格式
SISMEMBER key member
判断 member 元素是否是集合 key 的成员
smove
- 格式
SMOVE source destination member
将 member 元素从 source 集合移动到 destination 集合
srem
- 格式
SREM key member [member ...]
移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略
srandmember
- 格式
srandmember key [count]
在 key 中随机 count 个元素,count 默认为 1
count 为正数时,且小于集合长度,那么返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合长度,返回整个集合。如果 count 为负数,那么返回一个包含 count 绝对值个元素的数组,但数组中的元素可能会出现重复
spop
- 格式
SPOP key [count]
移除并返回集合中的 count 个随机元素,count 必须为正数,且默认值为 1
sdiff
- 格式
SDIFF key key2
差集,返回 key 相对于 key2 不同的元素
sdiffstore
- 格式
SDIFFSTORE destination key key2
差集存储,将 key 相对于 key2 的差集存储在 destation 集合中
sinter
- 格式
SINTER key key2
交集,返回 key 与 key2 的交集
sinterstore
- 格式
SINTERSTROE destination key key2
交集存储,将 key 与 key2 的交集存储在 destination 集合中
sunion
并集,同上
sunionstore
并集存储,同上
应用场景
- 动态黑白名单
- 有限随机数(spop 或 srandmember)
- 用户画像(sadd/sinter/sinterstore)
有序 Set 型 Value 操作命令(ZSet)
Redis 存储数据的 Value 可以是一个有序的 Set,这个有序的 Set 中的每个元素均 String 类型,有序 Set 与 Set 的不同之处是,有序 Set 中的每个元素都有一个分值 scor,Redis 会根据 score 的值对集合进行由小到大的排序。其与 Set 集合要求相同,元素不能重复,但元素的 score 可以重复,由于该类型的所有命令均是 z 开头,所有该 Set 也称为 ZSet
zadd
- 格式
ZADD key score member [[score member] ...]
将一个或多个 member 元素以及其 score 值加入到有序 key 中的适当位置
zrange
- 格式
zrange key start end [withscores]
将集合 key 中从 start 到 end 的元素切片输出,添加 withscores 显示 key 内元素的 score 值
zrangebyscore 与 zrevrangebyscore
- 格式
zrangebyscore key min max [withscores] [LIMIT offset count] - 格式
zrangebyscore key max min [withscores] [LIMIT offset count]
将集合 key 中 score > min,score <= max 的 元素输出,limit 按照前部分查询到的结果 从下标为 offset 开始,切片 count 数量元素并返回
zrevrangebyscore 是 zrangebyscore 的反向
zcard
查询 key 集合的长度,同Set
zcount
- 格式
zcount key start end
计数 key 集合中下标 > start,下标 <= end 的元素个数
zscore
- 格式
zscore key field
查询 key 集合中 field 元素的 score 值
zrank 与 zrevrank
- 格式
zrank key field或zrevrank key field
查询 key 中 field 元素的排名,zrevrank 倒序排名
zrem 与 zremrangerank
删除 key 中元素,zremrangerank 删除 key 中一个范围内的元素
zremrangebyscore
删除 key 中 score 在一个范围内的元素
zrangebylex
- 格式
zrangebylex key (min [max
按照第一个字母排序切片,min 和 max 前必须添加符号
zlexcount
根据字母返回计数