条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群
前言
Amazon ElastiCache for Redis 是速度超快的内存数据存储,能够提供亚毫秒级延迟来支持 实时应用程序。适用于 Redis 的 ElastiCache 基于开源 Redis 构建,可与 Redis API 兼容,能够与 Redis 客户端配合工作,并使用开放的 Redis 数据格式来存储数据。适用于 Redis 的 ElastiCache 兼具开源 Redis 的速度、简单性和多功能性与 Amazon 的可管理性、安全性和可扩展性,能够在游戏、广告技术、电子商务、医疗保健、金融服务和物联网领域支持要求最严苛的实时应用程序。
亚马逊云科技开发者社区为开发者们提供全球的开发技术资源。这里有技术文档、开发案例、技术专栏、培训视频、活动与竞赛等。帮助中国开发者对接世界最前沿技术,观点,和项目,并将中国优秀开发者或技术推荐给全球云社区。如果你还没有关注/收藏,看到这里请一定不要匆匆划过,点这里让它成为你的技术宝库! |
利用 ElastiCache for Redis,客户可以使用多个分区创建和运行托管的 Redis 集群。当遇到以下三种主要场景时,必须扩展 Redis 环境。第一,如果 Redis 数据的总内存大小超出或预计超出单个虚拟机的内存容量。第二,如果应用程序将数据写入 Redis 的写入吞吐量超出单个虚拟机的容量。第三,如果要将数据分布到多个分区中,以便在单个节点遇到任何问题时,对总体 Redis 环境产生的影响都较小。
我们推出了一系列博客,展示了如何在不同语言中使用不同的支持 ElastiCache 集群模式的客户端对 ElastiCache 集群进行连接和操作,前面已经有一篇博客介绍了 “使用 redission 连接 Amazon ElastiCache for redis 集群”, 今天的主题是讨论如何使用 C 语言连接 Elasticache for redis 集群。通过 redis 官网上查询到现有的客户端,C 语言中支持 redis cluster 的主要有 Hiredis-cluster, hiredis-vip 等,C++ 语言中支持 redis cluster 的主要有 redis-plus-plus,xredis 等。本篇博客主要会介绍 Hiredis-cluster 的使用。
2. 搭建测试环境
在此说明下,此次测试在宁夏区域进行,测试的主要内容包括:
- 在开启 TLS 及 Auth 的 ElastiCache 集群中验证读写和 Failover
- 在未开启 TLS 及 Auth 的 ElastiCache 集群中验证读写和 Failover,因为对于未开启 TLS 及 Auth 的集群,Client 端的代码实现会有所不同。
2.1. 创建测试环境
创建ElastiCache集群
- 首先创建一个开启 TLS 及其 Auth 的3 shards,6节点的ElastiCache 集群,实例类型为 cache.t3.small,版本为5.0.6, 按下文的方式获取 configuration endpoint,此处假设其值为:
具体获取 endpoint 的方式如下:
查找 Redis(已启用集群模式)集群的 configuration endpoint
- 登录 Amazon Management Console 并打开 ElastiCache 控制台 (https://console.aws.amazon.com/elasticache/)。
- 从导航窗格中,选择 Redis。
- 此时会显示一个列表,其中包含运行任意版本 Redis 的集群。
- 从集群列表中,选择运行“集群 Redis”的集群左侧的复选框。
- 此时屏幕会展开,以显示有关选定集群的详细信息。
- 找到 Configuration endpoint
2.创建一个关闭 TLS 且无 auth 的3 shards,6节点的 ElastiCache 集群,实例类型为 cache.t3.medium,版本为5.0.6,按上文的方式获取 configuration endpoint,此处假设其值为:
创建EC2测试客户端
1.在同一个 VPC 内创建一个 EC2并配置好响应 security group,我使用的 EC2是 Ubuntu 18.04,安装的环境是一些 Ubuntu 的参考命令。
2.在 EC2上准备环境, Hiredis-cluster 是基于 hiredis 扩展编写的, 我们环境准备准备的时候也会涉及到 hiredis 部分,
- C Compiler 安装,这里我使用 GCC,可参考这个 How to install GCC Compiler on Ubuntu 18.04
- libssl-dev 安装,sudo apt-get install libssl-dev 注意在CMake 之前安装,否则会报错 “Could NOT find OpenSSL, try to set the path to OpenSSL root folder in the system variable OPENSSL_ROOT_DIR (missing: OPENSSL_CRYPTO_LIBRARY OPENSSL_INCLUDE_DIR)”
- CMake 安装,我使用的是 CMake 编译,CMake 官网提供了安装方式Installing | CMake
- libevent-dev 安装,sudo apt install libevent-dev, 直接安装可能会报如下错误,解决办法是
CMake Error at /usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:230 (message):Could NOT find PkgConfig (missing: PKG_CONFIG_EXECUTABLE)
Call Stack (most recent call first):/usr/local/share/cmake-3.23/Modules/FindPackageHandleStandardArgs.cmake:594 (_FPHSA_FAILURE_MESSAGE)/usr/local/share/cmake-3.23/Modules/FindPkgConfig.cmake:99 (find_package_handle_standard_args)tests/CMakeLists.txt:40 (find_package)
- hiredis 下载并编译,因为 hiredis-cluster 是基于 hiredis 扩展编写的,所以需要安装并编译 hiredis。 如下命令,因为会用到 SSL,所以我使用 make USE_SSL=1, 可以直接使用 make 替代。
git clone https://github.com/redis/hiredis.git
cd hiredis
make USE_SSL=1
sudo make install
- hiredis-cluster 环境准备,因为会测试 ssl,所以通过选项指定,Redis
mkdir build; cd build
cmake -DCMAKE_BUILD_TYPE=RelWithDebInfo -DENABLE_SSL=ON ..
make
3.在上面的步骤完成后,你的环境会是这样的:
hiredis 相关,中会生成 hiredis_ssl lib 文件,在</usr/local/lib/>中 hiredis.a 文件
中,hiredis_cluster lib 文件生成
2.2 不开启传输中加密(TLS)及 auth 的 ElastiCache 集群测试
加载测试数据
- 使用 redis-cli 登录未开启了 TLS 和 auth 的 ElastiCache 集群并通过 cluster nodes 命令获取 slots 在 shards 中的分布,通过 redis-cli 工具连接集群并进行操作的具体方法请见使用 redis-cli 连接到 Redis 集群。
redis-cli -c -h -p
- 分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出3个 key 恰好分布在 shard1,shard2 和 shard3 上
C代码
1.以下是写入 ElastiCache 集群的代码, 针对于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行写入,请注意配置的地址为 ElastiCache 集群的 configuration endpoint,另外修改不同的 keyname。
#include "hircluster.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char **argv) {UNUSED(argc);UNUSED(argv);struct timeval timeout = {1, 500000}; // 1.5sredisClusterContext *cc = redisClusterContextInit();redisClusterSetOptionAddNodes(cc, "<No TLS and auth ElastiCache configuration endpoint>:<port>"); redisClusterSetOptionConnectTimeout(cc, timeout);redisClusterSetOptionRouteUseSlots(cc);redisClusterConnect2(cc);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);// handle errorexit(-1);}int count = 0;while(count < 10000){redisReply *reply = (redisReply *)redisClusterCommand(cc, "SET %s %d", "test1", count);printf("SET: %d\n", count);count++ ;if (cc && cc->err) {printf("Error: %s\n", cc->errstr);}freeReplyObject(reply);sleep(1);}redisClusterFree(cc);return 0;
}
2.以下是读取 ElastiCache 集群的代码, 针对于 Elasticache 三个 shard 上的 test1,test2,test3 三个 key 进行读取,请注意配置的地址为 ElastiCache 集群的 configuration endpoint,另外修改不同的 keyname。
#include "hircluster.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char **argv) {UNUSED(argc);UNUSED(argv);struct timeval timeout = {1, 500000}; // 1.5sredisClusterContext *cc = redisClusterContextInit();redisClusterSetOptionAddNodes(cc, "<No TLS and auth ElastiCache configuration endpoint>:<port>"); redisClusterSetOptionConnectTimeout(cc, timeout);redisClusterSetOptionRouteUseSlots(cc);redisClusterConnect2(cc);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);// handle errorexit(-1);}int count = 0;while(count < 10000){redisReply *reply = (redisReply *)redisClusterCommand(cc, "GET %s", "test1");if(reply && reply->str) {printf("GET: %s\n", reply->str);}freeReplyObject(reply);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);}count++;sleep(1);}redisClusterFree(cc);return 0;
}
基本功能测试
1.使用如下命令编译代码:
gcc hiredisc-naw1.c -o hiredisc-naw1 -L./build -lhiredis_cluster /usr/local/lib/libhiredis.a -L~/hiredis -lhiredis_ssl
2.运行程序并监控 ElastiCache 未开启 TLS 及 Auth 集群的 CurrConnections 指标,可以看到负载被均衡地发送到了6个节点上,即 hiredis-cluster 可以完成读写分离和负载均衡的工作:
我的代码在~/hiredis-cluster 路径下面,所以
cd hiredis-cluster/ &&./hiredisc-naw1
cd hiredis-cluster/ &&./hiredisc-naw2
cd hiredis-cluster/ &&./hiredisc-naw3
cd hiredis-cluster/ &&./hiredisc-nar1
cd hiredis-cluster/ &&./hiredisc-nar2
cd hiredis-cluster/ &&./hiredisc-nar3
2.3. 开启传输中加密(TLS)及 auth 的 ElastiCache 集群测试
Amazon ElastiCache 传输中加密是一项可选功能,它允许您在数据最脆弱时候(从一个位置传输到另一个位置时)提高数据的安全性。由于在终端节点加密和解密数据时需要进行一些处理,因此启用传输中加密会对性能产生一些影响。应对使用和不使用传输中加密的数据进行基准测试,以确定对使用案例的性能影响。 关于 TLS 加密这一块,具体可以参考条条大路通罗马- 使用 redission 连接 Amazon ElastiCache for redis 集群。
加载测试数据
1.使用 redis-cli 登录开启了 TLS 和 auth 的 ElastiCache 集群并通过 cluster nodes 命令获取 slots 在 shards 中的分布,通过 redis-cli 工具连接集群并进行操作的具体方法请见使用 redis-cli 连接到 Redis 集群。
redis-cli -c -h -p
2.分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出 3 个 key 恰好分布在 shard1,shard2 和 shard3 上
C代码
1.以下是写入 ElastiCache 集群的代码, 针对于 Elasticache 三个shard 上的 test1,test2,test3 三个 key 进行写入,请注意配置的地址为 ElastiCache 集群的 configuration endpoint,设置密码,另外修改不同的 keyname。这里需要注意的是 hiredis-cluster 对 SSL 的支持,可以分为两种方式,一种是指定 SSL 证书路径,另一种是指定证书,对于 EC2 访问 ElastiCache 的情况,指定证书路径即可, 具体可参考 hiredis 的文档。
#include "hiredis_cluster/hircluster.h"#include "hiredis/hiredis_ssl.h"
#include <stdio.h>
#include <stdlib.h>#define CLUSTER_NODE_TLS ":<Enable TLS and auth ElastiCache configuration endpoint>:<port>"
#define CLUSTER_PASSWORD "<PASSWORD>"int main(int argc, char **argv) {UNUSED(argc);UNUSED(argv);redisSSLContext *ssl;redisSSLContextError ssl_error;redisInitOpenSSL();ssl = redisCreateSSLContext(NULL, "/etc/ssl/certs", NULL, NULL,NULL, &ssl_error);if (!ssl) {printf("SSL Context error: %s\n", redisSSLContextGetError(ssl_error));exit(1);}struct timeval timeout = {5, 500000}; // 5.5sredisClusterContext *cc = redisClusterContextInit();redisClusterSetOptionAddNodes(cc, CLUSTER_NODE_TLS);redisClusterSetOptionConnectTimeout(cc, timeout);redisClusterSetOptionRouteUseSlots(cc);redisClusterSetOptionEnableSSL(cc, ssl);redisClusterSetOptionPassword(cc, CLUSTER_PASSWORD);redisClusterConnect2(cc);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);// handle errorexit(-1);}int count = 0;while(count < 10000){redisReply *reply = (redisReply *)redisClusterCommand(cc, "SET %s %d", "test1", count);printf("SET: %d\n", count);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);}count++ ;freeReplyObject(reply);sleep(1);}redisClusterFree(cc);redisFreeSSLContext(ssl);return 0;
}
2.以下是读取 ElastiCache 集群的代码, 针对于 Elasticache 三个shard 上的 test1,test2,test3 三个 key 进行读取,请注意配置的地址为 ElastiCache 集群的 configuration endpoint ,另外修改不同的 keyname。
#include "hircluster.h"
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>int main(int argc, char **argv) {UNUSED(argc);UNUSED(argv);struct timeval timeout = {1, 500000}; // 1.5sredisClusterContext *cc = redisClusterContextInit();redisClusterSetOptionAddNodes(cc, "<No TLS and auth ElastiCache configuration endpoint>:<port>"); redisClusterSetOptionConnectTimeout(cc, timeout);redisClusterSetOptionRouteUseSlots(cc);redisClusterConnect2(cc);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);// handle errorexit(-1);}int count = 0;while(count < 10000){redisReply *reply = (redisReply *)redisClusterCommand(cc, "GET %s", "test1");if(reply && reply->str) {printf("GET: %s\n", reply->str);}freeReplyObject(reply);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);}count++;sleep(1);}redisClusterFree(cc);return 0;
}
基本功能测试
1.使用如下命令编译代码:
gcc hiredisc-naw1.c -o hiredisc-naw1 -L./build -lhiredis_cluster /usr/local/lib/libhiredis.a -L~/hiredis -lhiredis_ssl
2.运行程序并监控 ElastiCache 未开启 TLS 及 Auth 集群的CurrConnections 指标,可以看到负载被均衡地发送到了6个节点上,即 hiredis-cluster 可以完成读写分离和负载均衡的工作:
我的代码在~/hiredis-cluster 路径下面,所以
cd hiredis-cluster/ &&./hiredisc-naw1
cd hiredis-cluster/ &&./hiredisc-naw2
cd hiredis-cluster/ &&./hiredisc-naw3
cd hiredis-cluster/ &&./hiredisc-nar1
cd hiredis-cluster/ &&./hiredisc-nar2
cd hiredis-cluster/ &&./hiredisc-nar3
2.3. 开启传输中加密(TLS)及 auth 的 ElastiCache 集群测试
Amazon ElastiCache 传输中加密是一项可选功能,它允许您在数据最脆弱时候(从一个位置传输到另一个位置时)提高数据的安全性。由于在终端节点加密和解密数据时需要进行一些处理,因此启用传输中加密会对性能产生一些影响。应对使用和不使用传输中加密的数据进行基准测试,以确定对使用案例的性能影响。 关于 TLS 加密这一块,具体可以参考条条大路通罗马- 使用 redission 连接 Amazon ElastiCache for redis 集群。
加载测试数据
1.使用 redis-cli 登录开启了 TLS 和 auth 的 ElastiCache 集群并通过 cluster nodes 命令获取 slots 在 shards 中的分布,通过 redis-cli 工具连接集群并进行操作的具体方法请见使用 redis-cli 连接到 Redis 集群。
redis-cli -c -h -p
2.分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出 3 个 key 恰好分布在shard1,shard2 和 shard3 上
C代码
1.以下是写入 ElastiCache 集群的代码, 针对于 Elasticache 三个shard 上的 test1,test2,test3 三个 key 进行写入,请注意配置的地址为 ElastiCache 集群的 configuration endpoint,设置密码,另外修改不同的 keyname。这里需要注意的是 hiredis-cluster 对SSL的支持,可以分为两种方式,一种是指定 SSL 证书路径,另一种是指定证书,对于 EC2 访问 ElastiCache 的情况,指定证书路径即可, 具体可参考 hiredis 的文档。
#include "hiredis_cluster/hircluster.h"#include "hiredis/hiredis_ssl.h"
#include <stdio.h>
#include <stdlib.h>#define CLUSTER_NODE_TLS ":<Enable TLS and auth ElastiCache configuration endpoint>:<port>"
#define CLUSTER_PASSWORD "<PASSWORD>"int main(int argc, char **argv) {UNUSED(argc);UNUSED(argv);redisSSLContext *ssl;redisSSLContextError ssl_error;redisInitOpenSSL();ssl = redisCreateSSLContext(NULL, "/etc/ssl/certs", NULL, NULL,NULL, &ssl_error);if (!ssl) {printf("SSL Context error: %s\n", redisSSLContextGetError(ssl_error));exit(1);}struct timeval timeout = {5, 500000}; // 5.5sredisClusterContext *cc = redisClusterContextInit();redisClusterSetOptionAddNodes(cc, CLUSTER_NODE_TLS);redisClusterSetOptionConnectTimeout(cc, timeout);redisClusterSetOptionRouteUseSlots(cc);redisClusterSetOptionEnableSSL(cc, ssl);redisClusterSetOptionPassword(cc, CLUSTER_PASSWORD);redisClusterConnect2(cc);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);// handle errorexit(-1);}int count = 0;while(count < 10000){redisReply *reply = (redisReply *)redisClusterCommand(cc, "SET %s %d", "test1", count);printf("SET: %d\n", count);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);}count++ ;freeReplyObject(reply);sleep(1);}redisClusterFree(cc);redisFreeSSLContext(ssl);return 0;
}
2.以下是读取 ElastiCache 集群的代码, 针对于 Elasticache 三个shard 上的 test1,test2,test3 三个 key 进行读取,请注意配置的地址为 ElastiCache 集群的 configuration endpoint ,另外修改不同的 keyname 。
#include "hiredis_cluster/hircluster.h"#include "hiredis/hiredis_ssl.h"
#include <stdio.h>
#include <stdlib.h>#define CLUSTER_NODE_TLS "<Enable TLS and auth ElastiCache configuration endpoint>:<port>"
#define CLUSTER_PASSWORD "<PASSWORD>"int main(int argc, char **argv) {UNUSED(argc);UNUSED(argv);redisSSLContext *ssl;redisSSLContextError ssl_error;redisInitOpenSSL();ssl = redisCreateSSLContext(NULL, "/etc/ssl/certs", NULL, NULL,NULL, &ssl_error);if (!ssl) {printf("SSL Context error: %s\n", redisSSLContextGetError(ssl_error));exit(1);}struct timeval timeout = {5, 500000}; // 5.5sredisClusterContext *cc = redisClusterContextInit();redisClusterSetOptionAddNodes(cc, CLUSTER_NODE_TLS);redisClusterSetOptionConnectTimeout(cc, timeout);redisClusterSetOptionRouteUseSlots(cc);redisClusterSetOptionEnableSSL(cc, ssl);redisClusterSetOptionPassword(cc, CLUSTER_PASSWORD);redisClusterConnect2(cc);if (cc && cc->err) {printf("Error: %s\n", cc->errstr);// handle errorexit(-1);}int count = 0;while(count < 10000){redisReply *reply = (redisReply *)redisClusterCommand(cc, "GET %s", "test1");if(reply && reply->str) {printf("GET: %s\n", reply->str);}freeReplyObject(reply);
if (cc && cc->err) {printf("Error: %s\n", cc->errstr);}count++;sleep(1);}redisClusterFree(cc);redisFreeSSLContext(ssl);return 0;
}
基本功能测试
1.使用如下命令编译代码:
gcc hiredisc-aw1.c -o hiredisc-aw1 -L./build -lhiredis_cluster /usr/local/lib/libhiredis.a -L~/hiredis -lhiredis_ssl
2.运行程序并监控 ElastiCache 开启 TLS 及 Auth 集群的CurrConnections 指标,可以看到负载被均衡地发送到了 6 个节点上,即 hiredis-cluster 可以完成读写分离和负载均衡的工作:
我的代码在~/hiredis-cluster 路径下面,所以
cd hiredis-cluster/ &&./hiredisc-aw1
cd hiredis-cluster/ &&./hiredisc-aw2
cd hiredis-cluster/ &&./hiredisc-aw3
cd hiredis-cluster/ &&./hiredisc-ar1
cd hiredis-cluster/ &&./hiredisc-ar2
cd hiredis-cluster/ &&./hiredisc-ar3
三级标题
3.1. 未开启 TLS 及 auth 的 ElastiCache failover 测试
登录 console,对 Shard1 进行 failover,然后观测我们的C程序的输出, 此过程大约持续12s ((观测所得)),
从 ElastiCache 集群的每个节点的 CurrConnections 指标截图同样可以看出,hiredis-cluster 将读写请求都发送到了 shard1 新的主节点上:
3.2. 开启 TLS 及 auth 的 ElastiCache failover 测试
登录 console,对 Shard1 进行 failover,然后观测我们的C程序的输出,这个时间大概 10s 左右(观测所得),
从 ElastiCache 集群的每个节点的 CurrConnections 指标截图同样可以看出, hiredis-cluster 将读写请求都发送到了 shard1 新的主节点上:
failover 测试中发生问题以及解决方案
在做 failover 的时候发现一个问题,在 failover 过程中,有的时候client 端直接断开链接,有的时候成功,后来经过分析 hiredis 的代码得知需要把 timeout 时间调整下,所以从 1.5s 调整为 5.5s, 注意这个值并不是最佳实践,是根据测试得来的。
4. 结束语
在本博客中,主要使用C语言通过 hiredis-cluster 连接和操作ElastiCache 集群,从简单的 Demo 中我们可以看到 hiredis-cluster 可以很好地支持 ElastiCache 集群开启 TLS 及 auth 等功能,并自动完成读写分离,负载均衡,failover 等工作,有助于我们便捷,高效地使用 ElastiCache。
5.参考
Hiredis-cluster 文档:GitHub - Nordix/hiredis-cluster: C client library for Redis Cluster. This project is used and sponsored by Ericsson. It is a fork of the now unmaintained hiredis-vip.
Hiredis 文档: GitHub - redis/hiredis: Minimalistic C client for Redis >= 1.2
Amazon Elasticache : Amazon ElastiCache for Redis
条条大路通罗马 —— 使用 redisson 连接 Amazon ElastiCache for redis 集群:条条大路通罗马 —— 使用redisson连接Amazon ElastiCache for redis 集群 | 亚马逊AWS官方博客
相关博客
条条大路通罗马 —— 使用 redisson 连接 Amazon ElastiCache for redis 集群
条条大路通罗马 —— 使用 redis-py 访问 Amazon ElastiCache for redis集群
条条大路通罗马 —— 使用 go-redis 连接 Amazon ElastiCache for Redis 集群
本篇作者
冯秋爽
Amazon 解决方案架构师,负责跨国企业级客户基于 Amazon 的技术架构设计、咨询和设计优化工作。在加入 Amazon 之前曾就职于 IBM 、甲骨文等 IT 企业,积累了丰富的程序开发和数据库的实践经验。
文章来源:https://dev.amazoncloud.cn/column/article/630a21a42ecbae73705ffb40?sc_medium=regulartraffic&sc_campaign=crossplatform&sc_channel=CSDN
相关文章:

条条大路通罗马系列—— 使用 Hiredis-cluster 连接 Amazon ElastiCache for Redis 集群
前言 Amazon ElastiCache for Redis 是速度超快的内存数据存储,能够提供亚毫秒级延迟来支持 实时应用程序。适用于 Redis 的 ElastiCache 基于开源 Redis 构建,可与 Redis API 兼容,能够与 Redis 客户端配合工作,并使用开放的 Re…...

元宇宙核能发电VR模拟仿真实训教学为建设新型电力系统提供重要支撑
随着“碳达峰、碳中和”目标与建设新型能源体系的提出,在元宇宙环境下建设电力系统是未来发展的趋势。以物联网、区块链、数字孪生、混合现实等技术为主要代表的元宇宙技术体系及其在电力和能源系统中的应用,将会促进智能电网的发展,为建设新…...

我的Python教程:使用Pyecharts画柱状图
Pyecharts是一个用于生成 Echarts 图表的 Python 库。Echarts 是一个基于 JavaScript 的数据可视化库,提供了丰富的图表类型和交互功能。通过 Pyecharts,你可以使用 Python 代码生成各种类型的 Echarts 图表,例如折线图、柱状图、饼图、散点图…...

应用冷启bindservice耗时
背景:sdk初始化的时候耗时过长,而sdk,init方法中只有一个bindservice及一些变量的初始化,却好事100ms 查看trace发现binderservice耗时只占init耗时的一小部分,但是init逻辑并没有其他代码。 这里servicebind返回快的另一原因是se…...
资金情况:每周一次投资和消费总结
以下是每周一次投资和消费总结的最佳方法: 撰写一份清单:在整个星期中记录你的投资和消费行为,包括花费、支出和收入。 分类整理:将你的花费和支出分成不同的类别,例如餐饮、购物、交通等等。这将帮助你更好地了解你的…...
(杭电多校)2023“钉耙编程”中国大学生算法设计超级联赛(7)
1002 Random Nim Game 只有3种情况,要么必赢,要么必输,要么从宏观角度考虑,随机的话,赢的概率就是1/2(就像抛硬币一样,随着抛的次数越来越多,正反面的概率将越来越接近1) 当只要有一堆石头数量不是1,那么就是必赢或必输,赢的概率就是1/2 当每堆石头数量都为1时,当堆数为奇数…...

力扣:61. 旋转链表(Python3)
题目: 给你一个链表的头节点 head ,旋转链表,将链表每个节点向右移动 k 个位置。 来源:力扣(LeetCode) 链接:力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 示例&…...
笙默考试管理系统-MyExamTest----codemirror(1)
笙默考试管理系统-MyExamTest----codemirror(1) 目录 笙默考试管理系统-MyExamTest----codemirror(1) 一、 笙默考试管理系统-MyExamTest----codemirror 二、 笙默考试管理系统-MyExamTest----codemirror 三、 笙默考试管…...
【资料分享】全志科技T507工业核心板硬件说明书(二)
目 录 2引脚说明 2.1引脚排列 2.2引脚定义 2.3内部引脚使用说明 2.4引脚上下拉、串联说明 2.5功能引脚信号走线长度与阻抗说明 本文档为创龙科技SOM-TLT507工业...
PyTorch翻译官网教程-FAST TRANSFORMER INFERENCE WITH BETTER TRANSFORMER
官网链接 Fast Transformer Inference with Better Transformer — PyTorch Tutorials 2.0.1cu117 documentation 使用 BETTER TRANSFORMER 快速的推理TRANSFORMER 本教程介绍了作为PyTorch 1.12版本的一部分的Better Transformer (BT)。在本教程中,我们将展示如…...

SpringCloud实用篇6——elasticsearch搜索功能
目录 1 DSL查询文档1.1 DSL查询分类1.2 全文检索查询1.2.1 使用场景1.2.2 基本语法1.2.3 示例1.2.4 总结 1.3 精准查询1.3.1 term查询1.3.2 range查询1.3.3 总结 1.4.地理坐标查询1.4.1 矩形范围查询1.4.2 附近查询 1.5 复合查询1.5.1 相关性算分1.5.2 算分函数查询1࿰…...
质量小议29 -- 循证
1. 循证 Evidence-Based遵循证据基于证据慎重、准确和明智地应用当前所能获得的最好研究依据利用证据追求实践科学化和专业化的价值观,重视证据指导实践的理念,运用证据解决实践中问题的思维,基于证据开展专业实践活动的指导原则,…...

微服务与Nacos概述-3
流量治理 在微服务架构中将业务拆分成一个个的服务,服务与服务之间可以相互调用,但是由于网络原因或者自身的原因,服务并不能保证服务的100%可用,如果单个服务出现问题,调用这个服务就会出现网络延迟,此时…...
Java 面试八股文
参考: 2023年 Java 面试八股文(20w字)_json解析失败_leader_song的博客-CSDN博客...

NPM与外部服务的集成(上)
目录 1、关于访问令牌 1.1 关于传统令牌 1.2 关于粒度访问令牌 2、创建和查看访问令牌 2.1 创建访问令牌 在网站上创建传统令牌 在网站上创建粒度访问令牌 使用CLI创建令牌 CIDR限制令牌错误 查看访问令牌 在网站上查看令牌 在CLI上查看令牌 令牌属性 1、关于访问令…...
React Router 6
1.概述 React Router 以三个不同的包发布到 npm 上,它们分别为: react-router: 路由的核心库,提供了很多的:组件、钩子。 react-router-dom: 包含react-router所有内容,并添加一些专门用于 DOM 的组件,例如…...

Leetcode34 在排序数组中查找元素的第一个和最后一个位置
给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 你必须设计并实现时间复杂度为 O(log n) 的算法解决此问题。 代码: c…...

Kubernetes 调度约束(亲和性、污点、容忍)
目录 一、Pod启动典型创建过程 二、调度流程 三、指定调度节点 1.使用nodeName字段指定调度节点 2.使用nodeSelector指定调度节点 2.1给对应的node节点添加标签 2.2修改为nodeSelector调度方式 3.通过亲和性来指定调度节点 3.1节点亲和性 3.2Pod亲和性与反亲和性 3.2…...

按轨迹运行
文章目录 import math import timeimport numpy as np import matplotlib.pyplot as pltdef plot_arrow(x, y, yaw, length=5, width=1):dx = length * math.cos(yaw)dy = length * math.sin(yaw)plt.arrow(x, y, dx, dy, head_length=width, head_width=width)plt.plot([x, x …...

研发工程师玩转Kubernetes——通过PV的节点亲和性影响Pod部署
在《研发工程师玩转Kubernetes——PVC通过storageClassName进行延迟绑定》一文中,我们利用Node亲和性,让Pod部署在节点ubuntud上。因为Pod使用的PVC可以部署在节点ubuntuc或者ubuntud上,而系统为了让Pod可以部署成功,则让PVC与Pod…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...

深度学习在微纳光子学中的应用
深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...
鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南
1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...
CSS | transition 和 transform的用处和区别
省流总结: transform用于变换/变形,transition是动画控制器 transform 用来对元素进行变形,常见的操作如下,它是立即生效的样式变形属性。 旋转 rotate(角度deg)、平移 translateX(像素px)、缩放 scale(倍数)、倾斜 skewX(角度…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
前端高频面试题2:浏览器/计算机网络
本专栏相关链接 前端高频面试题1:HTML/CSS 前端高频面试题2:浏览器/计算机网络 前端高频面试题3:JavaScript 1.什么是强缓存、协商缓存? 强缓存: 当浏览器请求资源时,首先检查本地缓存是否命中。如果命…...