当前位置:首页 > 未命名 > 正文内容

Redis 高级用法:从缓存到分布式系统的核心组件

廖万里16小时前未命名1

Redis 作为最流行的内存数据库,不仅能做缓存,还支持分布式锁、消息队列、实时排行榜等高级场景。本文深入探讨 Redis 的高级用法,助你成为 Redis 专家。

一、Redis 数据结构进阶

Redis 提供了五种基本数据结构,每种都有其独特的应用场景。

1.1 String 高级用法

# 设置带过期时间的 key
SET user:1001 "张三" EX 3600

# 不存在才设置(分布式锁基础)
SET lock:order NX EX 30

# 批量操作
MSET key1 "value1" key2 "value2"
MGET key1 key2

# 数值操作
INCR page:views
INCRBY counter 100

1.2 Hash 结构

# 存储对象
HSET user:1001 name "张三" age 25 city "北京"

# 获取单个字段
HGET user:1001 name

# 获取所有字段
HGETALL user:1001

# 数值增减
HINCRBY user:1001 age 1

1.3 Sorted Set 排行榜

# 添加成员
ZADD leaderboard 100 user1 200 user2 150 user3

# 获取排行榜(降序)
ZREVRANGE leaderboard 0 9 WITHSCORES

# 获取排名
ZREVRANK leaderboard user1

# 增加分数
ZINCRBY leaderboard 50 user1

二、缓存策略

2.1 缓存穿透

查询不存在的数据,请求直接穿透到数据库。解决方案:缓存空值或使用布隆过滤器。

import redis
import json

r = redis.Redis(host='localhost', port=6379, db=0)

def get_user(user_id):
    key = f"user:user_id"
    value = r.get(key)
    
    if value is not None:
        if value == b'NULL':
            return None
        return json.loads(value)
    
    user = db.query("SELECT * FROM users WHERE id = user_id")
    
    if user:
        r.setex(key, 3600, json.dumps(user))
    else:
        r.setex(key, 60, 'NULL')
    
    return user

2.2 缓存雪崩

大量缓存同时失效,导致数据库压力骤增。解决方案:过期时间加随机值。

import random

def set_cache(key, value, base_ttl=3600):
    ttl = base_ttl + random.randint(0, 300)
    r.setex(key, ttl, json.dumps(value))

三、分布式锁

Redis 分布式锁是高并发场景的利器。

import redis
import uuid

r = redis.Redis(host='localhost', port=6379, db=0)

class RedisLock:
    def __init__(self, name, expire=30):
        self.name = name
        self.expire = expire
        self.identifier = str(uuid.uuid4())
        self.key = f"lock:name"
    
    def acquire(self):
        return r.set(self.key, self.identifier, nx=True, ex=self.expire)
    
    def release(self):
        script = "if redis.call('get', KEYS[1]) == ARGV[1] then return redis.call('del', KEYS[1]) end return 0"
        r.eval(script, 1, self.key, self.identifier)

with RedisLock("order:12345"):
    process_order()

四、消息队列

Redis 的 List 可以实现简单的消息队列。

import threading

def producer():
    for i in range(10):
        task = json.dumps({"id": i, "data": f"task_i"})
        r.lpush("task:queue", task)

def consumer():
    while True:
        result = r.brpop("task:queue", timeout=5)
        if result:
            _, task = result
            data = json.loads(task)
            process_task(data)

五、限流

使用 Redis 实现令牌桶或滑动窗口限流。

import time

def check_rate_limit(user_id, limit=100, window=60):
    key = f"rate_limit:user_id"
    current = r.incr(key)
    if current == 1:
        r.expire(key, window)
    return current <= limit

六、总结

Redis 的高级用法远不止缓存,分布式锁、消息队列、限流、排行榜等场景都能胜任。掌握这些技能,能让你在系统设计中游刃有余。

最佳实践建议:

1. 合理设置过期时间,避免雪崩

2. 使用连接池管理连接

3. 大 key 拆分,避免阻塞

4. 持久化配置根据场景选择

本文链接:https://www.kkkliao.cn/?id=774 转载需授权!

分享到:

版权声明:本文由廖万里的博客发布,如需转载请注明出处。


发表评论

访客

看不清,换一张

◎欢迎参与讨论,请在这里发表您的看法和观点。