Redis 在 Web 项目中的应用与实践

本文介绍了Redis在Web项目中的应用,包括消息队列的使用,如RPush/LPop实现简单队列,ZAdd/ZRangeByScore实现带有消费时间的消息队列。还讨论了分布式锁的实现,提出了两种方案,强调了加锁与释放锁的原子性,并提出了优化建议,以避免锁的误删和提高系统稳定性。
摘要由CSDN通过智能技术生成

$queueKey = “queue”;

// 生产者
r e d i s − > r p u s h ( redis->rpush( redis>rpush(queueKey, $data)

// 消费者
while (true) {
$data = r e d i s − > l p o p ( redis->lpop( redis>lpop(queueKey);
if (null === KaTeX parse error: Expected 'EOF', got '}' at position 77: …/ 业务逻辑 ... }̲由于没有消息时使用的sleep…queueKey = “queue”;

// 生产消息

// 消费时间, 这里设置为1小时候
$consumeTimestamp = time() + 3600;
// $data需要添加随机串前缀(or后缀),防止出现重复member被丢弃
$data = $data . md5(uniqid(rand(), true));
r e d i s − > z a d d ( redis->zadd( redis>zadd(queueKey, $consumeTimestamp, $data);

// 消费消息
while (tue) {
$arrData = r e d i s − > z r a n g e b y s c o r e ( redis->zrangebyscore( redis>zrangebyscore(queueKey, 0, time());
if (! a r r D a t a ) u s l e e p ( 100000 ) ; c o n t i n u e ; / / 业 务 逻 辑 f o r e a c h ( arrData) { usleep(100000); continue; } // 业务逻辑 foreach ( arrData)usleep(100000);continue;//foreach(arrData as $data) {
d a t a = s u b s t r ( data = substr( data=substr(data, 0, strlen($data) - 32);

    // 消费$data

}

}多消费者使用pub/sub主题订阅者模式,可以实现1:N的消息队列。这种模式中在消费者下线的情况下,生产的消息会丢失,在这里不推荐使用。需要强调的是不推荐使用redis作为消息队列服务,这不是redis的设计目标。如果一定要用可考虑 disque,是由redis的作者开发。分布式锁分布式锁主要解决的几个问题:互斥性: 同一时刻只能有一个服务(或应用)访问资源安全性: 锁只能被持有该锁的服务(或应用)释放容错: 在持有锁的服务crash时,锁仍能得到释放避免死锁方案1我们可能会考虑使用 setnx 和 expire 命令来实现加锁,即当没有key存在时才会成功写入value:$lockStatus = r e d i s − > s e t n x ( redis->setnx( r

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值