V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  top1ms  ›  全部回复第 1 页 / 共 1 页
回复总数  3
2019-11-27 19:00:29 +08:00
回复了 imiao 创建的主题 C++ 请教 C++多线程操作 deque 遇到的一个问题
如题主所说 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 对队列进行清理

--------
考虑不周的 请指正
2019-04-11 11:14:13 +08:00
回复了 13192262269 创建的主题 程序员 请教 Java 如何更改 map 里面的 key
推荐你学习 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);
}
2018-12-26 09:47:28 +08:00
回复了 liuhuansir 创建的主题 Java 咨询 spring+shiro+redis 做 session 共享问题
我目前也在做这个 遇见了 session 放 redis 反序列化出错的问题 我的问题是 SimpleSeesion vaild 这个属性 造成的 看了一下其他的解决方式 添加类 替换管理类 都比较麻烦 我目前的思路是 用一个 map 代理 SimpleSesssion 的参数 自定义的 SessionDAO doReadSession()方法中 再根据 map 里的值转换为 SimpleSession 如果不对 大佬萌指正吼
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3050 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 13ms · UTC 12:42 · PVG 20:42 · LAX 04:42 · JFK 07:42
Developed with CodeLauncher
♥ Do have faith in what you're doing.