外汇交易解决方案丨实时选取外汇行情多价源最优价

news2024/12/29 10:37:13

在外汇交易中,存在多个价源。多个价源之间,同一时刻的报价可能存在差异。在多个价源之间,实时选取最优价格具有重要意义,它有助于投资者获得更有利的交易执行价,降低交易成本,优化流动性,分散交易风险。特别对于高频交易者和算法交易者,获取多个价源间的最优价可以更合理地执行交易策略。此外,通过比较不同价源的价格,投资者还能够更好地了解市场的趋势和波动性,从而做出更明智的投资决策

本文将基于 DolphinDB 流数据处理框架,为大家提供一种多价源最优价实时选取的解决方案。

1. 案例概述

本案例以 CFETS (中国外汇交易中心) 和 HKFEMT (香港外汇市场) 两个市场为例,通过买方报价 (bid) 举例说明,实现不同价源之间最优价的选取,并对异常数据做处理。详细规则如下:

  • 为每个货币对的买方报价 (bid) 设定一个阈值,超过阈值的价格被视为异常报价
  • 如果两个市场的买方报价 (bid) 都没超过该货币对的阈值,选取较大的买方报价 (bid) 做为最优价
  • 如果有一个市场的买方报价 (bid) 超过了该货币对的阈值,选取另一个买方报价 (bid) 做为最优价
  • 如果两个市场的买方报价 (bid) 都超过了该货币对的阈值,返回该货币对前一时刻的最优价

DolphinDB 的流数据引擎是一种专门用于处理实时数据流的高效、灵活的计算模块。它可以对流数据进行各种类型的分析,如时间序列、横截面、异常检测、连接等,并将结果输出到内存表、流数据表或其他终端。流数据教程详见:流数据

本案例使用等值连接引擎和响应式状态引擎实现,流程图如下:

业务流程图

如流程图所示,整体数据处理过程如下:

  • 两个市场的数据通过两个流数据表进入等值连接引擎
  • 等值连接引擎根据货币对选取同一时刻的不超过阈值的最优价和最优价市场,如果两个市场的价格都是大于阈值的异常值,那么等值连接引擎会把此时刻的最优价和最优价市场设置为空值
  • 等值连接引擎的结果输入到响应式状态引擎,响应式状态引擎对最优价和最优价市场使用向前填充的方法处理空值
  • 最终结果实时输出到存储计算结果的流数据表中
  • 应用系统可以订阅结果流数据表,实时获取最优价,用于指导交易、风险控制和可视化展示

2. 模拟数据

为了方便读者快速上手,本案例提供了模拟数据,结合 DolphinDB 提供的数据回放功能,可仿真实时的外汇行情。没有真实行情数据的读者,可用此方法做全流程测试。模拟数据是 CFETS (中国外汇交易中心) 和 HKFEMT (香港外汇市场) 两个市场的一天的报价数据。本案例简化了数据结构,仅以买方报价 (bid) 举例说明,详细的数据表结构如下图所示:

为了使模拟数据更加接近真实行情,本案例使用了取自外汇交易中心官网的 29 个常见货币对在某个时间点的真实买方报价 (bid) 。以每个货币对的真实买方报价 (bid) 做为正态分布的期望值,0.1 做为正态分布的标准差,生成符合正态分布的模拟数据。为了过滤异常行情,把每个货币对真实值加上 0.08 做为异常阈值。每个货币对每 500 毫秒产生一条数据。

模拟数据及异常阈值生成的代码如下:

def genOneDayData(rawCurrencyPair,rawBid,date,marketName)
{
	dataTable = table(1:0,`market`currencyPair`time`bid`bidVolume,[`SYMBOL,`SYMBOL,`TIMESTAMP,"DOUBLE","INT"])
    num = 0
    for(i in 0..(rawCurrencyPair.size() - 1))
	{
        market = take(marketName,172800)
		currencyPair = take(rawCurrencyPair[i],172800)
		time = concatDateTime(date,00:00:00.000 + 500*(0..(172800-1)))
		bid = norm(rawBid[i],0.1,172800)
		bidVolume = int(norm(5000000,500000,172800))
		t = table(market,currencyPair,time,bid,bidVolume)
		dataTable.append!(t)
	}
	return select * from dataTable order by time,currencyPair
}

// The real data copied from the official website of CFETS
currencyPair = ["NZD/USD","USD/JPY","USD/CHF","GBP/USD","EUR/JPY","CNY/THB","CNY/TRY","CNY/SEK","CNY/PLN","CNY/SAR","CNY/KRW","CNY/RUB","CAD/CNY","SGD/CNY","AUD/CNY","HKD/CNY","EUR/CNY","CNY/MXN","CNY/NOK","CNY/DKK","CNY/HUF","CNY/AED","CNY/ZAR","CNY/MYR","CHF/CNY","NZD/CNY","GBP/CNY","100JPY/CNY","USD/CNY"]
bids = [0.61114,143.984,0.89425,1.27282,157.7,4.904,3.60415,1.4865,0.56205,0.51888,180.72,11.5679,5.4696,5.3465,4.7983,0.92282,7.9141,2.365,1.4956,0.9407,46.746,0.50849,2.5687,0.644,8.0801,4.4165,9.198,5.0189,7.2262]

date = 2023.06.01
// Create HKFEMT tick data
HKFEMT_Tick = genOneDayData(currencyPair,bids,date,`HKFEMT)
// Create CFETS tick data
CFETS_Tick = genOneDayData(currencyPair,bids,date,`CFETS)

//Set thresholds
threshold = dict(currencyPair,bids + 0.08)

生成的模拟数据存储在 CFETS_Tick 和 HKFEMT_Tick 两个内存表中,后续实时计算时,会把这两个内存表的数据回放到对应的流数据表中,生成仿真的实时行情。判断 29 个货币对的买方报价 (bid) 是否异常的阈值存储在字典变量 threshold 中,它的 Key 是货币对代码,Value 是该货币对的阈值。

3. 业务代码实现

3.1 环境清理与流数据表创建

def cleanEnvironment(){
    try{ unsubscribeTable(tableName = `HKFEMTStreamTable, actionName = "joinLeft") }catch(ex){ print(ex) }
    try{ dropStreamTable(`HKFEMTStreamTable)}catch(ex){ print(ex) }
    try{ unsubscribeTable(tableName = "CFETSTStreamTable", actionName = "joinRight")}catch(ex){ print(ex) }
    try{ dropStreamTable(`CFETSTStreamTable)}catch(ex){ print(ex) }
    try{ dropStreamTable(`bestPriceStreamTable)}catch(ex){ print(ex) }
    try{ dropStreamEngine(`bestPricEngine)}catch(ex){ print(ex) }
    try{ dropStreamEngine(`fillPrevEngine)}catch(ex){ print(ex) }
}
cleanEnvironment()

def createStreamTableFunc()
{
    // Define streamTables that receive original market data: HKFEMTStreamTable and CFETSTStreamTable
    colName = `market`currencyPair`time`bid`bidVolume
	colType = [`SYMBOL,`SYMBOL,`TIMESTAMP,"DOUBLE","INT"]
    HKFEMTTemp = streamTable(20000000:0,colName,colType)
    try{ enableTableShareAndPersistence(table = HKFEMTTemp, tableName = "HKFEMTStreamTable", asynWrite = true, compress = true, cacheSize = 20000000, retentionMinutes = 1440, flushMode = 0, preCache = 10000) }
	catch(ex){ print(ex) }
    CFETSTemp = streamTable(20000000:0,colName,colType)
    try{ enableTableShareAndPersistence(table = CFETSTemp, tableName = "CFETSTStreamTable", asynWrite = true, compress = true, cacheSize = 20000000, retentionMinutes = 1440, flushMode = 0, preCache = 10000) }
	catch(ex){ print(ex) }

    // Define streamTables that save results: bestPriceTempStreamTable
    colName = `currencyPair`time`market`bestPrice`leftBid`rightBid`delay
	colType = [`SYMBOL,`TIMESTAMP,`INT,`DOUBLE,`DOUBLE,`DOUBLE,`DOUBLE]
    bestPriceTemp = streamTable(20000000:0,colName,colType)
    try{ enableTableShareAndPersistence(table = bestPriceTemp, tableName = "bestPriceStreamTable", asynWrite = true, compress = true, cacheSize = 20000000, retentionMinutes = 1440, flushMode = 0, preCache = 10000) }
	catch(ex){ print(ex) }
}
createStreamTableFunc()
go
  • go 语句的作用是对代码分段进行解析和执行
  • enableTableShareAndPersistence 共享流数据表并持久化到磁盘。上述代码的主要作用是调用该函数创建三个共享的异步持久化流数据表。其中两个是 HKFEMTStreamTable 和 CFETSTStreamTable ,它们分别用于接收和发布香港外汇市场和中国外汇交易中心的实时行情数据;另一个是 bestPriceStreamTable ,它用于接收和发布引擎处理完毕的最优价结果。

3.2 定义选取最优价及市场的函数

在本案例中,自定义一个函数用于实现最优价和最优价市场的选取,该函数输入参数的数据类型除 threshold 外都是向量,对应原始行情数据表中相关的列;输入参数 threshold 对应模拟数据生成的各个货币对的阈值,其数据类型是一个字典,它的 Key 是货币对代码,Value 是该货币对的阈值。这个函数后续以参数的方式配置到等值连接引擎中。

def bestPriceAndMarket(leftBid, rightBid, leftMarket, rightMarket, currencyPair, threshold)
{
    price = iif(leftBid > threshold[currencyPair] and rightBid > threshold[currencyPair],NULL,iif((leftBid > threshold[currencyPair]),rightBid,iif(rightBid > threshold[currencyPair],leftBid,max(leftBid,rightBid))))
    market = iif(leftBid > threshold[currencyPair] and rightBid > threshold[currencyPair],NULL,iif((leftBid > threshold[currencyPair]),2,iif(rightBid > threshold[currencyPair],1,iif(leftBid > rightBid,1,2))))
    return market, price
}
  • iif(cond, trueResult, falseResult):如果满足条件 condition,则返回 trueResult,否则返回 falseResult。它等效于对每个元素分别运行 if...else 语句
  • 为了方便后续数据填充,市场的数据类型转为整形,引擎左表市场返回 1,引擎右表市场返回 2

3.3 注册流计算引擎和订阅流数据表

本案例使用等值连接引擎和响应式状态引擎串联实现,等值连接引擎的输出是响应式状态引擎的输入。代码如下:

fillPrevSch = table(1:0,`time`currencyPair`market`bestPrice`leftBid`rightBid`inTime,[`TIMESTAMP,`SYMBOL,`INT,`DOUBLE,`DOUBLE,`DOUBLE,`NANOTIMESTAMP])
// create reactiveStateEngine
fillPrevEngine = createReactiveStateEngine(name = "fillPrevEngine", metrics = [<Time>,<ffill(Market)>,<ffill(BestPrice)>,<leftBid>,<rightBid>,<(now(true) - inTime) \ 1000000>], dummyTable = fillPrevSch, outputTable = bestPriceStreamTable, keyColumn="CurrencyPair")

HKFEMT_Table_left = table(1:0,`market`currencyPair`time`bid`bidVolume`inTime,[`SYMBOL,`SYMBOL,`TIMESTAMP,`DOUBLE,`INT,`NANOTIMESTAMP])
CFETS_Table_right = table(1:0,`market`currencyPair`time`bid`bidVolume`inTime,[`SYMBOL,`SYMBOL,`TIMESTAMP,`DOUBLE,`INT,`NANOTIMESTAMP])

// create equiJoinEngine
bestPricEejEngine = createEquiJoinEngine(name = "bestPricEngine", leftTable = HKFEMT_Table_left, rightTable = CFETS_Table_right, outputTable = fillPrevEngine, metrics = [<bestPriceAndMarket(HKFEMT_Table_left.bid,CFETS_Table_right.bid,HKFEMT_Table_left.market,CFETS_Table_right.market,currencyPair,threshold) as `market`bestPrice>,<HKFEMT_Table_left.bid>,<CFETS_Table_right.bid>,<max(HKFEMT_Table_left.inTime,CFETS_Table_right.inTime)>], matchingColumn = `currencyPair, timeColumn = `time)

def appendTime(engine,isLeftTable,mutable data)
{
    data[`inTime] = now(true)
    appendForJoin(engine,isLeftTable,data)
}
subscribeTable(tableName="HKFEMTStreamTable", actionName="joinLeft", offset=0, handler=appendTime{bestPricEejEngine, true,}, msgAsTable=true)
subscribeTable(tableName="CFETSTStreamTable", actionName="joinRight", offset=0, handler=appendTime{bestPricEejEngine, false,}, msgAsTable=true)
  • 选取最优价及市场的函数配置在等值连接引擎中
  • 等值连接引擎的输出参数配置为响应式状态引擎,表变量 fillPrevSch 表示响应式状态引擎输入的表结构,其字段顺序和类型要和等值连接引擎的输出完全一致
  • ffill:此函数用在响应式状态引擎中,表示对参数列中的空值用相同货币对的非空前值做填充
  • 自定义函数 appendTime 在数据写入等值连接引擎前增加了写入时间,方便后续做延时的统计,该时间精度为纳秒

3.4 Python API 实时订阅最优价结果

通过 Python API 订阅结果表,能够实时获取最优价及对应的价源,订阅的代码如下:

import dolphindb as ddb
import numpy as np
from threading import Event

def resultProcess(lst):
    print(lst)
    
s = ddb.session()
s.enableStreaming()
s.subscribe(host = "192.168.100.3", port = 8848, handler = resultProcess, tableName = "bestPriceStreamTable", actionName="pySub", offset=-1, resub=False)

Event().wait()
  • 执行 Python 代码前,必须先在 DolphinDB server 端定义流数据表 bestPriceStreamTable
  • s.enableStreaming() 函数表示启用流数据功能
  • subscribe 方法
    • host 和 port 参数为 DolphinDB server 的 IP 地址和端口
    • handler 参数为回调函数,示例代码自定义了 resultProcess 回调函数,动作为打印实时接收到的数据
    • tableName 参数为 DolphinDB server 端的流数据表,示例代码订阅了 bestPriceStreamTable
    • offset 参数设置为 -1,表示订阅流数据表最新记录
    • resub 参数为是否需要自动重连

3.5 Excel 实时订阅最优价结果

Excel 是常用的办公软件,DolphinDB 的 Excel 插件能够把实时计算的结果推送至 Excel。在 Excel 插件连接到 DolphinDB server 之后,能够获取到共享的流数据表,本案例如下图所示:

右击 bestPriceStreamTable 流数据表,选择 Export by Subscribe,会弹出输入主键的对话框,如下图:

在对话框中输入货币对列 currencyPair ,点击确定,即完成订阅。

3.6 Grafana 实时监控最优价

Grafana 是一个开源的数据可视化 Web 应用程序,擅长动态展示时序数据,支持多种数据源。DolphinDB 开发了 Grafana 数据源插件 (dolphindb-datasource),让用户在 Grafana 面板 (dashboard) 上通过编写查询脚本、订阅流数据表的方式,与 DolphinDB 进行交互 (基于 WebSocket),实现 DolphinDB 时序数据的可视化。详细教程参考:Grafana连接DolphinDB数据源

本案例展示货币对人民币对美元的最优价, Grafana 中的 Query 代码如下:

select  gmtime(time) as ts, bestPrice from bestPriceStreamTable where currencyPair='USD/CNY' context by second(time) limit -1

因为 Grafana 默认显示 UTC 时间,和 DolphinDB server 内的数据时间存在 8 个小时时差,所以 Grafana中 的 Query 需要使用 gmtime 函数进行时区的转换。

3.7 历史数据回放

本章节在前文已搭建的整体框架的基础上,进行行情的回放,模拟实时数据写入。代码如下:

//replay data
submitJob("replayL","replayToLeft",replay,CFETS_Tick,`CFETSStreamTable,`time,,100)
submitJob("replayR","replayToRight",replay,CFETC_Tick,`CFETCTStreamTable,`time,,100)
t = getRecentJobs(2)

执行完后,查看变量 t 内的信息,如下图所示:

如果 endTime 和 errorMsg 字段为空,说明任务正在正常运行中。

4. 查询结果

随着数据回放模拟行情的注入,Python API ,Excel ,Grafana 等展示或接收端能够实时收到数据。

4.1 客户端查询

通过 GUI,VScode 插件等客户端能够查询结果表,查询语句如下:

select top 29 * from bestPriceStreamTable order by time desc

多次执行此语句,可发现结果在实时发生变化。VScode 的数据查询结果如下:

  • delay 列表示计算延时,单位是毫秒

4.2 Python API 实时订阅的计算结果

4.3 Excel 实时订阅的计算结果

4.4 Grafana 实时可视化展示

5. 计算性能

本案例的架构设计中包含了延时计算,统计了从第 1 个等值连接引擎收到数据至第 2 个响应式状态引擎输出结果所经历的时间。本案例的测试环境如下,该环境仅供参考:

  • CPU:Intel(R) Xeon(R) Silver 4210R CPU @ 2.40GHz
  • 内存:256GB
  • 磁盘:SSD 3.5TB * 4
  • 操作系统: CentOs Linux release 7.6.1810

本案例最大延时的场景是 29 个货币对同时到达引擎,最小延时场景是只有 1 货币对到达引擎。在单线程情况下,其延时统计见下表:

货币对数量延时(毫秒)
10.0841
290.1185

6. 案例总结

DolphinDB 内置的流数据框架支持流数据的发布、订阅、预处理、实时多表关联、实时内存计算、复杂指标的滚动窗口计算、滑动窗口计算、累计窗口计算等,是一个运行高效、使用便捷的流数据处理框架。

本文基于 DolphinDB 流数据处理框架,提供了一种实时选取外汇行情多价源最优价的低码高效解决方案,旨在提高开发人员在使用 DolphinDB 内置的流数据框架开发流计算业务场景时的开发效率、降低开发难度,更好地挖掘 DolphinDB 在复杂实时流计算场景中的价值。

7. 附件

文档示例代码如下,请按文件顺序依次执行。

script.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1460356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

中科大计网学习记录笔记(十四):多路复用与解复用 | 无连接传输:UDP

前言&#xff1a; 学习视频&#xff1a;中科大郑烇、杨坚全套《计算机网络&#xff08;自顶向下方法 第7版&#xff0c;James F.Kurose&#xff0c;Keith W.Ross&#xff09;》课程 该视频是B站非常著名的计网学习视频&#xff0c;但相信很多朋友和我一样在听完前面的部分发现信…

YOLO-NAS浅析

YOLO-NAS&#xff08;You Only Look Once - Neural Architecture Search&#xff09;是一种基于YOLO&#xff08;You Only Look Once&#xff09;的目标检测算法&#xff0c;结合神经架构搜索&#xff08;NAS&#xff09;技术来优化模型性能。 YOLO是一种实时目标检测算法&…

攻防世界-web-Training-WWW-Robots

题目信息 In this little training challenge, you are going to learn about the Robots_exclusion_standard. The robots.txt file is used by web crawlers to check if they are allowed to crawl and index your website or only parts of it. Sometimes these files rev…

pytest框架学习总结:失败用例如何处理?

当我们跑用例的时候&#xff0c;有些用例可能会失败&#xff0c;可以对失败的用例设置做如下管理&#xff1a; 1、失败重跑: --reruns 2 --reruns-delay 5 2、失败了停止执行后续的用例&#xff1a;pytest -x 3、设置最多失败多少用例会停止执行:pytest --maxfail2 4、跳过用例…

《Solidity 简易速速上手小册》第7章:智能合约的部署与交互(2024 最新版)

文章目录 7.1 合约的编译和部署7.1.1 基础知识解析更全面的理解部署准备 7.1.2 重点案例&#xff1a;部署一个投票合约案例 Demo&#xff1a;创建并部署投票合约案例代码VotingContract.sol部署脚本&#xff08;Truffle&#xff09; 测试和验证拓展功能 7.1.3 拓展案例 1&#…

基于vue框架的环保知识普及平台设计与实现

项目&#xff1a;基于vue框架的环保知识普及平台设计与实现 目 录 摘要 I Abstract II 第1章 引言 1 1.1 研究的背景 1 1.2 目的和意义 1 1.3 设计思路 1 1.4 研究的主要内容 2 第2章 相关原理和技术 3 2.1 B/S 模式体系结构 3 2.2 Springboot技术 4 2.3 访问数据库…

GitHub 2FA认证(双重身份验证)

GitHub 2FA认证&#xff08;双重身份验证&#xff09; GitHub 向部分用户发出警告&#xff1a;如果在北京时间 2024 年 1 月 19 日 08:00 前仍未启用双重验证&#xff08;2FA)&#xff0c;他们将被禁用部分功能。当然&#xff0c;这对于 GitHub 用户来说并不算意外&#xff0c…

Leetcode 1089.复写零

目录 题目 思路 代码 题目 给你一个长度固定的整数数组 arr &#xff0c;请你将该数组中出现的每个零都复写一遍&#xff0c;并将其余的元素向右平移。 注意&#xff1a;请不要在超过该数组长度的位置写入元素。请对输入的数组 就地 进行上述修改&#xff0c;不要从函数返回…

录屏后没有声音怎么补救?试试这几种录屏工具

录屏后没有声音怎么补救&#xff1f;在数字化时代&#xff0c;无论是为了制作教学视频、分享游戏过程&#xff0c;还是为了记录会议内容&#xff0c;录屏都扮演着重要的角色。然而&#xff0c;在进行录屏时&#xff0c;有时可能会遇到录屏后没有声音的问题&#xff0c;这无疑会…

MIT 6.S081---Lab: Copy-on-Write Fork for xv6

Implement copy-on write(hard) 从下图可见&#xff0c;xv6的pte中RSW都是可以被软件使用的未定义位&#xff0c;此处将pte中的第9位标记为PTE_COW位。 修改kernel/riscv.h&#xff1a; 修改kernel/vm.c&#xff0c;新增refCount代表物理页面的引用次数&#xff0c;根据&…

2024年2月的TIOBE指数,go语言排名第8,JAVA趋势下降

二月头条&#xff1a;go语言进入前十 本月&#xff0c;go在TIOBE指数前10名中排名第8。这是go有史以来的最高位置。当谷歌于2009年11月推出Go时&#xff0c;它一炮而红。在那些日子里&#xff0c;谷歌所做的一切都是神奇的。在Go出现的几年前&#xff0c;谷歌发布了GMail、谷歌…

探索水下低光照图像检测性能,基于DETR(DEtection TRansformer)模型开发构建海底生物检测识别分析系统

海底这类特殊数据场景下的检测模型开发相对来说比较少&#xff0c;在前面的博文中也有一些涉及&#xff0c;感兴趣的话可以自行移步阅读即可&#xff1a; 《尝试探索水下目标检测&#xff0c;基于yolov5轻量级系列模型n/s/m开发构建海底生物检测系统》 《基于YOLOv5C3CBAMCBA…

list链表

1. list基本概念 功能&#xff1a;将数据进行链式存储 链表&#xff08;list&#xff09;是一种物理存储单元上非连续的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接实现的 链表的组成&#xff1a;链表由一系列结点组成 结点的组成&#xff1a;一个是存储数据…

苍穹外卖——第一天nginx

放到全是英文路径的打不开 到安装路径进入cmd&#xff0c;输入nginx -t nginx: the configuration file E:\Astudy\nginx-1.20.2/conf/nginx.conf syntax is ok nginx: [emerg] bind() to 0.0.0.0:80 failed (10013: An attempt was made to access a socket in a way forbid…

C++ For循环:生成三角形*阵列图案

#include <iomanip> #include <iostream>using namespace std;int main() {int i,j,n;cout << "请输入图案的行数&#xff1a;";cin >> n;for (i 1; i < n; i){cout << setw(n-i1); //设置域宽for (j 1; j < i; j){cout <…

外汇天眼:台积电离职员工开设资金盘,4年诈骗4000人得手65亿

继去年5月爆出的im. B借贷诈骗案件后&#xff0c;近期警方又破获一个做案手法如出一辙的资金盘&#xff0c;值得注意的是&#xff0c;由于主嫌利用曾在台积电工作结识的人脉&#xff0c;因此有大量台积电员工及其亲友受害&#xff0c;甚至让公司高层决定请法务部门协助打官司。…

CentOS和Ubuntu之间的区别和联系

CentOS&#xff08;Community ENTerprise Operating System&#xff09;和Ubuntu是两种流行的Linux发行版&#xff0c;它们在企业和个人用户中都有广泛的应用。尽管它们都是基于Linux内核&#xff0c;但它们在设计理念、更新策略、包管理系统等方面存在一些关键的区别和联系。下…

hashtable的结构和扩容机制

结构 最外层封装了dictht&#xff0c;结构如下 table指向了实际存储的hash结构dictEntry。size是哈希表大小&#xff0c;也就是说dictEntry有多少空间。sizemask是掩码&#xff0c;为固定值size-1&#xff0c;然后元素的index就应该是元素哈希值&sizemask。used代表dictE…

项目经理想辞职的20个“离奇”理由

项目经理&#xff0c;这个看似风光无限的职位&#xff0c;其实背后也有许多鲜为人知的辛酸。以下是几个项目经理想辞职的“离奇”理由&#xff1a; 1、“与难缠客户斗智斗勇” 有些客户的要求比“外星人的要求”还要离奇。 2、“被‘无限需求’吞噬” 客户总是有无尽的需求…

【云原生系列之kubernetes】--Ingress使用

service的缺点&#xff1a; 不支持基于URL等机制对HTTP/HTTPS协议进行高级路由、超时、重试、基于流量的灰度等高级流量治理机制难以将多个service流量统一管理 1.1ingress的概念 ingress是k8s中的一个对象&#xff0c;作用是如何将请求转发到service的规则ingress controlle…