redis并发写入队列中


最近项目中有个需求,需要在redis缓存中存储计数功能,计数应用中的异常数据,到达一定阈值的时候发送邮件 短信警报处理。


由于redis中并发没有锁功能,所以并发写数据时将value值写入到队列中。

 

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
public class RedisCur {
  public static void main(String[] args) {
    List<Future> futures = new ArrayList<Future>();
    ExecutorService executorService = Executors.newCachedThreadPool();
    for (int i = 0; i < 100; i++) {
      futures.add(executorService.submit(new WriteRedis(String.valueOf(i))));
    }
  }
 
}
 
 
 
public class WriteRedis implements Runnable {
  private String value;
  /**
   * @param value
   */
  public WriteRedis(String value) {
    super();
    this.value = value;
  }
  
  public void run(){
    Jedis jedisClient = new Jedis("127.0.0.1", 6379);
    try {
      String threadName = Thread.currentThread().getName();
      jedisClient.lpush("LOCK", value);
      System.err.println(threadName + "-" + value);
    } catch (Exception e) {
      e.printStackTrace();
    }
   
  }
 
}
 

 




以上代码通过并发将值写入到队列中

后面是另起一个线程读取队列中的value值进行计数功能,目前能想到的比较简单,起了个线程一直去请求队列中的信息。

本来是想做个监听的功能,队列中有数据是推送过来,但是redis没有更新推送类似消息队列的功能,暂且搞个简单的,后续看看是否还有其他的办法

 

public class RedisListener {
  
  public static void main(String[] args) {
    Listener thread1 = new Listener();
    thread1.start();
  }
 
 
}
 
 
import redis.clients.jedis.Jedis;
public class Listener extends Thread {
 
  @Override
  public void run() {
    Jedis jedisClient = new Jedis("127.0.0.1", 6379);
    while (true) {
      String value = jedisClient.lpop("LOCK");
      
      System.err.println(value);
      if (value == null) {
        try {
          System.err.println("================移除完成");
          Thread.sleep(1000);
          System.err.println("================继续监控");
        } catch (InterruptedException e) {
          e.printStackTrace();
        }
      }
    }
   
  }
 
}
 
 

猜你喜欢

转载自ttkx1988.iteye.com/blog/2325947
今日推荐