如何使用Redis 做队列操作

2025-05-18 03:21:31
推荐回答(1个)
回答1:

  现在的项目,都是部署在多个服务器,或者多个IP上,而且前台经由F5分发,所以用户的请求究竟落在那一台的服务器上,是无法确定的。对于项目中,有一秒杀设计,刚开始没有考虑到这种部署,同时也是使用最容易处理的方式,直接给数据库表锁行记录(Oracle上的)。可以说,对于不同的应用部署,而只有一台数据库服务器来说,很“轻松”的就解决了这个并发的问题。所以现在考虑一下,是不是挪到应用上,避免数据库服务器也掺杂到业务上。

比如,现在有2台应用服务器,1台数据库服务器。想法是,把Redis部署在数据库服务器上,两台服务器在操作并发缓存或者队列时,先从Redis服务器上,取得在两台应用服务器的代理对象,再做入列出列的操作。

看代码实现(PHP)

  Java代码
  入队列操作文件 list_push.php
  
    $redis = getRedisInstance();//从Redis服务器拿到redis实例
  $redis->connect('Redis服务器IP', 6379);
  while (true) {
  $redis->lPush('list1', 'A_'.date('Y-m-d H:i:s'));
  sleep(rand()%3);
  }
  ?>
  
  执行# php list_push.php &
  
  出队列操作 list_pop.php文件
    $redis = getRedisInstance();//从Redis服务器拿到redis实例
  $redis->pconnect('Redis服务器IP', 6379);
  while(true) {
  try {
  var_export( $redis->blPop('list1', 10) );
  } catch(Exception $e) {
  //echo $e;
  }
  
  }
  
  实现方法(Python)
  
  1.入队列(write.py)
  
  #!/usr/bin/env python
  
  import time
  
  from redis import Redis
  
  
  
  redis = Redis(host='127.0.0.1', port=6379)
  
  while True:
  
  now = time.strftime("%Y/%m/%d %H:%M:%S")
  
  redis.lpush('test_queue', now)
  
  time.sleep(1)
  
  2.出队列(read.py)
  
  #!/usr/bin/env python
  
  import sys
  
  from redis import Redis
  
  
  
  redis = Redis(host='127.0.0.1', port=6379)
  
  while True:
  
  res = redis.rpop('test_queue')
  
  if res == None:
  
  pass
  
  else:
  
  print str(res)

在操作时,注意,要操作的是同一个list对象。

呵呵,现在的主要思路就差不多就是如此,不过真实场景中,会有出入。