下面详细总结 Redis 需要掌握的核心内容,从基础到高级全面覆盖。
1. Redis 基础入门
安装和启动
# Ubuntu/Debian 安装sudo apt updatesudo apt install redis-server
# CentOS/RHEL 安装sudo yum install redis
# 启动 Redissudo systemctl start redis-serversudo systemctl enable redis-server
# 连接 Redisredis-cliredis-cli -h host -p port -a password
# 测试连接ping # 返回 PONG 表示连接成功
# 基本信息查看INFO serverINFO memoryINFO keyspace
基本配置和管理
# 查看配置CONFIG GET *CONFIG GET maxmemoryCONFIG GET port
# 修改配置CONFIG SET timeout 300CONFIG SET maxmemory 100mb
# 保存配置到文件CONFIG REWRITE
# 数据库操作SELECT 1 # 切换到数据库1(0-15)DBSIZE # 当前数据库key数量FLUSHDB # 清空当前数据库FLUSHALL # 清空所有数据库
# 键操作KEYS user:* # 查找键(生产环境慎用)SCAN 0 MATCH user:* COUNT 10 # 安全遍历EXISTS key1 # 检查键是否存在TYPE key1 # 查看键类型DEL key1 key2 # 删除键EXPIRE key1 60 # 设置过期时间(秒)TTL key1 # 查看剩余生存时间PERSIST key1 # 移除过期时间
2. 5种核心数据结构
字符串(String)
# 基本操作SET username "zhangsan"GET usernameSET counter 100INCR counter # 101INCRBY counter 10 # 111DECR counter # 110
# 批量操作MSET key1 "value1" key2 "value2"MGET key1 key2
# 位操作SETBIT login:2024-01-01 100 1 # 用户100在1月1日登录GETBIT login:2024-01-01 100 # 检查是否登录BITCOUNT login:2024-01-01 # 统计登录用户数
# 过期和条件设置SETEX session:abc123 3600 "user_data" # 设置值并过期时间SETNX lock:resource1 "locked" # 不存在才设置(分布式锁)
哈希(Hash)
# 用户信息存储HSET user:1000 name "张三" age 30 email "zhang@example.com"HGET user:1000 nameHGETALL user:1000HMGET user:1000 name age
# 更新操作HINCRBY user:1000 age 1 # 年龄+1HSETNX user:1000 phone "13800138000" # 字段不存在才设置HDEL user:1000 email # 删除字段
# 查看信息HLEN user:1000 # 字段数量HKEYS user:1000 # 所有字段HVALS user:1000 # 所有值HEXISTS user:1000 name # 检查字段是否存在
列表(List)
# 消息队列应用LPUSH messages "msg1" # 左侧插入LPUSH messages "msg2"RPUSH messages "msg_end" # 右侧插入LRANGE messages 0 -1 # 获取所有元素
# 队列操作LPOP messages # 左侧弹出(队列)RPOP messages # 右侧弹出(栈)
# 阻塞操作(消息队列)BLPOP task_queue 30 # 阻塞弹出,等待30秒BRPOP task_queue 30
# 其他操作LINDEX messages 0 # 获取指定位置元素LSET messages 1 "new_msg" # 设置元素值LTRIM messages 0 9 # 只保留前10个元素LLEN messages # 列表长度
集合(Set)
# 标签系统SADD article:1000:tags "python" "database" "redis"SADD article:1001:tags "java" "redis"SMEMBERS article:1000:tags # 获取所有标签
# 集合运算SINTER article:1000:tags article:1001:tags # 交集(共同标签)SUNION article:1000:tags article:1001:tags # 并集SDIFF article:1000:tags article:1001:tags # 差集
# 基本操作SISMEMBER article:1000:tags "python" # 检查是否存在SREM article:1000:tags "database" # 移除元素SCARD article:1000:tags # 元素个数SRANDMEMBER article:1000:tags # 随机获取元素SPOP article:1000:tags # 随机弹出元素
有序集合(Sorted Set)
# 排行榜应用ZADD leaderboard 100 "player1" 85 "player2" 95 "player3"ZREVRANGE leaderboard 0 2 WITHSCORES # 前3名(降序)ZRANGE leaderboard 0 -1 WITHSCORES # 升序排列
# 分数更新ZINCRBY leaderboard 10 "player1" # 增加分数
# 范围查询ZRANGEBYSCORE leaderboard 90 100 # 90-100分的玩家ZCOUNT leaderboard 80 100 # 统计区间内数量
# 排名操作ZRANK leaderboard "player1" # 升序排名ZREVRANK leaderboard "player1" # 降序排名ZSCORE leaderboard "player1" # 获取分数
# 集合运算ZUNIONSTORE leaderboard:month 2 leaderboard:week1 leaderboard:week2 WEIGHTS 1 2
3. 高级数据结构和功能
HyperLogLog(基数统计)
# 统计UV(独立访客)PFADD uv:2024-01-01 "user1" "user2" "user3"PFADD uv:2024-01-01 "user1" "user4" # user1重复,不计数PFCOUNT uv:2024-01-01 # 返回4
# 合并多日数据PFADD uv:2024-01-02 "user3" "user5" "user6"PFMERGE uv:2024-01-total uv:2024-01-01 uv:2024-01-02PFCOUNT uv:2024-01-total # 统计总UV
地理空间(GEO)
# 存储地理位置GEOADD cities 116.3974 39.9093 "北京"GEOADD cities 121.4737 31.2304 "上海" 113.2644 23.1291 "广州"
# 距离计算GEODIST cities "北京" "上海" km # 计算距离(公里)
# 附近搜索GEORADIUS cities 116.40 39.90 100 km WITHDIST # 100公里内的城市GEORADIUSBYMEMBER cities "北京" 200 km # 北京200公里内的城市
# 获取坐标GEOPOS cities "北京" "上海"
位图(Bitmap)
# 用户签到系统SETBIT sign:2024-01:user100 1 1 # 1号签到SETBIT sign:2024-01:user100 5 1 # 5号签到
# 统计签到情况BITCOUNT sign:2024-01:user100 # 本月签到次数GETBIT sign:2024-01:user100 1 # 检查1号是否签到
# 位运算BITOP AND sign:2024-01:active sign:2024-01:user100 sign:2024-01:user101
流(Stream)- Redis 5.0+
# 消息流(类似Kafka)XADD mystream * sensor-id 1234 temperature 19.8XADD mystream * sensor-id 1234 temperature 20.1
# 读取消息XRANGE mystream - + COUNT 2 # 读取前2条XREAD COUNT 10 STREAMS mystream 0 # 从开始读取
# 消费者组XGROUP CREATE mystream mygroup 0XREADGROUP GROUP mygroup consumer1 COUNT 1 STREAMS mystream >
4. 持久化机制
RDB(快照持久化)
# 配置文件示例# save 900 1 # 900秒内至少1个key变化则保存# save 300 10 # 300秒内至少10个key变化# save 60 10000 # 60秒内至少10000个key变化
# 手动执行SAVE # 阻塞式保存BGSAVE # 后台保存
# 检查状态LASTSAVE # 上次保存时间戳INFO persistence
AOF(追加日志)
# 配置文件选项# appendonly yes# appendfsync always # 每个写命令都同步# appendfsync everysec # 每秒同步(推荐)# appendfsync no # 由操作系统决定
# AOF重写(压缩日志)BGREWRITEAOF
# 检查AOF状态INFO persistence
混合持久化(Redis 4.0+)
# 开启混合持久化# aof-use-rdb-preamble yes
# 优势:快速加载 + 数据安全
5. 事务和Lua脚本
事务(Transaction)
# 基本事务MULTISET key1 "value1"SET key2 "value2"INCR counterEXEC
# 监控键(乐观锁)WATCH key1MULTISET key1 "new_value"EXEC # 如果key1被其他客户端修改,事务失败
# 取消事务MULTISET key1 "value1"DISCARD # 取消事务
Lua脚本
# 基本脚本EVAL "return redis.call('GET', KEYS[1])" 1 mykey
# 复杂脚本示例(限流器)EVAL "local key = KEYS[1]local limit = tonumber(ARGV[1])local window = tonumber(ARGV[2])local current = redis.call('GET', key)
if current == false then redis.call('SETEX', key, window, 1) return 1else if tonumber(current) < limit then redis.call('INCR', key) return tonumber(current) + 1 else return -1 -- 超过限制 endend" 1 rate_limit:user100 10 60
# 脚本加载和缓存SCRIPT LOAD "return redis.call('GET', KEYS[1])"EVALSHA sha1_hash 1 mykey
6. 发布订阅(Pub/Sub)
# 订阅频道SUBSCRIBE news notifications
# 另一个客户端发布消息PUBLISH news "重要新闻:Redis 7.0发布!"PUBLISH notifications "系统维护通知"
# 模式订阅PSUBSCRIBE log:* # 订阅所有log开头的频道
# 发布到模式匹配的频道PUBLISH log:error "数据库连接错误"PUBLISH log:info "用户登录成功"
# 取消订阅UNSUBSCRIBE newsPUNSUBSCRIBE log:*
7. 管道和连接管理
管道(Pipeline)
import redis
# Python管道示例r = redis.Redis()
# 普通操作(多次网络往返)for i in range(100): r.set(f'key:{i}', i)
# 管道操作(一次网络往返)pipe = r.pipeline()for i in range(100): pipe.set(f'key:{i}', i)pipe.execute()
连接管理
# 客户端管理CLIENT LIST # 查看所有连接CLIENT SETNAME myclient # 设置客户端名称CLIENT GETNAME # 获取当前客户端名称CLIENT KILL addr # 关闭指定连接
# 慢查询日志SLOWLOG GET 10 # 获取最近10条慢查询SLOWLOG LEN # 慢查询数量SLOWLOG RESET # 清空慢查询日志
# 配置慢查询阈值CONFIG SET slowlog-log-slower-than 10000 # 10毫秒
8. 内存管理和优化
内存优化策略
# 查看内存使用INFO memoryMEMORY USAGE key1 # 查看key的内存使用
# 内存优化命令MEMORY PURGE # 尝试释放内存(jemalloc)MEMORY DOCTOR # 内存诊断
# 淘汰策略配置CONFIG GET maxmemory-policyCONFIG SET maxmemory-policy allkeys-lru
# 淘汰策略选项:# volatile-lru 从已设置过期时间的key中淘汰最近最少使用的# allkeys-lru 从所有key中淘汰最近最少使用的# volatile-lfu 从已设置过期时间的key中淘汰最不经常使用的# allkeys-lfu 从所有key中淘汰最不经常使用的# volatile-random 从已设置过期时间的key中随机淘汰# allkeys-random 从所有key中随机淘汰# volatile-ttl 从已设置过期时间的key中淘汰即将过期的# noeviction 不淘汰,返回错误
大Key优化
# 查找大Keyredis-cli --bigkeys
# 内存分析redis-cli --memkeysredis-cli --memkeys-samples 10000
# 分割大Key# 原始:HSET user:1000 profile "很大的JSON数据"# 优化:将大JSON拆分成多个字段或使用多个Key
9. 高可用和集群
主从复制
# 从服务器配置# replicaof 192.168.1.100 6379# masterauth password
# 查看复制信息INFO replication
# 手动设置主从REPLICAOF 192.168.1.100 6379REPLICAOF NO ONE # 取消复制,成为主节点
哨兵(Sentinel)模式
# 哨兵配置 sentinel.confsentinel monitor mymaster 192.168.1.100 6379 2sentinel down-after-milliseconds mymaster 5000sentinel failover-timeout mymaster 10000
# 启动哨兵redis-sentinel sentinel.conf
# 哨兵命令SENTINEL mastersSENTINEL get-master-addr-by-name mymaster
集群(Cluster)模式
# 集群配置cluster-enabled yescluster-config-file nodes.confcluster-node-timeout 15000
# 创建集群redis-cli --cluster create 192.168.1.101:6379 192.168.1.102:6379 ...
# 集群管理CLUSTER INFOCLUSTER NODESCLUSTER SLOTS
# 添加节点redis-cli --cluster add-node new_host:port existing_host:port
# 重新分片redis-cli --cluster reshard host:port
10. 安全配置
认证和ACL
# 密码认证CONFIG SET requirepass "your_strong_password"AUTH your_strong_password
# ACL(Redis 6.0+)ACL SETUSER alice on >password ~cached:* +get +setACL SETUSER bob on >password ~* +@all -@dangerous
# 查看和管理ACLACL LISTACL GETUSER aliceACL DELUSER bob
网络安全
# 绑定IP# bind 127.0.0.1 192.168.1.100
# 保护模式# protected-mode yes
# 重命名危险命令rename-command FLUSHALL "" # 禁用命令rename-command CONFIG "CONFIG_SECRET" # 重命名命令
11. 监控和运维
监控命令
# 实时监控MONITOR
# 统计信息INFO all # 全部信息INFO stats # 统计信息INFO clients # 客户端信息INFO cpu # CPU信息INFO commandstats # 命令统计
# 性能测试redis-benchmark -h 127.0.0.1 -p 6379 -c 100 -n 100000
备份和恢复
# RDB备份SAVE # 同步保存(阻塞)BGSAVE # 后台保存
# AOF备份# 直接复制AOF文件
# 数据迁移redis-cli --rdb dump.rdb # 导出RDBredis-cli -h new_host -p 6379 < dump.rdb # 导入RDB
# 在线迁移MIGRATE new_host 6379 key1 0 5000 COPY REPLACE
12. 实际应用场景
缓存策略
import redisimport pickleimport time
class RedisCache: def __init__(self): self.redis = redis.Redis()
def get_user(self, user_id): # 先查缓存 cache_key = f"user:{user_id}" cached_data = self.redis.get(cache_key)
if cached_data: return pickle.loads(cached_data)
# 缓存未命中,查数据库 user_data = self.get_user_from_db(user_id)
# 写入缓存,设置过期时间 if user_data: self.redis.setex( cache_key, 3600, # 1小时过期 pickle.dumps(user_data) )
return user_data
def invalidate_user(self, user_id): # 用户信息更新,删除缓存 cache_key = f"user:{user_id}" self.redis.delete(cache_key)
分布式锁
import redisimport timeimport uuid
class DistributedLock: def __init__(self, redis_client, lock_name, expire_time=30): self.redis = redis_client self.lock_name = f"lock:{lock_name}" self.expire_time = expire_time self.identifier = str(uuid.uuid4())
def acquire(self, timeout=10): end_time = time.time() + timeout
while time.time() < end_time: # 尝试获取锁 if self.redis.set( self.lock_name, self.identifier, ex=self.expire_time, nx=True # 只有key不存在时才设置 ): return True
time.sleep(0.1) # 短暂等待后重试
return False
def release(self): # 使用Lua脚本保证原子性 script = """ if redis.call('GET', KEYS[1]) == ARGV[1] then return redis.call('DEL', KEYS[1]) else return 0 end """
result = self.redis.eval(script, 1, self.lock_name, self.identifier) return result == 1
限流器
import time
class RateLimiter: def __init__(self, redis_client, key, max_requests, window_seconds): self.redis = redis_client self.key = f"rate_limit:{key}" self.max_requests = max_requests self.window_seconds = window_seconds
def is_allowed(self): now = time.time() pipeline = self.redis.pipeline()
# 移除时间窗口外的请求 pipeline.zremrangebyscore(self.key, 0, now - self.window_seconds)
# 获取当前窗口内的请求数 pipeline.zcard(self.key)
# 添加当前请求 pipeline.zadd(self.key, {str(now): now})
# 设置过期时间 pipeline.expire(self.key, self.window_seconds)
results = pipeline.execute() current_requests = results[1]
return current_requests < self.max_requests
13. 学习路径建议
初级阶段(1-2周)
1.基础命令:5种数据结构的CRUD操作
2.配置管理:基本配置,持久化设置
3.客户端使用:redis-cli,Python客户端连接
中级阶段(2-3周)
1.高级特性:事务,Lua脚本,发布订阅
2.持久化:RDB/AOF原理和配置
3.性能优化:内存管理,管道,大Key处理
高级阶段(3-4周)
1.高可用:主从复制,哨兵,集群
2.运维管理:监控,备份,故障处理
3.安全:ACL,网络安全,最佳实践
总结
Redis需要掌握的核心内容包括:
1.数据结构精通:5种核心数据结构 + 4种高级结构
2.持久化机制:RDB快照 + AOF日志 + 混合持久化
3.高可用架构:主从复制 + 哨兵模式 + 集群模式
4.高级特性:事务,Lua脚本,发布订阅,管道
5.内存管理:淘汰策略,大Key优化,内存分析
6.安全运维:ACL控制,监控告警,备份恢复
7.实战应用:缓存,分布式锁,限流,队列等场景
建议通过实际项目来实践这些知识,同时关注Redis官方文档和社区的最佳实践。Redis的深度掌握需要结合实际业务场景来理解和应用。
上一条:Redis优化性能
下一条:购软平台是Redis代理
品质保证
多年的生产力软件专家
专业实力
资深技术支持项目实施团队
安全无忧
多位认证安全工程师
多元服务
软件提供方案整合,项目咨询实施
购软平台-找企业级软件,上购软平台。平台提供更齐全的软件产品、更专业的技术服务,同时提供行业资讯、软件使用教程和技巧。购软平台打造企业级数字产品综合应用服务平台。用户体验和数字类产品的专业化服务是我们不断追求的目标。购软平台您身边的企业级数字产品优秀服务商。
沪公网安备31011302006932号