redis常用命令

常用命令

库的操作

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获取每种命令的统计信息
  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值