##这几天就开始总结下redis,我们经常用的命令,以及实例吧!!!!
redis 队列 List
常用命令:
blpop删除,并获得该列表中的第一元素,或阻塞,直到有一个可用
brpop删除,并获得该列表中的最后一个元素,或阻塞,直到有一个可用
brpoplpush
lindex获取一个元素,通过其索引列表
linsert在列表中的另一个元素之前或之后插入一个元素
llen获得队列(List)的长度
lpop从队列的左边出队一个元素
lpush从队列的左边入队一个或多个元素
lpushx当队列存在时,从队到左边入队一个元素
lrange从列表中获取指定返回的元素
lrem从列表中删除元素
lset设置队列里面一个元素的值
ltrim修剪到指定范围内的清单
lpop从队列的右边出队一个元素
rpoplpush删除列表中的最后一个元素,将其追加到另一个列表
rpush从队列的右边入队一个元素
rpushx从队列的右边入队一个元素,仅队列存在时有效
例子:简单的存储队列,取出队列
<?php
include("logs.php");//引入的日志类
$redis = new Redis();
$redis->connect('127.0.0.1', 6379);
$arr = [['zhangsan'],['lisi'],['wanngwu'],['zhaoliu'],['xiaoqi']];
foreach($arr as $k => $v ){
$v = json_encode($v); //数组转换成string去存储
//将这些放入队列中
$redis->rpush("mylist",$v);
//记录日志
write_log($v,'redis_list');
}
//查看队列中存进去了多少数据
$len = $redis -> llen("mylist");
//根据长度去循环,发布队列
for ( $i=0 ; $i< $len; $i++ ) {
$redisList = json_decode($redis->lpop("mylist"),true);
}
?>
这个是最简单的队列,我做的最多的是用队列去发布债匹系统的用户信息,但是订单中心那边在生成订单 在加入队列的时候,会同时入库好几次同样的订单号或者一个人点击生成的多个订单(这个有时候外部掌握刷接口也会导致),所以我们解决方案!
排查分析:1.前端页面没有控制点击次数,一个人会生成多条数据,或者是同一时间的多少秒之内是不允许生生订单的
2.后端数据没有在加入队列的时候设置一个订单的存储的时间做标示
3.那就是分布存贮订单号和用户id,判断以上是否是同一个人去刷接口
4.就是利用事物try catch ,在事物中使用sleep去停留几秒
以上的话,就会多出好几个redis的存储裤,别看比较起来比较麻烦,如果真的出问题,到后期放款的时候白花花的银子就给人家了,还要不回来,这是责任啊
用户id和,订单库(哈希)
队列库
三方只要有一方失败,事物就会回滚
先对比当前用户在一段时间内生生几个订单,对应着的时间,当前的订单号在里面是否存在,如果不存在那就判断当前的时间和最后一个入库的时间是否小于设定的时间,当不小于的时候继续执行,订单信息入队列
laravel 队列利用redis 和queued类包,然后实现的