Lecture02-Redis-通用命令与键管理

文章目录

    [toc]

    单词词性音标含义
    existsv./ɪɡˈzɪsts/存在(EXISTS key 判断键是否存在,1=存在,0=不存在)
    unlinkv./ˌʌnˈlɪŋk/解除链接(UNLINK key 异步删除,不阻塞主线程,适合删大键)
    expirev./ɪkˈspaɪə(r)/过期(EXPIRE key 秒数 为键设置过期时间)
    ttln./ˌtiː tiː ˈel/剩余生存时间(TTL key 返回剩余秒数,-1 永不过期,-2 已过期)
    patternn./ˈpætn/模式(KEYS pattern 支持 * 匹配多个、? 匹配单个字符)
    evictionn./ɪˈvɪkʃn/驱逐(内存超限时删除键释放内存的行为)
    scanv./n./skæn/扫描(SCAN 游标式遍历键,避免 KEYS 阻塞)

    Lecture02-Redis-通用命令与键管理

    1、数据库(DB)操作

    Redis 默认有 16 个逻辑数据库(配置项 databases 16),相当于 16 个独立的 Map<String, value> 空间,索引从 0 到 15。

    理解:16 个库共享一份数据文件/内存,只是逻辑上隔离,不用于多租户隔离(生产一般只用 0 号库,库号更多用于教学分隔)。


    1、切换数据库

    127.0.0.1:6379> select 2
    OK
    127.0.0.1:6379[2]> select 0
    OK
    127.0.0.1:6379>
    

    2、查看当前库键的数量

    127.0.0.1:6379> dbsize
    (integer) 3
    

    3、清空当前库【危险】

    127.0.0.1:6379> flushdb
    

    4、清空所有库【危险】

    127.0.0.1:6379> flushall
    

    提示:flushall 也会触发一次 RDB 持久化,生成一个空的 dump.rdb(第 9 讲说明)。


    2、Key 操作

    1、Key 命名规范

    • 见名知意:user:token:session:xxx。
    • 同一项目统一规范,多单词用 : 分隔(这是 Redis 社区惯例,方便按前缀分组)。
    • Key 区分大小写,命令不区分大小写。
    • Key 不宜过长(超过 1024 字节会消耗过多内存、降低查询效率)。

    2、命令列表

    语法功能说明
    keys pattern按 pattern 查看键。* 匹配多个字符,? 匹配单个字符。
    ⚠️ 生产禁用:会阻塞主线程
    exists key [key ...]判断键是否存在,返回存在个数
    type key查看键对应 value 的类型
    del key [key ...]同步删除键,客户端要等删除完才返回
    unlink key [key ...]异步删除,先删元数据、真正删除后台执行,删大键不阻塞
    expire key 秒数为键设置过期时间(单位秒)
    ttl key查看剩余过期时间:-1 永不过期,-2 已过期
    persist key取消键的过期时间,转为永久
    rename old new重命名键
    scan cursor [MATCH p]游标式遍历键,不阻塞(生产替代 keys)

    3、操作演示

    # 批量造几个键
    127.0.0.1:6379> mset name tom age 20 city shenzhen
    OK
    
    # 按模式查键
    127.0.0.1:6379> keys *
    1) "age"
    2) "city"
    3) "name"
    127.0.0.1:6379> keys n*
    1) "name"
    
    # 判断存在
    127.0.0.1:6379> exists name
    (integer) 1
    127.0.0.1:6379> exists name age xyz
    (integer) 2
    
    # 查看类型
    127.0.0.1:6379> type name
    string
    
    # 设置过期时间
    127.0.0.1:6379> expire name 60
    (integer) 1
    127.0.0.1:6379> ttl name
    (integer) 59
    127.0.0.1:6379> ttl notexist
    (integer) -2
    
    # 异步删除
    127.0.0.1:6379> unlink city
    (integer) 1
    

    3、过期机制(TTL)与淘汰策略

    1、过期时间的作用

    给键设置过期时间,到期后 Redis 自动删除。典型应用:

    • 验证码:SET verify:code 123456 EX 120(2 分钟有效)
    • 登录 Token:SET token:xxx <值> EX 7200(2 小时有效)
    • 限流计数器、临时标记等

    2、设置过期的几种写法

    # 方式一:set 时带 EX 参数
    127.0.0.1:6379> set verify:code 123456 ex 120
    OK
    127.0.0.1:6379> ttl verify:code
    (integer) 118
    
    # 方式二:单独 expire
    127.0.0.1:6379> set token:abc "value" 
    OK
    127.0.0.1:6379> expire token:abc 7200
    (integer) 1
    
    # 方式三:毫秒级 PEXPIRE / SET PX
    127.0.0.1:6379> pttl verify:code
    (integer) 107000
    

    3、过期键如何被删除(够用版)

    Redis 对过期键采用主动 + 被动两种方式回收:

    expire-mechanism

    机制说明
    惰性删除(被动)访问到已过期键时,先删除再返回空,懒到"用到才删"
    定期删除(主动)后台每 100ms 抽样删除一批已过期键,避免过期键堆积占用内存

    记忆口诀:"用到才删 + 后台定时抽删"。但这两种都可能让键"稍晚一点才消失",所以不要依赖 TTL 精确到毫秒。


    4、内存淘汰(Maxmemory)

    当内存写满(配置 maxmemory)时,按 maxmemory-policy 决定删除哪些键。第 12 讲会详细展开 8 种策略,这里先记住最常见的:

    maxmemory-policy allkeys-lru   # 淘汰"最近最少使用"的键(缓存首选)
    

    4、生产注意:不要用 KEYS

    KEYS * 会遍历全部键并阻塞主线程,生产环境数据量大时会卡死服务。替代方案用 SCAN:

    # 游标式分批扫描,不阻塞
    127.0.0.1:6379> scan 0 match user:* count 100
    1) "1536"          # 下次游标位置,返回 0 表示遍历结束
    2) 1) "user:1"
       2) "user:2"
    

    运维排查用 SCAN,业务代码里不要用 KEYS。


    5、本讲小结

    • Redis 默认 16 个库,select 切换,生产一般只用 0 号库。
    • Key 操作重点是:exists / type / del / unlink / expire / ttl。
    • TTL 过期 = 惰性删除 + 定期删除,别依赖精确过期时间。
    • 生产禁用 KEYS,用 SCAN。

    6、课堂练习

    1. 在 0 号库设置 5 个键(含 user:1 ~ user:3),用 keys user:* 查看。
    2. 给 user:1 设置 30 秒过期,观察 ttl 变化,等过期后用 exists 确认已删。
    3. 用 unlink 删除一个大键(先 set bigkey 一个大字符串),观察与 del 的返回差异。
    4. 用 scan 0 match user:* count 100 遍历出所有 user:* 键。

    7、本节验证

    • 会切换数据库、查看当前库键数量、清空库 ✅
    • 掌握 key 常用命令(exists/type/unlink/expire/ttl)与命名规范 ✅
    • 理解 TTL 语义(-1 永不过期、-2 已过期)与过期键删除机制(够用版)✅
    • 知道生产禁用 KEYS,改用 SCAN 游标分批遍历 ✅
    end