| 数据结构 | 常用命令 | 游戏场景示例 |
|---|---|---|
| String | GET/SET/INCR/EXPIRE | 会话令牌、计数器(击杀、连胜)、限流计数 |
| Hash | HGETALL/HMSET/HINCRBY | 玩家简要档案、背包槽位、角色属性 |
| List | LPUSH/RPOP/BRPOP | 消息队列、聊天记录(可配合TTL) |
| Set | SADD/SREM/SMEMBERS | 在线玩家集合、好友/黑名单、标签 |
| Sorted Set | ZADD/ZINCRBY/ZREVRANGE/ZREVRANK/ZCARD | 实时排行榜、赛季榜单、战力/等级榜 |
| Stream | XADD/XREAD/XGROUP | 跨服事件总线、可靠消息队列、审计日志 |
玩家状态实时存储(Hash + TTL)
import redis
r = redis.Redis(host='localhost', port=6379, decode_responses=True)
def save_player_state(player_id: str, state: dict, ttl: int = 86400):
key = f"player:{player_id}:state"
r.hset(key, mapping=state)
r.expire(key, ttl)
def get_player_state(player_id: str) -> dict:
return r.hgetall(f"player:{player_id}:state")
实时排行榜(Sorted Set)
def update_score(player_id: str, score: float, incr: bool = False):
key = "leaderboard:global"
if incr:
return r.zincrby(key, score, player_id) # 增量更新
return r.zadd(key, {player_id: score}) # 覆盖更新
def top_n(n: int = 10):
return r.zrevrange(key, 0, n - 1, withscores=True) # 高分在前
def player_rank(player_id: str) -> int | None:
rank = r.zrank(key, player_id) # 升序排名
if rank is None:
return None
return r.zcard(key) - rank # 转为降序名次
会话管理与在线状态(String/HASH + Set + Pub/Sub)
import time, uuid
def create_session(player_id: str, ttl: int = 7200) -> str:
sid = str(uuid.uuid4())
r.hset(f"session:{sid}", mapping={
"player_id": player_id,
"login_time": int(time.time()),
"ip": "192.168.1.100", "device": "mobile_ios"
})
r.expire(f"session:{sid}", ttl)
r.set(f"player:{player_id}:session", sid, ex=ttl)
return sid
def verify_session(sid: str) -> str | None:
data = r.hgetall(f"session:{sid}")
if not data:
return None
r.expire(f"session:{sid}", 7200) # 续期
return data["player_id"]
def player_online(pid: str):
r.sadd("players:online", pid)
r.publish("player_status", f"online:{pid}")
def player_offline(pid: str):
r.srem("players:online", pid)
r.publish("player_status", f"offline:{pid}")
异步落库与跨服事件(List/Stream)
# 方案A:轻量队列(List + 守护线程)
def push_event(event: dict):
r.lpush("events:queue", json.dumps(event))
# 方案B:可靠队列(Stream,消费者组)
def publish_event(event: dict):
r.xadd("events:stream", {"data": json.dumps(event)})
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。