`

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();
        }
      }
    }
   
  }
 
}
 
 

 

 

分享到:
评论

相关推荐

    使用Redis作为消息队列服务场景应用案例

    消息被发送到队列中,“消息队列”是在消息的传输过程中保存消息的容器。在目前广泛的Web应用中,都会出现一种场景:在某一个时刻,网站会迎来一个用户请求的高峰期(比如:淘宝的双十一购物狂欢节,12306的春运抢票...

    Redis 实现队列原理的实例详解

    ·高并发场景,当某个时刻请求瞬间增加时,可以把请求写入到队列,后台在去处理这些请求 ·抢购场景,先入先出的模式 命令: rpush + blpop 或 lpush + brpop rpush : 往列表右侧推入数据 blpop : 客户端阻塞直到...

    基于SpringBoot框架搭建的物联网数据采集系统服务器端(源码)

    * 传感器提交Data数据时使用添加缓存,不直接操作数据库,而是将Data添加到Redis中形成缓存队列,提高并发效率 * 将用户登录信息不直接存入session,而是存入Redis缓存,以实现分布式session共享 * 3.提交Data数据...

    详解centos7 yum安装redis及常用命令

    使用关系型数据库的站点达到一定并发量的时候,往往在磁盘IO上会有瓶颈,这时候配合redis就有一定的优势,因为它具有以下几个特性: 基于内存运行,高并发读写; 支持分布式,理论上可以无限扩展; 丰富的数据...

    2021互联网大厂Java架构师面试题突击视频教程

    28_你能说说redis的并发竞争问题该如何解决吗? 29_你们公司生产环境的redis集群的部署架构是什么样的? 30_分布式缓存相关面试题的回答技巧总结 31_体验一下面试官可能会对分布式系统发起的一串连环炮 32_为什么要...

    aqi:aqi天气信息爬虫、清洗-scrapy+scrapy-redis+selenium+pandas+matplotlib

    利用scrapy+scrapy-redis+selenium爬取aqi天气网全国所有城市的天气信息近50W条scrapy主要用来做并发,非selenium渲染页面下的请求和存储io操作redis可以做增量(城市链接不做指纹)或分布式(继承scrapyredis爬虫类...

    基于SpringBoot框架搭建的物联网数据采集系统服务器端(源码+项目说明).zip

    * 传感器提交Data数据时使用添加缓存,不直接操作数据库,而是将Data添加到Redis中形成缓存队列,提高并发效率 * 将用户登录信息不直接存入session,而是存入Redis缓存,以实现分布式session共享 * 3.提交Data数据...

    Spark离线数仓Flink实时数仓项目源码+部署资料.rar

    存储框架:消息队列(可以实时读取&可以实时写入) ODS:Kafka 使用场景:每过来一条数据,读取到并加工处理 DIM:HBase 使用场景:事实表会根据主键获取一行维表数据(1.永久存储、2.根据主键查询) Kafka:不能长期存储,有...

    jedis使用指南

    你或许会问,incr是原子操作吗,能保证不会出现并发问题吗,不是说了吗,server端是单线程处理请求的。 三、 【跨jvm的锁实现【watch】【multi】】 首先说下这个问题的使用场景,有些时候我们业务逻辑是在不同的jvm...

    从运维角度看中大型网站架构的演变之路

    项目开发完成上线,用户访问量寥寥无几。有一定用户访问量,单台服务器性能有些吃力,想提高并发能力,增加一台服务器,将HTTP请求与SQL操作负载分散不同服务器。...c)增加消息队列和清理Cache程序,入库同时也写入消息

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    多线程与并发 GC机制 GC收集器类型 串行 CMS 并行 G1 算法 复制 标记清理 标记整理 分区 新生代 eden survivor 老年代(old区) 永久代(perm区) 版本变化 1.5 1.6 1.7 1.8 1.9 IO/NIO IO...

    java开源包1

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    java开源包11

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    java开源包2

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    java开源包3

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    java开源包6

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    java开源包5

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    java开源包10

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

    java开源包4

    缓存读取自redis的slave节点,写入到redis的master节点。 Java对象的SQL接口 JoSQL JoSQL(SQLforJavaObjects)为Java开发者提供运用SQL语句来操作Java对象集的能力.利用JoSQL可以像操作数据库中的数据一样对任何Java...

Global site tag (gtag.js) - Google Analytics