Redis之常用命令及数据类型使用
1. 全局命令
1. 查看所有键
keys * 线上环境禁止使用
2. 键总数
dbsize 不会遍历所有键,直接获取Redis内置的键总数变量
3. 检查键是否存在
exists keyname
存在返回1,不存在返回0.
4. 删除键
del keyname 可以删除任何类型,返回结果为成功删除的键的个数,如果该键不存在,则返回0
del key1 key2 key3 可以删除多个键
批量删除keys
先将有特殊字符的键值,导出一份到一个txt,然后使用while循环,逐行读取,进行删除。
cat /tmp/2.txt | while read line ;do redis-cli del $line ;done
5. 设置键过期
expire keyname seconds
expire hello 10 设置hello10秒过期时间
6. 查看键的过期时间
ttl keyname
返回值:
大于等于0的整数:键剩余的过期时间,单位为秒
-1:没设置过期时间
-2:键不存在
7. 查看键的数据结构类型
type keyname 键不存在,返回none
8. 键重命名
rename key newkey
rename a b
renamenx key newkey 使用renamenx时,newkey必须不存在,才能修改成功;否则修改不会成功的。
由于重名键期间会执行del命令删除旧的键,如果键对应的值比较大,会存在阻塞redis的可能性。
9. 随机返回一个键
randomkey
10. 迁移键
1. redis不同数据库之间迁移
move key db
2. 实现不同redis实例之间数据迁移
dump+restore 需要分别在两个客户端,分别执行命令
在源redis上,dump命令会将键值序列化,格式采用的是RDB格式
在目标redis上,restore命令将上面序列化的值进行复原,其中ttl参数代表过期时间,如果ttl=0代表没有过期时间
3. 实现不同redis实例之间数据迁移
例子:
1. 源redis有键hello,目标redis没有
migrate 127.0.0.1 6380 hello 0 1000
2. 源redis和目标redis都有键hello
migrate 127.0.0.1 6380 hello 0 1000 replace
3. 源redis多个键迁移
migrate 127.0.0.1 6380 "" 0 5000 keys key1 key2 key3
11. 迁移键
1. 全量遍历键
keys pattern
*: 匹配任意字符
.: 匹配一个字符
[] 代表匹配部分字符
\ 用来做转义
使用keys遍历,会引起redis阻塞,要慎用
2. 渐进式遍历
scan cursor [match pattern] [count number]
12. 切换数据库
select dbIndex
13. flushdb/flushall
清除数据库
2. 字符串
1. 字符串的值可以是字符串(简单的字符串,复杂的字符串例如JSON,XML),数字(整数,浮点数),二进制(图片,音频,视频),但是最大不能超过512M
2. 常用命令
1. 设置值(set)
1. 基本语法
set key value [ex seconds] [px milliseconds] [nx|xx]
ex seconds:为键设置秒级过期时间
px milliseconds:为键设置毫秒级过期时间
nx:键必须不存在,才可以设置成功,用于添加
xx:键必须存在,才可以设置成功,用于更新
2. 例子
set hello world
setnx hello world hello必须不存在,才可以设置成功
setxx hello world hello必须存在,才可以设置成功
2. 获取值(get)
1. 基本语法
get key
2. 例子
get key 返回对应的值
get not_exist_key 返回nil
3. 批量设置值
1. 基本语法
mset key value [key value]
2. 例子
mset a 1 b 2 c 3 d 4
4. 批量获取值
1. 基本语法
mget key [key]
2. 例子
mget a b c d
3. 使用批量获取值的命令,可以提高开发效率
5. 计数
1. 自增基本语法
incr key
incr a 1 如果a是整数,返回自增后的结果,如果不是整数,则返回错误
2. 自减基本语法
decr key
decr a 1 自减1
3. 自增指定数字
incrby a 2
4. 自减指定数字
decrby a 2
3. 不常用命令
1. 追加值
1. 基本语法
append key value
在字符串尾部追加值
2. 字符串长度
1. 基本语法
strlen key 每个中文占用3个字节 返回值就是字节数
3. 设置并返回原值
1. 基本语法
getset key value
4. 设置指定位置的字符
1. 基本语法
setrange key offeset value
setrange c 2 o 字符串索引从0开始,把字符串索引为2的字符,修改为o.
5. 获取部分字符串
1. 基本语法
getrange key start end
getrange c 0 2
4. 字符串类型命令时间复杂度
5. 字符串内部编码
1. 种类
int:8个字节的长整型
embstr:小于等于39个字节的字符串
raw:大于39个字节的字符串
2. 查看内部编码
object encoding keyname
6. 字符串应用场景
1. 缓存功能
redis作为缓存层,mysql作为存储层,绝大部分请求的数据都是从redis获取。由于redis具有支撑高并发的特性,所以缓存能起到加速读写和降低后端压力的作用。
2. 计数
使用redis作为计数的基础工具,可以实现快速计数,查询缓存的功能,同时数据可以异步落地到其它数据源
3. 共享session
4. 限速
为了短信接口不被频繁访问,会限制用户每分钟获取验证码的频率。
3. 哈希
1. 命令
1. 设置值
1. 基本语法
hset key field value
2. 例子
hset userinfo name yangjianbo
2. 获取值
1. 基本语法
hget key field 如果不存在就返回nil
2. 例子
hget userinfo name
3. 删除field
1. 基本语法
hdel key field 可以删除一个或者多个field
2. 例子
hdel userinfo name
4. 计算field个数
1. 基本语法
hlen key
2. 例子
hlen userinfo
5. 批量设置或获取field-value
1. 基本语法
批量设置 hmset key field value field value
批量获取 hmget key field
2. 例子
hmset userinfo name yichangkun age 18 zichan 0
hmget userinfo name age zichan
6. 判断field是否存在
1. 基本语法
hexists key field
2. 例子
hexists userinfo name
7. 获取所有field
1. 基本语法
hkeys key
2. 例子
hkeys userinfo
8. 获取所有value
1. 基本语法
hvals key
2. 例子
hvals userinfo
9. 获取所有的field-value
1. 基本语法
hgetall key 如果哈希元素个数比较多,会存在阻塞redis的可能。可以使用hscan命令
2. 例子
hgetall userinfo
10. 自增域
1. 基本语法
hincrby key field value value只能是int类型或者float类型
hincrbyfloat key field value
2. 例子
hincrby userinfo city 1
hincrbyfloat userinfo fangchan 2.5
hincrbyfloat userinfo nvren 5
11. 计算value的字符串长度(需要redis3.2以上)
1. 基本语法
hstrlen key field
2. 例子
hstrlen userinfo name
2. 哈希类型命令的时间复杂度
3. 内部编码
1. 种类
1. ziplist(压缩列表)
当哈希类型元素个数小于hash-max-ziplist-entries配置(默认512个),同时所有值小于hash-max-ziplist-value配置(默认64字节),redis会使用ziplist作为哈希的内部实现,ziplist使用更加紧凑的结构实现多个元素的连续存储,所以在节省内存方面比hashtable更加优秀。
2. hashtable(哈希表)
当哈希类型无法满足ziplist的条件时,redis会使用hashtable作为哈希的内部实现,因为ziplist的读写效率会下降,而hashtable的读写时间复杂度为O(1)。
2. 查看内部编码
object encoding keyname
4. 应用场景
1. 可以模拟简单的关系查询
4. 列表
用来存储多个有序的字符串,一个列表最多可以存储2的32次方减1个元素
1. 命令
1. 添加操作
1. 语法
rpush key value[ value value] 从右边插入列表
lpush key value[ value value] 从左边插入列表
2. 例子
lpush jishu yangjianbo luoying yichangkun
rpush chanpin sunyu wanghongxiao wangfei
2. 插入操作
1. 语法
linsert key before|after valuename newvalue
2. 例子
linsert jishu after yangjianbo wangzhiyong
linsert chanpin before wanghongxiao wangbo
3. 查找列表(范围查找)
1. 语法
lrange key start end
2. 例子
查找列表所有元素 lrange chanpin 0 -1
查找第二个和第三个元素 lrange chanpin 1 2
4. 查找某一个元素(精确查找)
1. 语法
lindex key index
2. 例子
lindex chanpin 3
5. 获取列表长度
1. 语法
llen key
2. 例子
llen jishu
6. 删除
1. 语法
lpop key 从左边第一个元素开始删除
rpop key 从右边第一个元素开始删除
2. 例子
lpop jishu
rpop chanpin
7. 删除指定元素
1. 语法
lrem key count value
lrem命令会从列表中找到等于value的元素进行删除,根据count的不同分为三种情况:
count>0,从左到右,删除最多count个元素
count<0,从右到左,删除最多count绝对值个元素
count=0,删除所有
2. 例子
lrem chanpin 1 wangbo
8. 只保留指定元素
1. 语法
ltrim key start end
2. 例子
ltrim chanpin 1 3
9. 修改指定索引下标的元素
1. 语法
lset key index newValue
2. 例子
lset chanpin 2 zhangning
10. 阻塞操作
1. 语法
blpop key [key...] timeout
brpop key [key...] timeout
2. 例子
blpop jishu 10 从左边删除第一个元素,有就删除,没有就阻塞10秒。
brpop jishu 10 从右边删除倒数第一个元素,有就删除,没有就阻塞10秒。
2. 列表命令时间复杂度
3. 内部编码
1. 种类
1. ziplist(压缩列表)
当列表的元素个数小于list-max-ziplist-entries配置(默认512个),同时列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节),redis会选用ziplist来作为列表的内部实现来减少内存的使用。
2. linkedlist(链表)
当列表类型无法满足ziplist的条件时,redis会使用linkedlist作为列表的内部实现。
2. 查看内部编码
object encoding keyname
3. redis3.2提供了quicklist内部编码
4. 使用场景
1. 消息队列
2. 文章列表
3. 列表使用场景口诀
lpush+lpop=Stack(栈)
lpush+rpop(队列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)
5. 集合
集合用来保存多个的字符串元素,不允许有重复元素,并且是无序的,不能通过索引下标获取元素。
一个集合最多可以存储2的32次方-1个元素。
1. 命令
1. 集合内操作
1. 添加元素
1. 语法
sadd key 元素名
2. 例子
sadd jishu yangjianbo yichangkun luoying
2. 删除元素
1. 语法
srem key 元素名
2. 例子
srem jishu yichangkun luoying
3. 计算元素个数
1. 语法
scard key
2. 例子
scard jishu
4. 判断元素是否在集合中
1. 语法
sismember key element
2. 例子
sismember jishu houzi 若存在,返回1;不存在,返回0
5. 随机从集合返回指定个数元素
1. 语法
srandmember key [count]
2. 例子
srandmember jishu 2 随机返回两个元素,如果不添加count,默认为1
6. 从集合中随机弹出元素并删除
1. 语法
spop key
2. 例子
spop jishu
3. spop从redis3.2以后,也可以添加count参数,spop与srandmember的最大区别就是:spop选出后,会把选出的元素删除,而srandmember不会。
7. 获取所有元素
1. 语法
smembers key
2. 例子
smembers jishu 如果元素过多,可能会导致redis阻塞
2. 集合间操作
准备工作:
创建两个集合,因为默认创建集合,会存储在不同的哈希槽中。但是使用集合间操作的时候,会有报错。CROSSSLOT Keys in request don't hash to the same slot
使用HashTag机制,可以将指定的key分配到同一个槽中。
sadd {bumen}jishu wangshiqiang
sadd {bumen}chanpin wangshiqiang
1. 求多个集合的交集
1. 语法
sinter key [key]
2. 例子
sinter {bumen}jishu {bumen}chanpin
2. 求多个集合的并集
1. 语法
sunion key [key]
2. 例子
SUNION {bumen}jishu {bumen}chanpin
3. 求多个集合的差集
1. 语法
sdiff key [key]
2. 例子
sdiff {bumen}jishu {bumen}chanpin
4. 将交集并集差集的结果保存
1. 语法
sinterstore destination key [key]
sunionstore destination key [key]
sdiffstore destination key [key]
2. 例子
sinterstore {bumen}zhenpin {bumen}jishu {bumen}chanpin
sunionstore {bumen}zhenpin {bumen}jishu {bumen}chanpin
sdiffstore {bumen}zhenpin {bumen}jishu {bumen}chanpin
3. 集合常用命令时间复杂度
2. 内部编码
1. 种类
1. intset(整数集合)
当集合中的元素都是整数且元素个数小于set-max-intset-entries配置(默认512个)
2. hashtable(哈希表)
当集合类型无法满足intset的条件时,redis会使用hashtable作为集合的内部实现。
2. 查看内部编码
object encoding keyname
3. 使用场景
标签
6. 有序集合
1. 命令
1. 集合内
1. 添加成员
1. 语法
zadd key score member [score member ...]
2. 例子
zadd jishu 10 yangjianbo
2. 计算成员个数
1. 语法
zcard key
2. 例子
zcard jishu
3. 计算某个成员的分数
1. 语法
zscore key member
2. 例子
zscore jishu yichangkun
4. 计算成员的排名
1. 语法
zrank key member 分数从低到高排列
zrevrank key member 分数从高到低排列
2. 例子
zrank jishu wangshiqiang
zrevrank jishu wangshiqiang
5. 删除成员
1. 语法
zrem key member
2. 例子
zrem jishu wangshiqiang
6. 增加成员的分数
1. 语法
zincrby key increment member
2. 例子
zincrby jishu 50 yangjianbo
7. 返回指定排名范围的成员
1. 语法
zrange key start end [withscores] 按照排名从低到高
zrevrange key start end [withscores] 按照排名从高到低
2. 例子
zrange jishu 0 2 withscores
zrevrange jishu 0 2 withscores
8. 返回指定分数范围的成员
1. 语法
zrangebyscore key min max [withscores] [limit offset count] 按照分数从低到高返回
zrevrangebyscore key max min [withscores] [limit offset count] 按照分数从高到低返回
2. 例子
zrangebyscore jishu 10 50 withscores
zrevrangebyscore jishu 60 10 withscores
9. 返回指定分数范围成员个数
1. 语法
zcount key min max
2. 例子
zcount jishu 20 60.
10. 删除指定排名内的升序元素
1. 语法
zremrangebyrank key start end
2. 例子
zremrangebyrank jishu 0 0
11. 删除指定分数范围的成员
1. 语法
zremrangebyscore key min max
2. 例子
zremrangebyscore jishu 20 60
2. 集合间
2. 内部编码
3. 使用场景
排行榜系统