为什么80%的码农都做不了架构师?>>>   

游戏中一些常用的功能,仅仅使用redis提供的命令来实现,恐怕难度比较大。好在redis支持lua,能让一系列的操作变为原子操作,让这些常用却又麻烦的功能变的简单了,当然这需要小量的性能损失,别的不多说,懂的自然懂,不懂的看了就懂了,上代码:

class MyStorage extends Redis
{public function safeDecr($key, $num){$script = "local old=redis.call('get', KEYS[1]);\n";$script.= "if not old or old+0 < ARGV[1]+0 then return false;end;";$script.= "return redis.call('decrBy', KEYS[1], ARGV[1]);\n";return $this->eval($script, array($key, $num), 1);}public function safeHDecr($key, $member, $num){$script = "local old=redis.call('hGet', KEYS[1], ARGV[1]);\n";$script.= "if not old or old+0 < ARGV[2]+0 then return false;end;";$script.= "redis.call('hIncrBy', KEYS[1], ARGV[1], -ARGV[2]);\n";$script.= "return true;";return $this->eval($script, array($key, "", $member, $num), 2);}public function lock($key, $now, $expire){$script = "local old=redis.call('get', KEYS[1]);\n";$script.= "if old and ARGV[1]+0 < old+0 then return false;end;\n";$script.= "redis.call('set', KEYS[1], ARGV[2]);\n";$script.= "return true;";return $this->eval($script, array($key, "", $now, $expire), 2);}public function hlock($key, $member, $now, $expire){$script = "local old=redis.call('hGet', KEYS[1], ARGV[1]);\n";$script.= "if old and ARGV[2]+0 < old+0 then return false;end;\n";$script.= "redis.call('hSet', KEYS[1], ARGV[1], ARGV[3]);\n";$script.= "return true;";return $this->eval($script, array($key, "", "", $member, $now, $expire), 3);}public function rankSwap($key, $r1, $r2){$script = "local r1score=redis.call('zScore', KEYS[1], ARGV[1]);\n";$script.= "local r2score=redis.call('zScore', KEYS[1], ARGV[2]);\n";$script.= "redis.call('zAdd', KEYS[1], r2score, ARGV[1]);\n";$script.= "return redis.call('zAdd', KEYS[1], r1score, ARGV[2]);\n";return $this->eval($script, array($key, "", $r1, $r2), 2);}
}$redis = new MyStorage();//场景1:需要对某个key进行decr操作,但是又不能让他为负数(比如某个物品限量销售)
$redis->safeDecr('mygold', 10);//如果mygold的值小于10,那么会返回false//场景2:需要对hashtable下某个Key做decr操作,但又不能让他为负数(比如用户的金币、游戏币等)
$redis->safeHDecr('mygold2', 'gold', 10);//场景3:锁定某个key,并且让他带有过期时间
$now = time();
$redis->lock('mylock', $now, $now + 5);//5秒后过期,再此期间再进行加锁,会返回false//场影4:锁定hashtable中某个key,并且带过期时间(当然你可以直接用lock,但是这样你要清理所有相关的锁,就必须来一次keys了)
$now = time();
$redis->hlock('mylock', 'lock', $now, $now + 5);//场景5:对排名进行原子的交换(比如游戏中的排行榜,如果你要取出来再zadd回去,估计bug一大堆,当然这个可以用策划来弥补,比如胜利了+N积分)
$redis->rankSwap('myrank', 'r1', 'r2');

转载于:https://my.oschina.net/scgywx/blog/285578

redis+lua现实游戏中的一些常用功能相关推荐

  1. DataScience:初学者进阶数学处理专家,学会Excel中50个常用功能带你飞

    DataScience:初学者进阶数学处理专家,学会Excel中50个常用功能带你飞 目录 初学者进阶数学处理专家,学会Excel中50个常用功能带你飞 1.自动筛选 2.在Excel中字符替换 3. ...

  2. Wordpress模板主题中functions.php常用功能代码与常用插件[ 后台篇](持续收集整理)

    用Wordpress建站的初学者一定会需要用到的Wordpress模板主题中functions.php常用功能代码与常用插件.慢慢持续收集整理....... 目录 一.Wordpress模板主题中fu ...

  3. 如何在游戏中快速集成聊天功能

    总览 本文以「人类跌落梦境」游戏为例,讲解如何在游戏场景下使用 LeanCloud IM SDK. LeanCloud 提供的即时通信 SDK 可以应用在多种场景,比如在线客服,直播间弹幕,工作群聊软 ...

  4. 用 Redis 搞定游戏中的实时排行榜,附源码!

    原文:segmentfault.com/a/1190000019139010 1. 前言 前段时间刚为项目(手游)实现了一个实时排行榜功能, 主要特性: 实时全服排名 可查询单个玩家排名 支持双维排序 ...

  5. SpringBoot中使用Thymeleaf常用功能(一):表达式访问数据

    环境搭建: 创建一个Maven项目,按照Maven项目的规范,在src/main/下新建一个名为resources的文件夹,并在下面新建static和templates文件夹. ①  修改pom.xm ...

  6. python中time模块常用功能

    import time time模块提供了大量对时间进行处理的方法 time.time() # 获取当前时间戳,得到自1970年开始的秒数>>>time.time() 1554878 ...

  7. 用Unity实现LOL游戏中聊天对话框的功能

    基于Socket,用UGUI实现游戏场景中玩家的聊天 如图,聊天UI分为两部分:对话框.输入框. 实现的功能如下 1.默认情况下,对话框不可见,按下回车键显示对话框和输入框,鼠标光标在输入框 2.再按 ...

  8. python中的几种copy用法_Python3中copy模块常用功能及其他几种copy方式比较

    1.简单的共享引用: python中内置有小整数常量池和字符串常量池,在某个范围内的相同的数字或字符串分别赋给不同的变量,这些不同的变量都是指向同一块内存地址,这就是所谓的共享引用,举几个简单的例子: ...

  9. SpringBoot中使用Thymeleaf常用功能(三):测试Thymeleaf循环取数据

    搭建环境请参考文章一 在index.html中新建超链接:<a th:href="@{eachtest}">测试循环</a> 新建包com.ysh.thym ...

最新文章

  1. 浅析linux容器--Docker
  2. 厦大肝癌研究成果登《细胞》顶刊背后:一作中途离世,捐献遗体用于医学研究...
  3. AI:2020年6月22日北京智源大会演讲分享之09:00-09:50 全体大会《AI精度与隐私的博弈》
  4. linux进程号函数,linux进程
  5. seo 伪原创_seo伪原创工具(解析新云查新型伪原创模式工具)
  6. mysql create database 语法_MySQL中CREATE DATABASE语法总结
  7. 为全面到来的数字化未来准备就绪 戴尔科技峰会赋能企业数字化发展新动力
  8. 如何在 Ubuntu 上安装 MongoDB
  9. 自己设计个动态屏保吧
  10. 埃加洛尔虚拟服务器,致我终将逝去的二区:新一轮大服务器实装
  11. 电商等一些互联网项目涉及到什么技术?
  12. 淘宝活动应该怎么参加吗?报名活动怎样容易通过?
  13. 该网站服务器出错了怎么回事,该网站服务器出错了是什么意思(图文)
  14. Python批量更改txt文本每行数据
  15. 聊聊Kafka中值得我们学习的优秀设计
  16. GPFS各类排故日志收集汇总
  17. SQL Prompt5 破解版+使用说明
  18. 新绝代双骄3终极全攻略3
  19. cmd:发生系统错误 5。拒绝访问解决方法
  20. html入门之用html给女朋友写封精致的情书--小白直接拿去用,一点难度都没有

热门文章

  1. 7-278 求幂级数展开的部分和 (20 分)
  2. android app固定dp,Android屏幕适配—被偷走的dp
  3. 服务器简历共享文件,通过 NFS 实现服务器目录共享
  4. android屏幕亮度权限,安卓支持将屏幕亮度设为0的方法。
  5. php中configuration,php configuration
  6. sql:MySQL 6.7 表,视图,存储过程结构查询
  7. VMWare虚拟机-锁定文件失败,打不开磁盘的解决办法
  8. [SCOI2005]扫雷(递推)
  9. LeetCode:砖墙【554】
  10. 【Java并发编程】之十一:线程间通信中notify通知的遗漏