# Redis 入门到精通(二)通用指令

Redis 入门到精通(二)通用指令

一、redis 通用指令-key 基本操作

1、key 特征

key是一个字符串,通过key获取redis中保存的数据。

2、key 应该设计哪些操作?

对于 key 自身状态的相关操作,例如:删除,判定存在,获取类型等。

对于 key 有效性控制相关操作,例如:有效期设定,判定是否有效,有效状态的切换等。

对于 key 快速查询操作,例如:按指定策略查询 key。

...

3、key 基本操作

java 复制代码
# 删除指定key
del key

#获取key是否存在(返回1是存在此key值,返回0是不存在此key)
exists key 

# 获取key的类型
type key 

4、redis 实际操作--key 基本操作

java 复制代码
# 先创建5种类型的数据
127.0.0.1:6379> set str str
OK
127.0.0.1:6379> hset hash1 hash1 hash1
(integer) 1
127.0.0.1:6379> lpush list1 list1
(integer) 1
127.0.0.1:6379> sadd set1 set1
(integer) 1
127.0.0.1:6379> zadd zset1 1 zset1
(integer) 1

# 获取key的类型
127.0.0.1:6379> type zset1
zset
127.0.0.1:6379> type str
string
127.0.0.1:6379> type hash1
hash
127.0.0.1:6379> type list1
list
127.0.0.1:6379> type set1
set

# 删除指定key

127.0.0.1:6379> del zset1
(integer) 1
127.0.0.1:6379> del zset1
(integer) 0

# 获取key是否存在(返回1是存在此key值,返回0是不存在此key)
127.0.0.1:6379> exists str
(integer) 1
127.0.0.1:6379> exists zset1
(integer) 0
127.0.0.1:6379>

二、redis 通用指令--key 时效性控制操作

1、key 扩展操作(时效性控制)

java 复制代码
# 为指定key设置有效期
expire key seconds
pexpire key milliseconds
expireat key timestamp
pexpireat key milliseconds-timestamp

# 获取key的有效时间
ttl key
pttl key

# 切换key从时效性转换为永久性
persist key

2、redis 实际操作--key 时效性控制操作

java 复制代码
# 创建数据 
127.0.0.1:6379> set str str
OK
127.0.0.1:6379> lpush list1 list1
(integer) 2
127.0.0.1:6379> lpush list2 list2
(integer) 1

# 设置 str 时效3秒
127.0.0.1:6379> expire str 3
(integer) 1
127.0.0.1:6379> get str
"str"
127.0.0.1:6379> get str
(nil)

# 设置 list1 时效30秒
127.0.0.1:6379> expire list1 30
(integer) 1

# 获取 list1 的有效时间(返回-2代表不存在此key,返回-1代表此key还存在)
127.0.0.1:6379> ttl list1
(integer) 21
127.0.0.1:6379> ttl list1
(integer) 12
127.0.0.1:6379> ttl str
(integer) -2
127.0.0.1:6379> ttl list1
(integer) -2
127.0.0.1:6379> ttl list2
(integer) -1

# 持久化list2失败(因为list2不具备时效性)
127.0.0.1:6379> persist list2
(integer) 0

# 设置list2时效性为60秒)
127.0.0.1:6379> expire list2 60
(integer) 1

# 查看 list2 时效性
127.0.0.1:6379> ttl list2
(integer) 51

# 持久化list2成功
127.0.0.1:6379> persist list2
(integer) 1
127.0.0.1:6379> ttl list2
(integer) -1

# 切换 list2 的 key 从时效性转换为永久性,成功。
127.0.0.1:6379> persist str
(integer) 0

三、redis 通用指令--key 查询操作

1、key 扩展操作(查询模式)

java 复制代码
# 查询key
keys pattern

2、查询模式规则

java 复制代码
*	匹配任意数量的任意符号
? 	配合一个任意符号
[]	匹配一个指定符号
java 复制代码
keys *			查询所有。
keys it*		查询所有以it开头。
keys *heima		查询所有以heima结尾。
keys ??heima	查询所有前面两个字符任意,后面以heima结尾。
keys user:?		查询所有以user:开头,最后一个字符任意。
keys u[st]er:1	查询所有以u开头,以er:1结尾,中间包含一个字母,s或t。

3、redis 实际操作--key 扩展操作(查询模式)

java 复制代码
# 查询所有 
127.0.0.1:6379> keys *
1) "list2"
2) "hash1"
3) "set1"

# 创建数据 
127.0.0.1:6379> set name itheima
OK
127.0.0.1:6379> set itheima name
OK

# 查询所有 
127.0.0.1:6379> keys *
1) "list2"
2) "name"
3) "hash1"
4) "set1"
5) "itheima"

# 查询所有以it开头
127.0.0.1:6379> keys it*
1) "itheima"

# 查询所有以s开头
127.0.0.1:6379> keys s*
1) "set1"

# 创建数据 
127.0.0.1:6379> set str str
OK
127.0.0.1:6379> set smr smr
OK

# 查询i后面任意字符并以heima结尾的key
127.0.0.1:6379> keys i?heima
1) "itheima"

# 查询前面是s后面是r,中间是任意字符的key
127.0.0.1:6379> keys s?r
1) "str"
2) "smr"

# 查询有4个任意字符的key
127.0.0.1:6379> keys ????
1) "name"
2) "set1"

# 创建数据 
127.0.0.1:6379> set nbme nbme
OK
127.0.0.1:6379> set nwme nwme
OK

# 查询所有以n开头,以me结尾,中间包含一个字母,a或w,的key
127.0.0.1:6379> keys n[aw]me
1) "name"
2) "nwme"
127.0.0.1:6379> keys *
1) "str"
2) "hash1"
3) "name"
4) "list2"
5) "nbme"
6) "nwme"
7) "smr"
8) "set1"
9) "itheima"
127.0.0.1:6379>

四、redis 通用指令--key 其他操作

1、key 其他操作

java 复制代码
# 为key改名
rename key newkey
renamenx key newkey

# 对所有key排序
sort

# 其他key通用操作
help @generic

2、redis 实际操作--key 其他操作

java 复制代码
# 创建数据 
127.0.0.1:6379> set str str
OK
127.0.0.1:6379> set str1 str1
OK
127.0.0.1:6379> set str2 str2
OK

# 修改 str 为 str3 
127.0.0.1:6379> rename str str3

# 查询所有 key 
127.0.0.1:6379> keys *
1) "str3"
2) "str2"
3) "str1"

# 获取 str 的 value (不存在,key为空)
127.0.0.1:6379> get str
(nil)

# 修改 str3 为 str2(原有str2将覆盖)
127.0.0.1:6379> rename str3 str2
OK

# 只有2个key(原来的 str2 已经不存在了)
127.0.0.1:6379> keys *
1) "str2"
2) "str1"

# 获取str2的value发现是str(而不是str2)
127.0.0.1:6379> get str2
"str"


# 使用 renamenx 修改 key 名,不会覆盖修改,如果key存在修改失败(返回0),key不存在修改成功(返回1)。
127.0.0.1:6379> renamenx str1 str2
(integer) 0
127.0.0.1:6379> renamenx str1 str3
(integer) 1

127.0.0.1:6379> keys *
1) "str3"
2) "str2"
127.0.0.1:6379>

3、redis 实际操作--key 其他操作:排序

java 复制代码
# 查询排序帮助
127.0.0.1:6379> help sort

  SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern ...]] [AS
C|DESC] [ALPHA] [STORE destination]
  summary: Sort the elements in a list, set or sorted set
  since: 1.0.0
  group: generic

# 查询其他key通用操作
127.0.0.1:6379> help @generic

# 创建数据 
127.0.0.1:6379> lpush aa 123
(integer) 1
127.0.0.1:6379> lpush aa 321
(integer) 2
127.0.0.1:6379> lpush aa 222
(integer) 3
127.0.0.1:6379> lrange aa 0 -1
1) "222"
2) "321"
3) "123"

# 排序(从小到大),不改变原数据
127.0.0.1:6379> sort aa
1) "123"
2) "222"
3) "321"

# 查看原数据
127.0.0.1:6379> lrange aa 0 -1
1) "222"
2) "321"
3) "123"

# 排序(从大到小),不改变原数据
127.0.0.1:6379> sort aa desc
1) "321"
2) "222"
3) "123"

# 查看原数据
127.0.0.1:6379> lrange aa 0 -1
1) "222"
2) "321"
3) "123"
127.0.0.1:6379>

五、redis 通用指令--db 基本操作

1、数据库 key 的重复问题

  • key 是由程序员定义的。
  • redis 在使用过程中,伴随着操作数据量的增加,会出现大量的数据以及对应的 key。
  • 数据不区分种类、类别混杂在一起,极易出现重复或冲突。

2、解决方案

  • redis 为每个服务提供有16个数据库,编号从0到15。
  • 每个数据库之间的数据相互独立。

3、db 基本操作

java 复制代码
# 切换数据库
select index

# 其他操作
quit
ping
echo message

4、redis 实际操作--db 基本操作

java 复制代码
# 切换数据库(0-15)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> select 5
OK
127.0.0.1:6379[5]> select 8
OK
127.0.0.1:6379[8]> select 15
OK
127.0.0.1:6379[15]> select 20
(error) ERR invalid DB index
127.0.0.1:6379> select 0
OK
127.0.0.1:6379>

# echo 回显字符
127.0.0.1:6379> echo redis
"redis"
127.0.0.1:6379> echo abc
"abc"
127.0.0.1:6379> echo 123

# ping 服务器是否处于连通状态(连通时回显字符,无连通将等待无回显)
127.0.0.1:6379> ping aaa
"aaa"
127.0.0.1:6379> ping bbb
"bbb"

# 断开服务端后,客户端一直处于等待状态,需要重新启动redis服务端,连接客户端
127.0.0.1:6379> ping ccc
......

# 退出客户端 
127.0.0.1:6379> quit

六、redis 通用指令--db 其他操作

1、db 其他操作:数据移动 move key db 和数据清除操作。

java 复制代码
# redis db 数据库相关操作:数据移动 
move key db

# 数据清除
dbsize
flushdb
flushall

2、redis 实际操作--db 其他操作:数据移动 move key db

java 复制代码
# 创建数据(在库0) 
27.0.0.1:6379> set name redis1
K

# 切换到库1
27.0.0.1:6379> select 1
K

# 获取 name 值(库1无name) 
27.0.0.1:6379[1]> get name
nil)

# 切换到库0
27.0.0.1:6379[1]> select 0
K

# 获取 name 值(库0中有name) 
27.0.0.1:6379> get name
redis1"

# (在库0中操作)redis db 数据库相关操作:数据移动(移动 name 到库1)
27.0.0.1:6379> move name 1
integer) 1

# 切换到库1
27.0.0.1:6379> select 1
K

# 获取 name 值(库1已经有name,相当于从库0剪切到库1) 
27.0.0.1:6379[1]> get name
redis1"

# 切换到库0
27.0.0.1:6379[1]> select 0
K

# 库0中已经没有地name
27.0.0.1:6379> get name
nil)

# 移动库0中name到库2,操作失败(因为库0中已经没有name)
27.0.0.1:6379> move name 2
integer) 0

# 在库0中重新创建name值为redis2
27.0.0.1:6379> set name redis2
K

# 再次在库0中,移动name到库1,操作失败(因为库1中也有name)
27.0.0.1:6379> move name 1
integer) 0
27.0.0.1:6379>

3、redis 实际操作--db 其他操作:数据清除操作

java 复制代码
# 在库0显示所有key
127.0.0.1:6379> keys *
1) "str2"
2) "str3"
3) "name"
4) "aa"

# 切换到库1,显示所有key
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
1) "name"

# 切换到库2,显示所有key
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> keys *
(empty list or set)

# 在库2,创建name
127.0.0.1:6379[2]> set name haha
OK
127.0.0.1:6379[2]> keys *
1) "name"

# 在库2,清库(只清除了库2中所有数据)
127.0.0.1:6379[2]> flushdb
OK
127.0.0.1:6379[2]> keys *
(empty list or set)
127.0.0.1:6379[2]> select 1
OK
127.0.0.1:6379[1]> keys *
1) "name"
127.0.0.1:6379[1]> select 0
OK
127.0.0.1:6379> keys *
1) "str2"
2) "str3"
3) "name"
4) "aa"

# 在库0,清库(flushall清除了所有库中所有数据,慎用,一般不用)
127.0.0.1:6379> flushall
OK
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> select 1
OK
127.0.0.1:6379[1]> keys *
(empty list or set)
127.0.0.1:6379[1]> select 2
OK
127.0.0.1:6379[2]> keys *
(empty list or set)
127.0.0.1:6379[2]>

# 统计当前库中有多少key
127.0.0.1:6379[2]> dbsize
(integer) 0
127.0.0.1:6379[2]> set name abc
OK
127.0.0.1:6379[2]> dbsize
(integer) 1
127.0.0.1:6379[2]> set name2 abc2
OK
127.0.0.1:6379[2]> dbsize
(integer) 2
127.0.0.1:6379[2]> set name3 abc3
OK
127.0.0.1:6379[2]> dbsize
(integer) 3
127.0.0.1:6379[2]>

上一节关联链接请点击:
# Redis 入门到精通(一)数据类型(4)

相关推荐
iVictor19 分钟前
Redis 大 Key 分析利器:支持 TOP N、批量分析与从节点优先
redis
夜泉_ly2 小时前
MySQL -安装与初识
数据库·mysql
qq_529835353 小时前
对计算机中缓存的理解和使用Redis作为缓存
数据库·redis·缓存
月光水岸New6 小时前
Ubuntu 中建的mysql数据库使用Navicat for MySQL连接不上
数据库·mysql·ubuntu
狄加山6756 小时前
数据库基础1
数据库
我爱松子鱼6 小时前
mysql之规则优化器RBO
数据库·mysql
chengooooooo6 小时前
苍穹外卖day8 地址上传 用户下单 订单支付
java·服务器·数据库
Rverdoser7 小时前
【SQL】多表查询案例
数据库·sql
Galeoto7 小时前
how to export a table in sqlite, and import into another
数据库·sqlite
希忘auto8 小时前
详解Redis在Centos上的安装
redis·centos