Rs eval及事物应用场景探讨

Redis PHP文档地址:https://github.com/phpredis/phpredis#eval
命令行文档地址:http://doc.redisfans.com/script/eval.html

命令简介
从Rs 2.6开始通过内置的Lua解释器,可以使用eval命令对脚本进行求值

$rs = new Redis();
$obj = $rs->connect(127.0.0.1,6379);
//如果有密码 $obj = $rs->auth('you pass');

$obj->eval("return 'test'");  //返回一个test字符串
$obj->eval("return redis.call('incr','num')"); //返回一个key为num 自增1的值
//还可以执行多条命令
$obj->eval("return {redis.call('incr','num'),redis.call('incrBy','num2')}");

什么是事物?
事物遵循四要素
1、原子性 2、隔离性 3、持久性 4、一致性
在Rs中的事物
MULTI, EXEC, DISCARD 和WATCH命令是Redis事物的基本操作
1、原子性:通过watch监控一个或多个Key如果值被其它命令更改,那么操作失败
2、一致性:在命令执行期间 保证数据不被破坏
3、隔离性:在事物执行期间不允许,其它事物进行操作
4、持久性:一旦执行成功,对数据修改为永久性操作
PS:在某些方面来说 Rs不是一个符合ACID的事物

$rs = new Redis();
$obj = $rs->connect(127.0.0.1,6379);
//如果需要监控 需要在事物开启之前进行 例如$obj->watch(key);
$obj->multi()
    ->set(key,val)
    ->lpush(key,val)
    ->exec();

需求背景
推广计数-接口中使用Rs 进行有效浏览计数
1、当前推广-浏览总人数
2、当前推广-浏览人信息列表
3、当前推广-浏览人产生增价总值
需要对3个Rs信息分别进行 incr incrByFloat lPush

设计之初,仅对必要条件进行简单校验,后直接顺序执行三个操作
这会产生不可预知BUG
如:高并发下 浏览人(get)溢出,增价溢出,某命令执行失败,后续操作无法进行

设计之二,对接口需要存储的信息,使用事物且进行key监控
在高并发使用场景下可能造成事物阻塞 ,且取值的时候因为是先取后插 所以值会存在偏差

设计之三,因数据在创建订单后会删除,且有效期为7天。根据判断重要性排序后
1、优先判断重复浏览 sadd
2、有效浏览限制最大值 incr
3、累加浏览产生的增价总值 incrByFloat
4、添加有效浏览列表 lpush
只在插入失败重试 且不考虑第几步失败, 限制人数即可(死道友不死贫道系列)

你可能感兴趣的:(Rs eval及事物应用场景探讨)