Nginx缓存及HTTPS配置小记

news2024/11/16 10:39:52

缓存基础

缓存分类

某些场景下,Nginx需要通过worker到上有服务中获取数据并将结果响应给客户端,在高并发场景下,我们完全可以将这些数据视为热点数据,并将其缓存到Nginx服务上。

在这里插入图片描述

  1. 客户端缓存:将缓存数据放到客户端。
    优点:数据直接本地获取,响应快,无网络开销
    缺点:仅对单一用户生效

  2. 服务端缓存:将数据缓存到服务端
    优点:有效降低上有服务器压力,且对所有用户生效。
    缺点: 仍然存在网络开销。

所以综合考虑上述的优缺点,我们建议合理利用缓存,必要时同时开启客户端和服务端的缓存。

缓存相关指令及参数含义

proxy_cache

语法: proxy_cache zone |off;
默认值:proxy_cache off;
上下文: http、server、location
作用:在Nginx中实现反向代理响应的缓存功能

proxy_cache_path

语法:proxy_cache_path path [levels=levels] keys_zone=name:size [inactive=time1] [max_size=size2] [loader_files=number] [loader_sleep=time2] [loader_threshold=time3];
默认值:proxy_cache_path:off;
上下文:http
参数含义:

  1. path:缓存文件存放路径
  2. level: path的目录层级,例如2:2 ,那么目录就会类似:
/path/to/cache/00
/path/to/cache/01
/path/to/cache/10
/path/to/cache/11
  1. use_temp_path:若开启则使用proxy_temp_path的路径
  2. key_zone:name是共享名称,size是共享内存的大小
  3. inactive:共享内存的值在规定时间内没有被访问就会被清理,默认配置为10min
  4. max_size: 设定最大的缓存文件大小,超过将有CM(cache manager)清理
  5. manager_files:CM一次清理的最大缓存文件数,默认为100
  6. manager_sleep:CM清理一次后进程的休眠时间,默认200毫秒
  7. manager_threshold:CM一次最长耗时,默认50ms
  8. loader_files:CL载入文件到共享内存每批最多的文件数,默认为100
  9. loader_sleep:CL加载文件到内存后,进程进入休眠时间,默认200毫秒
  10. loader_threshold:CL每次载入文件到共享内存的最大耗时,默认50毫秒

proxy_cache_key

语法:proxy_cache_key stirng;
默认值: proxy_cache_key $scheme%proxy_host$request_uir
上下文:http、server、location
作用:指定生成缓存键的方式

proxy_cache_valid

语法:proxy_cache_valid [code] time
默认值:无
上下文:http、server、location
配置示例: proxy_cache_valid 60m;
作用:设置缓存的有效时间

upstream_cache_status

作用:用于获取反向代理请求是否命中缓存。

状态值:

  1. MISS:未命中缓存
  2. HIT:命中缓存
  3. EXPIRED:缓存过期
  4. STALE:命中了陈旧的缓存
  5. REVALIDDATED:nginx验证陈旧缓存依然有效
  6. UPDATING:内容陈旧,但正在更新
  7. BYPASS:响应从原始服务器获取

我们只需按照下面所示的配置即可打印对应的状态值:

location / {
    proxy_cache my_cache;
    proxy_pass http://backend;
    proxy_set_header X-Cache-Status $upstream_cache_status;
    ...
}

配置示例

基础示例

如下图,我们会访问服务器1,服务器1的nginx配置了负载均衡,会视情况访问上游nginx服务器的1010或1011端口

在这里插入图片描述

我们先给出不走缓存的基础配置,配置内容比较简单,即轮询不同的上游服务器。

http {
    include       mime.types;
    default_type  application/octet-stream;


# 轮询上游服务器两个端口
   upstream cache_server {
        server 192.168.12.128:1010;
        server 192.168.12.128:1011;
   }
    sendfile        on;

    keepalive_timeout  65;


    server {
        listen       80;
        server_name  localhost;



        location / {

        proxy_pass http://cache_server;

       }
}

测试结果,可以看到请求结果每次都会交替指向不同端口的网页内容(1010,1011分别对应上述两个上有服务器两个端口的网页)

[root@localhost ~]# curl 192.168.12.127:80
1010
[root@localhost ~]# curl 192.168.12.127:80
1011
[root@localhost ~]# curl 192.168.12.127:80
1010
[root@localhost ~]# curl 192.168.12.127:80
1011
[root@localhost ~]# curl 192.168.12.127:80
1010
[root@localhost ~]# curl 192.168.12.127:80
1011

因为这些文件资源,比较固定,所以我们希望nginx能够将这些网页缓存起来,于是我们给出走缓存的配置。
需要注意的是,配置完缓存相关的配置之后,笔者为了能够更直观的看到缓存命中结果,在http的头部添加了Nginx-Cache-Status的值。

http {
    include       mime.types;
    default_type  application/octet-stream;
# 缓存配置,指定缓存路径、每个目录有2个层级,每个层级有两个目录、定义缓存键的共享内存区域名为cache_zone 为30m,最大值为32m,60min后缓存未被使用则会被删除,并关闭临时文件存储
   proxy_cache_path /usr/local/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=32m inactive=60m use_temp_path=off;

   upstream cache_server {
        server 192.168.12.128:1010;
        server 192.168.12.128:1011;
   }
    sendfile        on;

    keepalive_timeout  65;


    server {
        listen       80;
        server_name  localhost;



        location / {
          # 引用上文的缓存配置
           proxy_cache cache_zone;
        # 仅对响应200的有效,保存5min
          proxy_cache_valid 200 5m;
# http请求头记录缓存状态
        add_header Nginx-Cache-Status "$upstream_cache_status";
        proxy_pass http://cache_server;

       }
}

完成后我们重载一下配置,然后尝试发起请求。可以看到我们往请求头中放的Nginx-Cache-StatusMISS变为HIT

我们键入curl命令发起第一个请求,发送一个HEAD请求,并输出服务器返回的HTTP响应头信息,而不包括响应体

curl 192.168.12.127:80 -I

从结果来看,第一次的并没有命中缓存,所以Nginx-Cache-Status返回MISS。


HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Tue, 19 Jul 2022 15:52:18 GMT
Content-Type: text/html
Content-Length: 5
Connection: keep-alive
Last-Modified: Tue, 19 Jul 2022 15:23:53 GMT
ETag: "62d6cc89-5"
Nginx-Cache-Status: MISS
Accept-Ranges: bytes


再一次curl后就会发现结果变为HIT,由此可知上一次将请求结果缓存,所以本次请求命中了缓存。


HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Tue, 19 Jul 2022 15:52:19 GMT
Content-Type: text/html
Content-Length: 5
Connection: keep-alive
Last-Modified: Tue, 19 Jul 2022 15:23:53 GMT
ETag: "62d6cc89-5"
Nginx-Cache-Status: HIT
Accept-Ranges: bytes

同样的,我们也可以通过查看缓存文件夹看到我们缓存的文件

cat /usr/local/nginx/cache_temp/76/d1/608ccf55afd7b17fc84b73d835ecd176

可以看到缓存内容如下,这就是对应的html网页的参数和内容。


^▒▒b▒▒▒b2▒▒b▒b▒▒▒▒
"62d6cc89-5"
KEY: http://cache_server/
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Tue, 19 Jul 2022 15:52:18 GMT
Content-Type: text/html
Content-Length: 5
Last-Modified: Tue, 19 Jul 2022 15:23:53 GMT
Connection: close
ETag: "62d6cc89-5"
Accept-Ranges: bytes

1010

配置nginx不缓存特定内容

有时候我们希望缓存可以移除一些没必要的内容,我们就可以基于这些参数做到不缓存某些内容。

proxy_no_cache

语法:proxy_no_cache string;
默认值:无
上下文:http、server、location
作用:用于判断是否禁用缓存的条件表达式

proxy_cahce_bypass

语法:proxy_cache_bypass string;
默认值:无
上下文:http、server、location
作用:在特定条件下绕过缓存并直接向上游服务器发送请求

配置示例

我们希望txt、text文件不被缓存。对应nginx配置如下,我们只需判断用户请求文件是否是txt、text,如果是则添加一个标志变量 $cookie_name"no cahe",然后proxy_no_cache 看到当前请求存在这个$cookie_name变量,就不缓存,配置文件示例如下:

http {
    include       mime.types;
    default_type  application/octet-stream;

   proxy_cache_path /usr/local/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=32m inactive=60m use_temp_path=off;


   upstream cache_server {
        server 192.168.12.128:1010;
        server 192.168.12.128:1011;
   }
    sendfile        on;

    keepalive_timeout  65;


    server {
        listen       80;
        server_name  localhost;

       # 如果是txt text文件就加个cookir的变量
        if ($request_uri ~ \.(txt|text)$ ) {
         set $cookie_name "no cahe";
        }

        location / {
        # 引用上文的缓存配置
           proxy_cache cache_zone;
        # 如果有cookie_name这个变量就不换缓存
        proxy_no_cache $cookie_name;
        # 仅对响应200的有效
          proxy_cache_valid 200 5m;
# http请求头记录缓存状态
        add_header Nginx-Cache-Status "$upstream_cache_status";
        proxy_pass http://cache_server;

       }

}

测试结果如下可以看到3次curl的及如果都是MISS索命txt文件的请求都不走缓存。

第一次curl请求,返回miss。

[root@localhost ~]# curl 192.168.12.127:80/index.txt -I
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Tue, 19 Jul 2022 16:26:03 GMT
Content-Type: text/plain
Content-Length: 5
Connection: keep-alive
Last-Modified: Tue, 19 Jul 2022 16:25:30 GMT
ETag: "62d6dafa-5"
Nginx-Cache-Status: MISS
Accept-Ranges: bytes

第二次请求,还是返回miss。


[root@localhost ~]# curl 192.168.12.127:80/index.txt -I
HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Tue, 19 Jul 2022 16:26:04 GMT
Content-Type: text/plain
Content-Length: 5
Connection: keep-alive
Last-Modified: Tue, 19 Jul 2022 16:25:17 GMT
ETag: "62d6daed-5"
Nginx-Cache-Status: MISS
Accept-Ranges: bytes

缓存失效降低上游压力机制

合并源请求

如下图,三个相同的请求到达nginx,合并源请求做的就是让红色的请求去应用服务器获取结果,其他两个请求排队等待,当红色请求得到结果并缓存到nginx时,他们就不需要去应用服务器拿结果了,直接从缓存中拿到请求结果并返回即可。

在这里插入图片描述

相关配置

proxy_cache_lock

当多个客户端请求一个缓存中不存在的文件(或称之为一个MISS),只有这些请求中的第一个被允许发送至服务器。其他请求在第一个请求得到满意结果之后在缓存中得到文件。如果不启用proxy_cache_lock,则所有在缓存中找不到文件的请求都会直接与服务器通信。

	语法:proxy_cache_lock on|off;
	默认值:无
	上下文:http、server、location
proxy_cache_lock_age
	语法:proxy_cache_lock_age time;
	默认值:proxy_cache_lock_age  5s;
	上下文:http、server、location
	作用:直缓存锁的有效期
proxy_cache_lock_timeout
	语法:proxy_cache_lock_timeout time;
	默认值:proxy_cache_lock_timeout 5s;
	上下文:http、server、location
	作用:指定等待获取缓存锁的超时时间

配置示例

具体配置笔者已详尽注释到下文中,读者可自行参阅。

http {
    include       mime.types;
    default_type  application/octet-stream;

   proxy_cache_path /usr/local/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=32m inactive=60m use_temp_path=off;


   upstream cache_server {
        server 192.168.12.128:1010;
        server 192.168.12.128:1011;
   }
    sendfile        on;

    keepalive_timeout  65;


    server {
        listen       80;
        server_name  localhost;

       # 如果是txt text文件就加个cookir的变量
        if ($request_uri ~ \.(txt|text)$ ) {
         set $cookie_name "no cahe";
        }

        location / {
        # 引用上文的缓存配置
           proxy_cache cache_zone;
        # 如果有cookie_name这个变量就不换缓存
        proxy_no_cache $cookie_name;
        # 仅对响应200的有效
          proxy_cache_valid 200 5m;
		# http请求头记录缓存状态
        add_header Nginx-Cache-Status "$upstream_cache_status";
	# 开启lock
	proxy_cache_lock on;
	# 等待锁超时时间为5s
	proxy_cache_lock_timeout 5s;
	# 锁有效期为5s
	proxy_cache_lock_age 5s;
     proxy_pass http://cache_server;

       }

}

启用陈旧请求

原理

如下图,当大量请求到达服务器亦或者上游服务器宕机等问题出现时,nginx支持将陈旧缓存先返回给前端,这种方案使用于对数据一致性要求不高的业务场景。

在这里插入图片描述

关键配置

  1. proxy_cache_use_stale:当用户无法从原始请求中获取响应或者上游服务器宕机时使用,将陈旧的缓存内容返回给前端
proxy_cache_use_stale error | timeout | invalid_header |
updating | http_500 | http_502 | http_503 | http_504 |
http_403 | http_404 | http_429 | off ...;
默认值: proxy_cache_use_stale off;
上下文: http, server, location

可选参数内容含义
						1. error:与上游建立连接、发送请求、读取响应头出错
						2. timeout:与商友建立连接、发送请求、读取响应头超时
						3. invalid_header:无效头部
						4. updating:缓存过期,正在更新时
						5. http_500:返回状态码500
						6. http_502:返回状态码500
						7. http_503:返回状态码500
						8. http_504:返回状态码500
						.......
					
  1. proxy_cache_backgroud_update:新的缓存更新操作在后台运行
语法:proxy_cache_backgroud_update on | off;
默认值:proxy_cache_backgroud_update off;
上下文: http、server、location

配置示例

配置实例如下所示,读者可参考注释阅读。

server {
        listen       80;
        server_name  localhost;

        #charset koi8-r;

        #access_log  logs/host.access.log  main;

        location / {
            root   html;
            index  index.html index.htm;
           # 缓存更新在后台完成
            proxy_cache_background_update on;
                # http响应超时 错误 缓存更新时返回陈旧缓存
            proxy_cache_use_stale error  timeout updating;
        }


    }

第三方清除缓存模块

我们在上面往缓存中添加了一堆缓存,有时我们希望能够将其删除,我们就可以使用第三方模块进行缓存删除

首先我们需要下载第三方缓存清除模块

wget http://labs.frickle.com/files/ngx_cache_purge-2.3.tar.gz

进入nginx安装文件目录重新编译文件,然后再make、make install

./configure --add-module=ngx_cache_purge-2.3 ;make;make install

修改配置文件,如下所示,我们使用clear/需要被清除的文件的资源名配置如下,例如我们的请求将index.html缓存(proxy_cache_key的配置会将这个缓存结果以host+uri作为key将资源缓存起来),那么我们就可以使用/clear/inedx.html将其清除。
注意配置完成后需要将缓存目录清楚,再reload一下。

http {
    include       mime.types;
    default_type  application/octet-stream;

   proxy_cache_path /usr/local/nginx/cache_temp levels=2:2 keys_zone=cache_zone:30m max_size=32m inactive=60m use_temp_path=off;


   upstream cache_server {
        server 192.168.12.128:1010;
        server 192.168.12.128:1011;
   }
    sendfile        on;

    keepalive_timeout  65;


    server {
        listen       80;
        server_name  localhost;

       # 如果是txt text文件就加个cookir的变量
        if ($request_uri ~ \.(txt|text)$ ) {
         set $cookie_name "no cahe";
        }

        location ~/clear(/.*){
                # 清楚host+映射变量的缓存
                proxy_cache_purge cache_zone $host$1;
        }


        location / {
        # 引用上文的缓存配置
           proxy_cache cache_zone;
        # 缓存值的key
        proxy_cache_key $host$uri;
        # 如果有cookie_name这个变量就不换缓存
        proxy_no_cache $cookie_name;
        # 仅对响应200的有效
          proxy_cache_valid 200 5m;
        # http请求头记录缓存状态
        add_header Nginx-Cache-Status "$upstream_cache_status";
        # 开启lock
        proxy_cache_lock on;
        # 设置持有锁的超时时间
        proxy_cache_lock_timeout 5s;
        # 超时后多久再尝试
        proxy_cache_lock_age 5s;
        proxy_pass http://cache_server;

       }




        error_page   500 502 503 504  /50x.html;
        location = /50x.html {
            root   html;
        }


    }
  

}

完成配置之后,我们不妨重载一下配置进行测试,键入如下命令进行第一次请求:

curl 127.0.0.1:80/index.html -I

可以看到第一次结果为MISS


HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Wed, 20 Jul 2022 13:36:52 GMT
Content-Type: text/html
Content-Length: 5
Connection: keep-alive
Last-Modified: Tue, 19 Jul 2022 15:24:44 GMT
ETag: "62d6ccbc-5"
Nginx-Cache-Status: MISS
Accept-Ranges: bytes

再次请求,HIT命中缓存

HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Wed, 20 Jul 2022 13:36:54 GMT
Content-Type: text/html
Content-Length: 5
Connection: keep-alive
Last-Modified: Tue, 19 Jul 2022 15:24:44 GMT
ETag: "62d6ccbc-5"
Nginx-Cache-Status: HIT
Accept-Ranges: bytes

然后我们使用缓存清除地址将其清除

curl 127.0.0.1:80/clear/index.html -I

HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Wed, 20 Jul 2022 13:36:57 GMT
Content-Type: text/html
Content-Length: 287
Connection: keep-alive

再次发起请求发现,又变成MISS状态了。


HTTP/1.1 200 OK
Server: nginx/1.10.2
Date: Wed, 20 Jul 2022 13:37:02 GMT
Content-Type: text/html
Content-Length: 5
Connection: keep-alive
Last-Modified: Tue, 19 Jul 2022 15:23:53 GMT
ETag: "62d6cc89-5"
Nginx-Cache-Status: MISS
Accept-Ranges: bytes

基于nginx配置https请求

简介

关于https可以看到笔者这篇文章,做了非常详细的介绍,总的来说https就是客户端和服务端通过非对称密钥协商出一个对称密钥来保证数据安全,进而保证后续数据交互安全又高效。

http知识总结

csr/crt/key/pem的区别

  1. csr全称是certificate signing request,是向CA去申请证书的请求文件的后缀,其中包含了服务器的公钥和一些基本信息。
  2. crt是certificate的简写,就是最后拿到的证书文件的后缀。
  3. key是密钥的后缀,不同工具有不同编码方式,pem后缀的文件也有可能是证书或者密钥。

配置示例

由于我们没有ca,所以我们这里就自己在自己的服务器生成的key文件,模拟ca的私钥。

openssl genrsa -out ca.key 1024

然后在生成一个向ca申请证书的文件csr

openssl req -new -key ca.key -out ca.csr

使用key文件配置csr文件生成一个crt文件(模拟ca为服务器签发证书)

openssl x509 -req -days 365 -in ca.csr -signkey ca.key -out ca.crt

nginx配置,注意刚刚的crt文件和key文件都需要放到nginx的conf文件夹

 server {
        listen       443 ssl;
        server_name  localhost;

        ssl_certificate      ca.crt;
        ssl_certificate_key  ca.key;

        ssl_session_cache    shared:SSL:1m;
        ssl_session_timeout  5m;

        ssl_ciphers  HIGH:!aNULL:!MD5;
        ssl_prefer_server_ciphers  on;

        location / {
            root   html;
            index  index.html index.htm;
        }
    }

测试

完成配置后,重载一下配置进入测试,可以发现HTTPS虽然不受信任,但是可以使用了。

在这里插入图片描述

参考文献

【Django 030】部署到Nginx之配置https:https://blog.csdn.net/Victor2code/article/details/106485814)

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

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

相关文章

Linux和Windows环境下如何使用gitee?

1. Linux 1.1 创建远程仓库 1.2 安装git sudo yum install -y git 1.3 克隆远程仓库到本地 git clone 地址 1.4 将文件添加到git的暂存区(git三板斧之add) git add 文件名 # 将指定文件添加到git的暂存区 git add . # 添加新文件和修改过的…

DTCC2023大会-DBdoctor-基于eBPF观测数据库-附所有PPT下载链接

DTCC2023大会-DBdoctor-基于eBPF观测数据库-附所有PPT下载链接 8月16日—18日,第14届中国数据库技术大会(DTCC-2023)在北京国际会议中心举行。聚好看在大会上首次发布基于eBPF观测数据库性能的产品DBdoctor,受到了业界广泛的关注。近期几位业内同仁过来要大会的PPT…

NLP项目实战01--电影评论分类

介绍: 欢迎来到本篇文章!在这里,我们将探讨一个常见而重要的自然语言处理任务——文本分类。具体而言,我们将关注情感分析任务,即通过分析电影评论的情感来判断评论是正面的、负面的。 展示: 训练展示如下…

消息队列使用指南

介绍 消息队列是一种常用的应用程序间通信方法,可以用来在不同应用程序或组件之间传递数据或消息。消息队列就像一个缓冲区,接收来自发送方的消息,并存储在队列中,等待接收方从队列中取出并处理。 在分布式系统中,消…

Git的安装以及SSH配置

前言 近期工作需要,所以版本管理工具要用到Git,某些操作需要ssh进行操作,在某次操作中遇到:git bash报错:Permission denied, please try again。经排查是ssh没有配置我的key,所以就借着这篇文章整理了一下…

【小白专用】使用PHP创建和操作MySQL数据库,数据表

php数据库操作 php连接mysql数据库 <?php $hostlocalhost; // 数据库主机名 $username"root"; // 数据库用户名 $password"al6"; // 数据库密码 $dbname"mysql"; // 数据库名 $connIDmysqli_connect($host,$username,$password,$dbn…

Electron[4] Electron最简单的打包实践

1 背景 前面三篇已经完成通过Electron搭建的最简单的HelloWorld应用了&#xff0c;虽然这个应用还没添加任何实质的功能&#xff0c;但是用来作为打包的案例&#xff0c;足矣。下面再分享下通过Electron-forge来将应用打包成安装包。 2 依赖 在Electron[2] Electron使用准备…

AXURE地图获取方法

AXURE地图截取地址 https://axhub.im/maps/ 1、点击上方地图或筛选所需地区的地图&#xff0c;点击复制到 Axure 按钮&#xff0c;到 Axure 粘贴就可以了 2、复制到 Axure 后&#xff0c;转化为 svg 图形&#xff0c;就可以随意更改尺寸/颜色/边框&#xff0c;具体操作如下&am…

RocketMQ-源码架构二

梳理一些比较完整&#xff0c;比较复杂的业务线 消息持久化设计 RocketMQ的持久化文件结构 消息持久化也就是将内存中的消息写入到本地磁盘的过程。而磁盘IO操作通常是一个很耗性能&#xff0c;很慢的操作&#xff0c;所以&#xff0c;对消息持久化机制的设计&#xff0c;是…

使用Java8的Stream流的Collectors.toMap来生成Map结构

问题描述 在日常开发中总会有这样的代码&#xff0c;将一个List转为Map集合&#xff0c;使用其中的某个属性为key&#xff0c;某个属性为value。 常规实现 public class CollectorsToMapDemo {DataNoArgsConstructorAllArgsConstructorpublic static class Student {private…

基于YOLOv8深度学习的舰船目标分类检测系统【python源码+Pyqt5界面+数据集+训练代码】目标检测、深度学习实战

《博主简介》 小伙伴们好&#xff0c;我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源&#xff0c;可关注公-仲-hao:【阿旭算法与机器学习】&#xff0c;共同学习交流~ &#x1f44d;感谢小伙伴们点赞、关注&#xff01; 《------往期经典推…

【pycharm】Pycharm中进行Git版本控制

本篇文章主要记录一下自己在pycharm上使用git的操作&#xff0c;一个新项目如何使用git进行版本控制。 文章使用的pycharm版本PyCharm Community Edition 2017.2.4&#xff0c;远程仓库为https://gitee.com/ 1.配置Git&#xff08;File>Settings&#xff09; 2.去Gitee创建…

【C语言】位运算实现二进制数据处理及BCD码转换

文章目录 1&#xff0e;编程实验&#xff1a;按short和unsigned short类型分别对-12345进行左移2位和右移2位操作&#xff0c;并输出结果。2&#xff0e;编程实验&#xff1a;利用位运算实现BCD码与十进制数之间的转换&#xff0c;假设数据类型为unsigned char。3&#xff0e;编…

边缘计算系统设计与实践:引领科技创新的新浪潮

文章目录 一、边缘计算的概念二、边缘计算的设计原则三、边缘计算的关键技术四、边缘计算的实践应用《边缘计算系统设计与实践》特色内容简介作者简介目录前言/序言本书读者对象获取方式 随着物联网、大数据和人工智能等技术的快速发展&#xff0c;传统的中心化计算模式已经无法…

用php和mysql制作一个网站

当使用PHP和MySQL制作网站时&#xff0c;我们可以利用PHP的强大功能来与MySQL数据库进行交互&#xff0c;从而实现动态网页的创建和数据存取。下面是一个关于如何使用PHP和MySQL制作网站的简单说明&#xff0c;以及一些示例代码。 ​ 1、R5Ai智能助手 chatgpt国内版本 :R5Ai智…

P7 Linux C三种终止进程的方法

前言 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博客》✨✨✨ &#x1f525; 推荐专栏2: 《Linux C应用编程&#xff08;概念类&#xff09;_ChenPi的博客-CSDN博客》✨✨✨ &#x1f6f8;推荐专栏3: ​​​​​​《 链表_Chen…

C语言——字符函数和字符串函数(一)

&#x1f4dd;前言&#xff1a; 这篇文章对我最近学习的有关字符串的函数做一个总结和整理&#xff0c;主要讲解字符函数和字符串函数&#xff08;strlen&#xff0c;strcpy和strncpy&#xff0c;strcat和strncat&#xff09;的使用方法&#xff0c;使用场景和一些注意事项&…

机器人、智能小车常用的TT电机/310电机/370电机选型对比

在制作智能小车或小型玩具时&#xff0c;在电机选型上一些到各种模糊混淆的概念&#xff0c;以及各种错综复杂的电机参数&#xff0c;本文综合对比几种常用电机的参数及特性适应范围&#xff0c;以便快速选型&#xff0c;注意不同生产厂家的电机参数规则会有较大差异。 普通TT…

2023.12.09小爆发(31.56元) 穿山甲SDK接入收益·android广告接入·app变现·广告千展收益·eCPM收益

接入穿山甲SDK的app 数独训练APP 广告接入示例: Android 个人开发者如何接入广告SDK&#xff0c;实现app流量变现 接入穿山甲SDK app示例&#xff1a; android 数独小游戏 经典数独休闲益智 2023.12.09 广告收入有31.56R,小爆发了一下 1.用户统计上图&#xff1a; 昨天新增…

揭秘字符串的奥秘:探索String类的深层含义与源码解读

文章目录 一、导论1.1 引言&#xff1a;字符串在编程中的重要性1.2 目的&#xff1a;深入了解String类的内部机制 二、String类的设计哲学2.1 设计原则&#xff1a;为什么String类如此重要&#xff1f;2.2 字符串池的概念与作用 三、String类源码解析3.1 成员变量3.2 构造函数3…