Monday, September 6, 2021

V2EX - 技术

V2EX - 技术


CentOS 要停止维护了,下一个要选择哪个发行版本? Debian 还是 Ubuntu?还是国产?

Posted: 06 Sep 2021 04:29 AM PDT

RT,CentOS 要停止维护了,下一个要选择哪个发行版本? Debian 还是 Ubuntu?还是国产?

问一个 windows 的监听文件技术

Posted: 06 Sep 2021 04:23 AM PDT

我记得以前不知道从哪看来的,就是可以先打一个类似镜像的东西,然后安装文件,安装后再打一个镜像,这样有两个镜像,然后通过工具自动 diff 出来一个类似补丁的东西,这样装新机后,就可以用这个类似补丁的东西自动把这个文件安装好了 但是实在想不起来这个叫啥了,不知道有没有精通此道的大佬

最近 Linux 桌面很火,晒一晒自己日常办公的 Ubuntu 系统

Posted: 06 Sep 2021 04:16 AM PDT

操作系统:Ubuntu 16.04
桌面环境:Unity + Compiz
任务栏:plank
主题图标:MacBuntu-OS-Unity-Classic + Papirus-Light
虚拟机软件:libvirt + qemu + windows 7 (spice 协议,支持麦克风输入)
多媒体:smplayer + mpv + vaapi (支持 4k 10bit hevc/vp9)

有一直使用 Linux 桌面系统办公的吗,体验如何?

Posted: 06 Sep 2021 04:07 AM PDT

平常的一些软件如何解决呢,比如 qq,微信,企业 qq,office ?

腾讯云限时秒杀的轻量服务器又能买了

Posted: 06 Sep 2021 04:04 AM PDT

以前:抱歉,当前商品仅针对尚未购买过轻量应用服务器的产品新用户开放,欢迎了解其他活动。
现在买了之后提示
现在:抱歉,当前商品仅针对尚未购买过轻量应用服务器( v3 )的产品新用户开放,欢迎了解其他活动。
反正我已经冲了,你们随意
反正我不保证你们能冲
https://i.loli.net/2021/09/06/3J2Ol8HPzxYi1vd.png
https://i.loli.net/2021/09/06/wDskJQ7t3uhUWar.png

[Vue、React 和 Angular 一起学]首月总结

Posted: 06 Sep 2021 04:01 AM PDT

挑战活动 持续了一个多月,头发掉了不少。

https://github.com/LearnShare/learn-VRA 不知道对比着看是否舒适?

从几个方面简单对比一下:

  • 文档:Vue > React > Angular
    Angular 和 TypeScript 的文档都看得头疼,不够详尽,也不够平滑。
  • 上手难度:React > Vue > Angular
    React 最为简洁,class + JSX = UI 。

(个人感受,拒绝不友好的战斗)

5 年前端要转后端吗

Posted: 06 Sep 2021 03:59 AM PDT

做前端 5 年了,本身做的还不错,在前端领域做的还不错,薪资也还不错,只是现在快 30 了,总是感觉走技术路线前端的发展没有后端发展的空间大,纠结要不要转,应该如何转,学什么语言呢?

IDEA 怎么查看底层 jar 包中方法的调用

Posted: 06 Sep 2021 03:24 AM PDT

Eclipse 好像有插件可以看 jar 包中方法在包内的调用,IDEA 有类似插件吗?

read:// 有谁知道的?关于无障碍这块,老外走得是真快

Posted: 06 Sep 2021 03:18 AM PDT

如题,无意中发现有个网站默认开启了这个功能.
目前只在 edge 浏览器中正常使用. chrome, vivaldi 均没法正常使用(难道因为语音识别功能被墙的原因?)
在 chrome://flags 里面搜"read", 然后开启.
只需要在网址前面加 read:// 即可, 比如

read://https://v2ex.com/about 

右上角的 Voice Option 那里选择中文.

前端框架的开发者们,在开发框架时,如果不麻烦的话,加一下吧,这个功能对于有阅读障碍的人来说,真的挺有用的.(曾经见过有人使用过"无障碍"功能)

整理了拼音到 emoji 的映射,用于搜狗输入法自定义短语

Posted: 06 Sep 2021 03:12 AM PDT

想在 win 上用搜狗输入法输入 emoji 而不是图片,所以有了这个东西

🐶🐱🐰🐵🐷

目前全拼应该没啥问题,双拼问题挺多,不断发现问题想办法中。。

全拼: https://github.com/yuhangch/zhmoji/blob/master/PhraseEdit.quanpin.txt

微软双拼: https://github.com/yuhangch/zhmoji/blob/master/PhraseEdit.shuangpin.txt

k3s nodePort 暴露服务,仅 pod 运行节点能通过端口访问,集群内部访问正常,别的访问不了

Posted: 06 Sep 2021 03:12 AM PDT

找相关文章,所有节点执行以下命令,依然不行,请大佬救命

K3S : k3s-v1.21.4

Linux: Debian 10

root@node2:~# iptables -P FORWARD ACCEPT root@node2:~# iptables -I FORWARD -s 0.0.0.0/0 -d 0.0.0.0/0 -j ACCEPT 

请教关于工作优先级的问题

Posted: 06 Sep 2021 03:09 AM PDT

在一家传统公司,做与政府合作的项目。公司今年上半年刚开始做跟互联网相关的项目,但是老板不愿意配置人手,目前团队成员只有 4 个人,其中一个还是近期刚入职。

我们近期在开发一个商城项目,原本老板就只给了俩月时间,前两天开会的时候给砍十天,然后定好的 1.1 版本要跟 1.0 一起上线,工作计划被彻底打乱。

我整理了一下,手上一共有 15 个项目,大约有 5~7 个项目在同时进行,因为老板时不时就来催催,或者安插新的工作,说要跟领导一起演示 xx 项目,而其他工作安排又不能延期,我们就得压缩时间砍掉功能,来保证工期。

这一点让我很头大,跟老板讲过我们开发周期的问题,也讲过服务需要有一个较长时间的观察期,这期间需要不停地收集问题并修复优化,老板当时点点头说没问题,后脚就说交付了就先不用管了,收集问题的期间可以先干着别的工作,然后一个新项目就下来了。

面对这种问题,请问各位有什么好的方案?

桌面双主机搭配方式

Posted: 06 Sep 2021 03:06 AM PDT

一台 pc 和 mac 笔记本,目前有点纠结该如何搭配最好。 1.两个显示器分别显示两台主机,这也就意味着两套键鼠,好处自然是工作娱乐两不误,坏处就是占地多,设备配件也多。 2.一台显示器 [带鱼屏] ,同时显示两台主机;一套带有多设备切换的键鼠,好处就是占地少,足够 [懒] ,但坏处就是不知道这样搭配实际效果如何?很有可能演变成最后办公游戏体验都不太好。

希望各位能帮我分析下,拜谢了。

书房装修,请问有体验好的升降桌/电脑椅/显示器值得入手吗?

Posted: 06 Sep 2021 03:03 AM PDT

大家好,最近我在装修书房,想提升自己在家做兴趣项目和办公的体验,想入手下面这些东西:

  • 整体的升降桌:桌长考虑 1.4m~1.6m ,感觉坐累了能站一下会很不错;
  • 电脑椅:想找那种对腰部和屁股友好的椅子;
  • 显示器:主要是写代码、剪视频、码字,平时不玩游戏,习惯多开窗口左右排布,希望尺寸大一些。

希望能够聆听各位分享品牌型号和经验心得。

感谢指点。

开发了一个查房价的小程序

Posted: 06 Sep 2021 03:00 AM PDT

项目前后端均开源:

前端项目(当前): https://github.com/danbaixi/hourse-slave

后端项目: https://github.com/danbaixi/hourse-slave-api

使用场景

场景一

销售:您好,这套房 3.5w 一平,现在买还有 98 折优惠。

你:我用房莞小程序查了备案价才 3.2w ,为什么差那么多?

销售:3.2w 的房我们也有的,不过你得和车位一起买。

你:车位多少钱?

销售:30 万

场景二

销售:先生,看中了要赶紧下手了,房源不多了!

你:骗人!刚用房莞小程序查了房源,明明还剩很多。

销售:网上数据都是不靠谱的,很多房源签了没更新。

你:你在质疑 zf 办事效率?

以上内容纯属瞎掰,目前只能查东莞的新房数据,数据从不动产登记中心爬的

原型图

hh7eYD.md.jpg

预览图

hh7ZFO.md.png

aws s3 国内的使用体验如何?

Posted: 06 Sep 2021 02:57 AM PDT

请问有人使用过 aws s3 吗?本人有 10TB 数据需要做长期云端备份。对比了一下目前提供商的成本,aws 是最低的(虽然流量费用很高,但是不下载就没有问题)。但是 aws 服务器全部位于海外,上传和下载速度可能很慢,想问一下有这种情况吗?

要是用国内的云的话,tx 和 aliyun 会有内容审查吗?传上去的东西不知道会不会被和谐,可能要额外加密...

fork 一份 vitepress,改成 fisand-doc

Posted: 06 Sep 2021 02:43 AM PDT

很喜欢 vitepress, 但是 vitepress 并没有提供插件系统,只好 fork 一份做了一个。参考了 vitepress-for-component 。

h40GlQ.png

features:

  • 首页样式改版
  • 内置夜间模式、中英文切换
  • 内置 demo 组件

fisand-doc

求助,项目要对接 keycloak,怎么用到高可用服务上啊?

Posted: 06 Sep 2021 02:41 AM PDT

我负责一个 Springboot rest 高可用服务,对接 keycloak 配置完后发现一个特别蛋疼的问题:

  1. 前端请求分发到一个 pod,keycloak 拦截器返回重定向到 keycloak 登录页,用户输账号密码登录
  2. 用户登录后前端请求到另一个 pod,结果 keycloak 又返回重定向了,虽然用户不用再次输账号密码,但是由于这个重定向,前端的页面会重新加载-_-!
  3. 打算换成 jtw 或者 oauth2,前端说不好改不愿意

顺带,这个 keycloak 的资料是真的少,太痛苦了

keycloak 配置

keycloak 配置

客户端配置

客户端配置

有没有对接过的大佬帮帮忙,谢谢了 明天 deadline 了,领导要吃人了

Windows 下有没有 Amphetamine 这样的软件?

Posted: 06 Sep 2021 02:37 AM PDT

Amphetamine 可以自定义打开某些软件的时候,禁止系统睡眠。

Windows 我找不到这样的,最多只能是设置不睡眠几个小时,或者定时不睡

挂游戏的时候经常黑屏导致掉线就很烦

oracle 幻读, 不可重复读是如何避免的?

Posted: 06 Sep 2021 01:39 AM PDT

lz 经常在 v 站评论帮助他人, 很少发帖, 这次借贵宝地, 请教路过的各位大佬谈谈看法, 解答一下疑惑:

oracle 在具体实践中是否会考虑 "不可重复读", "幻读" 问题, 又是如何去解决的呢?


下面是楼主做的准备工作:

  • 事务的隔离级别

    • MySQL(InnoDB)
      • 默认的事务隔离级别是 REPEATABLE-READ(可重复读)
    • oracle
      • 默认的事务隔离级别是 READ COMMITTED(读提交)
  • 存在的问题

    • MySQL 存在 "幻读" 问题
    • oracle 存在 "不可重复读" "幻读" 问题
  • 解决方法

    • MySQL 使用 Next-Key Lock(锁定一个范围,并锁定记录本身), 具体表现就是在事务内查询时 select... for update
    • oracle 暂时没看到具体实践的资料

楼主查过 oracle 官网的文档, 似乎也没有具体的答案, db2 的资料多一些, 直接修改隔离级别为 "序列化读" 也不现实.

matplotlib 问题

Posted: 06 Sep 2021 01:38 AM PDT

Y 轴必须从 0 开始吗?
我的需求是 Y 轴 2507 至 2991 区间, 间隔值为 53
xo = np.linspace(2507, 2991, 53)
plt.yticks(xo)
plt.show()

这样之后数据都显示在最上方,数字都重叠在一起了.
求大佬指点一下

生产环境在进行应用版本的升级和回退时针对数据库的变更如何做到同步?

Posted: 05 Sep 2021 10:04 PM PDT

应用的升级和回滚因为是无状态的,可以进行各种版本的切换这个没问题,但是数据库的升级和回滚可能就要涉及到数据库表结构的 ddl,元数据的 dml 操作,这个如何做到自动同步(回滚)呢? 比如升级的时候删除了表的某列,难道回滚的时候还要去把删除的列加回来吗?你们一般升级应用的时候对于数据库的升级怎么操作的呢?

求教,导航站点怎么设计?

Posted: 05 Sep 2021 09:58 PM PDT

看着导航站点很简单,但是要是写成文档,还觉得无处下手。 有没有类似的说明文档可以参考设计逻辑啊

Nginx 如何定时发布网页

Posted: 05 Sep 2021 09:17 PM PDT

各位老哥,比如说我现在预先做好了一个网页,预计在三天后凌晨,替换掉当前域名指向的网页,目前有没有什么方案能够实现这个?

Linux /macos 平台下面,有类似 windows 平台下,被远程连接后,自动 lock 住桌面的方法么?

Posted: 05 Sep 2021 07:53 PM PDT

windows 下的 rdp 是真的好用,macos 版本好像叫 Microsoft Remote Desktop,用来远程连接一台 windows OS 的机器。最好的地方在于,远程连接上之后,远程的机器,屏幕显示会自动进入 lock 状态。

这样,如果你在外面(比如出差),远程连接公司的机器办公,办公室的人,是看不到你的桌面(即你在干嘛的)

据我所知,macos 是不行的,好像是用 VNC 连接吧,屏幕分辨率匹配不上的问题,就先不说的,关键是,我这边干嘛,远程的机器上也在"干嘛",看得一清二楚。那我是看邮件呢,还是不看邮件呢?...... 我不清楚 VNC 是不是有类似的功能,我没有掌握,还是本来就没有。

所以,来问问大家。

谢谢!

请教各位, Java 有没有这样的一个库,用于在 Linux 的 terminal 中像记事本一样读文本,对于文本超出终端长度的部分,可以通过按上下左右键的方式进行光标移动来翻阅未显示的部分,而不会自动换行

Posted: 05 Sep 2021 07:44 PM PDT

怎么说呢…有点儿像 vim,但是还不是 vim 。
我就是想用程序生成一段文本,然后实现一个所生成文本的查阅功能。由于这个功能要用在 terminal (像 XShell 等)里面展示内容,又不希望破坏原有格式(因为有一些图形表格类的内容,而且可能会非常长)
不知道我说明白了没有,请大家帮助,感谢大家

Java 如何直接或间接生成 CDR 文件

Posted: 05 Sep 2021 07:35 PM PDT

有没有相关思路指点一下

用 Python 轻松完成一个 TCC 分布式事务,修订版

Posted: 05 Sep 2021 05:51 PM PDT

什么是分布式事务?银行跨行转账业务是一个典型分布式事务场景,假设 A 需要跨行转账给 B,那么就涉及两个银行的数据,无法通过一个数据库的本地事务保证转账的 ACID,只能够通过分布式事务来解决。

分布式事务就是指事务的发起者、资源及资源管理器和事务协调者分别位于分布式系统的不同节点之上。在上述转账的业务中,用户 A-100 操作和用户 B+100 操作不是位于同一个节点上。本质上来说,分布式事务就是为了保证在分布式场景下,数据操作的正确执行。

TCC

什么是 TCC,TCC 是 Try 、Confirm 、Cancel 三个词语的缩写,最早是由 Pat Helland 于 2007 年发表的一篇名为《 Life beyond Distributed Transactions:an Apostate's Opinion 》的论文提出。

TCC 分为 3 个阶段

  • Try 阶段:尝试执行,完成所有业务检查(一致性), 预留必须业务资源(准隔离性)
  • Confirm 阶段:如果所有分支的 Try 都成功了,则走到 Confirm 阶段。Confirm 真正执行业务,不作任何业务检查,只使用 Try 阶段预留的业务资源
  • Cancel 阶段:如果所有分支的 Try 有一个失败了,则走到 Cancel 阶段。Cancel 释放 Try 阶段预留的业务资源。

TCC 分布式事务里,有 3 个角色,与经典的 XA 分布式事务一样:

  • AP/应用程序,发起全局事务,定义全局事务包含哪些事务分支
  • RM/资源管理器,负责分支事务各项资源的管理
  • TM/事务管理器,负责协调全局事务的正确执行,包括 Confirm,Cancel 的执行,并处理网络异常

如果我们要进行一个类似于银行跨行转账的业务,转出( TransOut )和转入( TransIn )分别在不同的微服务里,一个成功完成的 TCC 事务典型的时序图如下:

image.png

TCC 实践

对于前面的跨行转账操作,最简单的做法是,在 Try 阶段调整余额,在 Cancel 阶段反向调整余额,Confirm 阶段则空操作。这么做带来的问题是,如果 A 扣款成功,金额转入 B 失败,最后回滚,把 A 的余额调整为初始值。在这个过程中如果 A 发现自己的余额被扣减了,但是收款方 B 迟迟没有收到余额,那么会对 A 造成困扰。

更好的做法是,Try 阶段冻结 A 转账的金额,Confirm 进行实际的扣款,Cancel 进行资金解冻,这样用户在任何一个阶段,看到的数据都是清晰明了的。

下面我们进行一个 TCC 事务的具体开发

目前可用于 TCC 的开源框架,主要为 Java 语言,其中以 seata 为代表。我们的例子采用 Python 语言,使用的分布式事务框架为https://github.com/yedf/dtm,它对分布式事务的支持非常优雅。下面来详细讲解 TCC 的组成

我们首先创建两张表,一张是用户余额表,一张是冻结资金表,建表语句如下:

CREATE TABLE dtm_busi.`user_account` (   `id` int(11) AUTO_INCREMENT PRIMARY KEY,   `user_id` int(11) not NULL UNIQUE ,   `balance` decimal(10,2) NOT NULL DEFAULT '0.00',   `create_time` datetime DEFAULT now(),   `update_time` datetime DEFAULT now() );  CREATE TABLE dtm_busi.`user_account_trading` (   `id` int(11) AUTO_INCREMENT PRIMARY KEY,   `user_id` int(11) not NULL UNIQUE ,   `trading_balance` decimal(10,2) NOT NULL DEFAULT '0.00',   `create_time` datetime DEFAULT now(),   `update_time` datetime DEFAULT now() ); 

trading 表中,trading_balance 记录正在交易的金额。

我们先编写核心代码,冻结 /解冻资金操作,会检查约束 balance+trading_balance >= 0,如果约束不成立,执行失败

def tcc_adjust_trading(cursor, uid, amount):   affected = utils.sqlexec(cursor, "update dtm_busi.user_account_trading set trading_balance=trading_balance + %d where user_id=%d and trading_balance + %d + (select balance from dtm_busi.user_account where id=%d) >= 0" % (amount, uid, amount, uid))   if affected == 0:     raise Exception("update error, maybe balance not enough") 

然后是调整余额

def tcc_adjust_balance(cursor, uid, amount):   utils.sqlexec(cursor, "update dtm_busi.user_account_trading set trading_balance = trading_balance+ %d where user_id=%d" %( -amount, uid))   utils.sqlexec(cursor, "update dtm_busi.user_account set balance=balance+%d where user_id=%d" %(amount, uid)) 

下面我们来编写具体的 Try/Confirm/Cancel 的处理函数

@app.post("/api/TransOutTry") def trans_out_try():   # 事务以及异常处理   tcc_adjust_trading(c, out_uid, -30)   return {"dtm_result": "SUCCESS"}  @app.post("/api/TransOutConfirm") def trans_out_confirm():   # 事务以及异常处理   tcc_adjust_balance(c, out_uid, -30)   return {"dtm_result": "SUCCESS"}  @app.post("/api/TransOutCancel") def trans_out_cancel():   # 事务以及异常处理   tcc_adjust_trading(c, out_uid, 30)   return {"dtm_result": "SUCCESS"}  @app.post("/api/TransInTry") def trans_in_try():   # 事务以及异常处理   tcc_adjust_trading(c, in_uid, 30)   return {"dtm_result": "SUCCESS"}  @app.post("/api/TransInConfirm") def trans_in_confirm():   # 事务以及异常处理   tcc_adjust_balance(c, in_uid, 30)   return {"dtm_result": "SUCCESS"}  @app.post("/api/TransInCancel") def trans_in_cancel():   # 事务以及异常处理   tcc_adjust_trading(c, in_uid, -30)   return {"dtm_result": "SUCCESS"} 

到此各个子事务的处理函数已经 OK 了,然后是开启 TCC 事务,进行分支调用

@app.get("/api/fireTcc") def fire_tcc():     # 发起 tcc 事务     gid = tcc.tcc_global_transaction(dtm, utils.gen_gid(dtm), tcc_trans)     return {"gid": gid}  # tcc 事务的具体处理 def tcc_trans(t):     req = {"amount": 30} # 业务请求的负荷     # 调用转出服务的 Try|Confirm|Cancel     t.call_branch(req, svc + "/TransOutTry", svc + "/TransOutConfirm", svc + "/TransOutCancel")     # 调用转入服务的 Try|Confirm|Cancel     t.call_branch(req, svc + "/TransInTry", svc + "/TransInConfirm", svc + "/TransInCancel") 

至此,一个完整的 TCC 分布式事务编写完成。

如果您想要完整运行一个成功的示例,那么按照 dtmcli-py-sample 项目的说明运行 tcc 的例子即可

TCC 的回滚

假如银行将金额准备转入用户 2 时,发现用户 2 的账户异常,返回失败,会怎么样?我们修改代码,模拟这种情况:

@app.post("/api/TransInTry") def trans_in_try():   # 事务以及异常处理   tcc_adjust_trading(c, in_uid, 30)   return {"dtm_result": "FAILURE"} 

这是事务失败交互的时序图 image.png

这个跟成功的 TCC 差别就在于,当某个子事务返回失败后,后续就回滚全局事务,调用各个子事务的 Cancel 操作,保证全局事务全部回滚。

TCC 网络异常

TCC 在整个全局事务的过程中,可能发生各类网络异常情况,典型的是空回滚、幂等、悬挂,由于 TCC 的异常情况,和 SAGA 、可靠消息等事务模式有相近的地方,因此我们把所有异常的解决方案统统放在这篇文章分布式事务最经典的七种解决方案的异常处理章节进行讲解

小结

在这篇文章里,我们介绍了 TCC 的理论知识,也通过一个例子,完整给出了编写一个 TCC 事务的过程,涵盖了正常成功完成,以及成功回滚的情况。相信读者通过这边文章,对 TCC 已经有了深入的理解。

关于分布式事务更多更全面的知识,请参考分布式事务最经典的七种解决方案

文中使用的例子节选自yedf/dtm,支持多种事务模式:TCC 、SAGA 、XA 、事务消息 跨语言支持,已支持 golang 、python 、PHP 、nodejs 、Java 等语言的客户端。提供子事务屏障功能,优雅解决幂等、悬挂、空补偿等问题。

阅读完此篇干货,欢迎大家访问https://github.com/yedf/dtm项目,给颗星星支持!

作为库作者,如何优雅地劫持 malloc

Posted: 05 Sep 2021 02:40 PM PDT

在做一个库,目的是想改变malloc的行为,从 stack 上预先分配好的一大段内存处获取、释放内存。因为想做到对于下游应用基本透明(不需要LD_PRELOAD等操作),所以需要劫持malloc

我目前的做法是定义了一个jmp结构,存储了一系列的汇编代码,作用为跳转到我自己的fake_malloc处。如果下游程序要求劫持malloc,我就把malloc函数所在内存地址页属性更改为可写,将我的汇编代码覆盖到 glibc 的malloc地址处。

但是问题是除了我没别人能维护这段代码,搞得怨声载道。请问还有没有别的简单一点的方法来更改malloc的属性?并且能够恢复

Go 的 interface.Method 性能为什么会比 swith type 差?

Posted: 05 Sep 2021 12:32 PM PDT

测试代码:

package main  import ( 	"testing" )  type InterfaceA interface { 	Name() string }  type InterfaceB interface { 	Name() string 	Add() }  type A struct { 	v int }  func (*A) Name() string { 	return "A" }  func (a *A) Add() { 	a.v += 1 }  type B struct { 	A }  func (*B) Name() string { 	return "B" }  func BenchmarkNormal(b *testing.B) { 	switchFunc := func(v *A) { 		v.Add() 	} 	for i := 0; i < b.N; i++ { 		v := new(A) 		switchFunc(v) 	} }  func BenchmarkInterface(b *testing.B) { 	switchFunc := func(v interface{}) { 		switch n := v.(type) { 		case *A: 			n.Add() 		case *B: 			n.Add() 		} 	} 	for i := 0; i < b.N; i++ { 		v := new(A) 		switchFunc(v) 	} }  func BenchmarkInterface1(b *testing.B) { 	switchFunc := func(v InterfaceA) { 		switch v.Name() { 		case "A": 			v.(*A).Add() 		case "B": 			v.(*B).Add() 		} 	} 	for i := 0; i < b.N; i++ { 		v := new(A) 		switchFunc(v) 	} }  func BenchmarkInterface2(b *testing.B) { 	switchFunc := func(v interface{}) { 		v.(InterfaceB).Add() 	} 	for i := 0; i < b.N; i++ { 		v := new(A) 		switchFunc(v) 	} }  func BenchmarkInterface3(b *testing.B) { 	switchFunc := func(v InterfaceB) { 		v.Add() 	} 	for i := 0; i < b.N; i++ { 		v := new(A) 		switchFunc(v) 	} }  func BenchmarkInterface4(b *testing.B) { 	switchFunc := func(v InterfaceB) { 		v.Name() 	} 	for i := 0; i < b.N; i++ { 		v := new(A) 		switchFunc(v) 	} }  func BenchmarkInterface5(b *testing.B) { 	switchFunc := func(v InterfaceB) { 		v.Name() 		v.Add() 	} 	for i := 0; i < b.N; i++ { 		v := new(A) 		switchFunc(v) 	} } 

测试结果:

└──╼ go test -test.bench=".*" . -benchmem  goos: darwin goarch: amd64 pkg: org cpu: Intel(R) Core(TM) i5-8279U CPU @ 2.40GHz BenchmarkNormal-8       	1000000000	         0.2542 ns/op	       0 B/op	       0 allocs/op BenchmarkInterface-8    	1000000000	         0.8415 ns/op	       0 B/op	       0 allocs/op BenchmarkInterface1-8   	72095432	        15.48 ns/op	       8 B/op	       1 allocs/op BenchmarkInterface2-8   	55137806	        21.07 ns/op	       8 B/op	       1 allocs/op BenchmarkInterface3-8   	799164643	         1.449 ns/op	       0 B/op	       0 allocs/op BenchmarkInterface4-8   	767046265	         1.519 ns/op	       0 B/op	       0 allocs/op BenchmarkInterface5-8   	72075118	        15.82 ns/op	       8 B/op	       1 allocs/op PASS ok  	org	7.915s 

还有就是 interface 接口单独测试 Name()或者 Add()性能都差不多,可一旦两个一起调用,性能几乎减少了 10 倍,有大佬研究过这个问题吗?

对于稍微复杂的查询,怎么判断要对哪些字段加索引呢

Posted: 05 Sep 2021 07:37 AM PDT

比如我有一个查询,包括一个子查询,这个子查询有四个 and 的 where 条件,我就给这四个属性加了一个联合索引,

然后 where 之后还对 userId 进行分组求 MIN(某个属性),然后外层查询就有一个某个属性 IN 这个子查询的结果, 这里的操作我还需要用到什么索引吗?

最后我还需要对这个结果进行排序,按某个字段排序,这里加索引还有用吗?

大概是这样子的,( sql 不太熟悉,写的这个可能有错

items(userId,value,a,b,c,d,e)

SELECT * FROM items WHERE value IN      (         SELECT MIN(value) WHERE a=1 AND b=2 AND c=3 AND d=4 GROUP BY userId       )     ORDER BY e; 

golang 实现 office 转 pdf/image 有什么库推荐吗?

Posted: 05 Sep 2021 06:15 AM PDT

已经实现了导出 docx 或者 excel,如何进一步转换为 pdf/image 呢?

求教 SpringDataJpa 大神一个问题

Posted: 05 Sep 2021 05:33 AM PDT

问题描述

现象非常奇怪,同一查询,在其他方法中正常,但是在这个方法中 JSR 303 Bean 校验没有通过,查看后发现返回的所有数据域均为 null,见下图。

数据库里数据是存在的,其他地方的调用返回的数据是正常的,比如下面这里。

这两者之前的调用也都是类似的,查询用户信息,其中用户信息实体与错误代码实体以 @ManyToOne 关联并启用了延迟加载,如下:

排查进展

偶然尝试把用户信息实体中的懒加载替换为立即加载 FetchType.EAGER,问题就不再出现了,但是仍然不知道为什么。

很明显这里并没有直接用到延迟加载,错误代码是直接加载的数据库,但是关掉延迟加载后就正常,理论上报错的代码查出的数据等于延迟加载的这条数据,所以怀疑是不是延迟加载导致缓存中应有的数据未加载,而二次查询时没打到数据库而是直接访问的 Hibernate 缓存,延迟加载也失效了,从而导致二次查询数据域均为 null,但是这么来说的话又解释不了另一个查询为什么是正常的。

求推荐中等规模的 spring 开源项目

Posted: 05 Sep 2021 04:11 AM PDT

带完整 ORM 的. 主要参考项目结构,然后想看看 controller Service 和 Dao 到底都是啥...

最好带点简单业务, google 搜了一下全是各种 demo 意义不大.

本人不是敲 Java 的...所以实际工作中也看不到 Java 项目.

谢谢大佬,

No comments:

Post a Comment