Redis的一些基本命令和使用方法


Redis是一个开源的内存数据结构存储系统,支持多种数据结构(如字符串、哈希、列表、集合、有序集合等),常用于缓存、消息队列、排行榜等场景。以下是Redis的基本命令和使用方法:

一、连接Redis服务器

可以使用redis-cli命令连接Redis服务器,如:

redis-cli -h host -p port -a password

其中,host为Redis服务器主机名或IP地址,port为Redis服务器端口号,password为Redis服务器密码(如果设置了的话)。
在这里插入图片描述

二、操作数据

基本操作

# 使用SET命令存储数据,如:
SET key value
# 其中,key为数据的键名,value为数据的值。

# 使用GET命令获取数据,如:
GET key
# 其中,key为数据的键名。

# 使用DEL命令删除数据,如:
DEL key
# 其中,key为数据的键名。包括以下后面的高阶命令,删除都是用这个

# 使用EXPIRE命令设置数据的过期时间,如:
EXPIRE key seconds
# 其中,key为数据的键名,seconds为数据的过期时间(单位为秒)。

# 使用EXISTS命令判断数据是否存在,如:
EXISTS key
# 其中,key为数据的键名。

示例:

127.0.0.1:6379> set lzq lzqValue
OK
127.0.0.1:6379> get lzq
"lzqValue"
127.0.0.1:6379> get l
(nil)
127.0.0.1:6379> set x y
OK
127.0.0.1:6379> get x
"y"
127.0.0.1:6379> del x
(integer) 1
127.0.0.1:6379> get x
(nil)
127.0.0.1:6379> expire lzq 10
(integer) 1
127.0.0.1:6379> get lzq
"lzqValue"
127.0.0.1:6379> exists lzq
(integer) 0
127.0.0.1:6379> get lzq
(nil)
127.0.0.1:6379> set lzq lzqValue
OK
127.0.0.1:6379> exists lzq
(integer) 1
127.0.0.1:6379>

高阶操作

# 使用HSET命令存储哈希数据,如:
HSET key field value
# 其中,key为哈希的键名,field为哈希的域名,value为哈希的值。
# 这里为什么要有一个域,后面有解析,简单来说就是:如果没有域的概念,那么哈希表中的每个键值对就只能通过键来区分,这样就无法存储多个键相同但值不同的数据了

# 使用HGET命令获取哈希数据,如:
HGET key field
# 其中,key为哈希的键名,field为哈希的域名。

# 使用列表(list),使用LPUSH命令将值推入列表的左侧,如:
LPUSH key value
# 其中,key为列表的键名,value为列表的值。

# 使用LRANGE命令获取列表的值,如:
LRANGE key start stop
# 其中,key为列表的键名,start为起始下标,stop为结束下标。

# 使用集合(set),使用SADD命令将值添加到集合中,如:
SADD key member
# 其中,key为集合的键名,member为集合的成员。

# 使用SMEMBERS命令获取集合的所有成员,如:
SMEMBERS key
# 其中,key为集合的键名。

# 使用有序集合(sorted set),使用ZADD命令将值添加到有序集合中,如:
ZADD key score member
# 其中,key为有序集合的键名,score为成员的分值,member为成员。

# 使用ZRANGE命令获取有序集合的成员,如:
ZRANGE key start stop [WITHSCORES]
#其中,key为有序集合的键名,start为起始下标,stop为结束下标,WITHSCORES为可选参数,表示是否返回成员的分值。

1 关于Hset命令中为什么要有一个域:
为什么要有一个域呢?这是因为在哈希表中,每个键值对都需要有一个唯一的键(即域),用于区分不同的数据。如果没有域的概念,那么哈希表中的每个键值对就只能通过键来区分,这样就无法存储多个键相同但值不同的数据了。
举个例子,假设我们要存储一些人的信息,如姓名、年龄、性别等。如果不使用哈希表,我们可能会用类似以下格式的键值对来存储每个人的信息:

name1:张三
age1:20
gender1:男
name2:李四
age2:25
gender2:女

这样虽然可以存储每个人的信息,但键名过长且不易读,也不利于后续的数据处理。而使用哈希表,则可以将每个人的信息存储在一个哈希表中,如下所示:

HSET person1 name 张三
HSET person1 age 20
HSET person1 gender 男
HSET person2 name 李四
HSET person2 age 25
HSET person2 gender 女

这样就可以通过一个唯一的键(person1或person2)来区分不同的人,每个人的姓名、年龄、性别则通过不同的域来存储。这种方式更加简洁、易读,也便于后续的数据处理。

127.0.0.1:6379> hset lzq name lzq
(integer) 1
127.0.0.1:6379> hset lzq age 25
(integer) 1
127.0.0.1:6379> hget lzq
(error) ERR wrong number of arguments for 'hget' command
127.0.0.1:6379> hget lzq name
"lzq"
127.0.0.1:6379> hget lzq age
"25"
127.0.0.1:6379>
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lpush list 2
(integer) 2
127.0.0.1:6379> lpush list 3
(integer) 3
127.0.0.1:6379> lrange list 0,-1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange list 0 -1
1) "3"
2) "2"
3) "1"
127.0.0.1:6379> lrange list -2,-1
(error) ERR wrong number of arguments for 'lrange' command
127.0.0.1:6379> lrange list -2 -1
1) "2"
2) "1"
127.0.0.1:6379>
127.0.0.1:6379> sadd set 1
(integer) 1
127.0.0.1:6379> smembers set
1) "1"
127.0.0.1:6379> sadd set 2
(integer) 1
127.0.0.1:6379> smembers set
1) "1"
2) "2"
127.0.0.1:6379> sadd set 1
(integer) 0
127.0.0.1:6379> smembers set
1) "1"
2) "2"
127.0.0.1:6379>
127.0.0.1:6379> zadd sortedSet 10 lzq
(integer) 1
127.0.0.1:6379> zadd sortedSet 20 lzq1
(integer) 1
127.0.0.1:6379> zrange sortedSet 0 -1
1) "lzq"
2) "lzq1"
127.0.0.1:6379>

三、统计key的

# 统计所有的key
KEYS *

# 查看以"mykey"开头的所有key
KEYS mykey*

# 查看以"mykey"结尾的所有key
KEYS *mykey

# 需要注意的是,KEYS命令会枚举Redis中的所有key,如果数据量较大,
# 会对Redis的性能产生影响。因此,应该尽量避免在生产环境中使用KEYS命令。
# 在生产环境中,可以考虑使用SCAN命令来逐步迭代所有的key

# scan用法如下
# 迭代遍历所有key
SCAN 0
# 上面的命令从游标0开始迭代遍历所有key,返回的结果包括下一个游标和符合条件的key列表。
# 如果下一个游标为0,则表示遍历完成。

# 迭代遍历以"mykey"开头的key
SCAN 0 MATCH mykey*
# 上面的命令从游标0开始迭代遍历所有以"mykey"开头的key,
# 返回的结果包括下一个游标和符合条件的key列表。如果下一个游标为0,则表示遍历完成。

# 迭代遍历所有key,每次返回10个key
SCAN 0 COUNT 10
# 上面的命令从游标0开始迭代遍历所有key,每次返回10个key,返回的结果包括
# 下一个游标和符合条件的key列表。如果下一个游标为0,则表示遍历完成。
# 需要注意的是,由于SCAN命令是迭代遍历所有key,因此在遍历过程中如果有
# 新key被添加或删除,则有可能会遍历到重复的key或者遗漏某些key。因此,
# 在使用SCAN命令时应该结合业务场景进行合理的处理,确保数据的完整性。