首页>软件资讯>常见问题

常见问题

Redis基础

发布时间:2025-11-18 08:08:38人气:2



下面详细总结 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代理