V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  woodensail  ›  全部回复第 23 页 / 共 48 页
回复总数  945
1 ... 19  20  21  22  23  24  25  26  27  28 ... 48  
2020-05-19 19:36:37 +08:00
回复了 yuk1no 创建的主题 问与答 一道面试题给我整懵了,求指导
我又去查了下布隆过滤器的 wiki 。算了下误报率。
按 4GB 的过滤器存储 100 亿条数据来算,如果是最简单的只用 1 个 hash,则误判率约为 0.01 ;
而理论最佳值是用约 70 个 hash,此时误报率是 1e-23 。碰撞概率微乎其微。
不过 70 个 hash 代价有些大,可以折中一下,10 个 hash 时误报率 6e-11,5 个 hash 时误报率 2.8e-7 。个人认为 5 个 hash 是个不错的选择,穿透缓存的概率不算大,计算效率也不算太低。

所以最终方案 100 亿条数据,使用双布隆过滤器一共消耗 8GB 内存,hash 数量 5,有不到百万分之一的概率被穿透。还算可以吧。
2020-05-19 18:43:39 +08:00
回复了 yuk1no 创建的主题 问与答 一道面试题给我整懵了,求指导
嗯,再扩展一下,布隆过滤器的误报其实是可以解决的。用两个布隆过滤器,第一个用来标记碰撞,读取的时候先检查该过滤器,如果发现碰撞就穿透到数据库或者下一级缓存手段。没发现碰撞的话,则跟据第二个过滤器来判断是否有效。

然后写入的时候一般往第二个过滤器写,如果发现打算写的位置已经被写过,则认为发生碰撞,去第一个过滤器写碰撞标记。
2020-05-19 18:37:50 +08:00
回复了 yuk1no 创建的主题 问与答 一道面试题给我整懵了,求指导
@woodensail 啊,有个错别字,bitmap
2020-05-19 18:37:31 +08:00
回复了 yuk1no 创建的主题 问与答 一道面试题给我整懵了,求指导
哈,楼上这么一提我倒是想起了布隆过滤器。楼上说的 butmap 应该就是指这个吧。
要是对正确性要求不高的话,按楼上那样 hash 后取 hash 结果的一部分来做布隆过滤器。取的位数越多,错误概率越小,内存占用越大。40 位的布隆过滤器需要 4GB 内存。
2020-05-19 17:39:11 +08:00
回复了 yuk1no 创建的主题 问与答 一道面试题给我整懵了,求指导
@vnex 以前后端的同事做过这种需求。

似乎是这样:使用 ng 来进行流量分发。
执行扩容时,先把新集群进行预热,按配置文件将特定 id 范围的数据从老集群复制到新集群。(包括新的写入)
预热完毕后 ng 切到新规则,部分 id 段打到老集群,部分 id 段打到新集群,集群内部再分片,从而平衡新老集群的负载

大概是这样吧,我只是跟他们聊天的时候听说过,具体细节不清楚。
2020-05-18 11:30:28 +08:00
回复了 just1 创建的主题 生活 现在便宜快递都不送上门了?
我在我家那边已经进菜鸟的黑名单了,所以现在都寄公司。寄公司也方便,直接去前台拿,拿了就下地库扔车上,比寄回家方便多了。
2020-05-18 10:08:44 +08:00
回复了 tairan2006 创建的主题 小米 小米 10pro 从车库出来 100%断流…
我有类似情况,红米 n8p,双卡,移动的没问题,离开屏蔽环境后立刻就有信号。
联通的离开屏蔽环境后,会出现完全没信号,或者信号满格但是无网络的情况。一般开飞行模式两秒再关闭就行,我没试过长时间等待是否会自动恢复。
2020-05-13 14:51:23 +08:00
回复了 AaronChan 创建的主题 南京 本科不用落户都能买房了?
额,南京买房需要落户?不都是买了房才能落户吗。
@yazoox 后来有想过,不过已经跳槽了也就不管了。如果用 async 的话有几个优势,首先整个流程在同一个方法中,可以随时 return 退出后续步骤,在扫尾处理方面会简单很多。
另外由于 async 中可以直接 for 循环执行异步语句,所以不需要用 promise 迭代的方式来顺序执行数组中的任务,也让代码可读性大幅提高。

整体的话估计开发难度不到原来的一半,代码量下降不多但是可读性大幅提升。
@ysc3839 嗯,我当年刚知道 promise 这个特性的时候非常兴奋,然后很快就被业务教做人了。
一个医保的业务,需要
1:访问自家服务器获取订单信息(包含多个账单)
2:访问医保服务器做预结算
4:循环访问医保服务器,一个一个创建账单
3:访问自家服务器记录账单
5:循环访问医保服务器,一个一个确认账单
5:访问自家服务记录结果
其中任何一步失败都要跳过后续步骤,并且记录失败信息。如果失败时已经有部分账单被创建需要进行取消;如果有部分账单已经确认,需要进行退费。

最后用皮肉面色写出来一坨屎山,太绝望了,过去这么多年,我都再也没碰到过这大的屎山了
@ysc3839 @ysc3839 接上面那个例子说下 promise 解决回调地狱后带来的新问题。

1:作用域分裂,比如 fun3 中请求的得到的结果在 fun4 要使用,但是直接在 fun3 和 4 的作用域不是同一个。所以直接在 fun3 中定义变量无效,必须把变量声明提前到 fun1 执行之前。

2:流程控制困难,比如 fun2 中请求结果显示流程不能继续执行,需要退出。
这时候没法跳过 345 的执行,要么 fun2 通过变量或返回值来通知,在 345 的开头分别判断一下标志,有标志就直接退出。
或者直接抛异常来跳过后面的步骤,但这样一样,业务流程就和真正的异常混在了一起,给异常治理带来了麻烦。
@ysc3839 你看我写的,then 是可以链式调用的,fun1().then(fun2).then(fun3).then(fun4).then(fun5)
只额外包了一层而已。
不会出现回调地狱那样左边 tab 半个屏幕的情况。
@ysc3839 是的啊,我上面也说了,promise 在解决回调地狱后也带来了作用域分裂,流程控制困难等新的问题,不是个完美的解决方案。直到 generator 诞生才彻底解决了问题。
@sunjourney 那啥,不知道你为什么会这么认为,但是我确实没读过他的文章
@ysc3839 额,那是你用法不对,promise 的正确用法是 fun1().then(fun2).then(fun3)这样,无论多少个异步操作,只需要一层回调即可。缺点就是上面说的你没法直接 return,想 rutern 就只能抛异常,然后就把异常信息污染了。
另外再说下关于语法糖的问题,我一般把 async/await 看做 generator,因为 async/await 核心的异步挂起和作用域保持功能已经在 generator 实现了,就算没有 async/await,要不了多少代码也能封装类似的功能出来。

而 promise 到 generator 虽然也能通过 regenerator 的方式来实现,但是缺少作用域保持和异步挂起。
只能通过套一个函数保持作用域,然后多次调用同一个方法,通过 switch case 方式来分片执行。而你的原始代码也被编译得面目全非。是个非常不优雅的 hack 手段。远不如原生的 generator 好。
先有 promise,解决了回调地狱的问题。但是副作用是一段逻辑被切分到多个作用域中,且 return 和异常都被拦截。因为本质上 js 一个函数必须同步执行完毕,想实现异步只能用多个函数来实现。

然后有了 generator,generator 的创举在于允许一个函数执行到一半挂起,等异步回调后继续执行,完美的解决了 promise 带来的副作用。

而 async/await 本质上是 generator 在特殊场景下使用时的一个语法糖而已,省得你去依赖 co 模块了。

至于文章手头还真没有,毕竟也是很老的东西了……
2020-05-09 09:25:57 +08:00
回复了 formulahendry 创建的主题 职场话题 一年时间,我为什么只成功内推 31 人拿到微软 offer?
一年内推 31 个?那是不是奖励比本职工资还高了
1 ... 19  20  21  22  23  24  25  26  27  28 ... 48  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1617 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 25ms · UTC 16:46 · PVG 00:46 · LAX 08:46 · JFK 11:46
Developed with CodeLauncher
♥ Do have faith in what you're doing.