Friday, November 5, 2021

V2EX - 技术

V2EX - 技术


Redis 到底应该怎么存储使用?

Posted: 05 Nov 2021 04:19 AM PDT

问这个是因为我们公司目前的方法 我觉得挺不妥的 然后我也没有接触过别的公司或者并发比较大的系统中如何存储以及如何读取 redis

使用 redisson 连接的 redis(哨兵)

目前是存人群信息, 分了 1000 个 key (redis 中 key 如果很多的话会有问题么)

1000 个 key 的 value 是 一个大 Map ,存取这个 map 用的是 getLocalCachedMap

map 的每个 key 对应一个人 value 就是他的数据(数据量肯定不大 几百 k 吧)

然后业务集群每天大概请求在 40 -50 亿 然后峰值是 70 亿(其中也会过滤一些请求 比如不合法的或者各种过滤条件过滤掉),剩下的基本每次请求都会去请求一下 Redis 拿用户数据

这样一个 map 的话就会存多个人群数据 这样子维护的话 不会混乱么 比如有的人更新了有的人数据没更新

大家有做过类似的这种 redis 数据维护么 我也想了解了解

C#这迭代也太快了 tnnd

Posted: 05 Nov 2021 04:06 AM PDT

我感觉我去年还在学 C#8.0
怎么现在 C#10 都出来了,加了那么多语法糖。

而且好多程序员都是 C#得老手了,一堆 jargon 完全看不懂,天哪学不动了

还有三周离职,老板叫我开发个新项目

Posted: 05 Nov 2021 03:34 AM PDT

活久见。。。一口老血吐出来

离职提前四周通知,我上周提的,老板同意了。现在还剩三周要走了,又让我开新项目,我跟他说时间不够,他竟然 push 我说"我知道你要走了,所以没那么投入了,好好干可以完成的"

这种情况该怎么安排交接和离职啊?我的想法是找个同事一起弄,我负责 30%-40%的工作量,剩下的提前跟同事交代好,离职以后就交接给他了

大家有什么更好的办法么?想体面一些,因为保不齐以后要找这个雇主帮忙出介绍信

Nginx 跳转问题(包含 ad 认证)

Posted: 05 Nov 2021 03:25 AM PDT

后端有一个 iis 站点,站点使用 AD 域认证模式。
前端使用 nginx 做了转发,将请求转发给这个 iis 站点。
目前测试下来发现转发后会提示弹窗认证,但是不论输入密码正确与错误都没法通过验证,一直反复弹登录框页面

备注:所有服务器都是 windows 服务器,包括 nginx 也是 windows 版

有没有大佬碰到过这种问题?能否通过修改 nginx 配置的方式实现?

Mybatis 查询和数据库直接查询结果不一致

Posted: 05 Nov 2021 03:19 AM PDT

我在本地建了一个 mock 数据库,期间没做过写、删,mybatis 打开了日志打印。
一样的 sql 语句,select count (*)。
查询出来的结果却不一样,一个是 197 ,另一个是 89 。
这是为什么啊

kibana Discover 模块没有 Time Picker 按钮

Posted: 05 Nov 2021 03:19 AM PDT

看过官方文档,没有找到解决方案,是跟数据结构有关系么?

索引结构和内容
https://imgtu.com/i/Iu5zTJ

https://imgtu.com/i/Iu5vmF


官方链接: https://www.elastic.co/guide/en/kibana/7.12/set-time-filter.html

spring 事务问题

Posted: 05 Nov 2021 03:14 AM PDT

两个 Service A 的方法 A 没有加 @Transactional 和 Service B ;

Service A 的方法 A 没有加 @Transactional

Service B 的方法 B 添加 @Transactional

方法 A 调用方法 B ,方法 B 出错,抛出全局异常,

为什么会去回滚到 controller 里,再执行一次。

相当于 B 抛出全局异常后, 这个接口执行了两遍

分享一下我的家庭网络拓扑

Posted: 05 Nov 2021 03:13 AM PDT

我的家庭网络拓扑图

数据流部分

  1. 网络核心部分是 Nano Pi R2S 这个软路由,经过一年调教,已经能适应我这里的一切网络需求了。主要运行了 Wireguard 、流量监控、网路唤醒等服务。因为我们小区只有百兆网,所以性能暂时够用。
  2. 几乎所有网络设备都通过中间这个交换机与软路由通讯,虽然不算什么好的交换机,但是同理,够用。
  3. 数据中心是用 intel NUC8 搭建的家庭服务器,主要部署了 emby 、Nextcloud 、qbittorrent 等服务,满足了家庭观影、数据存储等需求。
  4. 存储采用多个硬盘,目前放弃了阵列模式,家庭用的话还是单块盘来用性价比最高,经常冷备、热备就好。
  5. 家庭服务器通过 FRP 服务把 Nextcloud 服务映射到公网,方便在外看家庭数据。
  6. 主力机是一台 E3-1231 V3 的机器,为什么还在用好几年前的平台?因为满足我的需求了。
  7. 我把一台小米路由器当 AP 用了,目前可以满足所有智能家居、所有手机、平板的稳定联网。
  8. 智能家居方面,完全采用了小米的方案,好看就是王道。

功率电部分

  1. 图中除了主力 PC 、移动设备和智能家居,其他均部署在一个机柜内,所以两个插排就搞定了。
  2. UPS 还是很有必要的,帮我至少挡住了两次意外停电。

关于防抖函数有个疑问

Posted: 05 Nov 2021 02:51 AM PDT

在网上查到的简单的防抖函数实现是这样的,试了一下确实可以实现防抖,但是我没搞明白多次调用函数每次 timer 不是都会新建一个并赋值为 0 吗?为什么可以把 timer 做为判断标志?

const debounce = (func, wait = 50) => {   let timer = 0   return function(...args) {     if (timer) clearTimeout(timer)     timer = setTimeout(() => {       func.apply(this, args)     }, wait)   } } 

Python 包导入的困惑

Posted: 05 Nov 2021 02:26 AM PDT

下载了一个 python 项目,目录是这样子的

- XXXProject   - A     - __init__.py     - xxx.py     - yyy.py     - ...   - scripts     - zzz.sh 

xxx.py 的内容是

from A.yyy import YY if __name__ == "__main__":     # ..... 

yyy.py 的内容是

class YYY():     # ..... 

zzz.sh 的内容是

python A/xxx.py 

然后我就按照 README 所说,在项目根目录下执行 sh scripts/zzz.sh,结果报错了,错误是

ModuleNotFoundError: No module named 'A' 

这是为什么呢?

vscode 能不能根据项目配置,开启不同的插件,比如一个 vue2 的项目开启 vetur,再打开一个 vue3 的项目开启 volar

Posted: 05 Nov 2021 02:25 AM PDT

请问 Django 的 JSONField 字段有没有必要进行索引?

Posted: 05 Nov 2021 12:48 AM PDT

比如我有一个 JSONField 字段,内容如下

{     "A": 1,     "B": 2 } 

我想筛选字段 "A" 的值为 2 ,或者 字段里面包含 B 这个 Key ,这种条件下,Django 的索引会加快查询速度么?

咨询一个搭建 PHP 部署环境的问题

Posted: 05 Nov 2021 12:42 AM PDT

我想在一台 linux 服务器搭建一个 PHP 部署环境,可以支持在线修改代码的那种,最好能集成 mysql 的管理工具,求指教

分享一个在 Django 的 model 里,使用元类动态添加相似的带自定义中间表的多对多关系字段的方法

Posted: 05 Nov 2021 12:33 AM PDT

当有多个 model 通过 ManyToManyField 关联到同一个目标 model 时,如果这个 ManyToManyField 需要额外的字段,则需要单独定义一个中间表。
这时中间表除了指向的源表是不一样的,其他字段包括目标表都是一样的,比如:

# base model class Created(models.Model):     created = models.DateTimeField(auto_now_add=True)      class Meta:         abstract = True         required_db_vendor = "postgresql"   class CreatedModified(Created):     last = models.DateTimeField(auto_now=True)      class Meta(Created.Meta):         abstract = True 
class Argument(CreatedModified):     ...   class ArgumentThrough(CreatedModified): 	# argument 中间表基类     argument = models.ForeignKey(         to=Argument,         on_delete=models.PROTECT     )     value = models.JSONField(blank=True)      def clean(self):         argument_value_validator(self.argument, self.value)      class Meta(CreatedModified.Meta):         abstract = True  
class Inventory(CreatedModified):     ...      class Meta(CreatedModified.Meta):         abstract = True   class Host(Inventory):     inventory_variables = models.ManyToManyField(         to=Argument,         through="HostArgument",         blank=True,         help_text=_("Variables for host")     )   class HostArgument(ArgumentThrough):     # Host 到 Argument 的中间表     host = models.ForeignKey(         to=Host,         on_delete=models.CASCADE     )   class Group(Inventory):     inventory_variables = models.ManyToManyField(         to=Argument,         through="GroupArgument",         blank=True,         help_text=_("Variables for group")     )    class GroupArgument(ArgumentThrough):     # Group 到 Argument 的中间表     group = models.ForeignKey(         to=Group,         on_delete=models.CASCADE     )  

可以看到 Host 和 Group 的两个关联 Argument 的中间表除了指向的源表以外,其他字段几乎是一模一样的,所以可以改成这样:

class Host(Inventory):     ...   class Group(Inventory):     ...      def add_related_field__argument(cls):     through_cls_dict = {         cls.__name__.lower(): models.ForeignKey(             to=cls, on_delete=models.CASCADE         ),         "__module__": cls.__module__     }      cls.add_to_class(         "inventory_variables", models.ManyToManyField(             to=Argument,             through=type(                 f"{cls.__name__}Argument", (ArgumentThrough,), through_cls_dict             ),             blank=True,         )     )   for model in (Host, Group):     add_related_field__argument(model)  

用这种方法,就可以不用写"重复"的代码了。
不知道你们是怎么解决这类问题的,希望我能抛砖引玉。

罗技摄像头 c920 有人用么?或者有更好的欢迎推荐。

Posted: 05 Nov 2021 12:33 AM PDT

主要是开视频会议用。谢谢

html table width 问题

Posted: 05 Nov 2021 12:06 AM PDT

遇到个问题,关于 html 中同时设置 table 元素的 table-layout: fixed; 和 width: 100%;的问题:

实际结果如下: 如果 .container { width: 600px }, 那么

  1. 如果不设置 width 属性,则 table 的宽度就是 600px
  2. 如果设置 table 的 width: 100%; 则 table 的宽度是 col 的宽度之和 1920px;

我的疑问是:

  1. 这个 width: 100% 是怎么计算的?
  2. 当 width: auto | 100% | 具体像素值; 遇上 table-layout: fixed | auto; 又是怎么计算宽度的?

有什么资料可以提供查阅吗?我现在只知道会有这样的效果,但是不知道为什么,找了挺久资料也没找到,有了解的大佬可以跟我指个路我去看看?

 <style> .container { 	width: 600px; } table {     table-layout: fixed;     width: 100%; // 这里切换是否设置宽度 } </style> <div class="container"> 	<table class="table"> 		<col style="width: 30px"> 		<col style="width: 90px"> 		<col style="width: 200px"> 		<col style="width: 200px"> 		<col style="width: 600px"> 		<col style="width: 300px"> 		<col style="width: 500px"> 		<thead class="thead"> 			<tr> 				<th> 					# 				</th> 				<th> 					姓名 				</th> 				<th> 					年龄 				</th> 				<th> 					职业 				</th> 				<th> 					住址 				</th> 				<th> 					兴趣爱好 				</th> 				<th> 					其他 				</th> 			</tr> 		</thead> 		<tbody> 		</tbody> 	</table> </div> 

有大佬用过 阿里开源的 datax 数据迁移工具吗

Posted: 04 Nov 2021 11:54 PM PDT

我在使用过程中有一些问题 1 、datax 开源版本能否支持实时同步 2 、当 table 配置多个时,column 如果配置为"*",那么将报错。因为不同 table 字段不完全相同。难道一个 job 只能配置一个表?

用了多年的逻辑鼠标,终于还是被他的驱动给劝退了。

Posted: 04 Nov 2021 11:48 PM PDT

一直用逻辑的鼠标,G502 为主,自定义按键关闭窗口,桌面,前后切换等都很方便。 但是最近这几年驱动安装更新问题,睡眠后重启失效,还有那反人类的程序设计,实在是烦了,算了。 有老哥们推荐推荐其他能自定义按键的鼠标吗?

主要就是办公用家用,不打游戏,除了左右键滚轮外,还有 4 个按键可以进行编程就行,关键就是得驱动适配好点。

记录翻译过单词的 Chrome 插件或软件

Posted: 04 Nov 2021 11:17 PM PDT

老铁们有没有可以记录翻译历史的进行汇总的软件,Chrome 插件或者 App

现代 Web 开发过去与未来

Posted: 04 Nov 2021 10:58 PM PDT

1 、最开始,网页只是用来看。Data → UI 是映射关系,所以最开始只有后端,因为后端把自己的 Data 转成 UI ,这是最本能的开发模式。

2 、Web 2.0 出现,网页变得可操作(从维基百科只能看,到 Blog 可评论),变成了 Data → UI → Action → Data ,怎么处理 Action ?这带来了 Ajax 崛起。

3 、Ajax 崛起主要是因为体验好,以前的开发模式当然也行,效果就是发一条评论,网页就刷新一次,这显然是让人崩溃的(其实很多老的 WordPress 博客就是这么工作的)。

4 、同时,浏览器性能提升,很多效果可以用 CSS 实现。网页就不只是 Data → UI → Data 这么简单了,同时还有 Loading 、CSS 效果、动画、UI 切换等。

5 、其实旧的开发模式,特别符合设计稿 → 网页的转化,什么按钮、圆角、阴影、特殊字体、动画,全都是一张图,设计师想改,换图片就行,不用改代码不用 build 不用发版。都使用 CSS 实现之后,才出现了设计到前端的转化问题( CSS 当然是有巨大优势的,比如天生的 responsive ,这又表明了顺应时代,因为移动端带来了多屏幕尺寸问题)。

6 、交互逻辑的大量涌现,与后端处理 Data 的开发思维是相悖的。为什么呢,想象一个完全没有 Data 请求的网页,也可以做的很炫酷很复杂,涉及大量 CSS 、JS ,这些工作谁来做呢?让后端来写显然不太合适。

7 、这时,前端就出现了,简单来说,前端的出现就是为了处理交互。随着交互的工作量越来越大,而这又偏离了后端处理 Data 的思维,以至于不得不出现专门的工种来干这个。

8 、所以处理 Data ,其实只是前端工作中的一环,完全不是全部,如果只是处理 Data ,后端来写 jQuery 处理不也行吗?

9 、当然,现代组件库也隐藏了很多细节,比如 hover focus 态、button 点击动画、UI 切换、loading 、自动布局、HTML 语义化等,都被包含在了组件库中。但即使如此,处理 Data 也只是一环,涉及到一些组件库无法覆盖的情况,还是需要前端来处理,更何况,组件库也是前端来开发的。

10 、回到最本能的开发方式,最符合直觉的方式,其实是后端来处理 Data ,前端来干其它的。但不太现实,因为 Data 与 UI 天生是绑定在一起的。

11 、现代的前后端分离当然有一些问题,但同时也有不可替代的价值。其实往大了说,整个人类发展就依赖于分工。一个人不可能造出一部 iPhone ,但分工协作可以。

12 、即使完成数据源服务的全部设想,那么维护数据源的人,会成为新的后端,消费数据源的人,会成为新的前端。而数据源的变动,依然需要前后端协调。当然,数据「元」服务肯定是有价值的,但前后端协调还将存在。

13 、本质上是因为,处理 Data 、处理 UI 就是两种不同的思维,前者是理性的,后者是感性的。理性是能不能用,感性是好不好用,两者缺一不可。举个例子,DOS 不能用吗?但大家喜欢 Windows 。直接刷新网页不能用吗?但大家喜欢 Ajax 。人不都是一堆肉吗?但大家喜欢好看的。

14 、各种变革到最后,很可能是解决一个问题,又带来了新问题,很可能是相比接口开发也没什么特别提升。而一个东西能不能产生革命性改变,决定了投入程度和未来的发展。

15 、前后端协调肯定存在,这是个大前提,让设计师去写代码,这也很难。后端就是 Data ,设计师就是 UI ,前端就是 Data + UI 粘合剂,这是历史使命。

16 、前端可以去研究怎么把 Data (逻辑) 与 UI 尽量分开,把逻辑更新与 UI 更新分开。因为按照 UI 改变量、就更新全局的思路,如果组件依赖于版本,不还是旧样式。所以,组件 UI 得来自外部,不依赖版本,就像组件 Data 是来自外部,不依赖版本。

17 、参考一下旧时代的开发模式,设计师改图片源就行,与前端代码无关,此时 UI 来自于外部 URL 。而未来 Web 开发,理论上组件 UI 也应该来自外部,自接口下发,跟组件自身代码解耦。

18 、而组件的 Data 逻辑,也应该来自外部,尽量解耦。参考类似 FaaS 思维( Next.js 12 Edge Functions ),直接在服务器上改函数就行,不用前端改个字段就得 build 一遍。

19 、所以未来前端的工作,不是思考大一统,自己写后端,拉设计师写前端(当然,这也是一个思路,但很可能只是转化了工作,而各工种分歧依然存在)。而是思考怎么设计一套 Data 与 UI 充分解耦的架构,把 Data 控制权释放给 Server ,让 Data 逻辑热更新,把 UI 控制权释放给设计师,让 UI 热更新。

20 、前端呢,就负责维护这个外部变量「依赖注入」的充分解耦系统,没事别老 build 。


Inspired by 《现代 Web 开发困境与破局》

面试遇到的 Python 多进程死循环问题求解

Posted: 04 Nov 2021 09:09 PM PDT

面试遇到面试官问:假如有两个 python 死循环进程同时运行在单核 cpu 上,会有一个进程永远不会执行吗?为什么? 我回答:不会,时间片到期后会切换。

感觉我回答的有问题,于是设计实验想验证一下,新建一个 python 文件,在两个 shell 分别执行,给不同的参数并将输入重定向到同一文件中,这样设计有问题吗? 代码如下:

import sys if __name__=="__main__": 	while True:     	print(sys.argv[1]) 

执行命令:

nohup python 1.py pid1 >./temp.out nohup python 1.py pid2 >./temp.out 

Git 能够搜索出来这样的 commit 么?改动了某一个或多个指定目录下文件的所 commit

Posted: 04 Nov 2021 06:56 PM PDT

root\   sub1\   sub2\     components\   sub3\     states\       core\   ...  

我现在想找到所有的 commits ,这些 commits 里面包含有文件在 root\sub2\components\ or root\sub3\states\core\ 下面(在它们的子目录下也算在内)?

谢谢

GitHub 上有什么好的官网生成 Repo 推荐?

Posted: 04 Nov 2021 05:56 PM PDT

一个不错的 go 博主 [go101]

Posted: 04 Nov 2021 01:35 PM PDT

一个不错的 go 博主 [ go101 ]

经常在推上看到这个组织发表对 go 的理解,通过代码实现对比。然后多人前来讨论, 后来发现这是国内一大佬~,不由得膜拜一下,按图索骥,加了 go101 的群,经常看到在群里都在热烈讨论,不吹水。感觉国内氛围很不错。

哈哈,在这支持下 go101 这个组织。

github:https://github.com/golang101/golang101 tw:https://twitter.com/go100and1/status/1455456634210160640?s=20

有兴趣的 goher~ 来加我哈,一起聊有意义、助成长的 go 氛围。

联系 v base64: bGlmZXdpbGxwYXNz

宝贝回家公益技术项目招人了

Posted: 04 Nov 2021 09:08 AM PDT

背景介绍: 宝贝回家是一个公益寻人组织,免费为社会提供公益服务。

目前,我正在计划开发小程序,欢迎有爱心,有时间的小伙伴加入。

快快微信扫码联系我吧! 企业微信

更多信息

首页: https://baobeihuijia.com/ #公众号:宝贝回家 #小程序:宝贝回家 https://github.com/airdb/mp-bbhj

TCP 中,没有 SACK 能力的接收方,也会缓存 LastRcvd 之后的数据包吗?

Posted: 04 Nov 2021 08:58 AM PDT

我现在知道了,tcp 在三次握手的时候会确认双方有没有 SACK 的能力(通过选项)。

如果有的话,那么接收方可能下面这种情况: 即已经收到了 14-20 的包,但由于网络原因,又收到了 22-23 的包。这时候,可能接收方会回复信息 ACK = 21 、SACK = [22-23]、window = 5 。所以,接收方有缓存 LastRcvd 之后的数据包的能力( 22-23 ),即使 21 没有收到。

但我现在想问,如果接收方没有 SACK 的能力,

  • 那么接收方也会缓存 LastRcvd 之后的数据包(22-23)吗,只是单纯不会通知出来 SACK 信息而已?
  • 还是 既不会缓存 LastRcvd 之后的数据包(22-23),也不会通知出来 SACK 信息?

No comments:

Post a Comment