redis基础----通用命令
1.redis特性
Redis 作为一款高性能的内存数据库
1.高性能
内存存储为主:数据主要存于内存,规避磁盘 I/O 延迟,读写速度极快,单机可轻松支撑每秒数十万次操作。
• 高效 I/O 处理:采用 I/O 多路复用模型(如 epoll、kqueue 等),能同时高效处理大量客户端连接,在高并发场景下表现稳定。
• 单线程核心:核心操作由单线程执行,避免多线程切换的开销和锁竞争问题,同时保证了操作的原子性(无需担心并发修改导致的数据不一致)。2.支持多种数据结构
- 持久化机制:
- RDB(快照):在指定时间间隔生成内存数据的二进制快照,适合备份和灾难恢复(恢复速度快,但可能丢失最近数据)。
- AOF(Append Only File):记录所有写操作到日志文件,重启时重新执行日志恢复数据(数据安全性更高,可配置每秒或每次操作同步)。
- 支持 RDB+AOF 混合持久化,兼顾两者优势。
- 过期键管理:通过惰性删除(访问时检查过期)+定期删除(周期性扫描部分过期键)结合,高效释放过期内存。
- 内存淘汰策略:当内存达到上限(
maxmemory
),自动按策略淘汰数据,如 LRU(最近最少使用)、LFU(最不经常使用)、随机淘汰等,保障服务持续运行。- 主从复制(Master-Slave):从节点异步复制主节点数据,实现读写分离(主节点写,从节点读),提升读吞吐量,同时从节点可作为主节点的备份。
- 哨兵(Sentinel):监控主从集群状态,当主节点故障时自动执行故障转移(将从节点升级为主节点),保证服务高可用,支持多哨兵部署以避免单点问题。
- 集群(Cluster):
- 数据分片存储:将数据按哈希槽(16384 个)分配到多个节点,实现水平扩展(突破单机内存和性能限制)。
- 自动故障转移:节点故障时,集群自动检测并调整分片分布,保证服务可用性。
- 跨节点操作支持:通过
HASHSLOT
机制实现多键操作(需指定相同哈希槽)。
2.通用命令
2.1连接redis本地服务器
无密码:
redis-cli
有密码:
# 语法:redis-cli -h 主机地址 -p 端口 -a 密码
redis-cli -h 192.168.1.100 -p 6380 -a your_password
redis的配置文件
2.2测试客户端和服务器是否连接正常
使用 redis-cli连接redis服务器后,使用ping命令,出现PONG则连接正常
2.2 get和set
get:
- 键存在时返回对应的值(字符串形式)
- 键不存在时返回
(nil)
- 键存在但不是字符串类型时,返回错误(
WRONGTYPE Operation against a key holding the wrong kind of value
)
set:
为指定键(key)设置对应的值(value),如果键已存在则覆盖原有值。
2.3keys
KEYS
是 Redis 中用于查找符合指定模式(pattern)的所有键的命令,在日常开发和调试中经常用于快速定位键,但在生产环境需谨慎使用。1. 基本语法
redis
KEYS pattern
pattern
:匹配模式,支持通配符,常用规则:
*
:匹配任意多个字符(包括 0 个),例如user:*
匹配所有以user:
开头的键?
:匹配单个字符,例如id:?
匹配id:1
、id:a
等(但不匹配id:12
)[abc]
:匹配a
、b
、c
中的任意一个字符,例如name:[xy]
匹配name:x
、name:y
[^abc]
:匹配除a
、b
、c
之外的任意字符[a-z]
:匹配a
到z
之间的任意字符(范围匹配)2. 返回值
- 一个列表,包含所有符合模式的键名(字符串形式)
- 若没有匹配的键,返回空列表
(empty list or set)
注意:keys*谨慎使用,KEYS
命令会遍历 Redis 中的所有键,在数据量大(如百万级以上)的情况下,会阻塞服务器进程,导致其他请求超时。生产环境严禁使用,尤其是高峰期。
2.4exists
exists 是 Redis 中用于检查一个或多个键(key)是否存在的命令,在日常开发中常用于判断数据是否存在,避免对不存在的键进行无效操作。
2. 返回值
- 整数类型,表示存在的键的数量:
0
:所有指定的键都不存在;1
:只有一个键存在;N
(N>1):指定的多个键中有 N 个存在。
高效性:exists 命令是 O (1) 时间复杂度,无论数据量多大,检查速度都很快。
• 原子性:同时检查多个键时,命令是原子执行的,不会受到其他操作的干扰。
• 常见场景:
◦ 判断键是否存在,避免对不存在的键执行 get 等无效操作;
◦ 批量验证多个键的存在性(如检查一批用户 ID 是否在缓存中);
◦ 结合其他命令实现业务逻辑(如先判断键存在再删除,if (exists key) then del key)。
2.5del
DEL
是 Redis 中用于删除一个或多个键(key)及其对应值的命令,是数据管理中常用的删除操作命令。
返回值:
- 整数类型,表示成功删除的键的数量:
0
:所有指定的键都不存在(未删除任何键);N
(N>0):成功删除了 N 个存在的键。
- 高效性:
DEL
命令的时间复杂度为 O (N),其中 N 是被删除的键的数量(单个键删除时为 O (1)),执行速度快。- 原子性:删除多个键时,命令原子执行,要么全部删除成功,要么因错误(如中途断连)导致部分未删除,不会出现 “半删除” 状态。
- 彻底性:删除键后,键及其对应的值(无论值的类型是字符串、哈希、列表等)会被完全从内存中移除,释放占用的空间。
- 常见场景:
- 主动清理过期或无用的数据(如缓存失效时删除旧数据);
- 批量删除特定前缀的键(结合
KEYS
或SCAN
查找后删除,如DEL $(redis-cli KEYS "user:tmp:*")
);- 业务逻辑中需要删除数据(如用户注销时删除其相关缓存)。
5. 注意事项
- 删除大键的风险:如果删除的键对应的值非常大(如包含百万级元素的列表或集合),
DEL
命令可能会阻塞 Redis 服务器一段时间(因为需要释放大量内存),影响其他请求。此时建议:
- 用
UNLINK
命令替代(非阻塞删除,Redis 会在后台异步删除大键,不阻塞主线程);- 避免在高峰期删除超大键。
- 集群环境:如果删除的键分布在 Redis 集群的不同节点,
DEL
会在所有相关节点执行删除操作,并返回总删除数量。- 不可恢复:
DEL
命令删除的键无法通过 Redis 自身机制恢复,需谨慎操作(重要数据建议先备份)。
2.6expire
EXPIRE 是 Redis 中用于为键(key)设置过期时间的命令,过期后键会被自动删除,常用于管理临时数据(如验证码、会话信息等),避免手动清理过期数据的麻烦。
EXPIRE key seconds#key:要设置过期时间的键名;
#seconds:过期时间(单位:秒),必须是正整数。
- 自动清理:键过期后会被 Redis 自动删除,无需手动干预,节省内存。
- 覆盖性:如果对已设置过期时间的键再次执行
EXPIRE
,会覆盖原有的过期时间(更新为新的秒数)。- 修改键值会重置过期时间:如果用
SET
等命令修改了键的值,过期时间会被清除(键变为持久化)。
pexpire:
PEXPIRE key milliseconds:与 EXPIRE 功能相同,但过期时间单位为毫秒(更精确)。
PERSIST key:移除键的过期时间(将临时键转为持久化键)。
2.7ttl
TTL 是 Redis 中用于查询键(key)剩余过期时间的命令,全称为 "Time To Live",常与 EXPIRE 等设置过期时间的命令配合使用,用于了解键的存活状态。
TTL key
返回值:
- 整数类型,有三种可能的结果:
- 正数:键存在且有过期时间,返回剩余的秒数;
-1
:键存在,但没有设置过期时间(持久化键);-2
:键不存在(或已过期被删除)。
2.8key的过期策略
当为键设置过期时间(如 EXPIRE
命令),Redis 会将键的过期时间单独存储在一个 “过期字典”(本质是哈希表)中,记录键与过期时间的映射,而非直接修改键的值。
核心过期策略:
1. 惰性删除(Lazy Expiration)
- 原理:不主动删除过期键,而是在每次访问键时才检查是否过期。若过期则删除并返回
nil
,否则正常返回值。- 优点:节省 CPU 资源,只在必要时才执行删除操作,不影响其他操作。
- 缺点:可能浪费内存。如果过期键长期未被访问,会一直占用内存(如 “僵尸键”)。
2. 定期删除(Periodic Expiration)
- 原理:Redis 每隔一段时间(默认 100 毫秒,可配置)主动扫描部分过期键并删除。具体流程:
- 从过期字典中随机抽取一定数量(默认 20 个)的键;
- 删除其中已过期的键;
- 如果过期键比例超过 25%,重复步骤 1(避免大量过期键堆积);
- 每次扫描不超过指定时间(默认 25 毫秒),防止阻塞服务器。
- 优点:主动清理部分过期键,减少 “僵尸键”,平衡内存和 CPU 消耗。
- 缺点:可能漏删部分过期键(因随机抽样),但概率较低。
3. 内存淘汰机制(Maxmemory Eviction)
- 原理:当 Redis 内存使用达到
maxmemory
配置的上限时,触发内存淘汰策略,删除部分键(无论是否过期)释放空间。- 常见策略(通过
maxmemory-policy
配置):
allkeys-lru
:删除所有键中最近最少使用的键;volatile-lru
:只删除设置了过期时间且最近最少使用的键;allkeys-random
:随机删除所有键中的键;volatile-random
:随机删除设置了过期时间的键;volatile-ttl
:删除设置了过期时间且剩余时间最短的键;noeviction
:不删除任何键,返回错误(默认策略)。- 适用场景:内存有限时,确保 Redis 不会因内存耗尽而崩溃。
2.9 type
TYPE
是 Redis 中用于查询指定键(key)所存储值的数据类型的命令,Redis 支持多种数据类型(如字符串、哈希、列表等),该命令可以帮助开发者了解键的类型,以便使用对应的操作命令。
注意:
TYPE
命令只返回最上层的数据类型,对于嵌套结构(如列表中包含字符串),仍返回外层类型(如list
)。- 若键已过期但未被删除(受过期策略影响),
TYPE
仍会返回其类型(因为键在物理上仍存在),但GET
等命令会返回nil
。