Redis入门:数据结构与基本命令

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的使用就够了。