# Redis缓存的使用

# 概述

​ Redis是一个业务逻辑为单线程的,基于内存的键值数据存储,可以理解为一个数据类型更简单,但效率更高的service,他可以实现的功能使用service也可以实现,但是不需要额外编写service代码与占用额外的进程资源。

# 分布式锁

当某个业务可能在多个进程上执行,又需要保证原子性时,可以使用redis来添加锁。在业务前设置key获取锁,业务完成后删除key释放锁。

可参考neteaseChunkRes插件

redis1

# 保存全局数据

对于一些需要多个服同时频繁修改与访问的全局数据,可以存放在redis上。如果一次修改或访问需要多条redis操作,则还需要配合分布式锁使用。

例如

  • 玩家的在线状态

    可参考neteaseFriend插件,玩家登录与登出时设置key,打开好友界面查询好友在线状态时获取key

  • 全局弹幕

    可参考neteaseDanmu插件。

    玩家发的弹幕缓存在server内存,然后每一段时间插入到netease:danmu:list。

    server每一段时间从netease:danmu:list取一部分弹幕到netease:danmu:latest(分布式锁保证每7秒执行一次)。

    server每一段时间从netease:danmu:latest取弹幕并推送到客户端。

# 作为sql的缓存

相比于直接使用server内存作为sql缓存,在中间加入一层redis的好处有:避免server崩溃丢失大量数据,更多地减少sql请求的频率,以及降低server内存峰值。

例如neteaseQuest插件:

  • 玩家任务进度有更新,先更新到内存
  • 每隔4秒将内存数据整合写入redis
  • 每隔444秒将redis数据整合写入sql