全局命令
查看所有键
keys *
keys命令的时间复杂度为O(n),因为keys命令会遍历所有键. 线上环境禁止使用
127.0.0.1:6379[2]> KEYS *
(empty list or set)
127.0.0.1:6379[2]> select 0
OK
127.0.0.1:6379> KEYS *
1) "k1"
2) "name"
3) "student:2019205242"
键总数
dbsize
dbsize命令的时间复杂度为O(1),因为可以直接获取redis内置的键总数
127.0.0.1:6379> DBSIZE
(integer) 3
检查建是否存在
exists key
127.0.0.1:6379> exists java
(integer) 0
127.0.0.1:6379> exists name
(integer) 1
删除键
del key [key ...]
del是一个通用命令,无论值是什么数据类型,都可以用del删除
127.0.0.1:6379> DEl java
(integer) 0
127.0.0.1:6379> del k1
(integer) 1
127.0.0.1:6379> keys *
1) "java"
2) "name"
3) "student:2019205242"
4) "go"
127.0.0.1:6379> del go java
(integer) 2
键过期
expire key seconds
对key添加过期时间
ttl key
返回键的剩余时间
127.0.0.1:6379> EXPIRE user::1 10
(integer) 0
127.0.0.1:6379> get user::1
(nil)
127.0.0.1:6379> ttl user::1
(integer) -2
127.0.0.1:6379> ttl name
(integer) -1
键的数据类型
type key
返回对外的数据类型
object encoding key
返回底层数据结构
127.0.0.1:6379> TYPE java
string
127.0.0.1:6379> OBJECT encoding java
"int"
键管理
单个键管理
1.键重命名
rename key newkey
renamenx key newkey
renamenx确保只有newkey不存在时才被覆盖
127.0.0.1:6379> rename name java
OK
127.0.0.1:6379> get java
"red"
127.0.0.1:6379> keys *
1) "java"
2) "name"
3) "student:2019205242"
4) "go"
127.0.0.1:6379> renamenx go java
(integer) 0
key与newkey相同时,不同版本redis返回的结果有差异
127.0.0.1:6379> renamenx go go
(error) ERR source and destination objects are the same
2.随机返回一个键
randomkey
127.0.0.1:6379> RANDOMKEY
"java"
127.0.0.1:6379> RANDOMKEY
"go"
3.键过期
expire key seconds | 键在seconds秒后过期 |
---|---|
pexpire key milliseconds | 键在milliseconds毫秒后过期 |
expireat key timestamp | 键在秒级时间戳timestamp后过期 |
pexpireat key milliseconds-timestamp | 键在秒级时间戳milliseconds-timestamp后过期 |
ttl key | 返回剩余时间单位秒 |
pttl key | 返回剩余时间单位毫秒 |
无论使用过期时间还是时间戳,秒级还是毫秒级,在redis内部最终使用的都是pexpireat
注意的点:
-
若expire key的键不存在,返回0
-
若设置过期时间为负值,键会立即被删除
-
persist
命令可以将过期时间清除127.0.0.1:6379> EXPIRE list1 50 (integer) 1 127.0.0.1:6379> pttl list1 (integer) 43934 127.0.0.1:6379> persist list1 (integer) 1 127.0.0.1:6379> pttl list1 (integer) -1
-
对于字符串类型,执行set命令会去掉过期时间
-
setex命令是set + expire的组合,不但是原子执行,同时减少了一次网络通讯的时间
4.迁移键
目的:我们只想把部分数据由一个redis迁移到另一个redis
-
move
move key db
127.0.0.1:6379> move list1 1 (integer) 1 127.0.0.1:6379> select 1 OK 127.0.0.1:6379[1]> keys * 1) "list1"
-
dump + restore
dump key
restore key ttl value
127.0.0.1:6379> lrange list1 0 -1 1) "1" 2) "2" 3) "3" 127.0.0.1:6379> dump list1 "\n\x11\x11\x00\x00\x00\x0e\x00\x00\x00\x03\x00\x00\xf2\x02\xf3\x02\xf4\xff\x06\x00Z1_\x1cg\x04!\x18" 127.0.0.1:6379> restore list2 0 "\n\x11\x11\x00\x00\x00\x0e\x00\x00\x00\x03\x00\x00\xf2\x02\xf3\x02\xf4\xff\x06\x00Z1_\x1cg\x04!\x18" OK
-
migrate
migrate host port key|"" destination-db timeout [copy] [replace] [keys key [key ...]]
这里我尝试向1号仓库迁移key, 结果之一阻塞直到超时,原因应该是migrate不能向同一个redis实例迁移数据,redis时单线程的
对比
遍历键
1.全量遍历键
keys pattern
通配符
- *代表匹配任意字符
- ?代表匹配一个字符
- []代表匹配部分字符
- \x用来做转义
127.0.0.1:6379> KEYS k?
1) "k2"
2) "k1"
3) "k3"
2.渐进式遍历
scan cursor [match pattern] [count number]
cursor: 游标,第一次遍历从0开始,每次scan遍历完都会返回当前游标的值,直到游标值为0,表示遍历结束
count number:表示每次遍历key的个数,默认是10
127.0.0.1:6379> scan 0
1) "0"
2) 1) "list2"
2) "java"
3) "k1"
4) "student:2019205242"
5) "k2"
6) "name"
7) "k3"
8) "hello"
9) "go"
数据库管理
1.切换数据库
select dbIndex
redis是用数字作为多个数据库的实现,redis默认配置中是有16个数据库
2.flushdb/flushall
flushdb
清除当前数据库
flushall
清除所有数据库