【Redis】Redis基本命令(1)_redis keys命令效率
KEYS
返回所有满足样式(pattern)的key。
-
KEY *
返回所有key,不简易使用
性能问题:当 Redis 存储百万级键时,会消耗大量 CPU 和内存资源,Redis 是单线程模型,KEYS * 执行期间会阻塞其他所有命令(包括读写操作),导致服务短暂不可用。
生产环境风险:
阻塞导致请求堆积
客户端超时重试
最终导致 Redis 崩溃
返回大量键名时可能撑爆客户端内存 -
yid?i
其中 ?匹配任意一个字符,比如yidai
、yidei
、yidii
-
yid*i
其中 * 匹配任意一串字符,比如yidai
、yideeeeei
、yidi
-
yi[ae]ai
其中 [ae] 代表匹配 a 或者 e 任意一个字符,比如yidai
、yidei
-
yi[^e]ai
其中 [^e] 代表匹配除了 e 的任意一个字符,比如yidai
但不匹配yidei
-
yi[a-e]ai
其中 [a-e] 代表匹配 a 到 e 任意一个字符,比如yidai
、yidei
、yidbi
用法:KEYS pattern
命令有效版本:1.0.0 以后
时间复杂度为O(N)
返回值为匹配 pattern 的所有 key
EXIST
判断某个key是否存在
语法:EXISTS key [key ...]
可以一次查找一个或者多个key
127.0.0.1:6379> EXISTS yidai (integer) 1127.0.0.1:6379> EXISTS yidai yidi hello(integer) 3
时间复杂度为O(1)
返回值为 key 存在的个数
DEL
删除指定的 key
可以一次删除一个或者多个key
语法:DEL key [key ...]
127.0.0.1:6379> DEL yidai yidi (integer) 2
返回值:删除key的个数
时间复杂度:O(1)
EXPIRE
为指定的 key 添加秒级的过期时间(Time To Live TTL)
语法:EXPIRE key seconds
时间复杂度:O(1)
返回值:成功时返回1,失败返回0
127.0.0.1:6379> EXPIRE hello 10(integer) 1
TTL
获取指定 key 的过期时间,秒级。
语法:TTL key
时间复杂度:O(1)
返回值:剩余过期时间。-1 表示没有关联过期时间,-2 表示 key 不存在。
127.0.0.1:6379> TTL yidei(integer) -1
TYPE
Redis TYPE
命令返回值详解
string
SET name \"Alice\"
→ TYPE name
返回 string
list
LPUSH fruits \"apple\"
→ TYPE fruits
返回 list
hash
HSET user:1 name \"Bob\"
→ TYPE user:1
返回 hash
set
SADD tags \"red\"
→ TYPE tags
返回 set
zset
ZADD leaderboard 100 \"player1\"
→ TYPE leaderboard
返回 zset
stream
XADD mystream * field1 \"value1\"
→ TYPE mystream
返回 stream
none
TYPE non_existent_key
返回 none
语法:TYPE key_name
时间复杂度:O(1)
特殊场景:
- 已过期的 key 仍会返回原类型,直到 redis 清除
- 空数据结构(如空列表)仍返回对应类型
- 模块扩展类型可能返回自定义类型名
127.0.0.1:6379> SET greeting \"Hello\"OK127.0.0.1:6379> TYPE greetingstring127.0.0.1:6379> TYPE missing_keynone
redis 的5种数据类型内部编码
Redis 数据结构内部编码对照表
raw
int
embstr
hashtable
ziplist
linkedlist
ziplist
quicklist
hashtable
intset
skiplist
ziplist
关键说明:
- 编码转换阈值(可通过配置文件调整):
# redis.conf 示例配置hash-max-ziplist-entries 512 # hash元素超过512时转hashtablehash-max-ziplist-value 64 # hash字段值超过64字节时转hashtable
object encoding
可以查看数据结构内部编码
127.0.0.1:6379> set hello worldOK127.0.0.1:6379> lpush mylist a b c(integer) 3127.0.0.1:6379> object encoding hello\"embstr\"127.0.0.1:6379> object encoding mylist\"quicklist\"
Redis 这样设计有两个好处:
内存效率:针对不同数据特征选择最优编码
性能优化:平衡读写速度与存储开销
弹性扩展:自动适应数据规模变化
String字符串
字符串类型是 Redis 最基础的数据类型,关于字符串需要特别注意:
1)⾸先 Redis 中所有的键的类型都是字符串类型,⽽且其他⼏种数据结构也都是在字符串类似基础上构建的,例如列表和集合的元素类型是字符串类型
2)字符串类型的值实际可以是字符串,包含⼀般格式的字符串或者类似 JSON、XML 格式的字符串;数字,可以是整型或者浮点型;甚⾄是⼆进制流数据,例如图片、⾳频、视频等。不过⼀个字符串的最大值不能超过 512 MB。
注意:由于 Redis 内部存储字符串完全是按照⼆进制流的形式保存的,所以 Redis 是不处理字符集编码问题的,客⼾端传⼊的命令中使⽤的是什么字符集编码,就存储什么字符集编码。
SET
将 string 类型的 value 设置到 key 中。如果 key 之前存在,则覆盖,⽆论原来的数据类型是什么。之前关于此 key 的 TTL 也全部失效。
语法:SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
时间复杂度:O(1)
选项:
SET 命令⽀持多种选项来影响它的⾏为:
- EX seconds⸺使⽤秒作为单位设置 key 的过期时间。
- PX milliseconds⸺使⽤毫秒作为单位设置 key 的过期时间。
- NX ⸺只在 key 不存在时才进行设置,即如果 key 之前已经存在,设置不执行。
- XX ⸺只在 key 存在时才进行设置,即如果 key 之前不存在,设置不执行。
返回值: - 如果设置成功,返回 OK。
- 如果由于 SET 指定了 NX 或者 XX 但条件不满足,SET 不会执行,并返回 (nil)。
127.0.0.1:6379> SET hello 1 EX 10 OK127.0.0.1:6379> ttl hello(integer) 8127.0.0.1:6379> set hello 2 px 1000OK127.0.0.1:6379> pttl hello(integer) -2127.0.0.1:6379> set hello 2 px 1000OK127.0.0.1:6379> pttl hello(integer) 490127.0.0.1:6379> set hello 111 NXOK127.0.0.1:6379> set hello 111 NX(nil)127.0.0.1:6379> set yidai 123 EX 10 XX(nil)127.0.0.1:6379> set yidai 123 EX 10 NXOK127.0.0.1:6379> set yidai 123 EX 10 XXOK
SETNX
设置 key-value 但只允许在 key 之前不存在的情况下
语法:SETNX key value
时间复杂度:O(1)
返回值:1 表示设置成功。0 表示没有设置。
127.0.0.1:6379> SETNX YIDAI 123(integer) 1127.0.0.1:6379> SETNX YIDAI 123(integer) 0
GET
获取 key 对应的 value。
语法:GET key
时间复杂度:O(1)
返回值:key 对应的 value,或者 nil 当 key 不存在。如果 value 的数据类型不是 string,会报错。
127.0.0.1:6379> lpush yidai 1 2 3(integer) 3127.0.0.1:6379> TYPE yidailist127.0.0.1:6379> GET yidai(error) WRONGTYPE Operation against a key holding the wrong kind of value127.0.0.1:6379> set key 1OK127.0.0.1:6379> get key\"1\"
MGET
⼀次性获取多个 key 的值。如果对应的 key 不存在或者对应的数据类型不是 string,返回 nil
语法:MGET key [key ...]
时间复杂度:O(K),K是key的个数
返回值:对应value的列表
127.0.0.1:6379> set hello 1OK127.0.0.1:6379> set yidai 2OK127.0.0.1:6379> mget hello yidai1) \"1\"2) \"2\"
MSET
⼀次性设置多个 key 的值。
语法:MSET key value [key value ...]
时间复杂度:O(K),K是key的个数
返回值:OK
127.0.0.1:6379> MSET key1 1 key2 2OK
多次GET 和 MGET的区别
其中 MGET 有效减少了网络通信的时间,一次查找完了多个key值,而 get
需要多次查询,增加了网络通信时间消耗,降低了效率注意:用MGET也需要注意查询建的个数,不能过于庞大,否则可能导致命令执行时间过长,导致Redis阻塞
计数命令
INCR
将 key 对应的 string 表⽰的数字加⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:INCR key
时间复杂度:O(1)
返回值:integer 类型的加完后的数值
127.0.0.1:6379> EXISTS LL(integer) 0127.0.0.1:6379> INCR LL(integer) 1127.0.0.1:6379> INCR LL(integer) 2127.0.0.1:6379> SET KK 10OK127.0.0.1:6379> INCR KK(integer) 11127.0.0.1:6379> SET NUM 239204940933333333333333333335333333333333OK127.0.0.1:6379> INCR NUM(error) ERR value is not an integer or out of range127.0.0.1:6379> SET str dsdafOK127.0.0.1:6379> INCR str(error) ERR value is not an integer or out of range
INCRBY
将 key 对应的 string 表示的数字加上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:INCRBY key decrement
时间复杂度:O(1)
返回值:integer 类型的加完后的数值
127.0.0.1:6379> EXISTS ky(integer) 0127.0.0.1:6379> INCRBY ky 2(integer) 2127.0.0.1:6379> INCRBY by -1(integer) -1
DECR
将 key 对应的 string 表⽰的数字减⼀。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错
语法:DECR key
时间复杂度:O(1)
返回值:integer 类型的减完后的数值
127.0.0.1:6379> EXISTS ui(integer) 0127.0.0.1:6379> DECR ui(integer) -1
DECRBY
将 key 对应的 string 表示的数字减上对应的值。如果 key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的 string 不是⼀个整型或者范围超过了 64 位有符号整型,则报错。
语法:DECRBY key decrement
时间复杂度:O(1)
返回值:integer 类型的加完后的数值
127.0.0.1:6379> EXISTS we (integer) 0127.0.0.1:6379> DECRBY we -2(integer) 2
INCRBYFLOAT
将 key 对应的 string 表⽰的浮点数加上对应的值。如果对应的值是负数,则视为减去对应的值。如果key 不存在,则视为 key 对应的 value 是 0。如果 key 对应的不是 string,或者不是⼀个浮点数,则报错。允许采⽤科学计数法表示浮点数。
语法:INCRBYFLOAT key increment
时间复杂度:O(1)
返回值:加/减完后的数值
127.0.0.1:6379> EXISTS float(integer) 0127.0.0.1:6379> INCRBY float -1(integer) -1127.0.0.1:6379> INCRBYFLOAT float -1\"-2\"127.0.0.1:6379> INCRBYFLOAT float -0.5\"-2.5\"127.0.0.1:6379> INCRBYFLOAT float 10.5\"8\"127.0.0.1:6379> INCRBYFLOAT float 1e5\"100008\"
APPEND
如果 key 已经存在并且是⼀个 string,命令会将 value 追加到原有 string 的后边。如果 key 不存在,则效果等同于 SET 命令。
语法:APPEND KEY VALUE
时间复杂度:O(1)
返回值:追加完成之后 string 的⻓度。
127.0.0.1:6379> EXISTS ss(integer) 0127.0.0.1:6379> APPEND ss 1(integer) 1127.0.0.1:6379> GET ss\"1\"127.0.0.1:6379> APPEND ss sdad(integer) 5127.0.0.1:6379> GET ss\"1sdad\"
GETRANGE
返回 key 对应的 string 的子串,由 start 和 end 确定(左闭右闭)。可以使用负数表示倒数。-1 代表倒数第⼀个字符,-2 代表倒数第⼆个,其他的与此类似。超过范围的偏移量会根据 string 的长度调整成正确的值
语法:GETRANGE key start end
时间复杂度:O(N)
返回值:string类型的子串
127.0.0.1:6379> SET yidai \"i am yidai\"OK127.0.0.1:6379> GETRANGE yidayi 0 4\"\"127.0.0.1:6379> GETRANGE yidai 0 4\"i am \"127.0.0.1:6379> GETRANGE yidai 0 7\"i am yid\"127.0.0.1:6379> GETRANGE yidai 0 9\"i am yidai\"
SETRANGE
覆盖字符串的⼀部分,从指定的偏移开始
语法:SETRANGE key offset value
时间复杂度:O(N)
返回值:替换后string类型的长度
127.0.0.1:6379> SET key \"hello world\"OK127.0.0.1:6379> SETRANGE key 6 redis(integer) 11127.0.0.1:6379> GET key\"hello redis\"
STRLEN
获取 key 对应的 string 的⻓度。当 key 存放的类似不是 string 时,报错。
语法:STRLEN key
时间复杂度:O(1)
返回值:string 的长度。或者当 key 不存在时,返回 0。
127.0.0.1:6379> SET yidai yidaiOK127.0.0.1:6379> STRLEN yidia(integer) 0127.0.0.1:6379> STRLEN yidai(integer) 5