Redis基础认知(先了解是什么,为什么用)
- Redis是什么 :开源、高性能的内存键值(Key-Value)数据库 ,也常作为缓存 、分布式存储工具。特点:速度极快(内存操作)、支持丰富数据结构、单线程但高并发友好。
- 为什么项目要用Redis :缓解数据库压力(热点数据缓存)、实现分布式功能(锁、会话、限流)、实时统计等。典型项目中,Redis不是主数据库,而是辅助层。
- 核心优势:亚毫秒级响应、持久化支持(RDB/AOF)、主从/哨兵/集群高可用。
常用数据类型与命令(用redis-cli练习)
- String (字符串,最常用):
SET key value、GET key、INCR key(计数器)、EXPIRE key 60(设置过期)。 - Hash (对象/哈希):
HSET user:1 name "saiya" age 20、HGETALL user:1(适合存用户信息)。 - List (列表):
LPUSH listkey item、LRANGE listkey 0 -1(消息队列、最新列表)。 - Set (集合):
SADD setkey member、SMEMBERS setkey(去重、标签)。 - Sorted Set (ZSet) (有序集合):
ZADD rank 100 user1、ZRANGE rank 0 9(排行榜)。
在线Redis模拟网站
Sandbox
特点:
- 官方出品,完全免费,无需注册、无需配置。
- 交互式命令行界面,和真实redis-cli几乎一样。
- 支持所有常用Redis命令和数据类型(String、Hash、List、Set、Sorted Set等)。
- 隔离环境,数据不会持久化,适合练习和实验。
但是 Redis Sandbox(https://redis.io/try/sandbox/)有安全限制:
Sandbox 要求所有 Key 必须添加前缀 pg:(pg: 是 playground 的缩写),否则会直接拒绝执行,提示 "Command keys without prefix are not allowed!"。
这是官方为了防止不同用户互相干扰、保护共享环境而设计的规则。
示例:
SET pg:name 'saiya'
GET pg:name
-
String 类型练习:
SET pg:username 'ssaiya'
GET pg:username
SET pg:counter 100
INCR pg:counter
EXPIRE pg:username 60 // 60秒后过期
TTL pg:username -
Hash 类型:
HSET pg:user:1 name 'saiy' age 20 city 'Singapore'
HGETALL pg:user:1
HGET pg:user:1 name
HINCRBY pg:user:1 age 1 -
List 类型:
LPUSH pg:mylist 'item1' 'item2'
RPUSH pg:mylist 'item3'
LRANGE pg:mylist 0 -1
LPOP pg:mylist -
Set 类型:
SADD pg:myset 'apple' 'banana' 'orange'
SMEMBERS pg:myset -
Sorted Set(排行榜):
ZADD pg:ranking 100 'user1' 85 'user2' 95 'user3'
ZRANGE pg:ranking 0 2 WITHSCORES -
查看所有自己的key:
KEYS pg:*
-
删除:
DEL pg:username
-
清空当前会话的所有key(小心使用):
FLUSHDB
其他
这个 Sandbox 对新手有点不友好,可以换一个不需要加 pg: 的在线练习网站:
https://rapidtoolset.com/en/tool/redis-playground
命令
初始化和通用命令
PING
含义:发送一个简单的 ping 请求,测试 Redis 服务器是否正常运行。
预期输出:PONG
INFO server
含义:返回 Redis 服务器的基本信息(如版本、运行时间、内存使用等)。
拓展:实际项目中可用于监控 Redis 状态,查看内存占用、客户端连接数等。
KEYS *
含义:返回当前数据库中所有的 key(* 是通配符,匹配任意字符)。
注意:在练习环境安全,但在真实生产环境强烈不推荐使用!因为它会扫描整个数据库,可能导致 Redis 短暂阻塞。
拓展:生产中请改用 SCAN 0 MATCH * COUNT 100(迭代式、安全,不会阻塞)。
DBSIZE
含义:返回当前数据库中 key 的总数量。
拓展:快速了解数据库规模。
FLUSHDB
含义:清空当前数据库的所有 key(谨慎使用,只在练习时用)。
拓展:生产中很少用全清,通常用 DEL key 或按前缀批量删除。
SCAN
- 这是 Redis 的核心命令(还有 SSCAN、HSCAN、ZSCAN 等变体)。
- 作用:基于游标(cursor)的迭代器,用来逐步扫描集合中的元素(这里扫描的是整个数据库的 Key 空间)。
- 优点:不会阻塞 Redis 主线程,适合生产环境大数据库使用。每次调用只处理少量数据,返回一部分结果和下一个游标。
0(游标 / cursor)
- 表示起始游标,意思是"从头开始一次新的迭代"。
- Redis 会返回一个新游标(一个整数)和一批匹配的 Key。
- 下次调用时,用上一次返回的游标继续扫描(例如 SCAN 1234 MATCH * COUNT 100)。
- 当返回的游标再次变为 0 时,表示本次完整迭代结束(所有 Key 已扫描完毕)。
- 注意:即使某次返回的 Key 列表为空,也不代表结束,必须看游标是否为 0。
**MATCH ***(匹配模式)
- MATCH 是可选参数,用于过滤只返回匹配特定模式的 Key。
- * 是通配符(glob 风格模式),意思是匹配所有 Key(相当于没有过滤,扫描整个数据库)。
- 其他常见例子:
-
- MATCH user:* → 只匹配以 user: 开头的 Key
- MATCH *cache* → 匹配包含 cache 的 Key
- 匹配是在 Redis 取出元素之后进行的,如果取出的元素不匹配,就不会返回。
COUNT 100
- COUNT 是可选参数,提示(hint)Redis 每次迭代大致返回多少个元素(不是严格保证)。
- 这里 100 表示:希望 Redis 每次调用尽量扫描/返回大约 100 个 Key(实际可能会多一点或少一点,取决于内部 hash 表结构和是否有 MATCH 过滤)。
- 默认值是 10。
- COUNT 越大,一次调用返回越多,但单次命令耗时可能越长(对 Redis 负载有影响)。生产中常设为 100~10000,根据实际情况调整。
- 注意:它不是"最多返回 100 个",而是"建议每次做多少工作量"。

Redis 的 SCAN 命令总是返回一个包含两个元素的数组:
- 第一个元素 "0" :这是下一个游标(cursor)。
-
- "0" 表示本次迭代已经完成,数据库中所有匹配的 Key 都已经扫描完毕。
- 如果返回的不是 "0",而是一个其他数字(如 "12345"),那就代表还没扫完,你需要用这个数字继续调用 SCAN 12345 MATCH *。
- 第二个元素 :这是一个数组,里面包含本次扫描返回的匹配 Key 列表。
-
- 这里返回了 4 个 Key:"time"、"name"、"timi"、"our"。
- 这些就是你数据库里目前所有匹配 * 模式(即所有 Key)的键名。
String(字符串)入门 ------ 最常用类型(缓存、计数器等)
SET fruit name 'apple'
SET city 'Singapore'
GET fruit_name
GET city
SET counter 100
INCR counter
含义:将 key counter 的值 原子性 +1(适合高并发计数)。
拓展:用于页面访问量、点赞数、库存扣减等。
INCRBY counter 50
含义:将 counter 的值 增加 50。
DECR counter
含义:将 counter 的值 原子性 -1。
GET counter
APPEND fruit_name ' is sweet'
含义:在 key fruit_name 的值末尾追加字符串 ' is sweet'。
拓展:可用于日志拼接等场景。
GET fruit_name
DEL fruit_name
含义:删除指定的 key fruit_name。
EXISTS city
含义:检查 key city 是否存在(返回 1 表示存在,0 表示不存在)。
TTL city
含义:查看 key city 的剩余存活时间(秒),-1 表示永不过期。
EXPIRE city 60
含义:设置 key city 在 60 秒后自动过期删除。
拓展:缓存必备,防止数据永远占用内存(生产中常加随机值防雪崩,如 300 + random(60))。
TTL city
TYPE fruit_name
含义:返回 key 的数据类型(这里是 string)。
KEYS *
Hash(哈希 / 对象):
HSET fruit:1001 name 'banana' color 'yellow' weight 120 taste 'sweet'
HGET fruit:1001 name
HGET fruit:1001 color
HGETALL fruit:1001
HSET fruit:1001 weight 150
HINCRBY fruit:1001 weight 30
HMGET fruit:1001 name color weight
HDEL fruit:1001 taste
HGETALL fruit:1001
KEYS *
List(列表):
LPUSH fruitlist 'apple' 'banana' 'orange'
RPUSH fruitlist 'mango' 'grape'
LRANGE fruitlist 0 -1
LPOP fruitlist
RPOP fruitlist
LRANGE fruitlist 0 -1
LLEN fruitlist
LINDEX fruitlist 1
KEYS *
Set(集合):
SADD fruits 'apple' 'banana' 'orange' 'apple'
SMEMBERS fruits
SCARD fruits
SISMEMBER fruits 'banana'
SADD fruits2 'banana' 'grape' 'kiwi'
SINTER fruits fruits2
SUNION fruits fruits2
SDIFF fruits fruits2
SPOP fruits
KEYS *
Sorted Set(有序集合 / 排行榜):
ZADD fruit_ranking 100 'apple' 85 'banana' 95 'orange' 120 'mango'
ZRANGE fruit_ranking 0 -1 WITHSCORES
ZREVRANGE fruit_ranking 0 2 WITHSCORES
ZSCORE fruit_ranking 'mango'
ZINCRBY fruit_ranking 10 'mango'
ZRANK fruit_ranking 'mango'
ZREM fruit_ranking 'banana'
ZCARD fruit_ranking
ZCOUNT fruit_ranking 90 110
KEYS *
综合练习(模拟实际项目场景):
# 1. 水果缓存(String)
SET cache:fruit:1001 '{"name":"banana","color":"yellow","weight":150}'
GET cache:fruit:1001
# 2. 访问计数器
SET views:home 0
INCR views:home
INCRBY views:home 10
# 3. 最新水果列表(List)
LPUSH fruits:recent 'apple' 'banana' 'orange' 'mango'
LRANGE fruits:recent 0 9
# 4. 水果标签(Set)
SADD fruit:1001:tags 'sweet' 'tropical' 'yellow'
SMEMBERS fruit:1001:tags
# 5. 水果甜度排行榜(Sorted Set)
ZADD sweetness_ranking 95 'banana' 88 'apple' 92 'mango' 75 'grape' 98 'orange'
ZREVRANGE sweetness_ranking 0 4 WITHSCORES
KEYS *
过期与清理:
SET temp_fruit 'will_expire_soon'
EXPIRE temp_fruit 30
TTL temp_fruit
PERSIST temp_fruit
DEL temp_fruit
FLUSHDB
KEYS *
