小阿轩yx-高性能内存对象缓存
小阿轩yx-高性能内存对象缓存
案例分析
案例概述
Memcached
- 是一款开源的高性能分布式内存对象缓存系统
- 用于很多网站提高访问速度,尤其是需要频繁访问数据的大型网站
- 是典型的 C/S 架构,需要构建 Memcached 服务器端与 Memcached API 客户端
- 用 C 语言编写的,Memcached API 客户端可用任何语言来编写(如 PHP、Python、Perl等)
案例前置知识点
数据存储方式与数据过期方式
Memcached
- 具有独特的数据存储方式和数据过期方式
数据存储方式:Slab Allocation
- 按组分配内存
数据过期方的两种方式
- LRU
- Laxzy Expiration
LRU
- 指追加的数据空间不足时,会根据 LRU 的情况淘汰最近最少使用的记录
- 可以有效解决内存碎片问题,但也可能会使内存空间产生浪费
Laxzy Expiration
- 即懒惰过期,指使用 get 时查看记录时间,从而检查记录是否已经过期
Memcached 缓存机制
- 缓存是常驻在内存的数据,能够快速进行读取
- 是一款非常出色的缓存软件
Memcached 分布式
- 部署主要依赖于 Memcached 的客户端来实现
- 多个 Memcached 服务器是独立的
- 数据如何存储是由路由器算法所决定
Memcached 路由算法
求余数 hash 算法
- 先用 key 做 hash 运算得到一个整数,再做 hash 算法,根据余数进行路由,适合大多数据需求
- 不适合在动态变化环境中,比如大量机器添加或删除,会导致大量的对象存储位置失效
一致性 hash 算法
- 适合在动态变化的环境中使用
原理
- 按照 hash 算法把对应的 key 通过一定的 hash 算法处理后映射形成一个首尾相接闭合循环
- 然后通过使用与对象存储一样的 hash算法将机器也映射到环中
- 顺时针方向计算将所有对象存储到离自己最近的机器中
案例环境
- 使用三台 CentOS 7.9 系统完成
- 两台是 Memcached 服务器,另一台是基于 LAMP 架构进行 Memcached 扩展的 Memcached API 客户端
主机 | 操作系统 | 主机名/IP地址 | 主要软件及版本 |
服务器 | CentOS7.9 | Memcache1/192.168.10.101 | libevent-2.1.8-stable.tar.gz |
服务器 | CentOS7.9 | Memcache2/192.168.10.102 | libevent-2.1.8-stable.tar.gz |
客户端 | CentOS7.9 | Memcached-API/192.168.10.103 | httpd-2.4.25.tar.gz |
案例拓扑
案例需求
- 安装部署 Memcached 服务
- 安装 Memcached API 客户端
- 实现 Memcached 主主复制+高可用
案例实现思路
- 首先安装 Memcached 服务器 及Memcached APl客户端
- 利用 Keepalived 构建 Memcached 高可用服务器架构
- 测试并验证 Keepalived 高可用所带来的稳定性
案例一
单 memcached 节点缓存系统
设置各节点的主机名
主机
- 192.168.10.101
[root@localhost ~]# hostnamectl set-hostname memcache1
[root@localhost ~]# bash
主机
- 192.168.10.102
[root@localhost ~]# hostnamectl set-hostname memcache2
[root@localhost ~]# bash
主机
- 192.168.10.103
[root@localhost ~]# hostnamectl set-hostname memcached-API
[root@localhost ~]# bash
安装 Memcached 服务器
修改两台主机名
[root@localhost ~]# hostnamectl set-hostname memcache1
[root@localhost ~]# bash
[root@localhost ~]# hostnamectl set-hostname memcache2
[root@localhost ~]# bash
首先关闭防火墙、内核机制
[root@memcache1 ~]# systemctl stop firewalld
[root@memcache1 ~]# setenforce 0
安装 Libevent
上传 libevent 包至服务器
解压
[root@memcache1 ~]# tar zxvf libevent-2.1.8-stable.tar.gz
进入 libevent
[root@memcache1 ~]# cd libevent-2.1.8-stable
安装 gcc* 环境
[root@memcache1 libevent ~]# yum -y install gcc*
配置路径前缀
[root@memcache1 libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
make install 执行
[root@memcache1 libevent-2.1.8-stable]# make && make install
Libevent
- 是用 C 语言编写
- 轻量级
- 开源高性能事件通知库
- 已经被广泛应用。作为底层的网络库(如:memcached、Vomit、Nylon、Netchat等)
亮点
- 事件驱动
- 高性能
- 轻量级
- 专注于网络
- 没有 ACE 那么臃肿庞大
- 源代码相当精炼、易读
- 跨平台
- 支持 Windows、Linux、*BSD、Mac Os
- 支持多种 I/O 多路复用技术(epoll、poll、dev/poll、select、kqueue等)
- 支持 I/O
- 定时器和信号事件
- 注册事件优先级
安装 Memcached
上传 memcached-1.5.1.tar.gz 至服务器
解压
[root@memcache1 ~]# tar zxvf memcached-1.5.1.tar.gz
进入
[root@memcache1 ~]# cd memcached-1.5.1
配置路径
[root@memcache1 memcached-1.5.1]# ./configure --prefix=/usr/local/memcached --with-libevent=/usr/local/libevent//退出
[root@memcache1 memcached-1.5.1]# cd
上传 memcached.service 脚本至服务器
下载 psmisc
[root@memcache1 ~]# yum -y install psmisc
- psmisc 提供了 killall 命令
添加执行权
[root@memcache1 ~]# chmod +x memcached_service.sh
启动服务
[root@memcache1 ~]# ./memcached_service.sh start
查看进程
[root@memcache1 ~]# netstat -anpt | grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 20564/memcached
tcp6 0 0 :::11211 :::* LISTEN 20564/memcached
Memcached API 客户端
先安装 gcc*
[root@memcached-api]# yum -y install gcc*
设置好 yum 源
[root@memcached-api ~]# rm -rf /etc/yum.repos.d/*
curl -o /etc/yum.repos.d/CentOS-Base.repo ftp://192.168.2.149/repo/CentOS-Base.repo
curl -o /etc/yum.repos.d/epel.repo ftp://192.168.2.149/repo/epel.repo
[root@memcached-api ~]# yum clean all
安装 httpd、php
[root@memcached-api ~]# yum -y install httpd mariadb mariadb-server php php-devel php-mysql
启动服务
[root@memcached-api ~]# systemctl start mariadb
数据库设置密码
[root@memcached-api ~]# mysqladmin -uroot password 'pwd123'
启动 httpd
[root@memcached-api ~]# systemctl start httpd
关闭防火墙、内核机制
[root@memcached-api ~]# systemctl stop firewalld
[root@memcached-api ~]# setenforce 0
切换目录
[root@memcached-api ~]# cd /var/www/html
编写测试文件
[root@memcache-api html]# vim test1.php
<?php
phpinfo();
?>
浏览器访问 192.168.10.103/test1.php
退出当前目录
上传 libmemcached-1.0.18.tar.gz 至服务器
解压
[root@memcached-api ~]# tar zxvf libmemcached-1.0.18.tar.gz
进入
[root@memcached-api ~]# cd libmemcached-1.0.18
配置安装路径
[root@memcached-api libmemcached-1.0.18]# ./configure --prefix=/usr/local/libmemcached --with-memcached=/usr/local/memcached
make install 执行
root@memcached-api libmemcached-1.0.18]# make && make install
退出当前目录
上传 memcached-2.2.0.tgz 至服务器
解压
[root@memcached-api ~]# tar zxvf memcached-2.2.0.tgz
进入
[root@memcached-api ~]# cd memcached-2.2.0
利用 phpize 生产脚本
[root@memcached-api memcached-2.2.0]# phpize
安装 zlib
[root@memcached-api memcached-2.2.0]# yum -y install zlib
指定配置脚本位置
[root@memcached-api memcached-2.2.0]#./configure --with-php-config=/usr/bin/php-config --with-libmemcached-dir=/usr/local/libmemcached/ --disable-memcachedsasl --with-zlib-dir
make install 执行
[root@memcached-api memcached-2.2.0]# make && make install
退出当前目录
修改配置文件
[root@memcached-api ~]# vim /etc/php.ini
//添加下面内容
extension=memcached.so
重启 httpd
[root@memcached-api ~]# systemctl restart httpd
浏览器刷新网站查看
切换目录
[root@memcached-api ~]# cd /var/www/html/
上传 test2.php代码至服务器
刷新网站测试
Memcached 数据库操作与管理
安装 telnet 软件包
[root@memcachel ~]# yum -y install telnet
连接
[root@memcachel ~]# telnet 127.0.0.1 11211
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
get key
VALUE key 3932160 25
Memcache test successful!
END
quit
root@memcachel ~]# telnet 127.0.0.1 11211
//添加一条键值数据
add username 0 0 8
zhangsan
STORED
-
表示键值名为 username
-
标记位表示自定义信息为 0
-
过期时间为 0(永不过期,单位为秒)
-
字节数为 8
-
zhangsan 为值,这里需要注意输入长度为8 字节,与设定值符合
//查询键值数据
get username
VALUE username 0 8
zhangsan
END
gets username
VALUE username 0 8 2
zhangsan
END
-
get 后跟键名。如果检查最近是否更新,可以使用 gets,最后一位显示的是更新因子,每更新一次更新因子数会加一
//更新一条键值数据
set username 0 0 4
lisi
STORED
get username
VALUE username 0 4
everything
END gets username
VALUE username 0 4 4
lisi
END
//清除一条缓存数据
delete username
DELETED
get username
END
//检查后更新 check and set
add username 0 0 8
zhangsan
STOREDgets username
VALUE username 0 8 7
zhangsan
END //注意,因为更新因子和gets得到的不一致,这个语句的更新会失败
cas username 0 0 8 1
lodging
EXISTS cas username 0 0 8 7
zhangsai
STORED
gets username
VALUE username 0 7 8
lodging
END
-
cas命令的最后一个数字是更新因子,如果gets获取到的更新因子和cas命令提供的更新因子一致,则更新改数据,否则不会更新,会提示exists
-
cas命令的第三个数字是要更新的数据的字节数,和接下来输入进去的字符串的字节数要一致,否则会报错
//追加数据
//后追加 8 字节
append username 0 0 8
zhangsan
STORED
get username
VALUE username 0 14
lodgingzhangsan
END
//清除所有缓存数据
flush_all
OK
//查看服务器统计信息
stats
//返回所有键值对统计信息
stats items
//返回指定存储空间的键值对
stats cachedump 1 0
//显示各个 slab 的信息,包括 chunk 的大小、数目、使用情况等
stats slabs
//输出所有 item 的大小和个数
stats sizes
//清空统计数据
stats reset
//退出
quit
案例二
Memcached 实现主主复制和高可用的方式
Memcached 主主复制架构
-
支持多个 Memcached 之间相互复制(双向复制,主备都是可读可写的)
-
可以解决 Memcached 的容灾问题
(此步骤在两台memcache服务器上都执行)
- 192.168.10.101
- 192.168.10.102
修改主机名
[root@localhost ~]# hostnamectl set-hostname memcache1
[root@localhost ~]# bash
[root@localhost ~]# hostnamectl set-hostname memcache2
[root@localhost ~]# bash
这里开启会话同步
首先关闭防火墙、内核机制
[root@memcache1 ~]# systemctl stop firewalld
[root@memcache1 ~]# setenforce 0
安装 gcc* 环境
[root@memcache1 ~]# yum -y install gcc*
上传 libevent-2.1.8-stable.tar.gz 至服务器
解压
[root@memcache1 ~]# tar zxvf libevent-2.1.8-stable.tar.gz
进入
[root@memcache1 ~]# cd libevent-2.1.8-stable
配置文件路径
[root@memcache1 libevent-2.1.8-stable]# ./configure --prefix=/usr/local/libevent
make install 执行
[root@memcache1 libevent-2.1.8-stable]# make && make install
上传 memcached-1.2.8-repcached-2.2.tar.gz
解压
[root@memcache1 ~]# tar zxvf memcached-1.2.8-repcached-2.2.tar.gz
进入
[root@memcache1 ~]# cd memcached-1.2.8-repcached-2.2
配置文件路径
[root@Memcached1 memcached-1.2.8-repcached-2.2]# ./configure --prefix=/usr/local/memcached_replication --enable-replication --with-libevent=/usr/local/libevent
修改源代码配置文件
[root@memcache1 memcached-1.2.8-repcached-2.2]# vim memcached.c
//找到如下几行(在55行--60行):
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
#if defined(__FreeBSD__) || defined(__APPLE__)
# define IOV_MAX 1024
#endif
#endif//修改成如下所示:(删掉上面红色的两行)
/* FreeBSD 4.x doesn't have IOV_MAX exposed. */
#ifndef IOV_MAX
# define IOV_MAX 1024
#endif
make install 执行
[root@memcache1 memcached-1.2.8-repcached-2.2]# make && make install
函数路径链接
[root@memcache1 ~]# ln -s /usr/local/libevent/lib/libevent-2.1.so.6 /usr/lib64/
这里取消会话同步
启动服务
[root@Memcached1 ~]# /usr/local/memcached_replication/bin/memcached -d -u root -m 128 -x 192.168.10.101
两台服务器查看进程
[root@memcache1 ~]# netstat -antp |grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 52646memcached
tcp 0 0 192.168.10.101:11212 192.168.10.102:38298 ESTABLISHED 52646memcached
tcp6 0 0 :::11211 :::* LISTEN 52646memcached
[root@memcache2 ~]# netstat -antp |grep memcached
tcp 0 0 0.0.0.0:11211 0.0.0.0:* LISTEN 29976memcached
tcp 0 0 192.168.10.102:38298 192.168.10.101:11212 ESTABLISHED 29976memcached
tcp6 0 0 :::11211 :::* LISTEN 29976memcached
使用 telnet 进行简单验证复制功能
安装 telnet
[root@memcache1 ~]# yum -y install telnet
在 Memcached1 上插入一条具有特点的键值
[root@memcache1 ~]# telnet 192.168.10.102 11211
//自定义信息+永不过期+8个字节
set username 0 0 8
12345678
STORED
get username
VALUE username 0 8
12345678
END
quit
在 Memcached2 上进行查看刚刚插入的键值
安装 telnet
[root@memcache1 ~]# yum -y install telnet
[root@memcache2 ~]# telnet 192.168.10.102 11211
get username
VALUE username 0 8
12345678
END
gets username
//1代表更新因子
VALUE username 0 8 1
12345678
END
//自定义信息+永不过期+8个字节+更新因子(要与gets得到的一致)
cas username 0 0 8 1
zhangsan
STORED
这里同步会话
Memcached 主主复制+Keepalived 高可用架构
安装配置 keepalived(两台主机都安装)
[root@memcache1 ~]# yum -y install keepalived
修改主 keepalived 配置文件
[root@memcache1 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_01vrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}//定义要执行的脚本
vrrp_script check_down {
//脚本路径和名称
script "/etc/keepalived/memcached.sh"
//间隔1秒执行一次
interval 1
}vrrp_instance VI_1 {//master角色不能设置nopreempt,所以此处要设置为BACKUPstate BACKUPinterface ens33virtual_router_id 51//从主机的优先级要小于此数字priority 100
advert_int 1
//添加,此语句关闭了抢占功能,从主机不需要
nopreemptauthentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100
}//调用前面的脚本
track_script {check_down
}
}
vrrp_strict:严格遵守VRRP协议,禁止以下状况
-
无VIP地址
-
配置了单播邻居
-
在VRRP版本2中有IPv6地址,开启动此项会自动开启iptables防火墙规则,建议关闭此项配置
编写脚本文件
[root@memcached1 keepalived]# vim /etc/keepalived/memcached.sh
#!/bin/bash
if [ $(ps -C memcached --no-header | wc -l) -eq 0 ]; thensystemctl stop keepalived
fi
添加执行权限
[root@memcached1 keepalived]# chmod +x /etc/keepalived/memcached.sh
配置从 keepalived 文件
[root@memcache2 ~]# vim /etc/keepalived/keepalived.conf
! Configuration File for keepalivedglobal_defs {notification_email {acassen@firewall.locfailover@firewall.locsysadmin@firewall.loc}notification_email_from Alexandre.Cassen@firewall.locsmtp_server 192.168.200.1smtp_connect_timeout 30router_id LVS_02vrrp_skip_check_adv_addr#vrrp_strictvrrp_garp_interval 0vrrp_gna_interval 0
}//定义要执行的脚本
vrrp_script check_down {
//脚本路径和名称
script "/etc/keepalived/memcached.sh"
//间隔1秒执行一次
interval 1
}vrrp_instance VI_1 {state BACKUP interface ens33virtual_router_id 51//从主机的优先级要小于此数字priority 99
advert_int 1authentication {auth_type PASSauth_pass 1111}virtual_ipaddress {192.168.10.100
}//调用前面的脚本
track_script {check_down
}
}
编写脚本文件
[root@memcached2 keepalived]# vim /etc/keepalived/memcached.sh
#!/bin/bash
if [ $(ps -C memcached --no-header | wc -l) -eq 0 ]; thensystemctl stop keepalived
fi
添加执行权限
[root@memcached2 keepalived]# chmod +x /etc/keepalived/memcached.sh
vrrp_strict #严格遵守VRRP协vim议
这将禁止VIPs unicast peers (虚拟IP单播对等体),这样会使得这个VIP无法进行单播通信
两台服务器关闭 NetworkManager
[root@memcachel keepalived]# systemctl stop NetworkManager
测试验证
两台服务器上启动 keepalived
[root@Memcached1 ~]# systemctl start keepalived
[root@memcached2 ~]# systemctl start keepalived
主服务器查看 VIP
[root@memcachel keepalived]# ip a
2:ens33: <BROADCAST,MULTICAST,UP,LOWER UP> mtu 1500 gdisc pfifo fast stateoup default glen 1000inet 192.168.10.100/32 scope global ens33
在客户端修改缓存服务器地址
切换目录
[root@memcached-api ~]# cd /var/www/html
[root@memcached-api html]# vim /usr/local/httpd/htdocs/test2.php
<?php
$memcache = new Memcached();
$memcache->addServer('192.168.10.100', 11211);
$memcache->set('key', 'Memcache test01 successful!', 0, 60);
$result = $memcache->get('key');
unset($memcache);
echo $result;
?>
浏览器刷新测试
pkill memcached
检查当前主机的memceched进程和keepalived进程
关闭memcached后,该主机的keepalived也会被脚本关闭,于是VIP就漂移到了另一台主机,待此主机修好后,把memcached和keepalived开启,由于设置了不抢占,VIP不会抢占回来,但是把第二台主机的memcached关闭后,第二台主机的keepalived也会关闭,于是VIP就漂移回了第一台主机。完成故障的转移
小阿轩yx-高性能内存对象缓存
相关文章:
小阿轩yx-高性能内存对象缓存
小阿轩yx-高性能内存对象缓存 案例分析 案例概述 Memcached 是一款开源的高性能分布式内存对象缓存系统用于很多网站提高访问速度,尤其是需要频繁访问数据的大型网站是典型的 C/S 架构,需要构建 Memcached 服务器端与 Memcached API 客户端用 C 语言…...
华中师范大学学报人文社会科学版
一、《华中师范大学学报(人文社会科学版)》是国家教育部主管、华中师范大学主办的人文社会科学综合性学术期刊。本刊用稿以质量为标准,不分内稿外稿。文稿一经发表,即付报酬,不收版面费。 二、根据教育部和新闻出版总署颁发的社会科学学报编排规范,来稿应注意以下各项: 1. 题…...
CI/CD的node.js编译报错npm ERR! network request to https://registry.npmjs.org/
1、背景: 在维护paas云平台过程中,有研发反馈paas云平台上的CI/CD的前端流水线执行异常。 2、问题描述: 流水线执行的是前端编译,使用的是node.js环境。报错内容如下: 2024-07-18T01:23:04.203585287Z npm ERR! code E…...
用ssh tunnel的方式设置 AWS DocumentDB 公网访问
AWS DocumentDB的设定是只允许VPC内进行访问的,同时官方文档给了步骤,通过ssh tunnel的方式,可以从公网,或者从VPC外的网络,对DocumentDB进行访问。 我阅读了AWS官方文档并测试了这个步骤,如下是详细的步骤…...
基于电鸿(电力鸿蒙)的边缘计算网关,支持定制
1 产品信息 边缘计算网关基于平头哥 TH1520 芯片,支持 OpenHarmony 小型系统,是 连接物联网设备和云平台的重要枢纽,可应用于城市基础设施,智能工厂,智能建筑,营业网点,运营 服务中心相关场…...
WPF之URI的使用
pack://application:, pack://application:, 是一个在 WPF (Windows Presentation Foundation) 应用程序中用于指定资源位置的 URI (统一资源标识符) 方案的特定格式。这个格式用于访问嵌入在应用程序程序集(assemblies)中的资源,如图像、XA…...
Web开发:ASP.NET CORE前后端交互之AJAX(含基础Demo)
目录 一、后端 二、前端 三、代码位置 四、实现效果 五、关键的点 1.后端传输给前端: 2.前端传输给后端 一、后端 using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using Microsoft.AspNetCore.Mvc.Rendering; using WebAppl…...
经典神经网络(14)T5模型原理详解及其微调(文本摘要)
经典神经网络(14)T5模型原理详解及其微调(文本摘要) 2018 年,谷歌发布基于双向 Transformer 的大规模预训练语言模型 BERT,而后一系列基于 BERT 的研究工作如春笋般涌现,预训练模型也成为了业内解决 NLP 问题的标配。 2019年,谷歌…...
C语言结构体字节对齐技术详解
C语言结构体字节对齐技术详解(第一部分) 在C语言中,结构体字节对齐是一个重要的概念,它涉及到内存中数据的布局和访问效率。字节对齐可以帮助提高程序的性能,减少内存碎片,并确保数据的一致性和正确性。本…...
Linux编辑器——vim的使用
目录 vim的基本概念 命令模式 底行模式 插入模式 注释和取消注释 普通用户进行sudo提权 vim配置问题 vim的基本概念 一般使用的vim有三种模式: 命令模式 底行模式和插入模式,可以进行转换; vim filename 打开vim,进入的…...
Java案例斗地主游戏
目录 一案例要求: 二具体代码: 一案例要求: (由于暂时没有学到通信知识,所以只会发牌,不会设计打牌游戏) 二具体代码: Ⅰ:主函数 package three;public class test {…...
sqlite|轻量数据库|pgadmin4的sqlite数据库操作--重置密码和账号解锁
前言: pgadmin4的用户密码以及pgadmin4创建的pg数据库的连接信息等等都是存放在sqlite数据库内的;而有的时候,可能会由于自己的问题将pgadmin4的密码忘记,这个时候需要重置pgadmin4的密码,或者是pgadmin4的密码输错多…...
【ARMv8/v9 异常模型入门及渐进 9.1 - FIQ 和 IRQ 打开和关闭】
请阅读【ARMv8/v9 ARM64 System Exception】 文章目录 FIQ/IRQ Enable and Disable汇编指令详解功能解释使用场景和注意事项 FIQ/IRQ Enable and Disable 在ARMv8/v9架构中,可以使用下面汇编指令来打开FIQ和 IRQ,代码如下: asm volatile ("msr da…...
深入探索Flutter中的状态管理:使用Provider库
当涉及Flutter状态管理时,provider是一个强大且灵活的解决方案,它提供了一种简单且高效的方式来管理应用程序状态。本文将详细介绍Flutter中provider插件的使用方法、示例代码、各种使用场景以及注意事项。 1. 引入依赖 首先,需要在项目的pubspec.yaml文件中添加provider依…...
算法工程师第十四天(找树左下角的值 路径总和 从中序与后序遍历序列构造二叉树 )
参考文献 代码随想录 一、找树左下角的值 给定一个二叉树的 根节点 root,请找出该二叉树的 最底层 最左边 节点的值。 假设二叉树中至少有一个节点。 示例 1: 输入: root [2,1,3] 输出: 1示例 2: 输入: [1,2,3,4,null,5,6,null,null,7] 输出: 7 层次遍历&#…...
memcached 高性能内存对象缓存
memcached 高性能内存对象缓存 memcache是一款开源的高性能分布式内存对象缓存系统,常用于做大型动态web服务器的中间件缓存。 mamcached做web服务的中间缓存示意图 当web服务器接收到请求需要处理动态页面元素时,通常要去数据库调用数据,但…...
C语言 分割链表
题目来源: 代码部分,参考官方题解的写法: // 思路: 就是把原始链表,拆分为2部分,最后再拼接一下。struct ListNode* partition(struct ListNode* head, int x) {struct ListNode* small malloc(sizeof(struct ListNode));struct ListNode*…...
spring ioc的原理
1、控制反转(IOC):对象的创建控制权由程序自身转移到外部(容器) 2、依赖注入(DI):所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。 Spring 中的 IoC 的实现原理就是工厂模式加反射机制。 参考资料…...
npm安装依赖包报错,npm ERR! code ENOTFOUND
一、报错现象: npm WARN registry Unexpected warning for https://registry.npmjs.org/: Miscellaneous Warning ETIMEDOUT: request to https://registry.npmjs.org/vue failed, reason: connect ETIMEDOUT 104.16.23.35:443 npm WARN registry Using stale data…...
【iOS】——内存对齐
内存对齐是什么 内存对齐指的是数据在内存中的布局方式,它确保每个数据类型的起始地址能够满足该类型对齐的要求。这是因为现代处理器在访问内存时,如果数据的起始地址能够对齐到一定的边界,那么访问速度会更快。这种对齐通常是基于数据类型…...
网络安全-网络安全及其防护措施10
46.软件定义网络(SDN) 软件定义网络(SDN)的概念和特点 软件定义网络(SDN)是一种新兴的网络架构,通过将网络的控制平面(Control Plane)和数据转发平面(Data …...
Pytorch基础应用
1.数据加载 1.1 读取文本文件 方法一:使用 open() 函数和 read() 方法 # 打开文件并读取全部内容 file_path example.txt # 替换为你的文件路径 with open(file_path, r) as file:content file.read()print(content)方法二:逐行读取文件内容 # 逐…...
Axure 教程 | 设置文本框背景透明
在AXURE软件中,部件样式可以编辑,但有时却无法满足所有个性化原型的需求。例如文本框部件,可以设置是否隐藏边框,但即使隐藏边框之后,文本框还会有白色的背景。 当界面需要一个无背景色的输入框时,对于完…...
【BUG】已解决:NOAUTH Authentication required
已解决:NOAUTH Authentication required 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,武汉城市开发者社区主理人…...
全国产服务器主板:搭载飞腾FT2000+/64处理器的高性能加固服务器
近期很多朋友咨询全国产化的服务器主板。搭载的是飞腾FT-2000/64的全国产化服务器主板。他的主要特点是:①丰富的PCIe、千兆以太网、SATA接口,可用作数据处理、存储、通信服务器;②板载独立显示芯片,对外HDMI/VGA/L…...
OPC UA边缘计算耦合器BL205工业通信的最佳解决方案
OPC UA耦合器BL205是钡铼技术基于下一代工业互联网技术推出的分布式、可插拔、结构紧凑、可编程的IO系统,可直接接入SCADA、MES、MOM、ERP等IT系统,无缝链接OT与IT层,是工业互联网、工业4.0、智能制造、数字化转型解决方案中IO系统最佳方案。…...
【已解决】Django连接MySQL启动报错Did you install mysqlclient?
在终端执行python manage.py makemigrations报错问题汇总 错误1:已安装mysqlclient,提示Did you install mysqlclient? 当你看到这样的错误信息,表明Django尝试加载MySQLdb模块但未找到,因为MySQLdb已被mysqlclient替代。 【解…...
ubuntu gcc g++版本切换
要将 GCC 和 G 的版本从 12.4 降低到 9,你可以按照以下步骤操作: 安装 GCC 和 G 9: sudo apt update sudo apt install gcc-9 g-9 使用 update-alternatives 设置优先级: sudo update-alternatives --install /usr/bin/gcc gcc…...
如何发一篇顶会论文? 涉及3D高斯,slam,自动驾驶,三维点云等等
SLAM&3DGS 1)SLAM/3DGS/三维点云/医疗图像/扩散模型/结构光/Transformer/CNN/Mamba/位姿估计 顶会论文指导 2)基于环境信息的定位,重建与场景理解 3)轻量级高保真Gaussian Splatting 4)基于大模型与GS的 6D pose e…...
Java面试八股之什么是Redis的缓存更新
什么是Redis的缓存更新 Redis的缓存更新是指当缓存中的数据发生变化时,需要将这些变化同步到缓存中以保持数据的一致性。缓存更新的目的是确保缓存中的数据始终是最新的,以便用户可以获取到最新的数据。 常见的缓存更新策略包括: 直接覆盖…...
网站备案安全承诺书/爱站网关键词长尾挖掘工具
设向量a和向量b 则a•b|a||b|cos,|a|和|b|分别为两向量的模 cos即为两向量的余弦值,所以cosa•b/|a||b| 距离和相似性度量: http://blog.sina.com.cn/s/blog_6045a9da01011nk7.html 转载于:https://www.cnblogs.com/lsai/p/3715948.html...
网站建设栏目设计/品牌运营策略
PHP 向它运行的任何脚本提供了大量的预定义常量。不过很多常量都是由不同的扩展库定义的,只有在加载了这些扩展库时才会出现,或者动态加载后,或者在编译时已经包括进去了。 对于一些基本的常量是这些常量在 PHP 的内核中定义。它包含 PHP、Ze…...
自适应企业网站用什么框架做/游戏推广渠道
1.注意多用函数,尤其是最小最大化等多种联合,可以定义一个函数最大化,然后嵌套到另外一个函数里面。 2.初始化为临时最大值可以设为float(‘inf’)。 3.产生随机数可以import random: randint(a,b)函数可以产生a-b之间的整数,上下…...
如何做行业平台网站/关键词优化百家号
勉强实现了把 function MyPromise(callback){this.status"pending", // 标记状态this.valueundefined; // resolve函数接受的参数this.reasonundefined; // reject 函数this.onFulfilledCallbacksnew Set(); // 成功回调 函数集合this.onRejectedCallbacksnew …...
服务行业做网站/每日舆情信息报送
做互联网的人都习惯把一切搬到互联网上进行:网站浏览、邮件、IM、网上办公、文件共享……甚至现在连订餐都流行网上去做。不知道将来上厕所能不能在网上订马桶?互联网本来是人类活动的延伸,是人类活动的另一种形式。但我们进入互联网之后好像…...
做网站建设网站制作/百度竞价排名正确解释
CGI编程1)在WEB服务器上添加WML的MIME类型对于IIS4,可在其管理器里的站点属性中加入新的MIME类型,后缀.wml和 MIME类型text/vnd.wap.wml。对于PWS,可修改注册表,先在 HKEY_CLASSES_ROOT层加入主键.wml,再加入串值Conte…...