条条大路通罗马系列—— 使用 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集群

  1. 首先创建一个开启 TLS 及其 Auth 的3 shards,6节点的ElastiCache 集群,实例类型为 cache.t3.small,版本为5.0.6, 按下文的方式获取 configuration endpoint,此处假设其值为:

具体获取 endpoint 的方式如下:

image.png

查找 Redis(已启用集群模式)集群的 configuration endpoint

  • 登录 Amazon Management Console 并打开 ElastiCache 控制台 (https://console.aws.amazon.com/elasticache/)。
  • 从导航窗格中,选择 Redis。
  • 此时会显示一个列表,其中包含运行任意版本 Redis 的集群。
  • 从集群列表中,选择运行“集群 Redis”的集群左侧的复选框。
  • 此时屏幕会展开,以显示有关选定集群的详细信息。
  • 找到 Configuration endpoint

image.png

2.创建一个关闭 TLS 且无 auth 的3 shards,6节点的 ElastiCache 集群,实例类型为 cache.t3.medium,版本为5.0.6,按上文的方式获取 configuration endpoint,此处假设其值为:

image.png

创建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 文件

image.png

image.png

中,hiredis_cluster lib 文件生成

image.png

image.png

2.2 不开启传输中加密(TLS)及 auth 的 ElastiCache 集群测试

加载测试数据

  1. 使用 redis-cli 登录未开启了 TLS 和 auth 的 ElastiCache 集群并通过 cluster nodes 命令获取 slots 在 shards 中的分布,通过 redis-cli 工具连接集群并进行操作的具体方法请见使用 redis-cli 连接到 Redis 集群。

redis-cli -c -h -p

image.png

  1. 分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出3个 key 恰好分布在 shard1,shard2 和 shard3 上

image.png

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

image.png

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 集群。

111.png

redis-cli -c -h -p

2.分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出 3 个 key 恰好分布在 shard1,shard2 和 shard3 上

222.png

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

image.png

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 集群。

image.png

redis-cli -c -h -p

2.分别生成 testka,testb,testc 三个 key,可以通过其 slot 值结合上文各个 shard 上 slot 分布信息,判断出 3 个 key 恰好分布在shard1,shard2 和 shard3 上

image.png

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

image.png

三级标题

3.1. 未开启 TLS 及 auth 的 ElastiCache failover 测试

登录 console,对 Shard1 进行 failover,然后观测我们的C程序的输出, 此过程大约持续12s ((观测所得)),

image.png

从 ElastiCache 集群的每个节点的 CurrConnections 指标截图同样可以看出,hiredis-cluster 将读写请求都发送到了 shard1 新的主节点上:

image.png

3.2. 开启 TLS 及 auth 的 ElastiCache failover 测试

登录 console,对 Shard1 进行 failover,然后观测我们的C程序的输出,这个时间大概 10s 左右(观测所得),

image.png

从 ElastiCache 集群的每个节点的 CurrConnections 指标截图同样可以看出, hiredis-cluster 将读写请求都发送到了 shard1 新的主节点上:

image.png

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 集群

本篇作者

image.png

冯秋爽

Amazon 解决方案架构师,负责跨国企业级客户基于 Amazon 的技术架构设计、咨询和设计优化工作。在加入 Amazon 之前曾就职于 IBM 、甲骨文等 IT 企业,积累了丰富的程序开发和数据库的实践经验。

文章来源:https://dev.amazoncloud.cn/column/article/630a21a42ecbae73705ffb40?sc_medium=regulartraffic&amp;sc_campaign=crossplatform&amp;sc_channel=CSDN 

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数组相关练习

数组练习 将数组转化成字符串数组拷贝求数组元素的平均值查找数组中指定元素(顺序查找)二分查找冒泡排序数组逆序 将数组转化成字符串 import java.util.Arrays;public class Text1 {public static void main(String[] args) {int[] arr {5, 6, 4, 2};System.out.println(Arr…

Android Framework解析——WMS原理

作者&#xff1a;bobby_developer 1. WMS原理&#xff1a;WMS角色与实例化过程 window:它是一个抽象类&#xff0c;具体实现类为 PhoneWindow &#xff0c;它对 View 进行管理。Window是View的容器&#xff0c;View是Window的具体表现内容&#xff1b; windowManager:是一个接…

大学生口才培训需求分析

标题&#xff1a;大学生口才培训需求分析 摘要&#xff1a; 本论文旨在分析大学生口才培训的需求&#xff0c;通过对大学生口才培训的重要性、现状和挑战进行研究&#xff0c;并结合相关理论和实践经验&#xff0c;提出相应的培训需求和解决方案。通过本论文的研究&#xff0c…

js手写贪吃蛇游戏

前端手写贪吃蛇游戏 贪吃蛇游戏 场景 使用了js 和 html /css 就可以完成 一个贪吃蛇小游戏 技术分析 主要用到的几个技术点&#xff1a; clientWidth &#xff1a;元素的宽度&#xff0c;包含内边距clientHeight &#xff1a;元素的高度&#xff0c;包含内边距setInterval&am…

(八)穿越多媒体奇境:探索Streamlit的图像、音频与视频魔法

文章目录 1 前言2 st.image&#xff1a;嵌入图像内容2.1 图像展示与描述2.2 调整图像尺寸2.3 使用本地文件或URL 3 st.audio&#xff1a;嵌入音频内容3.1 播放音频文件3.2 生成音频数据播放 4 st.video&#xff1a;嵌入视频内容4.1 播放视频文件4.2 嵌入在线视频 5 结语&#x…

kubernetes中最小组件——Pod

目录 一、Pod简介 二、Pod的使用方式 三、Pause——Pod中底层基础容器 四、为什么kubernetes这样设计Pod 五、Pod的分类 1.自主式Pod 2.控制器管理的Pod 3.静态Pod 六、Pod容器的分类 1. 基础容器&#xff08;infrastructure container&#xff09; 2. 初始化容器&am…

Git与Github常用方法

目录 1. Github基本使用方法2. Git使用方法3. git、VS code、Github联合使用方法4. Git配置Github远程仓库SSH密钥5 常见问题 1. Github基本使用方法 仓库&#xff08;Repository&#xff09;&#xff1a;Github上用来存放代码的空间&#xff0c;包含代码、文档和其他文件。提…

万应低代码受邀参加上海电信“大干一场 科创沙龙”活动

7月28日&#xff0c;由上海市宝山区大场镇政府指导、中国电信上海北区局主办的“大干一场 科创沙龙”系列第九期沙龙活动顺利举办。大场镇“数字化转型”领导小组办公室&#xff08;以下简称“数字办”&#xff09;邀请了来自镇域内外的数十家科创服务企业。万应低代码作为天翼…

flask-----蓝图

1.引入蓝图 flask都写在一个文件中&#xff0c;项目这样肯定不行&#xff0c;会导致循环导入的问题&#xff0c;分目录&#xff0c;分包&#xff0c;使用蓝图划分目录。 2.使用蓝图 步骤如下&#xff1a; -1 实例化得到一个蓝图对象-order_blueBlueprint(order,__name__,tem…

医疗行业如何防范弱口令攻击?这份弱口令治理方案请收好

随着5G、云计算、物联网等新兴技术与传统医疗系统的不断深化融合&#xff0c;我国医疗信息化程度越来越高&#xff0c;逐步向数字化、智慧化医疗演进&#xff0c;蓬勃发展的信息化也使医疗行业面临的安全风险逐渐增多。数据泄露、勒索病毒等问题频发&#xff0c;加之《等保》、…

JavaScript |(四)正则表达式 | 尚硅谷JavaScript基础实战

学习来源&#xff1a;尚硅谷JavaScript基础&实战丨JS入门到精通全套完整版 系列笔记&#xff1a; JavaScript |&#xff08;一&#xff09;JavaScript简介及基本语法JavaScript |&#xff08;二&#xff09;JavaScript自定义对象及函数JavaScript |&#xff08;三&#xff…

hcip——期中小试

要求&#xff1a; 1、该拓扑为公司网络&#xff0c;其中包括公司总部、公司分部以及公司骨干网&#xff0c;不包含运营商公网部分。 2 、设备名称均使用拓扑上名称改名&#xff0c;并且区分大小写。 3 、整张拓扑均使用私网地址进行配置。 4 、整张网络中&#xff0c;运行 O…

21、springboot的宽松绑定及属性处理类的构造注入

springboot的宽松绑定及属性处理类的构造注入 ★ 如何使用属性处理类所读取的属性 属性处理类最终变成了Spring容器中的一个Bean组件&#xff0c;因此接下来Spring即可将该Bean组件注入任意其他组件。 这种做法的好处是&#xff1a;可以将大量的配置信息封装一个对象——所以…

Spring boot 集成 Skywalking 配置 || Skywalking 打不开【已解决】

一、Skywalking官网 Apache SkyWalking 1.下载Skywalking APM &#xff08;如果下载最新的&#xff0c;双击打开闪退&#xff0c;选老点的版本&#xff09; 2. 下载 Skywalking Agents 如果下载太慢&#xff0c;建议复制下载链接&#xff0c;然后用下载器下载&#xff0c;比…

时间复杂度空间复杂度相关练习题

1.消失的数字 【题目】&#xff1a;题目链接 思路1&#xff1a;排序——》qsort快排——》时间复杂度O&#xff08;n*log2n&#xff09; 不符合要求 思路2&#xff1a;&#xff08;0123...n)-(a[0]a[1][2]...a[n-2]) ——》 时间复杂度O&#xff08;N&#xff09;空间复杂度…

软件验收测试包括几种类型?验收测试报告有什么好处?

在软件开发中&#xff0c;验收测试是软件项目在开发完成后进行的最后一项测试工作。它是确认软件是否满足预期要求&#xff0c;并准备将软件交付用户的核心环节&#xff0c;它可以确保软件的质量和功能符合用户的需求和期望。 一、软件验收测试的类型 软件验收测试可以分为多…

Java版企业电子招标采购系统源码Spring Cloud + Spring Boot +二次开发+ MybatisPlus + Redis tbms

​ 功能描述 1、门户管理&#xff1a;所有用户可在门户页面查看所有的公告信息及相关的通知信息。主要板块包含&#xff1a;招标公告、非招标公告、系统通知、政策法规。 2、立项管理&#xff1a;企业用户可对需要采购的项目进行立项申请&#xff0c;并提交审批&#xff0c;查…

20230809在WIN10下使用python3批量将TXT文件转换为SRT文件

20230809在WIN10下使用python3批量将TXT文件转换为SRT文件 2023/8/9 17:30 由于喜欢看纪录片等外文视频&#xff0c;通过剪映/PR2023/AUTOSUB识别字幕之后&#xff0c;可以通过google翻译识别为简体中文的DOCX文档。 DOCX文档转换为TXT文档之后&#xff0c;还需要转换为SRT文档…

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

​三江学院图书馆藏八一新书《乡村振兴战略下传统村落文化旅游设计》

实战:Prometheus+Grafana监控Linux服务器及Springboot项目

文章目录 前言知识积累什么是Prometheus什么是Grafana怎样完成数据采集和监控 环境搭建docker与docker-compose安装docker-compose编写 监控配置grafana配置prometheus数据源grafana配置dashboardLinux Host Metrics监控Spring Boot 监控 写在最后 前言 相信大家都知道一个项目…