redis+lua现实游戏中的一些常用功能
为什么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现实游戏中的一些常用功能相关推荐
- DataScience:初学者进阶数学处理专家,学会Excel中50个常用功能带你飞
DataScience:初学者进阶数学处理专家,学会Excel中50个常用功能带你飞 目录 初学者进阶数学处理专家,学会Excel中50个常用功能带你飞 1.自动筛选 2.在Excel中字符替换 3. ...
- Wordpress模板主题中functions.php常用功能代码与常用插件[ 后台篇](持续收集整理)
用Wordpress建站的初学者一定会需要用到的Wordpress模板主题中functions.php常用功能代码与常用插件.慢慢持续收集整理....... 目录 一.Wordpress模板主题中fu ...
- 如何在游戏中快速集成聊天功能
总览 本文以「人类跌落梦境」游戏为例,讲解如何在游戏场景下使用 LeanCloud IM SDK. LeanCloud 提供的即时通信 SDK 可以应用在多种场景,比如在线客服,直播间弹幕,工作群聊软 ...
- 用 Redis 搞定游戏中的实时排行榜,附源码!
原文:segmentfault.com/a/1190000019139010 1. 前言 前段时间刚为项目(手游)实现了一个实时排行榜功能, 主要特性: 实时全服排名 可查询单个玩家排名 支持双维排序 ...
- SpringBoot中使用Thymeleaf常用功能(一):表达式访问数据
环境搭建: 创建一个Maven项目,按照Maven项目的规范,在src/main/下新建一个名为resources的文件夹,并在下面新建static和templates文件夹. ① 修改pom.xm ...
- python中time模块常用功能
import time time模块提供了大量对时间进行处理的方法 time.time() # 获取当前时间戳,得到自1970年开始的秒数>>>time.time() 1554878 ...
- 用Unity实现LOL游戏中聊天对话框的功能
基于Socket,用UGUI实现游戏场景中玩家的聊天 如图,聊天UI分为两部分:对话框.输入框. 实现的功能如下 1.默认情况下,对话框不可见,按下回车键显示对话框和输入框,鼠标光标在输入框 2.再按 ...
- python中的几种copy用法_Python3中copy模块常用功能及其他几种copy方式比较
1.简单的共享引用: python中内置有小整数常量池和字符串常量池,在某个范围内的相同的数字或字符串分别赋给不同的变量,这些不同的变量都是指向同一块内存地址,这就是所谓的共享引用,举几个简单的例子: ...
- SpringBoot中使用Thymeleaf常用功能(三):测试Thymeleaf循环取数据
搭建环境请参考文章一 在index.html中新建超链接:<a th:href="@{eachtest}">测试循环</a> 新建包com.ysh.thym ...
最新文章
- 浅析linux容器--Docker
- 厦大肝癌研究成果登《细胞》顶刊背后:一作中途离世,捐献遗体用于医学研究...
- AI:2020年6月22日北京智源大会演讲分享之09:00-09:50 全体大会《AI精度与隐私的博弈》
- linux进程号函数,linux进程
- seo 伪原创_seo伪原创工具(解析新云查新型伪原创模式工具)
- mysql create database 语法_MySQL中CREATE DATABASE语法总结
- 为全面到来的数字化未来准备就绪 戴尔科技峰会赋能企业数字化发展新动力
- 如何在 Ubuntu 上安装 MongoDB
- 自己设计个动态屏保吧
- 埃加洛尔虚拟服务器,致我终将逝去的二区:新一轮大服务器实装
- 电商等一些互联网项目涉及到什么技术?
- 淘宝活动应该怎么参加吗?报名活动怎样容易通过?
- 该网站服务器出错了怎么回事,该网站服务器出错了是什么意思(图文)
- Python批量更改txt文本每行数据
- 聊聊Kafka中值得我们学习的优秀设计
- GPFS各类排故日志收集汇总
- SQL Prompt5 破解版+使用说明
- 新绝代双骄3终极全攻略3
- cmd:发生系统错误 5。拒绝访问解决方法
- html入门之用html给女朋友写封精致的情书--小白直接拿去用,一点难度都没有
热门文章
- 7-278 求幂级数展开的部分和 (20 分)
- android app固定dp,Android屏幕适配—被偷走的dp
- 服务器简历共享文件,通过 NFS 实现服务器目录共享
- android屏幕亮度权限,安卓支持将屏幕亮度设为0的方法。
- php中configuration,php configuration
- sql:MySQL 6.7 表,视图,存储过程结构查询
- VMWare虚拟机-锁定文件失败,打不开磁盘的解决办法
- [SCOI2005]扫雷(递推)
- LeetCode:砖墙【554】
- 【Java并发编程】之十一:线程间通信中notify通知的遗漏