基础篇
一、Redis 简介
Redis(Remote Dictionary Server)是一个开源的、基于内存的高性能键值存储系统,支持多种数据结构(如字符串、哈希、列表、集合等),广泛应用于缓存、消息队列、实时分析等场景。以下内容将详细讲解 Redis 的基本操作。
二、Redis 安装与启动
1. 安装 Redis
# Ubuntu/Debian
sudo apt update
sudo apt install redis-server
# CentOS/RHEL
sudo yum install epel-release
sudo yum install redis
# macOS(使用 Homebrew)
brew install redis
2. 启动 Redis 服务
# Linux 系统
sudo systemctl start redis
# macOS(后台运行)
brew services start redis
# 手动启动 Redis 服务器
redis-server
3. 连接 Redis 客户端
redis-cli
# 指定主机和端口
redis-cli -h 127.0.0.1 -p 6379
三、Redis 通用命令
1. 查看所有键
KEYS *
2. 检查键是否存在
EXISTS key
3. 删除键
DEL key1 key2
4. 设置键过期时间
EXPIRE key seconds # 设置过期时间(秒)
TTL key # 查看剩余时间(-1 表示永不过期,-2 表示键不存在)
5. 持久化键
PERSIST key # 移除键的过期时间
6. 重命名键
RENAME old_key new_key
四、字符串(String)操作
字符串是 Redis 最基本的数据类型,可以存储文本、数字或二进制数据。
1. 设置值
SET key value
SET name "Alice" # 设置键值
SET age 25 EX 60 # 设置值并指定过期时间(60秒)
SET counter 0 NX # 仅当键不存在时设置(原子操作)
2. 获取值
GET name # 返回 "Alice"
3. 批量操作
MSET key1 "value1" key2 "value2"
MGET key1 key2 # 返回 ["value1", "value2"]
4. 数值增减
INCR counter # 自增1(返回 1)
INCRBY counter 5 # 自增5(返回 6)
DECR counter # 自减1(返回 5)
5. 追加字符串
APPEND name " Smith" # 值变为 "Alice Smith"
五、哈希(Hash)操作
哈希用于存储对象,适合保存多个字段的结构化数据。
1. 设置字段值
HSET user:1 name "Alice" age 25
HSET user:1 email "alice@example.com"
2. 获取字段值
HGET user:1 name # 返回 "Alice"
HGETALL user:1 # 返回所有字段和值
HMGET user:1 name age # 返回指定字段
3. 删除字段
HDEL user:1 email
4. 检查字段是否存在
HEXISTS user:1 age # 返回 1(存在)
5. 获取所有字段或值
HKEYS user:1 # 返回 ["name", "age"]
HVALS user:1 # 返回 ["Alice", "25"]
六、列表(List)操作
列表是一个双向链表,支持在头部或尾部插入元素。
1. 插入元素
LPUSH list1 "item1" # 头部插入,返回列表长度
RPUSH list1 "item2" # 尾部插入
LINSERT list1 BEFORE "item2" "item1.5" # 在指定元素前插入
2. 获取元素
LRANGE list1 0 -1 # 获取所有元素
LINDEX list1 0 # 获取第一个元素
3. 删除元素
LPOP list1 # 删除并返回头部元素
RPOP list1 # 删除并返回尾部元素
LREM list1 1 "item1" # 删除1个值为 "item1" 的元素
4. 修剪列表
LTRIM list1 0 2 # 只保留前3个元素
七、集合(Set)操作
集合是无序且元素唯一的容器,适合去重和集合运算。
1. 添加元素
SADD tags "redis" "database" "cache"
2. 获取元素
SMEMBERS tags # 返回所有元素
SCARD tags # 返回元素数量
3. 集合运算
SINTER set1 set2 # 交集
SUNION set1 set2 # 并集
SDIFF set1 set2 # 差集(set1 有但 set2 没有)
4. 删除元素
SREM tags "cache"
八、有序集合(Sorted Set)操作
有序集合通过分数(score)为元素排序,适合排行榜、优先级队列等场景。
1. 添加元素
ZADD leaderboard 100 "Alice" 200 "Bob"
2. 获取元素
ZRANGE leaderboard 0 -1 WITHSCORES # 按分数升序返回
ZREVRANGE leaderboard 0 -1 # 按分数降序返回
ZSCORE leaderboard "Alice" # 返回分数 100
3. 范围查询
ZRANGEBYSCORE leaderboard 150 300 # 分数在150到300之间的元素
4. 删除元素
ZREM leaderboard "Bob"
九、发布订阅(Pub/Sub)
Redis 支持消息的发布与订阅,适用于实时消息系统。
1. 订阅频道
SUBSCRIBE news
2. 发布消息
PUBLISH news "Hello, World!"
十、事务与 Lua 脚本
1. 事务(Multi/Exec)
MULTI
SET balance 100
INCRBY balance 50
EXEC # 提交事务
2. Lua 脚本
EVAL "return redis.call('GET', KEYS[1])" 1 key_name
十一、持久化与备份
1. RDB 快照
SAVE # 阻塞式保存快照
BGSAVE # 后台保存快照
2. AOF 日志
# 修改配置文件启用 AOF
appendonly yes
appendfsync everysec # 每秒同步
十二、Redis 配置与安全
1. 修改配置文件
vim /etc/redis/redis.conf
2. 设置密码
# 配置文件添加
requirepass your_password
# 客户端验证
AUTH your_password
十三、性能优化
使用 Pipeline 批量操作
(echo -en "PING\r\nSET key1 value1\r\nGET key1\r\n"; sleep 1) | nc localhost 6379
合理选择数据结构
优先使用哈希存储对象,而非多个字符串键。
避免大键(Big Key)
单个键的值不超过 1MB。
十四、常见问题与解决方案
1. 内存不足
方案:启用淘汰策略(如
maxmemory-policy allkeys-lru
)。
2. 高并发写入
方案:使用集群模式分片数据。