在PHP中,Redis是一个强大的键值存储系统,常用于数据缓存、消息队列、分布式锁等场景。本文将深入探讨如何使用PHP与Redis进行常见操作,并提供实例代码供参考。 1. **简单的字符串缓存** 在PHP中,Redis可以用于缓存SQL查询结果,以提高性能。以下是一个例子,当查询`tb_order`表的最新10条记录时,首先尝试从Redis获取已缓存的数据,如果没有则从数据库中查询并缓存结果。 ```php $redis = new Redis(); $redis->connect('127.0.0.1', 6379, 60); $sql = 'select * from tb_order order by id desc limit 10'; $key = md5($sql); $data = $redis->get($key); if (!$data) { $data = $db->query($sql); $data = json_encode($data, JSON_UNESCAPED_UNICODE); $redis->set($key, $data, 60); } print_r(json_decode($data, true)); ``` 2. **通过列表模拟简单队列** Redis的List数据结构可以用于模拟队列。在发送邮件或者处理秒杀场景中,可以将任务序列化存入List,然后多进程或多线程读取并执行任务。 ```php $redis = new Redis(); $redis->connect('127.0.0.1', 6379, 60); for ($ix = 0; $ix < 1000; $ix++) { $redis->lPush('send_email_queue', json_encode(['id' => $ix, ...])); } while ($count = $redis->lLen('send_email_queue')) { $task = $redis->rpop('send_email_queue'); $task = json_decode($task, true); $mailer->send($task['send'], $task['receive'], $task['title'], $task['body']); echo "任务 {$task['id']} 邮件发送成功<br>"; } ``` 3. **乐观锁实现** 乐观锁通过`watch`和`multi`命令实现。在修改数据前,`watch`会监控指定的key,如果在事务执行过程中key的值被改变,事务会失败。例如,在商品库存减一操作中,可以使用乐观锁防止并发导致的超卖问题: ```php $redis = new Redis(); $redis->connect('127.0.0.1', 6379, 60); $redis->set('goods_stock_nums', 100); $redis->watch('goods_stock_nums'); $redis->multi(); $redis->decr('goods_stock_nums'); if ($redis->exec()) { echo '抢购成功'; } else { echo '数据错误,请重新再试'; } ``` 4. **悲观锁实现** 悲观锁可以通过`set`命令配合`nx`(not exists)或`xx`(exists)选项实现。在操作前设置一个临时key,表示锁的状态,完成后再删除。下面的例子展示了如何在抢购操作中使用悲观锁: ```php function lock($key, $timeout) { $redis = getRedis(); return $redis->set($key, '', ['nx', 'ex' => $timeout]); } function unlock($key) { $redis = getRedis(); return $redis->del($key); } $lockKey = 'goods_lock'; if (lock($lockKey, 30)) { // 执行抢购逻辑 // ... unlock($lockKey); } else { echo '商品已被抢购完,请稍后再试'; } ``` 5. **发布/订阅(Publish/Subscribe)** Redis的发布/订阅功能允许消息广播到多个订阅者。在PHP中,可以创建发布者发布消息,同时创建多个订阅者监听特定频道并处理消息。 发布者: ```php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->publish('news_channel', 'New article published!'); ``` 订阅者: ```php $redis = new Redis(); $redis->connect('127.0.0.1', 6379); $redis->subscribe(['news_channel'], function ($redis, $channel, $message) { echo "Received message on {$channel}: {$message}\n"; }); ``` 以上是PHP使用Redis进行字符串缓存、队列模拟、乐观锁和悲观锁以及发布/订阅操作的基本示例。在实际应用中,可以根据业务需求进行更复杂的组合和优化。了解并熟练掌握这些基本操作,将有助于提升PHP应用的性能和扩展性。
- 粉丝: 4
- 资源: 925
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助