常用命令
库的操作
select index 切换数据库,共有16个库,0-15
flushdb 清当前库
flushall 清除所有库
dbsize 查看库大小
exists key 判断key是否存在
expire key 给key设置过期时间
ttl key 查看key剩余的过期时间
type key 查看key的类型
key的操作
DEL key [key ...] 删除指定的key(一个或多个)
DUMP key 导出key的值
EXISTS key [key ...] 查询一个key是否存在
KEYS pattern 查找所有匹配给定的模式的键
MOVE key db 移动一个key到另一个数据库
RANDOMKEY 返回一个随机的key
RENAME key newkey 将一个key重命名
RENAMENX key newkey 重命名一个key,新的key必须是不存在的key
EXPIRE key seconds 设置一个key的过期的秒数
EXPIREAT key timestamp 设置一个UNIX时间戳的过期时间
PERSIST key 移除key的过期时间
PEXPIRE key milliseconds 设置key的有效时间以毫秒为单位
PTTL key 获取key的有效毫秒数
TTL key 获取key的有效时间(单位:秒)
TYPE key 获取key的存储类型
SCAN cursor [MATCH pattern] [COUNT count] 增量迭代key
unlink key 非阻塞删除
DEBUG OBJECT key 当 key 存在时,返回有关信息。 当 key 不存在时,返回一个错误。
help @数据类型 用于获取对应数据类型的命令,但是可视化工具不支持这些操作,例如:
help @string
十种数据类型命令
- String
set key value [NX|XX] [GET] [EX seconds|PX milliseconds|EXAT unix-time-seconds|PXAT unix-time-milliseconds|KEEPTTL]
redis为SET命令增加了一系列选项:
EX – 以秒位单位设置过期时间
PX – 以毫秒位单位设置过期时间
EXAT - 设置以秒为单位的UNIX时间戳所对应的时间为过期时间
PXAT - 设置以毫秒为单位的UNIX时间戳所对应的时间为过期时间
NX – 键不存在的时候设置值
XX – 键存在的时候设置值
KEEPTTL – 保留设置前指定键的过期时间,不加这个命令,重新设置键的值,过期时间会丢失
GET – 返回原本的键,如果键不存在返回nil
例如:
set abc 123 nx ex 60
set abc 123 KEEPTTL
由于SET命令加上选项已经可以完全取代SETNX, SETEX, PSETEX的功能,所以在将来的版本中,redis可能会不推荐使用并且最终抛弃这几个命令
setex 设置过期时间
setnx 设置key,成功返回1,失败返回0
mset 一次设置多个键和值,批量设置也是原子操作,要么都成功,要么都失败
setrange key 0 -1
get
mget 批量获取
getrange 截取指定范围的字符串
getrange key 0 -1 和get key 等效,获取key的值
getset 先获取,在设置,类似于map集合中的put,会覆盖原有的值,并返回被覆盖的值
incr 如果是数字,自增
incrby 可以设置步长值的自增
decr 如果是数字,自减
decrby 自减,同自增
move 移除key
append 拼接字符串
strlen 字符串的长度
- list(列表)
list 元素可重复,可以做消息队列或者栈,类似与双向链表,对两头的数据访问效率很高
lpush/rpush 向 左/右 边添加元素
lrange 获取集合中的元素,没有rrange命令
lpop 移除list集合最左边的数据并返回移除的结果
rpop 移除list集合最右边的数据并返回移除的结果
lindex 根据下标获取数据
llen 获取列表中元素个数
lrem key 10 abc 从上到下移除10个等于abc的元素,返回值为移除的个数
ltrim key start end 截取list,start和end是下标
rpoplpush key key1 从旧集合中移除最早的元素放到新集合中,如果新的列表不存在,会创建
lset key 0 123 向key列表中的0号位置添加元素,如果列表不存在会报错,而且必须是存在的下标,不能越界
linsert key before/after 将某个值插入列表中指定的某个值的前面或后面
- set(集合)
set 元素不能重复 所以可以做交、并、差集
sadd key value 向集合中添加元素,可以一次添加多个
smembers key 获取集合的所有元素
sismember key value 判断集合中是否包含该元素,0表示没有,1表示有
srem key value 移除某个元素
scard key 获取集合元素的个数
srandmember key 1 随机抽取set中的一个元素,不删除元素
spop key 1 随机移除一个元素
smove key key1 value 将 key 中指定元素移动到 key1中,如果 key1不存在,会自动创建
sdiff key set01 计算set减去set01的结果集,差集
sinter key set01 计算两个集合的交集
sunion key set01 计算两个集合的并集
- zset
有序集合,在set的基础上每个value增加了一个分数值,用来记录顺序
zadd key score value 添加元素 ,可以批量添加
zrange key start stop [withscores]
按照元素分数从小到大的顺序,返回索引 start 到 stop 的所有元素,0 -1就是返回所有元素,withscores表示一起返回分数值
zrevrange key start stop [withscores] 倒序上个命令的结果
zrangebusocer key min max [withscores] [limit offset count] 获取指定分数的元素
zsore key value 获取元素的分数
zcard key 查看zset有多少个元素
zrem key score 移除某个score下的value值
zincrby key increment value 增加某个元素的分数
zcount key min max 获取指定分数范围内的元素个数
zrank key values 获得下标值
zrevrank key values 逆序获得下标
ZMPOP numkeys key [key ...] MIN|MAX [COUNT count] 7.0新增命令
BZMPOP ZMPOP的阻塞版本
很适合做排行榜,例如:
添加排行榜单:zadd theCharts 1000 橘子 800 苹果 600 火龙果 1500 西瓜 1200 榴莲
变更排行榜: zincrby theCharts 300 苹果
获取榜单: zrange theCharts 0 -1
- hash
hash 类似于 Map<String,Map<Object,Object>> 适合存储经常变更的数据,以及对象
hset key age 18 设置hash 中age字段的值为18 ,可以批量设置,hmset批量设置基本废弃
hget 过去某个hash的某个字段的值
hgetall key 获取hash全部的字段以及值
hdel key filed 删除指定的字段
hlen 获取hash长度
hexists key age 判断hash中是否有字段age
hkeys key 获取所有的字段名
hvals key 获取所有的值
hincrby hdncrby 和String 类似自增自减,可自己设置步长值
hsetnx 设置key,成功返回1,失败返回0
- bitmap
位图最小的单位是bit,每个bit取值只能是0或者1,用于记录类似签到记录这种数据可以极大的减少开销,一个字节8个bit,超过8bit会自动扩容,扩容也以8bit为单位,一个月的签到记录不过4字节,使用关系型数据库,不仅性能上会存在问题,还会极大的增加开销
setbit key offset val 给指定 key 的值的第offset赋值为val,偏移量从0开始算
getbit key offset 获取指定key的第offset位
bitcount key start end 返回指定key的[start,end]中为1的数量
bitop operation destkey key 对不同的二进制存储数据进行位运算(and、or、not、xor)
- Hyperloglog
用来做基数统计算法的数据结构,如统计网站的UV(独立访客,一般理解为客户端ip)
pfadd key element [element...] 添加指定元素到Hyperloglog 中
pfcount key [key...] 返回 Hyperloglog 基数的估算值
pfmerge destkey sourcekey [sourcekey...] 将多个 Hyperloglog 合并
- geo
用于记录地理位置信息,核心思想就是把地球化分为平面上的网格,把三维信息简化为二维,底层是zset
geoadd key score value 将多个经纬度信息添加到geo中
geopos key value 返回key中给定元素的坐标
geohash key value 将经纬度通过geohash算法生成base32的编码值,把二维的信息简化为了一维
geodist key value value km 返回两个位置之间的距离,后面的单位可以是m、km等,默认是m
georadius key 坐标 半径 半径的单位 count size desc/asc
- 以给定的经纬度为中心,返回半径内的size条元素,倒序/升序排列
- 其他参数:withdist 位置元素与中心的距离一并返回
withcoord 同时返回位置元素的坐标
withhash 返回hash值
georadiusbymember 类似于georadius
示例:
geoadd geo 120.168618 30.256333 西湖 120.213156 30.165801 白马湖 119.950761 29.983574 天中山
zrange geo 0 -1 同样可以使用zset的命令
geopos geo 西湖 白马湖
geohash geo 西湖
geodist geo 西湖 白马湖 m
georadius geo 120.179371 30.252945 20 km withdist count 10 desc
georadiusbymember geo 西湖 20 km withdist count 10 desc
-
stream:redis版本的消息中间件
队列相关指令
xinfo stream streamKey 打印stream的相关信息
xadd streamKey * key value
添加消息到队列的末尾,如果队列不存在,会自动创建
消息id必须比上个id大,默认使用*表示使用自动生成的id,如果不使用自增id由客户端自行传入也需要格式是:时间戳-id的方式
添加消息时,返回值就是自动生成的id,格式为:时间戳-自增id(1688199110597-0),自增id表示该毫秒内产生的第多少条消息,长度为64位,理论上同一毫秒不可能达到这种量级的数据量,因此不用担心序列号不够用
xrange streamKey start end count
获取消息列表,忽略删除的消息, -表示最小值,+表示最大值,count表示要获取多少个值
xrevrange 和xrange的区别是倒叙id反向获取消息
xdel streamKey id 删除消息
xtrim streamKey maxlen minid
限制stream的长度,如果已经超长会进行截取,maxlen 表示允许的最大消息条数,minid 是允许的最小id
xlen 获取stream中的消息的条数
xread [count] [block milliseconeds] streams streamKey id
获取消息,返回大于指定id的消息,count是最多读取多少条消息,不指定count会返回所有的消息
block代表是否以阻塞的方式读,默认不阻塞,milliseconeds设为0代表永远阻塞
$代表特殊的id,表示当前已经存储的最大id作为最后一个id
0-0代表从最小的id开始获取消息
示例:消息内容可以重复
xadd streamKey * name zhangsan age 20 height 170 weight 60
xadd streamKey * name lisi age 20 height 180 weight 80
xrange streamKey - +
xtrim streamKey maxlen 4
xtrim streamKey minid 1688200482103-0
xread count 2 streams streamKey 0-0
xread count 2 block 0 streams streamKey $ 一直阻塞等待最新消息
xadd streamKey 1688201542861-1 name lisi age 20 height 180 weight 80
xread count 2 streams streamKey 1688201542861-0
消费者相关指令
xgroup create streamKey groupName id
创建消费者组,id:$代表从尾不开始消费,0代表从头开始消费
xreadgroup group groupName consumerName [count] [block milliseconeds] streams streamKey id
读取消息,”>“表示从第一条尚未被消费的消息开始读取,和kafka一样,一条消息只能被同一个消费者组里的消费者消费一次,避免了同一个消费者组内的重复消费
xpending streamKey groupName
查询每个消费者组内所有消费者,以读取但未确认的消息
xack streamKey groupName id 确认消息已经消费
示例:
xgroup create streamKey groupA 0
xreadgroup group groupA consumer1 streams streamKey >
xreadgroup group groupA consumer2 streams streamKey >
xgroup create streamKey groupc 0
xreadgroup group groupc consumer1 count 1 streams streamKey >
xpending streamKey groupA
xack streamKey groupA 1688201542861-1
- bitfield(位域)
目前很少使用,可以把一个redis字符串看作是一个二进制位组成的数组,并对任意一位进行访问和修改
scan命令
-
想要通过特定前缀查找key时,可以使用keys 命令,但是这个命令有明显的缺点:
- 没有偏移量和分页,会一次性返回所有满足条件的key
- 而且keys采用的是遍历算法,时间复杂度是O(n),因为redis是单线程的,如果数据量很大会造成服务器的卡顿,也有可能造成其他指令的超时
-
所以在2.8版本的时候,加入了scan指令,与keys一样也提供匹配功能,但是相比keys更加强大
-
虽然scan时间复杂度也是O(n),但是可以通过游标分步执行,不会阻塞线程,而且提供了limit参数
-
在redis中所有的key都存储在一个很大的字典中,分为一维数组和二维链表结构,一维数组的大小是2^n,扩容操作是变为原数组的两倍,类似与java中的hashMap
-
scan指令返回的游标就是一维数组的索引位置,也被称为槽,limit参数就是需要遍历的槽位数,因为每个槽上的链表元素个数不同,返回结果可能多也可能少,所以单次返回结果为空,并不意味着遍历结束,而是要看返回给客户端的游标是否为0,游标为0代表遍历结束
-
因为字典的扩容和缩容,scan的遍历顺序很特别,并不是从一维数组的第0位遍历到末尾,而是采用高位进位加法来遍历,高位进位加法从左边加,进位向右边移,与普通加法相反
-
采用高位进位加法,扩容后rehash的槽位在遍历顺序上是相邻的,能够避免扩容后对已经遍历过的槽位进行重复遍历,但是缩容情况下,无法避免对正在遍历的槽位的重复遍历,所以需要客户端去重,而且遍历的过程如果有数据修改,改动后的数据能不能遍历到不确定
-
scan基本语法
- scan cursor [MATCH parttern] [COUNT count],
- cursor表示游标的意思,可以简单理解为分页的页码,每次执行命令后会返回给你一个cursor,下次再遍历时从返回位置开始遍历;
- [MATCH parttern]表示是否进行key值的模式匹配;
- [COUNT count]表示是否限制数量,可以简单理解为limit,但是返回的数量是不固定的
-- 0是起始槽位,1000是一次要遍历的槽位
scan 0 MATCH PRE* COUNT 1000
渐进式rehash
- 如果元素比较多,扩容时一次性把旧数组的元素迁移到新数组下,就会出现卡顿,redis为了解决这个问题,采用了渐进式rehash
- 会同时保留旧数组和新数组,渐渐的把旧数组中的元素迁移到新数组,访问的时候,如果再旧数组中找不到元素,还需要到新数组下面去寻找
- scan也同样需要扫描新旧槽位,把结果融合后返回给客户端
在redis中如果某个key太大,会导致数据迁移卡顿,删除key的时候,内存会被一次性回收,也会造成卡顿,所以应该尽量避免大KEY的产生
info指令
- 可以通过info获取redis内部一系列的运行参数,可以使用info一次获取所有信息,也可以按块获取信息
- info信息分为9块
参数名 | 说明 |
---|---|
server | 获取 server 信息 |
clients | 获取 clients 信息,如客户端连接数等 |
memory | 获取 server 的内存信息,包括当前内存消耗、内存使用峰值 |
persistence | 获取 server 的持久化配置信息 |
stats | 获取 server 的一些基本统计信息,如处理过的连接数量等 |
replication | 获取 server 的主从配置信息 |
cpu | 获取 server 的 CPU 使用信息 |
keyspace | 获取 server 中各个 DB 的 key 的数量 |
cluster | 获取集群节点信息,仅在开启集群后可见 |
commandstas | 获取每种命令的统计信息 |