V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  crclz  ›  全部回复第 11 页 / 共 35 页
回复总数  684
1 ... 7  8  9  10  11  12  13  14  15  16 ... 35  
2021-01-05 21:21:37 +08:00
回复了 jtping 创建的主题 程序员 有个关于并发的问题想请教下
@opengps #8 楼说的非常正确,要考虑的情况很多,逻辑要求应当非常严谨。

现在市面上的文章很多都没考虑到数据的一致性。(例如 redis 扣减库存,然后 DB 再慢慢处理订单)


经过分析,不难发现,redis+DB 有以下两个主要 ACID 方面的问题:

1. "ACID.Consistency"(一致性):因为 redis 和 DB 是两个数据储存,所以涉及到分布式事务。
分布式事务一般有如下两种选择:A. 采用某种协议,例如 Paxos,保证强一致性。B. 采用消息队列+补偿来保证最终一致性。

2. "ACID.Duration"(持久性):redis 断电后如何恢复?
一般可以采用的是:A. 副本集 B. 平行系统( Parallel Model - Martin Fowler )

对于“一致性”问题,A 方案(分布式事务协议)是不现实的,因为 redis 本身的事务支持就不完备。如果采用 B 方案,用消息队列,也是无法实现的,因为 outbox pattern (自己去查英文资料)依赖 ACID 的单个数据库的事务,而 redis 本身的事务支持就不完备。

现在,我们发现,万恶之源在于 —— redis 对事务的支持不完备。

-------

但是,我们可以转换一下思路,把 redis 的角色从更偏向 DB 的角色转换成更偏向 cache 的角色。
这时候就应当引入 [软状态] :状态定期过期并刷新。

简单来说,就是定期把剩余库存定期更新到 redis 。

接下来详细说一下:

假设我们的步骤如下:
1. 连接 redis,库存-1,如果成功(可以使用 lua 脚本来保证原子性),那么就进行下一步;如果失败,就提示已售罄。
2. 连接数据库,创建订单(或者为了削峰,写消息队列,事后慢慢在 DB 创建订单)

但是,这两步不是原子性的,会造成 redis 和 DB 的状态不一致:
如果 redis 扣减库存成功了,但是连接数据库失败了,那么就会存在少卖的情况。但是不会超卖。幸运的是,少卖比超卖好解决。

这时候,只需要在消息队列里面的订单处理完成后,将 DB 里面真实的剩余库存同步到 redis 即可。
2021-01-05 18:59:46 +08:00
回复了 zxCoder 创建的主题 C 大家写 C 语言除了搞硬件的,还有做什么工作的啊
@pandaos 外挂大多数是用 VC++写的
2021-01-03 18:29:30 +08:00
回复了 fxrocks 创建的主题 Redis 全量读取速度
你是准备把 redis 当 mysql 使吗?想想 ACID 有保障吗?
如果是对 redis 以及缓存了解不深的人,我推荐你只将 redis 用于缓存,严格按照:查数据库时写缓存、数据库更新时 invalidate 缓存、缓存条目自动过期。

另外,如果想要方便,可以用 mysql json 或者 postgres jsonb,或者 mongo
2021-01-02 19:40:15 +08:00
回复了 naoh1000 创建的主题 云计算 如何系统学习数据库?
大学里面讲的“数据库概论”沾点关系代数了,并且和实际中如何写高效的 sql 语句重合性不高。

推荐书目:
《 SQL 反模式》(整本)
《高性能 MySQL 》(不必整本读)
首先你也意识到了,下面这点是一个痛点。

mock 假数据非常困难,造成 api 使用者的对接接口必须等到接口开发差不多了才能对接,效率非常低下。这是很重要的痛点。


我建议的解决方案是从团队的工作流程入手:

在开发初期就确定接口的格式,然后前后端人员共同进行评审,最终确定接口的格式。这之后就花 1-2 个小时在 springboot 里面把方法和参数都写出来,然后就可以有 swagger 文档供前端拿去用了。另外,swagger 的核心是那个 json 文件,相当于 API 的中间语言表示。那个 json 文件你拿去其他 mock 的框架里面,都是支持导入的。
2021-01-01 10:03:32 +08:00
回复了 lemonnn 创建的主题 Python Python 正则问题
import re

def single(l):
assert len(l) == 1
return l[0]

s = '[123)(abc]'

# m = re.findall()
m = re.findall('\[(.*?)\)|\((.*?)]',s)
m = [single([q for q in p if len(q)>0]) for p in m]
print(m)
2021-01-01 10:00:50 +08:00
回复了 lemonnn 创建的主题 Python Python 正则问题
('123', '') 表示 123 在第一个 group(括号)内被匹配。
('', 'abc') 表示 abc 在第二个 group(括号)内被匹配。
2021-01-01 09:24:57 +08:00
回复了 AsiaToyo 创建的主题 Google Google Drive 文件相同判斷
@AsiaToyo 生成速度只要比你的网速快就行了
@UglyFatOld 87 年学 basic 估计得 50 多岁了吧
2020-12-31 13:04:02 +08:00
回复了 felixin 创建的主题 数据库 在云上开上万个小型独立数据库有什么便宜的方案?
@abersheeran 不是集群,不是集群。如果你要开 50000 个 database,那么就拿 10 台机器出来,一台开 5000 个。再说账号也是存放在数据库里面的(由系统自己管理),50000 账号也只是 50000 条记录而已,实际的压力还是要看执行的 SQL 的量。
2020-12-31 10:33:28 +08:00
回复了 felixin 创建的主题 数据库 在云上开上万个小型独立数据库有什么便宜的方案?
@abersheeran 你可以多机啊
2020-12-30 18:51:39 +08:00
回复了 felixin 创建的主题 数据库 在云上开上万个小型独立数据库有什么便宜的方案?
为啥不给每一个开发者开一个 database ?( Postgres 的"Schema",mongodb 的"database"),在分配给每个开发者一个账户
如果一个前端开发人员这样说的话,我会称之为“低能”
这个又不是什么必需品。以前没有共享充电宝的时候大家怎么过的啊?
2020-12-27 16:14:14 +08:00
回复了 QBugHunter 创建的主题 Android 关于 Thread 里创建对象的问题
进程是由操作系统管理。
你的进程不管是优雅地退出,还是暴力地退出,
你这个进程的所有(操作系统分配的)资源都会优雅地释放。
2020-12-26 17:28:38 +08:00
回复了 Aluhao 创建的主题 PHP 求 16 位纯数字订单号产生算法
你说的 16 位是“个十百千万”的位吧,不是 bit 吧。

如果是 16 个字符,那么约束我猜就是前端 js 的 number 超过 53~54bit 就会损失精度吧。

一个解决方案是传字符串。

如果非要数字,也不是不可以。你去看看 snowflake 算法。https://github.com/beyondfengyu/SnowFlake/blob/master/SnowFlake.java 把第 18 行里面的几个东西改一下,就可以应对不同的位数,本质是(使用年限,机器数量,数据中心数量,每秒并发数量)的权衡。当然首先得去看看 showflake 的结构再来改。
1 ... 7  8  9  10  11  12  13  14  15  16 ... 35  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1031 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 37ms · UTC 19:47 · PVG 03:47 · LAX 11:47 · JFK 14:47
Developed with CodeLauncher
♥ Do have faith in what you're doing.