Redis 是一个开源的内存数据结构存储系统,广泛用于缓存、消息队列、实时分析等场景。以下是 Redis 的一些关键知识点及示例:
1. 基本数据类型
Redis 支持多种数据类型,每种数据类型都有其特定的操作命令。
1.1 字符串 (String)
字符串是 Redis 中最基本的数据类型,可以存储任何类型的值。
# 设置键值对
SET key "value"
# 获取键值
GET key
# 示例
SET name "Alice"
GET name # 返回 "Alice"
1.2 哈希 (Hash)
哈希是一个键值对集合,适合存储对象。
# 设置哈希字段
HSET user:1 name "Alice"
HSET user:1 age 30
# 获取哈希字段
HGET user:1 name
# 示例
HSET user:1 name "Alice"
HSET user:1 age 30
HGET user:1 name # 返回 "Alice"
HGETALL user:1 # 返回所有字段和值
1.3 列表 (List)
列表是一个有序的字符串集合,可以从两端进行操作。
# 从左侧插入元素
LPUSH list1 "a"
LPUSH list1 "b"
# 从右侧插入元素
RPUSH list1 "c"
# 获取列表长度
LLEN list1
# 弹出左侧第一个元素
LPOP list1
# 获取列表中的所有元素
LRANGE list1 0 -1
# 示例
LPUSH list1 "a" # list1: ["a"]
LPUSH list1 "b" # list1: ["b", "a"]
RPUSH list1 "c" # list1: ["b", "a", "c"]
LLEN list1 # 返回 3
LPOP list1 # 返回 "b", list1: ["a", "c"]
LRANGE list1 0 -1 # 返回 ["a", "c"]
1.4 集合 (Set)
集合是一个无序的字符串集合,自动去重。
# 添加元素到集合
SADD set1 "a"
SADD set1 "b"
SADD set1 "a" # 重复元素不会被添加
# 获取集合中的所有元素
SMEMBERS set1
# 检查元素是否在集合中
SISMEMBER set1 "a"
# 示例
SADD set1 "a" # set1: {"a"}
SADD set1 "b" # set1: {"a", "b"}
SADD set1 "a" # set1: {"a", "b"}
SMEMBERS set1 # 返回 {"a", "b"}
SISMEMBER set1 "a" # 返回 1 (true)
SISMEMBER set1 "c" # 返回 0 (false)
1.5 有序集合 (Sorted Set)
有序集合类似于集合,但每个元素都会关联一个分数,元素按分数排序。
# 添加元素到有序集合
ZADD zset1 1 "a" # zset1: {"a": 1}
ZADD zset1 2 "b" # zset1: {"a": 1, "b": 2}
# 获取有序集合中的所有元素
ZRANGE zset1 0 -1 # 返回 ["a", "b"]
# 获取有序集合中元素的分数
ZSCORE zset1 "a" # 返回 1
2. 发布/订阅 (Pub/Sub)
Redis 支持发布/订阅消息模式,适用于实时消息传递。
# 订阅频道
SUBSCRIBE channel1
# 发布消息到频道
PUBLISH channel1 "Hello, World!"
# 示例
# 终端1:
SUBSCRIBE channel1 # 订阅 channel1
# 终端2:
PUBLISH channel1 "Hello, World!" # 订阅者会收到消息 "Hello, World!"
3. 事务 (Transaction)
事务允许一次执行多个命令,保证原子性。
# 开始事务
MULTI
# 添加命令到事务队列
SET key1 "value1"
SET key2 "value2"
# 执行事务
EXEC
# 示例
MULTI
SET key1 "value1"
SET key2 "value2"
EXEC # 两个 SET 命令会被原子性地执行
4. 脚本 (Scripting)
Redis 支持使用 Lua 脚本执行复杂操作。
# 执行 Lua 脚本
EVAL "return redis.call('SET', KEYS[1], ARGV[1])" 1 key "value" # 等同于 SET key "value"
5. 持久化 (Persistence)
Redis 提供两种持久化方式:RDB 快照和 AOF 日志。
5.1 RDB (Redis Database)
RDB 是一种快照方式,将数据在某个时间点保存到磁盘。
# 手动触发 RDB 快照
SAVE # 同步保存数据到磁盘
# 异步触发 RDB 快照
BGSAVE # 异步保存数据到磁盘
5.2 AOF (Append Only File)
AOF 记录每个写操作日志,重启时重放日志以恢复数据。
# 启用 AOF
CONFIG SET appendonly yes
# 手动重写 AOF 文件 以减少体积
BGREWRITEAOF
6. 主从复制 (Replication)
Redis 支持主从复制,实现数据的高可用和读写分离。
# 配置从节点
SLAVEOF master_host master_port
# 示例
SLAVEOF 127.0.0.1 6379 # 将当前节点配置为 127.0.0.1:6379 的从节点
7. 哨兵 (Sentinel)
哨兵用于监控 Redis 实例,实现自动故障转移。
# 启动哨兵
redis-sentinel /path/to/sentinel.conf
# 示例
# sentinel.conf 配置文件中定义了主节点和监控参数
sentinel monitor mymaster 127.0.0.1 6379 2 # 监控主节点 mymaster
8. 集群 (Cluster)
Redis 集群允许在多个节点间分布数据,实现高可用和可扩展性。
# 创建集群
redis-cli --cluster create host1:port1 host2:port2 host3:port3 --cluster-replicas 1
# 示例
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1
9. 常用配置
Redis 提供多种配置选项,可以通过配置文件或命令行进行设置。
# 查看当前配置
CONFIG GET *
# 设置最大内存为 256MB
CONFIG SET maxmemory 256mb
10. 安全性
Redis 提供密码保护和访问控制列表 (ACL) 来增强安全性。
# 设置密码
CONFIG SET requirepass "yourpassword"
# 使用密码连接
redis-cli -a "yourpassword"
11. 性能优化
通过合理配置和使用,可以提升 Redis 的性能。
11.1 内存优化
使用合适的数据类型
合理设置最大内存和内存淘汰策略
Copy
# 设置最大内存
CONFIG SET maxmemory 256mb
# 设置内存淘汰策略为 LRU
CONFIG SET maxmemory-policy allkeys-lru
11.2 网络优化
使用更高效的网络协议
合理配置客户端连接数
# 设置最大客户端连接数
CONFIG SET maxclients 10000
11.3 持久化优化
根据业务需求选择合适的持久化方式
调整 RDB 和 AOF 的配置参数
# 设置 RDB 快照频率
CONFIG SET save "900 1 300 10 60 10000"
# 设置 AOF 同步频率为每秒一次
CONFIG SET appendfsync everysec
12. 常见问题
12.1 内存不足
# 检查内存使用情况
INFO memory
# 清理不必要的数据
DEL old_key
12.2 性能瓶颈
分析慢查询日志
优化数据结构和访问模式
考虑使用集群或分片
# 设置慢查询日志阈值为 10 毫秒
CONFIG SET slowlog-log-slower-than 10000
# 查看慢查询日志
SLOWLOG GET
12.3 数据丢失
检查持久化配置
确保主从复制和哨兵配置正确
定期备份数据
# 查看 RDB 配置
CONFIG GET save
# 查看 AOF 配置
CONFIG GET appendonly
# 手动触发备份
BGSAVE
13. 高级特性
13.1 Bitmaps
Bitmaps 是一种特殊的数据结构,用于处理位操作。
# 设置某个位的值
SETBIT bitmap1 7 1
# 获取某个位的值
GETBIT bitmap1 7
# 统计位图中值为1的位数
BITCOUNT bitmap1
# 示例
SETBIT bitmap1 7 1 # 将 bitmap1 的第8位设置为1
GETBIT bitmap1 7 # 获取 bitmap1 的第8位的值,返回1
BITCOUNT bitmap1 # 统计 bitmap1 中值为1的位数,返回1
13.2 HyperLogLog
HyperLogLog 是一种用于基数估计算法的数据结构,适用于大规模数据去重统计。
# 添加元素到 HyperLogLog
PFADD hll1 "a" "b" "c" # 添加元素到 hll1
# 获取基数估计值
PFCOUNT hll1
# 合并多个 HyperLogLog
PFMERGE hll2 hll1
13.3 Geospatial
Redis 提供地理空间数据的存储和操作功能。
# 添加地理空间数据
GEOADD locations 13.361389 38.115556 "Palermo" # 添加地理位置 Palermo
GEOADD locations 15.087269 37.502669 "Catania" # 添加地理位置 Catania
# 获取地理空间数据的距离
GEODIST locations "Palermo" "Catania" km # 获取 Palermo 和 Catania 之间的距离,返回166.2742 km
# 获取指定范围内的地理空间数据
GEORADIUS locations 15 37 200 km # 获取指定范围内的地理位置
14. 实用工具
14.1 Redis CLI
Redis CLI 是 Redis 提供的命令行工具,用于与 Redis 服务器交互。
# 连接到 Redis 服务器
redis-cli -h host -p port
# 执行 Redis 命令
redis-cli SET key "value"
# 示例
redis-cli -h 127.0.0.1 -p 6379 # 连接到本地 Redis 服务器
redis-cli SET key "value" # 设置键值对
14.2 Redis Sentinel
Redis Sentinel 是用于监控 Redis 实例和实现高可用性的工具。
# 启动 Redis Sentinel
redis-sentinel /path/to/sentinel.conf
14.3 Redis Cluster
Redis Cluster 是用于实现 Redis 分布式存储的工具。
# 创建 Redis 集群
redis-cli --cluster create host1:port1 host2:port2 host3:port3 --cluster-replicas 1
# 示例
redis-cli --cluster create 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 --cluster-replicas 1 # 创建 Redis 集群
15. Redis 客户端
除了 Redis CLI,Redis 还支持多种编程语言的客户端库,常见的有:
Python: redis-py
Java: Jedis
Node.js: node_redis
Go: go-redis
15.1 Python 示例
import redis
# 连接到 Redis 服务器
r = redis.Redis(host='localhost', port=6379, db=0)
# 设置键值对
r.set('key', 'value')
# 获取键值对
value = r.get('key')
print(value)