V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  timethinker  ›  全部回复第 16 页 / 共 19 页
回复总数  374
1 ... 8  9  10  11  12  13  14  15  16  17 ... 19  
@aoizz 按照这个思路,很难想象你一次性要获取 10W 的用户(根据 getByIds,使用 SQL IN 语句?),优化的核心思路在于时间跟空间的平衡点,数据查找尽量使用 SQL 通过数据库来筛选数据,充分利用好数据库的索引功能,避免一次性获取大量数据,然后只使用里面的少量数据。

不过最重要的还是看数据量与看场景,是 OLTP 还是 OLAP,前者尽量保证短时间内完成操作,后者更多的是通过提前创建派生数据来提高查找速度(以空间换时间)。
在不进行预处理的情况下,你可以简单的改为并行流然后查找,users.stream().parallel().filter...,或者 users. parallelStream().filter...
2021-06-11 09:16:01 +08:00
回复了 googlehub 创建的主题 随想 今天是我的生日🎂🎂🎂🍰🍰🍰
祝你生日快落~,祝你生日快落~,哈皮巴斯得图友啊~,祝你生日快落~
2021-06-10 12:35:40 +08:00
回复了 Suomea 创建的主题 MySQL 客户端 SQLite 和服务端 MySQL 数据同步的问题
1:如果是多终端,修改来源不止一处,比较好的方式就是使用订阅机制,相当于多个生产者和多个消费者,同步只需要同步本地不存在的数据,使用一种递增的序列标识来表示数据的前后顺序。

2:使用日志式的存储比较容易实现,即数据只是简单的追加,不涉及到修改,如果有修改或者删除的需求,也仅仅只是追加一条数据(墓碑记录),当然了,数据无止境的累加也是不现实的,因此可以异步定期的去压缩数据(合并同一条记录的修改、移除已被删除的数据),这其实就是许多数据库背后的原理,用在应用层上也是同样的道理,其目的在于减少复杂的 IO 操作(在本例中是为了减少对数据库的复杂操作),提升整体的处理效率。

不太清楚你们的应用场景具体是怎么样的,简单的说一下思路:已经发生的事情是客观存在的,就像一个个事件,我们不能改变过去,但是可以补偿过去,其结果就是如果严格按照先后顺序处理这些事件,其结果最终都是一致的。定期压缩数据也只是建立了一个快照点,这样其他客户端就可以直接从这个快照点获取整个数据,然后在基于这个快照点的版本 ID,去同步之后的事件。

最后说一下问题,多个生产者产生数据可能会遇到冲突问题,需要共识算法来达成一致,这就是典型的分布式问题(比如上面的全局序列 ID/版本号),如果要做到这一步就需要结合业务场景做取舍,取决于你的业务复杂程度。

举个例子,我们都对 git 比较熟悉吧,如果两个人基于同一个版本提交,那么当他们试图同步彼此的时候,必定有一个人需要 merge 或者 rebase,如果对同一个文件修改了,可能还需要处理冲突。为什么说它是分布式的呢?因为可以脱离服务器,在自己本地独立的进行操作,以后同步的时候只需要大家对提交记录达成共识即可。

最后,以上这些都是基于你有多个终端修改源,并且需要同步到多个终端上的假设作为前提,如果只有一个生产者,那么这些问题都不存在了。
2021-06-09 11:03:46 +08:00
回复了 azev 创建的主题 问与答 大家做后端开发时 会更改响应的 HTTP 状态码吗?
2XX:请求成功
4XX:客户端错误
5XX:服务端错误

如果只返回 200,不方便日志的收集和监控预警,因为把错误相关的信息都放到响应体内了,如果有日志相关的收集需求,那么就意味着要去解析响应体。

见过很多前后端分离的项目,不管是成功还是失败,都一股脑返回一个包装体结构,里面大多有 3 个字段( code,message,data ),其实这三个字段不管在成功还是失败的情况下都存在冗余。

比较推荐的做法是,HTTP 状态码仍然继续使用,该返回什么数据直接返回,也不需要一股脑全部加上一个包装体,还美其名曰为规范,在请求正常的情况下,code 和 message 是多余的字段,前端其实只需要里面的 data 。

在错误的情况下( 4XX 和 5XX ),此时统一返回一种表达错误信息的格式才比较有意义,如果仍然返回之前的包装体,那么 data 字段也是冗余的。
@qiumaoyuan 没有分歧,我只是想回复你一下,然后分享一些关于这件事情的一些想法,前面两段内容是我的一些看法。后面两段也算是具体回复一下关于这个帖子的一些解决思路。
2021-06-01 17:24:33 +08:00
回复了 FreeWong 创建的主题 问与答 ========= TCP 数据可靠性问题 ===========
先不考虑是否长连接,如果你用 HTTP 来做,那么当你在发起请求之后,网络断开了,此时你是处于未知状态的。保存有可能成功,也有可能失败。

你可以在发起请求的时候创建一个唯一的 ID,这样服务器就可以支持幂等操作,你可以随意重新尝试 N 次,但是服务器只会处理一次。这样当你丢失连接以后,你可以随意再次发起一次请求,只有当你明确收到服务器的响应说这个请求已经处理完的时候,此时你再删除本地的文件。
@qiumaoyuan 规范的最终目的是服务于团队的,也就意味着想要提升整个团队的工作效率,就像代码是给人看的而不是给机器看的。进一步落地的方案可能是统一命名风格、禁用某些特性。时代在进步,同样我们使用的数据库或者其他中间件也在不断的改进和优化,但是很多方案却止步不前。开放学习和进步的团队文化是至关重要的,在我看来,现在很多的规范都已经过时了,也许在那个时候确实是有理由这样做,但是发展到现在就有点像用明朝的剑斩清朝的官。

反映出来的现象就是,由于很多人学习了这些早期项目的编码实践,后来又被其他人给继承,我不知道他们有没有仔细想过这些细节,但是科学的方法是进一步测试,得出实实在在的证据表明这些实践是否仍然有效。试图发现和总结出现这些现象的原因是另一个问题。

回到主题,对于楼主这个问题,我认为不在于 IN 本身是否好坏,而在于你的业务场景是否适合使用 IN,在 OLTP 场景,响应时间是至关重要的,同时也要保证数据的一致性和完整性,解决思路就是在时间和空间之间取得一个平衡。

对于下单来说,大多数系统需要保证操作及时响应,这也就意味着你不能进行太多耗时的操作(大部分时间花在了 IO 上),但是对于查询来讲,实时性也许就不那么强,或许可以通过异步的方式产生派生数据(即根据订单数据生成另一份数据),这一部分数据可以专门优化为方便查询的结构。当然是否采取这种方法取决于楼主业务的实际使用场景以及我方才这些假设是否成立。
好吧,又是一个没有贴出具体 [数据库以及版本] 的问题。

使用 IN 语句在新版本的 MySQL 中是没问题的,加好索引就行,唯一的问题就是如果 IN 太多的值,可能会导致数据包超过 max_allowed_packet 设定的值。

如果你的心里存在怀疑,那么最好的办法应该在自己的数据库上好好测试一下,看看是否真的存在性能问题。如果你想我们帮你测试,那么至少要列出数据库以及它的版本,更详细的可以列举到数据量、索引是否建立、硬件环境等信息。

我觉得现在很多关于数据库的使用说法有点偏中医理论了,这不能用那不能用,很多时候这些问题都是出现在特定数据库的特定版本。人云亦云,迷信上个世纪的偏方和奇技淫巧,殊不知那些东西早就已经发生了变化。
2021-05-26 16:52:46 +08:00
回复了 Rainshaw 创建的主题 硬件 mac 的 4k 外接显示器有什么推荐的吗?
目前用的 LV273HUPR,可以直接一根 C 口线连接 mbp 充电并拓展显示屏,还有 USB 接口,价格也不错。
2021-05-26 11:13:17 +08:00
回复了 Aliberter 创建的主题 Java 求助! springboot 如何获取 url 上的参数,@PathVariable 复用问题
这里的问题就是把一些原本更适合放在 Header 中的参数放到了 URL 上。

如果楼主确实需要一种解决方案,我个人的做法可能就是写一个 Filter,然后对 Request 进行包装( HttpServletRequestWrapper )并重写 getRequestURI()方法,相当于 rewrite,把这些 URL 路径参数转移到一个 ThreadLocal 上(或者 Header,总之让它存到另一个地方),然后就可以比较干净的来写 Controller 了。
查到了文档,楼主可以参考一下: https://kotlinlang.org/docs/whatsnew11.html#sealed-and-data-classes
没有用过 kotlin,不过看似这个东西在语言层面有点类似于 C/C++的结构体?那么正确的做法应该使用组合而不是继承吧。

如果确实有继承的需求,那么为何不直接用 class 呢?子类行为可以复用 /改写父类行为,实现多态的效果,这才是使用继承的主要原因吧。因为最终还是跑在 JVM 上,个人猜测这里不允许继承可能是因为 equals 或者 hashcode 可能会出现问题?
目前我自己用的是意利的深度烘焙咖啡粉,然后咖啡机用的 STARESSO 三代,清洗方便,做出来的浓缩油脂十足,香气逼人,我一般直接喝浓缩或者兑点开水喝美式,夏天可以直接加冰块。
2021-05-25 10:43:49 +08:00
回复了 SunSurprise 创建的主题 互联网 语雀的内容安全是否像宣称的那样靠谱
端对端加密意味着服务端压根不知道你存的什么东西,跟我本地加密然后上传 Github 是一样的吧。
2021-05-24 13:21:16 +08:00
回复了 phony2r 创建的主题 MySQL MySQL 如何保存有顺序的列表?
取决于是读多还是写多,另外跟数据量也有关系,假如说按照最坏的情况,修改序列会导致上 W 条的记录被修改,那么单独维护一张表存储序列是一个不错的方案,里面的内容是一个字符串,用分隔符组装 ID 列表,这样在变更序列的时候仅需要修改这一条数据(一对多,这里序列表 ID 就是主表的 ID,比如歌单 ID,评论文章 ID,小说 ID 等等)。

不过在读取的时候可能会遇到条件过滤+分页的问题,还是取决于场景,可以在更新序列表后异步的更新表数据( order ),此时数据表上的 order 字段只是一个冗余,在修改过后可能会遇到延迟的情况,在关键的地方还是要从序列表当中取出正确的排序,不过大多数情况下是可以接受的。
2021-05-24 09:26:09 +08:00
回复了 droidmax61 创建的主题 Android Vivo 手机某系统进程开放 55555 端口疑似用作 mCDN
客户端的 TCP/IP 端口一般是系统临时分配的。如果手机系统厂商为了节省带宽费用,在自家的设备系统上开设端口,然后设备之间打洞穿透内网建立连接,搞 P2P 网络的可行性还是存在的。

做得隐秘一点的话,可以是动态的,反正手机与系统厂商之间总会建立一个连接用于服务目的。
2021-05-21 17:08:01 +08:00
回复了 samin 创建的主题 程序员 关于低(零)代码平台的看法
一开始我们用汇编,后来出现了 C 语言,移除了特定架构的 CPU 指令,换平台时只要再编译一次就行了,把硬件 /系统相关的东西交给编译器来完成,C 语言不需要学习吗?

到后来人们开始使用 Java,一次编译全平台运行,Java 不需要学习吗?

下一次发生变革可能会有一个系统来替代编程语言,不需要写代码,但是这个系统不需要学习吗?

不管做到哪种程度,灵活性越高则学习成本越高,学习它本身就是一种职业技能相关的了,如果能够普及到九年义务教育,那也仅仅只能教大家如何使用,但创造性是无法直接教授的,就像学语文一样,你识字但不一定能写诗,到时候可能会说,人人都是程序员,只是使用的工具不一样。
2021-05-18 09:18:45 +08:00
回复了 fiypig 创建的主题 职场话题 有些公司真的有趣
不是没有遇到过这种,但我始终觉得这是迷惑行为,都留了 U 盘可以拷东西了,代码也不见得会多么安全。
还有那种不让联网的,我估计是在造火箭。
时代不同了,现在都是开源的世界,代码并不值钱,数据才是最值钱的。
“信任,但要验证”,与其严防死守,不如制定一种安全策略,管理好访问权限。
1 ... 8  9  10  11  12  13  14  15  16  17 ... 19  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   947 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 33ms · UTC 19:19 · PVG 03:19 · LAX 11:19 · JFK 14:19
Developed with CodeLauncher
♥ Do have faith in what you're doing.