Redis是最常用的内存数据库(准确说是数据结构服务器),速度快、数据结构丰富,在缓存、会话管理、排行榜、消息队列等场景下几乎是标配。这篇整理Redis的五种核心数据结构和对应的基本命令。
安装与连接
# Ubuntu
sudo apt install redis-server
sudo systemctl start redis
# macOS
brew install redis
brew services start redis
# Docker(推荐)
docker run -d --name redis -p 6379:6379 redis:7
# 连接
redis-cli
String(字符串)
最基础的数据类型,可以存字符串、数字、二进制数据(最大512MB)。
SET name "Alice"
GET name # "Alice"
SET counter 100
INCR counter # 101
INCRBY counter 10 # 111
DECR counter # 110
# 设置过期时间(秒)
SET token "abc123" EX 3600 # 1小时过期
TTL token # 查看剩余秒数
# 批量操作
MSET k1 "v1" k2 "v2" k3 "v3"
MGET k1 k2 k3
# 不存在才设置(常用于分布式锁)
SETNX lock "holder1"
应用场景:缓存、计数器、分布式锁、Session存储。
Hash(哈希)
类似于一个小型的key-value表,适合存储对象:
HSET user:1001 name "Alice" age "25" email "alice@example.com"
HGET user:1001 name # "Alice"
HGETALL user:1001 # 返回所有字段和值
HMSET user:1002 name "Bob" age "30"
HMGET user:1002 name age
HINCRBY user:1001 age 1 # age变为26
HDEL user:1001 email # 删除字段
HEXISTS user:1001 name # 1 (存在)
HLEN user:1001 # 字段数量
应用场景:存储用户信息、商品详情等结构化数据。比把JSON序列化成String存储更灵活——可以单独读写某个字段。
List(列表)
双向链表,支持头尾操作,可以做队列或栈:
LPUSH tasks "task1" "task2" "task3" # 从左边插入
RPUSH tasks "task4" # 从右边插入
LRANGE tasks 0 -1 # 获取所有元素: task3 task2 task1 task4
LLEN tasks # 4
LPOP tasks # 弹出左边: task3
RPOP tasks # 弹出右边: task4
# 阻塞弹出(做消息队列用)
BRPOP tasks 30 # 等待30秒,有元素则弹出
# 按索引获取
LINDEX tasks 0 # 获取第0个元素
应用场景:消息队列(LPUSH + BRPOP)、最新消息列表、时间线。
Set(集合)
无序、不重复的元素集合,支持集合运算:
SADD online_users "alice" "bob" "charlie"
SMEMBERS online_users # 所有成员
SCARD online_users # 3 (成员数)
SISMEMBER online_users "alice" # 1 (是成员)
SREM online_users "bob" # 移除
SRANDMEMBER online_users 2 # 随机取2个
# 集合运算
SADD group_a "alice" "bob" "charlie"
SADD group_b "bob" "david" "eve"
SINTER group_a group_b # 交集: bob
SUNION group_a group_b # 并集: alice bob charlie david eve
SDIFF group_a group_b # 差集: alice charlie
应用场景:标签系统、共同好友、去重、抽奖(SRANDMEMBER)。
Sorted Set(有序集合)
每个元素关联一个分数(score),按分数排序:
ZADD leaderboard 95 "alice" 87 "bob" 92 "charlie" 78 "david"
# 按分数从低到高
ZRANGE leaderboard 0 -1 WITHSCORES
# 按分数从高到低
ZREVRANGE leaderboard 0 2 WITHSCORES # Top 3
ZSCORE leaderboard "alice" # 95
ZRANK leaderboard "alice" # 排名(从0开始,从低到高)
ZREVRANK leaderboard "alice" # 0 (第一名)
ZINCRBY leaderboard 5 "bob" # bob加5分
# 按分数范围查询
ZRANGEBYSCORE leaderboard 80 100 # 80-100分的成员
ZCARD leaderboard # 成员总数
应用场景:排行榜、带权重的任务队列、延迟队列、范围查询。
Key通用操作
KEYS * # 查看所有key(生产环境慎用,用SCAN代替)
EXISTS mykey # 是否存在
TYPE mykey # 查看类型
DEL mykey # 删除
EXPIRE mykey 60 # 设置过期时间(秒)
PERSIST mykey # 移除过期时间
RENAME mykey newkey # 重命名
持久化
Redis提供两种持久化方式:
RDB(快照):定期把内存数据写到磁盘。恢复快,但可能丢失最后一次快照后的数据。
AOF(追加日志):每次写操作都追加到日志文件。数据更安全,但文件较大、恢复较慢。
实际使用中,两者可以同时开启。对数据安全要求高的场景建议开AOF。
小结
Redis的核心就是这五种数据结构,选对数据结构基本就能解决问题。String做缓存和计数,Hash存对象,List做队列,Set去重和集合运算,Sorted Set做排行榜。掌握这些,日常开发中Redis的使用就够了。