V2EX top1ms
 top1ms's recent timeline updates
top1ms

top1ms

V2EX member #345023, joined on 2018-08-28 17:02:38 +08:00
top1ms's recent replies
如题主所说 A 是生产端 B 是消费端 从题主的描述中 有一点我不明白 就是当队列满足 N 以后 队头拿一条数据出队 回收内存?代表队列中的数据可以不用完全消费 可以允许数据丢失吗? 先看你的问题 问题产生的原因是 不加锁重复消费导致数据不正确 加锁呢又导致线程 A 阻塞(这是一个大锁 一锁锁全部) 题主的做法应该是 B 拿出 A 所有数据时 上大锁 A 不能再插入数据了 等 B 处理完以后 清除队列里的数据 释放锁 A 才能插入数据 这样做很明显不好 因为 A 阻塞时(假设你是 web 环境) 只是数据没有入队 但是一样占用了内存空间!!! 而且造成网络阻塞 占用网络资源 所以我的解决思路是这样的 再不考虑生产端和消费端的效率情况下(最坏的情况就是 A 生产端能力大于 B 消费端能力 数据堆积 内存会爆)
--------
问题总结:
1: 不上锁 数据重复性消费
2: 上锁 锁的粒度大 B 操作时 A 不能操作
3: 数据允许丢失?
我的解决思路如下:
1: 如果保证数据不丢失 队列满足 N 时 大于 N 的 找个地方把来不及入队的数据先存起来 如数据库 这样也解决了 部分 生产端能力>消费端能力的问题 再开启一个线程 C 去处理这类数据 不用做 数据重复校验 因为这都是没来得及入队的 B 只会取得队列里的数据。
2: B 做数据重复性处理校验 上一个 number 值 这个 number 值可以是队列中的数据携带 可以是时间戳 记录我当前处理的位置
3 :减小锁粒度 B 获取数据的时候 上锁 有一个全局变量 number 更新这个 number 释放锁 锁是共享资源的竞争 A B 共同竞争的这个小锁 是为了取得 number 值 B 对 number 值进行更新 A 拿 number 值清空队列中的数据 就相当于游标一样撒 A 获取锁的实际就是队列满的时候 然后根据 number 对队列进行清理

--------
考虑不周的 请指正
推荐你学习 Java8 lambda 表达式
测试案例如下:

@Test
public void test02(){
Map<String,Integer> map=new HashMap<>();
map.put("zhangsan",123);
map.put("lisi",123);
map.put("wangmazi",123);
Map<String,Integer> keyMap=map.entrySet()
.stream()
.collect(toMap(castKey().compose(Map.Entry::getKey),Map.Entry::getValue));
keyMap.entrySet().forEach(System.out::println);

}

/**
* @Author: zms
* @Description: 转换成一个 function
* @Date: Create on 2019/4/11 10:57
*/
private Function<String, String> castKey() {
return this::opsForKey;
}

/**
* @Author: zms
* @Description: key 转换规则 默认保留自己自己的自己实现
* @Date: Create on 2019/4/11 10:59
*/
private String opsForKey(String key){
//do something ...
//我这里直接就截取原始 key 值的第一位当作新 key 了吼
// 看你的规则 正则拿出大写字母就 ok 了
return key.substring(0, 1);
}
我目前也在做这个 遇见了 session 放 redis 反序列化出错的问题 我的问题是 SimpleSeesion vaild 这个属性 造成的 看了一下其他的解决方式 添加类 替换管理类 都比较麻烦 我目前的思路是 用一个 map 代理 SimpleSesssion 的参数 自定义的 SessionDAO doReadSession()方法中 再根据 map 里的值转换为 SimpleSession 如果不对 大佬萌指正吼
About     Help     Advertise     Blog     API     FAQ     Solana     922 Online   Highest 6679       Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 13ms UTC 21:22 PVG 05:22 LAX 14:22 JFK 17:22
Do have faith in what you're doing.
(function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){ (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o), m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m) })(window,document,'script','//www.google-analytics.com/analytics.js','ga'); ga('create', 'UA-11940834-2', 'v2ex.com'); ga('send', 'pageview'); ga('send', 'event', 'Member', 'profile', 'top1ms'); ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86