首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  luw2007  ›  全部回复第 1 页 / 共 11 页
回复总数  218
1  2  3  4  5  6  7  8  9  10 ... 11  
93 天前
回复了 miniliuke 创建的主题 数据库 MongoDB 数据结构方案疑问
这个没有最好的方案。 取决于但一个用户的任务数,以及操作读写占比,业务流程。
结构 3 {userid:xx,tasks:{taskid:{k:v...}}}
@lhx2008 ttl 设置短点,比如。 让内存里面维护的少一点对象。
或者换策略,allkey-lru 呢?
压缩数据呢?
每条数据接近 1k 大小,压缩掉 20%看看。
@Breadykid 大叔一个。
看业务,按照你需要的业务时间设置超时时间, 比如抢锁多长时间,可以设置成具体需要的时间, 比如 1 分钟或者 5 分钟。
这只是记录进度,如果需要保存进度信息。还需要存储到 mysql 中。
问题:布式下的导入进度条获取,限制同一数据表同一时间只能导入一次,需要记录导入进度,解决并发和服务不稳定引发的问题

解决:
同一数据表同一时间只能导入一次。使用分布式锁就可以解决。
服务不稳定,这块只要保证存储稳定就行( redis/mysql )

领导的 mysql 方案,使用建表的方式来解决分布式锁的方式目前不太建议使用在高并发的后端服务。主要是性能太差。
同事的 zookeeper 方案,使用 zk 来做分布式锁。这个方案本身没有问题。不过考虑 zk 的部署,业务代码编写并非很容易,建议可以用来扩展思路,尝试实现一个来提高个人技术水平。
目前常规的做法都是使用 redis 加个锁,然后实时更新锁就行了。


容错性低的方案一:
1. 使用 SET NX 设置分布式锁。
set table_name 0 EX 3600 NX

table_name 表示表名
0 表示进度为 0
3600 表示到期时间。这里的到期时间需要根据业务自行调整,建议大于业务每批次的处理时间。最好等于业务表导入最小间隔。

2. 如果抢不到锁表示其他业务正在处理导入,当前线程退出或者休眠后重试。
3. 抢到锁的线程批量处理业务并实时更新进度
set table_name N EX 3600 XX

N 数字,表示当前进度

4. 处理完之后,可以删除当前 key,或者设置到期时间为下次需要运行的时间。

缺点:
1. redis 分布式锁的方案虽然简单,但是并不安全。如果存储不稳定,暂时没有特别完善的方案。 关键词:” redis 分布式锁的安全性“

2. 更新进度,直接按照 table_name 设置,可能出现当前线程卡住很长时间。这段时间中当前的锁过去后,别的线程重新设置锁。然后两个线程同时写一个 key,导致进度出现问题。

可行性:
由于没有足够的信息,无法确认方案是否满足业务需求。不过根据你领导的方案可以推断,上面这个方案在设置比较合理的到期时间之后应该问题不大。

思考题:
可以从 key 入手,设计一个容错性高的方案。
164 天前
回复了 guojam 创建的主题 求职 求求 dalao 看一下简历有什么不足的地方
大二还早。公司招实习是希望干活的。大二可以被剥削的时间太短。

在学校参加开源项目,acm。
大三暑期找短暂实习再找实习工作不迟。
164 天前
回复了 npe 创建的主题 问与答 请教一个高并发竞争资源问题
优惠券不会比 12306 复杂。 优惠券提前生成,乱序放到 redis 的列表里面,或者 MQ 里面。

redis 列表可以按照用户 hash,这样可以减少一次锁。并且可以拆分到多个 redis 中,增加 qps ( 1w qps 用不到)。
拿到优惠券之后,就同步记录用户流水,并更新优惠券状态。 如果更新成功再记录流水。

如果需要同步快速返回,可以将更新优惠券状态改成异步处理,但是到账也是异步。

如果 qps 达不到要求还要减少 io。可以以 redis 数据为准,则还可以减少用户流水的记录(存在优惠券丢失的情况,更新 redis 成功,写 mysql 失败。需要业务逻辑去补充这类数据)。
164 天前
回复了 coxier 创建的主题 分享创造 TinyPNG IDEA 插件释放你的右手
其实我还想说。为什么不替换成 webp 呢?
164 天前
回复了 coxier 创建的主题 分享创造 TinyPNG IDEA 插件释放你的右手
编译 release 之前加个钩子。 处理图片和其他资源。
刚毕业没两年经验少吧。用普涨的薪水挽留你只是常规操作。
留下不涨到币 offer 高,没什么意义。反而导致以后涨薪升职的机会变少。
165 天前
回复了 luw2007 创建的主题 程序员 面试题:设计一个活跃用户过滤器
@leegoo 是的,如果用户量很大,redis 需要优化。不然直接 key/value 存储不就好了
165 天前
回复了 gaoyg 创建的主题 程序员 6 年程序员想转行,不知道要干个啥
西安还是算了吧。 几年前实地面试了几家。钱太少,回不去。
171 天前
回复了 luw2007 创建的主题 程序员 面试题:设计一个活跃用户过滤器
@deming 历史数据清除么? 也就是年末发了一波 push,冷用户都来了。然后 redis 内存爆炸了。
184 天前
回复了 imwower 创建的主题 Apple apple ID 登录不了了, APP store 也是
现在正常了。刚刚刷 ios13,登陆不了。吓死我了
194 天前
回复了 IfEles 创建的主题 Java 最近遇到一个复杂的需求,不知如何去实现.....
里面的商品或者地点信息,这些都是有数据库基础表维护的。
这就是简单的一个匹配的问题。
应该由后端自己处理。前端只管传话就好了。

匹配关键词的方法很多。分词,双尾后缀树,自动机等等。
194 天前
回复了 IfEles 创建的主题 Java 最近遇到一个复杂的需求,不知如何去实现.....
里面的商品或者地点信息,这些都是有数据库基础表维护的
194 天前
回复了 Canon1014 创建的主题 PHP 关于系统单点登录跪求一个方案
可以看看 https://jwt.io/ 。两个系统同时使用相同的密钥可能存在风险。 不过都是 web 应用,可以随时切换到新的密钥上。
194 天前
回复了 Canon1014 创建的主题 PHP 关于系统单点登录跪求一个方案
@EasyProgramming
JWT 如果只用来验证登录,是不需要存储的。都是通过相同的密钥加密生成的。
202 天前
回复了 liulaomo 创建的主题 Go Go 语言中关于断行规则的一个细节
```golang
package main

func alwaysFalse() bool {
return false
}

func main() {
switch alwaysFalse();{
case true:
println("真")
case false:
println("假")
}
}

```
多了个分号,然后语义变了。 这块确实要注意。
202 天前
回复了 liulaomo 创建的主题 Go Go 语言中关于断行规则的一个细节
package main

func alwaysFalse() bool {
return false
}

func main() {
switch alwaysFalse();{
case true:
println("真")
case false:
println("假")
}
}


多了个分号,然后语义变了。 这块确实要注意。
1  2  3  4  5  6  7  8  9  10 ... 11  
关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1897 人在线   最高记录 5043   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.3 · 34ms · UTC 00:27 · PVG 08:27 · LAX 16:27 · JFK 19:27
♥ Do have faith in what you're doing.