粉丝2199获赞1.2万

讲到这里呢,我们就讲一点以前没讲过的东西,就是前前段时间呢,刚刚上线的这个 http service 的 服务。 对,以前呢通过天晴去行情,对吧?你需要有一个天晴的会计账号,然后你要拍摄,然后来来获取,并没有提供一个更更后面一点,或者说更原始的这个数据接口。这一点呢,有很多用户呢一直都会有需求, 包括呢我们现在发现其实很多人在做投研的这个阶段呢,其实随着大模型越来越好,对吧?我们其实大家来做投研的时候呢,都会直接的想尝试去说我去跟大源模型对话,那是不是大源模型可以直接来帮我去验证某些回测结果, 但是呢大源模型呢,现在有一个最关键的问题呢,在于它没有历史数据,它可能说有最近, 最近一两周,最近一两个月的日线或者一两天吧,它可以去跟你去对应的这个数据商里面查一查,但你假如说我要回测最近五年的数据,其实它是没有的。那在这种情况下呢,我们就准备去提供了一个 http server 的 这个数据获取的服务, 那通过这个数据服务呢,我们现在是用户无需健全呢,可以获取我们全部的日线数据,然后在无需健全的情况下呢,可以获取最近一年的分钟级别的数 据,健全之后呢,可以获取全量的分钟级别的数据,然后我们整个文档呢也都会朝着大圆模型去做优化,那它可以来做到什么样的事情呢?这个呢是我昨天刚刚试了一下的, 就打个比方,我们现在看到了一篇研报,对吧?看到了一篇很有名的研报,这一篇研报上面呢,它说了一个观点,就是说 五子期货啊,如果说我每天的收盘到第二天的开盘呢?它是有一个隔夜收益的,就是说如果我持有五子期货的多头,我每天以这个收盘价去买入,然后以开盘价去卖出啊,我都能赚到钱,这是一个非常简单的策略,然后呢他还画了一下对应的这个收益的曲线图, 那看到这篇引爆,我心里就会有个想法,对吧?那既然这个策略这么简单,那我就要去验证一下,那以前我要验证这个策略,我该怎么做呢?我需要先去找一个数据供应商,我就要去存储这个对应的数据, 我把数据存下来,数据存下来之后呢我,我要么呢?我用 excel, 要么我用 python, 对 吧?我要去写这个脚本, 写完这个脚本之后呢,我要去根据最后的结果呢,我要来做一个格式化。写完这个格式化之后呢,我还要来做对应的分析,比如说我光看了隔夜收益还不行,对吧?我还要看它的日内持有的收益嘛,比如说这两个收益对比,我才知道这个是不是真正的是超额收益。 那我现在可以来做什么事情呢?我可以来做这个估值期货策略,然后呢我把这段话呢写下来,大家如果感兴趣,如果想试一试呢?也可以直接把我这句这段话复制了,甚至说你可以截个图,直接把这个图丢给大约模型,就是说基于这个网站,这个这个网址呢,就是我们做的这个 这行情数据的这个服务,然后它里面呢会有详细的这个 demo 和讯息,就说你看这个网址,看了这个网址之后呢,帮我来获取 i f i c i h 最近五年的日线主页数据,然后以每天的收盘收盘价买入,开盘价卖出,然后统计这个隔夜收益与日内持有多头合约的收益比。 最后呢来告诉我结论,到底这个股子期货的收益的主要来源来于来自于日内波动还是个月收益?我说把这句话发进去之后呢,这个是我在 c c 里面来做的,用的呢是那个叉 g p 五点二来做的, 他就会吭吭哧吭哧给我写一个 python 脚本,然后给我产出一个回测报告,然后产出每天的这个收益图,然后最后一个进度图,然后他就告诉我什么结论呢? 你比如说以 i f 为例,对吧?隔夜收益这么多,日内收益这么多,总结来讲呢,就是期货主年的收益更偏向于隔夜收益,日内收益啊,几乎都是负贡献,然后只有 i c 的 这个日内收益是正贡献, 包括呢我们后面呢还有一个这个可数画图标,他直接戳出来的,也就是随着现在大圆模型的能力越来越强啊,在你有这个比较好的数据的支持下,你其实可以直接用它来做一些简单的这个回测脚本的分析,对吧?包括他也会,他会直接给给你, 就基于我们的服务啊,它会直接给你可以重复使用历史数据,然后可以复现的这个 python 脚本,这个 python 脚本我都都在我本地,然后还有这格式化的图标和测试结果,那这样呢,我大概用了五分钟吧,五分钟就连历史数据带 python 脚本带格式化,就把这个言报呢复现出来, 这个呢就是我们现在在做的这个 http 思维,就是我们认为啊,在以后的这个言报 的附件的难度啊会更降低,或者说一旦大家有某个想法之后,去验证自己想法的能力啊,会变得更强。但是大约模型现在最关键最缺少是什么?它是缺少历史数据,当然呢它也包括其中的一些使用技巧,对吧?使用技巧 我们再往后呢会提去提供这样的一些服务来去给到大家。那从研报有这个想法,到 python 验证, 再到得到结论,那得到结论之后,你如果要实盘,对吧?那实盘呢?天启又是一个本地开源的一个量化框架,那你基于大源模型来去搓这个量化框架呢,你会很方便。 同样的我们现在天启上面呢也有了几十个吧,各种各样的人数,各各种各样的策略,我们很欢迎大家先用大源模型来去把这个策略总结一下,然后再基于这个 i c p 搜完,然后你看两边得到结论是不是一样的,我很欢迎大家去做这样一个尝试。 这样呢就把我们的整个天晴,包括说我们最近做的一个新的 htv server 的 这个服务介绍完了,然后天晴的价格呢,大家去看我们官网就会有。那讲到这里呢,就做完了我今天的分享,然后再看大家有什么问题呢?我们可以回答一下。

咱们来挑战一下,不写代码的情况下,我们到底能不能开发出一个完整运行的 app? 那 这里我们开局是一张图, ide, 我 们选择腾讯的这个 call buddy 模型,这里我们选择 glm 四点七和 kimi 二点五,因为这里咱们要构建的是小程序,所以咱们选择 taro, 然后下一步咱们再用 kimi 二点五把图扔给它。这里生成完之后,我们看一下界面当中的效果, 其实大体还是可以的。顶部这里有一些排版的错乱,我们可以让它调一下, 这个地方呢,它没有识别成完整的 banner, 我 们再让它调就行了。那删选项这里识别的也不是很合理,数据列表这一块也是大体的结构,还可以,我们根据自己的实际情况再让它调,底部这里识别的还可以。 好,那接下来我们根据自己的实际需求,再让 kimi 来进行页面局部的一些调整。那经过一番调整过后,我们看现在的一个页面排版,这个还原度咱们就先不考虑,但至少目前是 看起来是比较正常的一个排版。这些调整全部都是 ai 自己去完成的,我们只是希望它改成什么样子,比如说这个 两段文本之间,我们希望它间距进行缩小,那这里我跟 ai 去聊的时候,其实不需要指定一些专用的词语,咱们就直接截图给他,让他去改就行。比如这里我们直接截图,然后直接扔给大模型,然后告诉他 两横文本的间距加大一点,然后我们看它修改过后, 是不是这里有了变化。现在界面没什么问题,我们就展示这个效果,那我们现在要搭建一个后台,然后把这些数据进行一个获取,我让他在项目里边创建了一个 server 目录, 然后在这个目录下去创建一个后台接口,然后这里的框架你可以自己去选,我这里就直接让他用靠就行了啊,不指定也没关系,他自己会去找。然后数据库我让他用的是马斯扣,这个地方编辑的还是很顺利,一遍就过了。编辑完之后你让他自己去运行, 他会告诉你这里起了三千这个端口,然后提供了哪些接口。然后我又跟 ai 说,我说那你把界面当中的这个地方,你换成真实的接口调用,然后现在大家看到的就是他自己调用接口的,但是这里其实已经出现了非常大的问题, 我们来看一下,这个是我打印出来他调用接口的东西,看到没有?这里已经出很大的问题,这上面的所有的文案都是通过接口吐出来的, 那这显然是不合理的,我们数据里面只一般只存数据,你不能说所有的文案都是来自于数据库里,应该有一些是在逻辑控制上面。好,那到这里我们就需要思考一个问题,那要不要对他进行修正?还是说我们随着后续逻辑的编辑,然后去慢慢的指引 ai 把这个逻辑进行修正,那到时候他的工程体量也会比较大,他自己能不能修改的了?那这里咱们选择后者。

大家好,我是马农 ag。 今天我们来聊一个在实际开发中非常普遍的性能问题,为使用缓存重复查询相同数据。 这个问题看起来不起眼,但在高 qps 场景下,它会直接让你的数据库不堪重负,接口响应急剧变慢。先说说问题场景, 想象一个高病发的订单接口,每秒要处理一千多个请求,每次请求都要查询字典数据,比如性别字典、学历字典、订单状态字典,还要查询系统配置信息,比如接口超时、时间限流预值。 这些数据有一个共同特点,几乎不会变化或者变化非常低频。但是在没有缓存的情况下,每一次请求都会去数据库执行相同的 c 框,一秒一千次,完全是无效的重复劳动。 这会带来三个严重问题,数据库连接池压力激增,高 qps 下很容易耗尽连接,出现连接超时, 接口响应延迟,因为每次都要走数据库 i o, 毫秒级的查询,叠加起来就是明显的卡顿以及系统资源浪费。相同数据反复传输,占用 c p u 和网络待宽。怎么发现这个问题呢?方法很简单, 第一步,在配置文件里开启 spring g p a show c q 等于 true, 把 c q 打印出来。 第二步,多次访问同一个接口,传入相同的参数。第三步,用 arseus 的 monitor 命令监控 dick repository 的 find by dick type 方法,统计五秒内的调用次数, 你会发现 sql 调用次数和接口请求次数完全一致,每一次请求都在执行数据库查询,没有任何附用,这就是问题的直接证据。 接下来看问题代码,在 cash before service 里 get dick by type 方法每次被调用都直接走 dick repository 查询数据库, get config by key 方法也一样,每次都查 代码,写法没有任何问题,逻辑也是对的,但就是缺了缓存这一层,导致相同数据被反复从数据库捞取,毫无复用可言。 一千 q p s 的 接口就意味着数据库每秒要执行一千次完全相同的 sql, 那 怎么优化呢?答案非常简单,就是 spring cash 里的 at cashable 注解。 在 cash after service 里给 get bit by type 方法加上 at cashable 注解,指定 cash names 为 dick, cash 屁为 dick type 参数。 这样第一次查询的时候, spring 会先看缓存里有没有,没有就去查数据库,把结果存入缓存,后续再有相同 tiktok 的 请求进来,直接从缓存拿,根本不会进入方法体,也不会执行任何 sql 同理配置信息查询加上 at cashable 注解, key 用 config key 还加了 nes 条件,结果为空时不缓存,避免把空结果也缓存进去。两个注解加上去,核心问题就解决了。优化效果有多明显? 根据实际压测数据,优化前 qps 大 约只有一百二十 p 九九,延迟接近七百毫秒,数据库压力极大。优化后 qps 直接飙升到三千五百 p 九九,降到三十五毫秒以内,性能提升大约二十五倍。 而且优化后用 rss 在 监控你会发现 find by tiktype 在 五秒统计窗口内的调用次数极少,仅在第一次请求实调用一次,后续完全是缓存命中,数据库几乎零压力。最后总结核心要点, 识别可缓存数据不变或低频变化,查询频繁、数据量小。这三个特征同时满足的数据就应该做缓存。核心注解有两个, at cacheable, 负责读取时缓存附用 at cache。 evict 负责数据更新时清除对应缓存,保证数据一致性。 缓存选型上单节点用 cafe, 本地缓存速度快,无网络开销。集群部署用 readys 分 布式缓存,保证多节点一致性。 记住这句话,能从缓存取的绝不查数据库。数据库是持久化存储,不是高频查询的容器,合理使用缓存才是解决重复查询问题的根本。好了,今天的内容就到这里,我是马农 ag, 我 们下期见。

大家好,昨天我们讲的是复合类基本类型,那今天我们讲 bing 类型,就是像 spring 一 样写一个 bing 的 类型。我们先把这个类的呃这个 controller 给给它禁掉,那禁掉的时候直接在这地方传入 force, 我 们在运行的时候它就不会再进行把这些内容输出出来了。 好的,那看见已经没有了,那接下来的工作,我们先创建一个兵,我们创建一个 student, 下一步完成。 bin 呢?它需要从继承的类是 call bin i bin interface 也是通过 crtp 的 方式进行继承。 q get it。 那 我们现在开始写我们的字段 拼音 field int id, 那 我们默认的 id 是 零吧,那我们下一个拼音 field clear 吧。 binfield 和 binfield declare 的 区别就是 binfield declare 需要再次声明这个东西,那下面就是我们重新把这个 spring name 声明一下,月刻月 bin 的 内容的话,我们可以放在之后关于 icloud 的 一个内容当中再讲。 那在我们的 o r m 框架 i r d b 当中,我们也会讲到关于 bing, 当然那个时候我们将 bing 分 装成了我们的 table 和我们的 view, 这个东西 is mail 售后是男性处。再来一个 bing field 的 s t d screen 吧。 嗯, school school 是 哪个学校呢?我是 h d u。 还有一个,我们 infield declare 是 一个动态类型, kill that create that kill that create that kill that current。 今天创建的 kill that time 吧, 这样的话可以看到具体的一个时间,也就是说我们在这个中间可以有很多的字段进行一个反射,包括一些复合类型。但是在这个地方我们不会讲这个东西。 我们再创建一个 control 了, control 了 bin return type control 啊, include h t d p controller i h t d p controller interface public i h d controller interface bin q get it as controller。 我 们传一个 v 二吧, v 一, 那我们传这个 bin 的 时候,就是之后所有的 controller 在 这个类当中写的那个映射,都需要前面有 bin 这个前缀 public, 然后 get mapping, 我 们刚才写的是 student, 是 吧?我们把这个类给导进来, include student, 你 猜一下大家,大家猜一下我下面是干什么?直接返回 student 行不行?行不行?我们见证奇迹的时刻, 跑起来, uh current that time 在 翻译这个 student, 好 的,我们已经翻译完成。跑起来,那你看见我们在这个地方,我们直接把这个宾作为一个返回值对象进行返回, 那 i a h d d p 或者说 i webco 是 能够捕捉这个返回值类型的,这是在 c 加加其他任何框架当中是没有的。这样的一个功能,我们请求一下这个这个路径啊,那我们前面有这个啊, ctrl 了呢? 我们前面有 bing 的 一个路径,后面有 student 路径,所以说这个路径就是 get bing students 多了一杠,返回的是一个 jason 类型,能看见它是我们想要的这样的一个数据结果。那我们其实 我们的 bin 呢,工作就已经完成了,它返回的是一个 application johnson 的 一个类型。在接下来的地方,我们继续啊操作这个 bin, get a mapping 什么呢? student list q list student, 能不能直接返回 student list 呢?也没有问题,在我们的实际的软件开发当中,那一般来说我们是通过前后端分离,那 前端主要请求的就是我们的一个加成数据,那我们完全请求,比如说我请求一系列的学生,那我直接返回一系列的学生,呃,完全是可以的嘛。 student i t four in i 等于零, i 小 于 三 i 加加 i e t。 点 app return i e t。 啊,那我们这个路径是 student list 路径,我们再创建, 刚刚是兵。 嗯,怎么报错了呀?打得太快了,似乎出错了。 好的,我们的 being student list 已经返回过来了。 完美,我们返回了三条数据,那我们能不能再往前呢?嗯,我们再嵌套一层 q list, 能不能这样返回 student list list? 我 先公布答案哈。这个是不行的,但是我们可以有其他的一个解决办法。我们看一下啊, return it 它会报错,因为我们所有的返回类型都是通过原对象 q t 的 一个原对象进行一个注册的, 那在这里面就报错。 return type cannot be resolved by system。 这个类型就不能够被系统所解析。那我们怎么去绕过这个东西呢? 返回一个 i johnson 对 象, 就是我们提前把这个对象转换成一个我们的 johnson 对 象,这个 i johnson 是 norman johnson, return i johnson youtube to johnson it, 这个这个 to johnson 这个数据就是它的参数,可以为任意的一个可解析的参数。 那我们还是像刚刚一样, int i 等于零啊, i 小 于三, i 加加 i d 点不是 back, 我 们把这个这个数据放进去。 好的,这样就可以了, 优质打印一下, 这是三条数据,这个地方是三条数据,这个地方也是三条数据,那总共是九条数据,那我们这个数据是对的。 那有没有其他的办法解决这个问题呢?也有,我们在我提前 提前讲一下啊。二,有一个叫 include h t t b response, i johnson response。 嗯,你直接把这个地方换成 johnson response, 或者说 那它是这个地方直接 return it 就 可以了, 我们请求一下二,是吧?也是对的。那还有没有一些方法呢?其实在这个地方降省的话,呃,我记得哈,你是直接可以 return 的 return it, 我 试一下啊。 哦,不行,不好意思,我记错了。那所以说在这个地方如果想直接返回对象,你直接放一个 i johnson response 一个类型就直接就可以了。那这个地方 johnson response 的 数,这个 我们之后会再讲到这个东西,那我们再回到这个地方, 嗯,再回到我们前面的这个代码,那除了这个 q list 之外,还有 q vector, s d d list, s d d vector, 它都能够做到同样的效果。那还有一些这个东西叫 map 类型, 那 q map, s d d map 也是可以的,我们返回一个啊, q map, q q string 或者 s d d string。 那 下面是 student student map get mapping。 好的,我们返回这么一个对象,就是说它是一个 map 对 象。 return spring, 我 们缩进一下就到那边了。 it return it it best 等于 student, i e t handsome 等于 student。 至于这个 student 的 用法也是怎么样呢?我们之后再讲这个东西,那我们已经定义了一个 qmap 的 一个对象。 好的,在这里 我说话一下。那最好的月客源在这里,最帅的月客源也在这里。那看见我们已经把这个对象我们刚刚定义的这个内容转换成了我们想要的 啊,讲省内容。哎呀,这个想要的,这个讲省内容, 那所以说今天就是这个视频,嗯,的主要目的就是让大家知道我们在项目当中支持这种病的一个返回操作。那如果是简单的就是只有一层封装的 list 或 vector map, 一 层封装的我们可以直接返回。如果是多层封装的,我们通过先转换成 johnson 再返回,或者是直接使用 johnson response 进行一个返回,那 johnson response 可以 接受任意的嵌套的一个数据, 嗯,这个就是我们今天的一个视频。嗯,接下来的时间我们再介绍一下,就是我们的欠讨类型,那 int in the list 这种方式可不可以呢?可以的, in the list 就是说我们的嵌套除了 bean 类型之外,也支持我们在上一节视频当中所讲述的基本的数据类型,就是我们的 数值类型, screen 类型,时间类型等等一系列的类型。 return q list int for int i 等于零 i 小 于十 i 加加 i t 点 append i 乘以 i return i t。 我们刚刚的 in the list 在 这里 看见,在这里面我们得到了我们想要的正确的结果。 好的,那今天我们讲述的 being 的 嵌套类型就到此为止。在接下来的视频当中,我们会讲一下 johnson response 类型,就是我们刚刚在这个地方使用的 i johnson response 类型,用户可以通过这种 response 自定义 response 类型来返回想要的东西。 那比如说我们,嗯,非常喜欢嗯 spring 当中的 model and view, 那 我们可以自己定义一个 response model and view response 来返回数据,把我们的啊页面,把我们的内容一起塞进去,返回给 前端。好的,这就是我们今天的视频, 补充一下,我们回头再看一下这个,并我们看一个实际的案例,这个 apple core 的 一个项目, 那在这个过程当中,比如说我们它有 data, 有 model, 还有我们的数据库,那我们看一个这个地方, user, 它是继承 i r d b table interface, 其实它呢也是一个 bin, 不 过它做了一层分装,把这个 bin 分 装成了一个呃, table, 对, 这样的一个数, r d b table 这样的一个数据类型, 这个是它不再是 bin field 了,而是 column 这个类型,其实它的内核是一样的,那我们在这个过程当中 user find reference, 嗯,我看一眼啊,哦,我们在这边不一定把 user 返回,那我们看一下没有返,有没有返回 user info。 哦,我们在这地方返回的有 user info, 但是它返回的是一个 johnson response 类型,那 info 呢?查找的是一个 info model, 就是 我们刚刚在这个地方定义的这个 user info 的 这样的一个病, 把这个 info 呢转成了 johnson 放到的 log history 里面,然后返回给我们的前端。 这个这个地方呢,那我们进行了一系列的查找,查找了一系列的数据,把它统一放到这个 johnson 里面,作为一个 johnson response 一个返回。嗯,我们找一下 package 相关的内容。 package info, 在 这个地方看见我们,呃,这个地方就是查找一个 package, 一个包它的所有的版本号,那我们直接就返回出来,返回了一个所有的版本号,在这个地方进行一个查找。 package version model find by user and name, 它就进行了一个查找 final, 它是 return final rdb condition where equal 这个 field name 等于这个 name 的 和 user name 等于这个 user 的 这样的一个 package 的 版本的一个 list 进行一个返回,这个就是我们刚刚讲的,并在实际的过程当中的一个应用。

大家好,本期给大家讲的课程是延续上一期课程,我们怎么在有前端的基础下,怎么把我整个系统给搭建起来?我们的课程上一期课程主要是我们怎么生成了我们的表结构,我们这一期是怎么去生成我们的接口? 上一期其实我在这里给了一个视力的提示词,这个提示词它其实可以把我们的表结构生成出来,但是我们也会有一些需求,我们有前端了,有表了,我们还差后台的系统,我们现有的系统功能 前端有了,我要操作操作,我最终要把数据通过后端的方式去保存到我们的数据库里面,我们有库有表了,那我们要有数据,这个数据是怎么来的?那是从页面操作而来,将这些数据 搬运到我们的数据库里面,这整个系统的流程也算是彻底的走通了。我再说到其实此部分,我们上一期我给大家示范了我们的一个表结构的提示时,这个时候表结构有了,这里还是基于之前的模板上面做一系列调整,这个时候你是一个 python 架构师对不对? 我需要根据页面的功能设计出后端的接口提示词,后端提示词具体要求如下,首先说说终极目标,当然了这个 person 你 可以换,如果说你是你的偏好是 java 开发的,你也可以是 java, 或者你是 go on, 这个都可以。这里面其实就 终极目标,我需要精通 java, 对 不对?这个你自己选,因为我本身就是后台以 java 为主,所以我这边就以 java 的 为例来讲解这个课程。我们先说我们的目标,目标就是根据我们页面功能设计出后端接口,我们具体的要求是什么?我们的规则还有我们实现要求, 比如说我们技术站用 supreme 三点发版本加 betty 加点点点点点,对不对?就是你根据你个人的要求来最后输出,你需要他输出是什么样子?我们其实现在我的输出没有要求,那其实他就是一个这样的一个 一个接口文档了,看到没有?哪一个模块,哪一些方法,这个是最终我们跑出来的一个具体的通过开发工具里面的智能体跑出来的一个结果,通过这个结果其实他就已经把我们的所有接口都已经跑出来了。 把我们所有接口跑出来,那跑出来的目的是什么呢?我可以根据这些接口再用一份提示词放在我们的系统里面,你看看到没有? 你看我的历史记录,我可以根据我自己本身的一个需求,就把我要的接口把代码放在哪一个目录下面。比方说这个是我们说的报表,我们把它跑出来了以后还有这些功能,通过这种方式我们就可以最终实现从前端到后端再到数据库的一系列的操作就全部打通, 打通以后呢肯定会变成一套系统,这个大概就是,呃,本期我要讲的一个具体的内容,我下一期我可能会着重讲我们跑出来的系统最终是什么样子的,会给大家来演示我们最终体现的一个成果是什么。感谢大家关注我,关注欧森布特点 com, 谢谢。

查询这个存栏数据的接口并不复杂,但业务上有个细节需要注意一下。我们先来看一下它的代码,这个是 ctrl 层的代码,里面并没有接收前端传过来的任何参数。紧接着我们来看一下它这个实线层,实线层这里也比较简单,就是掉了一个麦屏里面的方法, 这里我们点进去来看一下,然后再点到这个 c q 文件,那么看到这里代码上是没有问题的,但是在业务上它是有问题的。这个我们现在查的是这个实时的存栏,也就是当天有多少 头牛的存栏,那么就直接展示在页面上。但是后面如果我们要做这个数据分析,那么这里就有个问题,假如我要查询历史某一天的存栏,那么这个时候你是不是就查不到了?那么为了应对这样的情况,那么这里还有张历史的这个存栏表, 就把每一天的这个牛的存栏都放到这个历史存栏这张表里面,那么后面我们要做数据分析,或者是查某一天的这个存栏的数据,那么我们直接就可以从这个历史的存栏这张表里面来查询。 那么至于这个页面上的这个存档信息,那么我们也可以不用从这里查,那么直接从存档这张表里面来查。比如我们这个定时任务是每天十二点或者是凌晨的时候来执行一次,把它的存档数据放到这个存档这张表里面就可以。 有时候我们在写代码的时候,不能光想着这个,把这个功能实现就可以了,那么就比如说像这样的功能,正常的来说,你就是直接的写一个 c q 来把这个存栏数据查询出来是没问题, 但是为了扩展性考虑,就比如做这种数据分析,那么我们是不是还要做一张这种存栏的表,然后后面查询数据或者是做数据分析的时候就比较方便。

接口设置中,经常需要从上一个接口的响应中提取数据传递给下一个接口,当响应体是接收格式时,接收提取器就是实现这一关联的核心后置处理器,其本质呢,是通过接收 pass 表达式, 在响应结果上精准定位并捕获目标节点值,将其存储为解密的变量供后续使用。今天呢,我就用实际案例带大家全流程实现接收提取操作,相关的详细的脚本和时间案例我已经整理好,如果有需要的可以直接找我。要实现接收 pass 提取, 具体配置分为四步,第一个呢,我们在要提取的接口后面添加后置处理器,接收器添加完了之后, 我们来进行第二步,具体的一个配置叫定义变量名,变量名的这个命名呢,我们一般是根据他具体提取的内容来命名,这样的话我们看起来会更加的直白。 同时呢,如果定义多个变量中间呢,就用分号分隔。第三步呢,我们就是编辑 jmp 表达式,这里的核心在于用于定位目标数据。 多个表达式之间呢,我们与变量名要一一的对应,同样的话也是用分号来进行分隔。我们常见的表达式有 dom 点 u u id 这样的一层提取的一个级别,我们也可以通过 dom 点点 id 递归提取所有层级的字段值,比如说我们这里。 再者呢,我们还有一种情况,就是我们要去取某一个数据层级下第一个元素的词段,比如说我们这里 我们要提取 content, 它的第一层里面的第一个 custom name, 我 们就需要用这样的一个提取的方式编写它的 json pass, 那 么来看一下具体的一个执行。首先我们来看验证码,我们需要提取的呢是它的 u u id, 那么我们 u u id 大家可以看到是第一层级的,所以我们只需要通过 donor 点 u u id 就 可以将它提取出来,那么提取出来之后,它的变量名是 u u id, 我 们在登录接口里面去使用,就通过 donor 符号加大括号以及它的变量名来进行使用就可以了。二个呢,我们是提取的登录返回的 token, 登录返回的 token 呢,它也是第一个层级的,所以通过 donor 点 token 就 可以去正确的提取,提取完之后, token 呢,它是应用在请求头里面的,所以我们在这里传递也是通过 donor 大 括号去进行引用。 第三个呢,我们是要提取客户列表下面的所有的层级的 id, 也就是这样的一个字段,这里呢它会设计的会比较多, 每一个数据下面它都会有一个 id, 那 像这种层级呢,我们就相当于要递归地提取所有层级的 id 字段值,那我们就可以用 dot 点点 id 去提取所有的, 然后我们提取出来之后呢,也可以看到我们将所有的这个 id 值都提取出来了,然后我们要提取某一个数据层级下面的某一个字段,比如说我们这个 content 这个层级它是第一级, 然后它后面是个列表,那我们想要提取列表的第一层数据下面的第一个 custom name, 那 么我们就是 content, 然后列表取值,第一个的话就是下标为零, 然后再去对应的 custom name 这样的一个值,然后就实现了我们层级的一个提取,那配置完了这个 jenpad 之后,我们还有一个配置,就是去设置编号, 这里呢我们零代表随机一代表第一个,然后负一呢就代表全部,这里呢我们提取要注意一个细节,就是我们复杂的结构呢,建议先在在线的接收 pass 验证工具里面去把它 展示开来之后,然后再去做对应的一个提取工作。然后第二个呢,我们要注意数据为宿主的时候,我们处理的时候要指定正确的左引位置, 同时呢最后我们要用调试取样器来验证它的一个结果,这个就是我们接生 pass 提取的全流程。那么你在用接生提取器做关联的时候遇到过哪些让你头疼的问题呢?欢迎一起来分享你的实战经验。

一矿的金龙数据量化接口是一直用的比较熟悉和觉得好用的,最近他也推出了自己的 skill, 无论你是用 openclaw 或者是用像 cloud code 这样的啊 c l i 工具,那它都是可以简单使用的。那么今天我们就来演示一下该 skill 的 效果如何。 那么首先你得先需要下载 sku, 有 两个地址,第一个是你打开他的公众号,这里有他的压缩包下载地址,你直接解压到你项目本地,或者直接通过他的 github 地址去进行下载。 我已经将该压缩包下载到本地了,它解压出来是这样的一个文件夹,我们把它随便解压到一个文件夹里面,按照这样的路径设置,首先是一个 agent agent 下面是一个 skills 的 文件夹,再把这个压缩包里面的 iq data python 拖过来, 那么这就是它的一个完整 skill。 它首先里面是一个 macdaw 文件,一些脚本,还有一些引用,那么解压好之后,下面我们就可以开始正式的使用, 那这个地方我们是直接使用 excel 工具进行它的试用。首先我们在该位置使用 copilot, 我 们先问一下它当前电脑有没有安装米矿的一些安装包,以及米矿的 license 有 没有到期。我们的 ai 工具就会进行 license 的 检查。 在 license 检查的过程当中,我们看它输出的日期,那它其实是阅读了我们的 agent 里面的米矿 data 里面相关的检查米矿 license 的 一些 python 脚本,那所以它最后的检查结果是我们目前还有七十四天的试用日期。 大家如果没有米矿 license, 可以 到知乎这个作者的这篇帖子里面去获取米矿 license 的 试用,现在在我们的米矿 skill 已经准备好了,下面我们就开始试用一下。呃,这这篇公众号也对他的技能做了一个简单介绍。首先他支持的市场有 a 股、港股、期货、期权基金、转债、 宏观以及另类数据等等。那么可以根据他的教程复制这样的一个问题,帮我筛选出一批低估值的 价值股, roe 要高于十五,市盈率要低于二十。然后我们将这句话贴过来,或者你如果用的是 opencl, 你 直接用 opencl 进行对话也是可以的。 那么运行结束,我们的接口就根据我们的筛选条件, roe 大 于十五, p e 小 于二十,筛选出了符合条件的六十八个股票。那比如说我们看第一个新化保险,它的 p e 是 五点六八, 我们打开万德,我们看下新华保险,它这里的 pe 确实也是五点六八秘密矿,它提取到的数据是准确无误的, 那并且它将呃这六十八个结果保存为了一个 csv 文件,同时呢也会将提取脚本用到的一些拍粉代码保存到你的项目路径下, 你们直接打开 python 代码,就可以看到它具体是怎么写的。首先按出使化米矿接口,然后获取最近的交易日,扫描全市场股票, 过滤掉停牌的股票,通过调用因子接口,将全市场的股票列表去查找,查找到结果进行一个筛选,进行整理。最后保存到我们的 csv 文件里面, 我们发现它其实写出来代码还是非常规范和严谨的,除了查询财务指标,我们还可以查询比如可转债期权波动率、基金重仓持股以及期货主义合约以及其他的一些量价行情数据。以上内容就是关于米矿金融数据接口 skill 的 一个简单介绍。

在上周招聘,我面试了一个三年经验的一个软件测试工程师,问了一个问题啊,你们的系统假设现在有一个订单详情的一个接口,但是这个订单详情的接口来响应他需要四秒钟,那么我们怎么去排查?他立马就说,哎,我去先看一下日期有没有超时,再看一下数据库是不是有一些慢查询 啊,再看一下有没有走到锁影啊。然后这个时候呢我接着去问,假设现在日制呢显示接口两百成功, c 口呢,他也走了锁影,但是执行计划呢,显示也是扫描了十号数据啊,就说扫描也不够,但是呢接口还是慢,还是要四秒才能返回,这个时候你怎么去分析 他?想了想,哎,可能是返回的时段太多了,叙利亚话慢了,或者说有可能是网络的延迟。那么我说你怎么去确认他是叙利亚话慢呢?你怎么知道这次调用到底返回了多少条数据啊?多少 kb 的 数据? 叙利亚话呢?花了多久?数据库的一个交互呢?又花了多久?网络的传输又用了多久?日制里的一个总耗时四秒,其实对我们来讲它是一个黑盒的,我们怎么样去把它给拆开 好?这个时候呢他可能就已经回答不出来了啊,面试到这里呢就结束了,这就是会做接口的一个功能测试和真正懂接口的性能测试的一个分数率。 这道题能够筛出一些高手,因为他考的是呃,不是说能不能够去测通一个接口,而是有没有能力穿透接口的表象深入全面路的一个执行的一个细节。如果你也被问住了啊,不要慌,那么在这里呢,我去详细的去讲了,我们怎么样去进行排查, 从我们最开始的词盘,然后到网络 cpu 内存,然后 maccode 的 调优,还有我们的慢查询音,然后我们的 呃连接词内存, code 语言,然后还有存储过程,还有我们的一些集群架构,还有我们的 radio 以及 radio 相关里面的一些东西,以及我们的消息队列, mq, 好, 这里面所有的细节呢都给大家去讲清楚了,那么我们在这里呢,先给大家去讲一下 我们怎么样去进行拆解。首先第一层我们是做一个执行链路的一个深度的拆解,就是日制,它并不是说万能的 啊,日制里面显示的时间,它对于我们来讲它是一个总的时间啊,它是一个总的时间,我们并不知道它分层的时间是什么,什么叫分层的时间?分层的时间就是,哎,我这个时候我的一个数据库这里, sql 这里,它到底花了多少时间?有没有慢查询, 对不对?好,我要去看单独的去看有没有慢查询的日制,然后慢查询日制。如果有慢查询日制啊,这个慢查询,这个 c 口花了多久的时间,对不对?好,这个时候连接词我要去看有没有打满,对不对?连接词如果超过了我现在设置的一个连接词了,好,那这个时候是不是就会进行一些等待,就会导致响应变慢, 对不对?好,还有我们的 sql 语句的一些优化, sql 语句的优化就是现在有没有直接?是,呃,现在有没有直接,比如说,呃,十二点的星,好,把所有的资源全部都返回, 但你返回了所有的资源呢?但可能前端呢,他只用了三个资源,只用了五个资源,有一些融融于的一些数据呢,会直接拖垮他虚拟化和网络传输的一个时间。 记住两百的一个状态码背后可能藏着百万级啊,没有分页的查询,还有循环的 n 加一的调用,还有大对象的一个序列表,这些呢就是性能的真正的杀手啊,我们想要去精准的一些定位了,还要去考全电路的一些追踪工具。 第二层呢,就是我们真实的量化分析的能力啊,就是接口的总耗时,我们要怎么去进行分层啊?接口的总耗时,我们怎么要去进行分层,然后我们的总耗时,然后最开始走到我们的从一连层开始,然后操作系统 让我们的应用程序花了多少?我们的一个呃缓存数据库花了多少的时间?然后还有我们数据库的一个服务花了多少的时间?就是我们的右逻辑,加上我们的数据库的交互,加上我们应用程序这里的一个序的话的处理,然后再加上我们网络的传输,再加上最终啊回到我们客户这里的一个解析 啊,每一项呢,我们都要把它给变化出来,比如说我这里呢,可以去使用我们的一个解密特,加上我们的英菲尔 d p, 然后加上我们的一个广发廊来搭建一个监控平台, 通过解密特里面的一个呃后端监听器啊,通过解密特里面的一个后端监听器,把每次请求的各阶段耗时全部都写到英菲尔 d p 里面来好,也可以通过我们的一些呃,微软或者 facebook 去抓包,看 t c p 的 一个往返时间啊, 监测监控的时候呢,我们还要去监测一下我们像 mexico 啊,像 mexico 的 一个连接池的一个使用率,现成的一个主射数,然后还有我们的 g c 频率,也就说我们要去监控一下我们的一个什么呢?监控通过我们的 logo, 呃, polo 米修斯加 logo, 一个 spotter, 还有我们的 polo 米修斯加上 mexico, 一个 spotter, 加上 wifi, 来监控一下我们的一个服务器,以及我们的一个 mexico。 最后呢就是我们呃定位问题到优化的一个闭环的一个落地啊,就说我们发现了问题之后,最终要去做一件什么事情呢?最终要去推动开发,去进行优化,也就说我们在推动优化的时候呢,还要去做一些什么事情呢?就是我们要去提出一些解决的方案。 什么叫做提出解决方案?就是比如说,哎,没有和前端去对齐,前端需要哪些数据,我们就传哪些数据,减少我们虚量化的开销。 还有就是我们要去做一些强制的分页,以及我们一些就是低频的去修改的一些数据,或者说压根就不会去修改的一些数据,这个时候一定要引入我们的缓存的 release。 还有就是接口要进行拆开,比如说一个接口做了三件事情,那么呢我们这个时候呢,不如拆成三个接口啊,按需求来进行调用,整体体验呢,反而可能会更快。所以这道题他到底考的是什么呢?他考的是从验证接口对不对升级为保障接口快不快?稳不稳? 普通测试呢,看到两百就收工了,高级的测试呢,看到两百了,可能才刚刚开始,因为真正的质量藏就藏在那接口的四秒的沉默里面。你有没有遇到过日治一切正常,但用户就是觉得卡的情况呢?可以分享给我,我们一起讨论一下。