PHP结合redis

1 篇文章 0 订阅

链接redis及类型基本操作

// 普通链接redis
$redis->connect('127.0.0.1', '6379');
$redis->auth('password');
// 使用tp链接redis
$redis  =  new  Redis(config('cache.redis'));   // 链接redis

String操作

$redis->set('str', '123456'); // redis字符集写入
dump($redis->get('str')); // redis字符集获取
// 输出结果:
123456

// 修改数据直接写入覆盖就OK
$redis->set('str', '123');
$redis->set('str', 123, 10); // 有效期为10秒
// $redis->setex('str', 10, 123); // 有效期为10秒
echo $redis->get('str');  // 结果为123

// 创建多个mset
$list = array('k1' => 'v1', 'k2' => 'v2', 'k3' => 'v3');
$redis->mset($list);
dump($redis->mget(array_keys($list)));

// 递增incr,递减decr
$redis->incr('num');
$redis->decr('num');
$redis->incrby('num', 10) //指定递增数字
$redis->decrby('num', 10) //指定递减数字
$redis->incrByFloat('num', 1.5); //键值加减小数。减为负数即可

// 删除key
$redis->del('str');

List操作

$redis->lPush('xiao', 'A'); // 从左插入队列
$redis->lPush('xiao', 'B'); // 从左插入队列
$redis->rPush('xiao', 'C'); // 从右插入队列
// 遍历key从左开始
dump($redis->lrange('xiao', 0, 2));
// 输出结果为:
array(3) {
  [0] => string(1) "B"
  [1] => string(1) "A"
  [2] => string(1) "C"
}

// 从左侧索引为0的修改成Y
$redis->lSet('xiao', 0, 'Y');
dump($redis->lrange('xiao', 0, 2));
// 输出结果为:
array(3) {
  [0] => string(1) "Y"
  [1] => string(1) "A"
  [2] => string(1) "C"
}

echo  $redis->lLen('xiao');  // 获取key长度
// 删除队列最左侧一个切输出
echo $redis->lPop('xiao');
echo $redis->rPop('xiao');  // 右侧开始

Hash操作

$redis->hSet('hash', 'key', 'value');
dump($redis->hKeys('hash')); // hash所有的键
dump($redis->hVals('hash')); // hash所有的值
echo $redis->hGet('hash', 'key');
echo $redis->hGetAll('hash'); // 获取hash所有键值

// hExists判断key键是否存在,返回bool值
var_dump($redis->hExists('hash', 'key'));

// del删除
$redis->del('hash');
$redis->hDel('hash', 'key')

// hMset以数组形式添加多个,hMget获取多个
$redis->hMset('max', array('k1' => 'v1', 'k2' => 'k2'));
dump($redis->hMget('max', array('k1', 'k2')));

set集合

$sets1 = $redis->sAdd('key1', 'value1', 'value2'); // 创建集合
$sets2 = $redis->sAddArray('key2', array('value1',  'value2', 'value3'));

//取两个集合的并集
$union  =  $redis->sUnion('key1', 'key2');
// array(3) { [0]=> string(6) "value2" [1]=> string(6) "value1" [2]=> string(6) "value3" }
$redis->sUnionStore('store', 'key1', 'key2'); // 将key1和key2并集值存入store,返回bool

//取两个集合的交集
$inter  =  $redis->sInter('key1', 'key2');
// array(2) { [0]=> string(6) "value2" [1]=> string(6) "value1" }
$redis->sInterStore('store', 'key1', 'key2'); // 将key1和key2交集值存入store,返回bool

//取两个集合的差集
$diff  =  $redis->sDiff('key1', 'key2');
// array(0) { }

$redis->sRem('key1' , 'value1'); // 删除该集合中的value1
$redis->sMove('key1','key2','value1'); // 将key1中的value1移到key2返回bool
$redis->sIsMember('key1','value'); // 判断value是否为key1中的值
$redis->sCard('key1'); //返回长度
$redis->sRandMember('key1'); // 随机返回一个值
$redis->sPop('key1'); // 所及返回一个值且删除

zset有序集合

// 添加数据
$redis->zAdd('zset', 80, '张三');
$redis->zAdd('zset', 90, '李四');
$redis->zAdd('zset', 70, '王五');

$redis->zCard('zset'); // 获取有多少学员
$redis->zScore('zset', '张三'); // 获取张三的分数
$redis->zIncrBy('zset', 10, '张三'); // 给张三同学加10分

// 获取指定学员的排名,从0开始
$redis->zRank('zset', '张三'); // 从低到高排序的名次
$redis->zRevRank('zset', '王五'); // 从高到低排序的名次
$redis->zRangeByScore('zset', 75, 100); // 返回指定分数范围内从低到高排序的成员

$redis->zCount('zset', 2, 10); // 获取zset中score在区间[2, 10]元素的个数
$redis->zRemRangeByScore('zset', 1, 3); // 移除zset中score在区间[1, 3](含边界)的元素
$redis->zRemRangeByRank('zset', 0, 1);  //默认元素score是递增的,移除zset中元素 从0开始到-1位置结束

// 删除成员
$redis->zRem('zet', '王五');

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PHP Redis超卖是指在使用PHPRedis实现商城秒杀功能时,由于并发操作导致商品库存被多次减少,最终超出了实际库存数量。具体来说,对于秒杀活动,当多个用户同时请求购买同一件商品时,如果不采取合适的措施,可能会导致库存被重复减少,从而造成超卖的情况。 在给出解决方案之前,我们先了解下引用内容中的两种解决超卖问题的方法: 引用中的方法是使用Redis的原子性的递增递减操作来处理超卖问题。首先,从Redis中取出商品的库存数量,然后使用Redis的decr操作对库存进行减1操作。如果减1后的库存小于等于0,表示商品已经售罄,抛出异常。接下来,使用MySQL的事务对商品库存进行减1操作,并将订单信息写入数据库。如果事务执行成功,则提交事务;如果事务执行失败,则回滚事务,并将库存恢复到之前的值。 引用中的方法是使用malkusch/lock库来实现加锁操作。首先,通过传入一个Predis实例创建一个锁,并设置锁的释放时间为10秒。然后,在加锁的代码块内执行秒杀逻辑,包括从数据库获取库存数量并进行减1操作,并将订单信息写入数据库。最后,释放锁。 为了解决超卖问题,可以综合以上两种方法来进行处理。首先,使用Redis的decr操作对库存进行减1操作,并判断减1后的库存是否小于等于0,如果是则表示商品已经售罄,抛出异常。接下来,使用malkusch/lock库进行加锁操作,确保在并发情况下只有一个请求能够执行秒杀逻辑。在加锁的代码块内,执行MySQL的事务操作,包括对商品库存进行减1操作和将订单信息写入数据库。如果事务执行成功,则提交事务;如果事务执行失败,则回滚事务,并将库存恢复到之前的值。 综上所述,通过结合Redis的原子性操作和加锁操作,可以有效地解决PHP Redis超卖问题。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [php+redis实现商城秒杀功能](https://download.csdn.net/download/weixin_38680247/12959117)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [php 解决超卖的几种方案(redis锁、mysql悲观锁)](https://blog.csdn.net/weixin_39734609/article/details/120302338)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值