首页
关于
Search
1
给你10个市场数据调研报告的免费下载网站!以后竞品数据就从这里找!
183 阅读
2
php接口优化 使用curl_multi_init批量请求
144 阅读
3
《从菜鸟到大师之路 ElasticSearch 篇》
107 阅读
4
2024年备考系统架构设计师
104 阅读
5
PHP 文件I/O
92 阅读
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
登录
Search
标签搜索
php函数
php语法
性能优化
安全
错误和异常处理
问题
vue
Composer
Session
缓存
框架
Swoole
api
并发
异步
正则表达式
php-fpm
mysql 索引
开发规范
协程
dafenqi
累计撰写
786
篇文章
累计收到
31
条评论
首页
栏目
php
thinkphp
laravel
工具
开源
mysql
数据结构
总结
思维逻辑
令人感动的创富故事
读书笔记
前端
vue
js
css
书籍
开源之旅
架构
消息队列
docker
教程
代码片段
副业
redis
服务器
nginx
linux
科普
java
c
ElasticSearch
测试
php进阶
php基础
页面
关于
搜索到
560
篇与
的结果
2023-08-08
PHP实现队列及队列原理
队列是一种线性表,按照先进先出的原则进行的:PHP实现队列:第一个元素作为队头,最后一个元素作为队尾<?php /** * 队列就是这么简单 * * @link */ $array = array('PHP', 'JAVA'); array_push($array, 'PYTHON'); //入队列 array_shift($array); //出队列什么是双端队列(或双向队列)Deque,全名double-ended queue?即元素可以在队列的任意一段入队或出队,如果我们把这些方法叫做insertLeft()和insertRight(),以及removeLeft()和removeRight()。如果严格禁止调用insertLeft()和removeLeft()方法(或禁用右段的操作),双端队列功能就和栈一样。禁止调用insertLeft()和removeRight()(或相反的另一对方法),它的功能就和队列一样了。双端队列与栈或队列相比,是一种多用途的数据结构。PHP实现双端队列<?php class Deque { public $queue = array(); /**(尾部)入队 **/ public function addLast($value) { return array_push($this->queue,$value); } /**(尾部)出队**/ public function removeLast() { return array_pop($this->queue); } /**(头部)入队**/ public function addFirst($value) { return array_unshift($this->queue,$value); } /**(头部)出队**/ public function removeFirst() { return array_shift($this->queue); } /**清空队列**/ public function makeEmpty() { unset($this->queue); } /**获取列头**/ public function getFirst() { return reset($this->queue); } /** 获取列尾 **/ public function getLast() { return end($this->queue); } /** 获取长度 **/ public function getLength() { return count($this->queue); } }队列的用途:队列可以很好地异步处理数据传送和存储,当你频繁地向数据库中插入数据、频繁地向搜索引擎提交数据,就可采取队列来异步插入。另外,还可以将较慢的处理逻辑、有并发数量限制的处理逻辑,通过消息队列放在后台处理,例如FLV视频转换、发送手机短信、发送电子邮件等。
2023年08月08日
17 阅读
0 评论
0 点赞
2023-08-08
设计不使用oauth身份验证的安全restful api
设计不使用oauth身份验证的安全restful api调用api的客户端程序,需要在header处发送 API_ID: 1API_TIME: 时间戳API_HASH: $clienthash$user="username";$publicKey='hello';$privateKey= hash_hmac('sha256', $user, $publicKey); 需要先把客户端程序的privateKey存入数据库.$data=json字符串.$clienthash = hash_hmac('sha256', API_TIME.API_ID.$data, $privateKey);API端验证:$serverHash = hash_hmac('sha256', API_TIME.API_ID.$data, $privateKey);//到数据库查找此客户端的privateKey;如果$clientHash === $serverHash 进入第二层验证如果服务器时间和API_TIME在设定的时间段内,则验证通过.第2种方式:设定一个密钥比如key = ‘2323dsfadfewrasa3434'。 2. 这个key 只有发送方和接收方知道。3. 调用时,发送方,组合各个参数用密钥 key按照一定的规则(各种排序,MD5,ip等)生成一个access_key。一起post提交到API接口。4. 接收方拿到post过来的参数以及这个access_key。也和发送一样,用密钥key 对各个参数进行一样的规则(各种排序,MD5,ip等)也生成一个access_key2。5. 对比access_key 和access_key2 。一样。则允许操作,不一样,报错返回或者加入黑名单。
2023年08月08日
12 阅读
0 评论
0 点赞
2023-08-08
PHP高并发高负载系统架构
PHP高并发高负载系统架构1、为什么要进行高并发和高负载的研究1.1、产品发展的需要1.2、公司发展的需要1.3、当前形式决定的2、高并发和高负载的约束条件2.1、硬件2.2、部署2.3、操作系统2.4、Web 服务器2.5、PHP2.6、MySQL2.7、测试3、解决之道——硬件篇处理能力的提升:部署多颗CPU,选择多核心、具备更高运算频率、更大高速缓存的CPU;处理能力的提升最直接的反应在于Web请求的处理效率和PHP程序的执行效率。内存带宽与容量:更大的内存带宽和容量;内存带宽与容量的提升最直接的反应在于应对数据库大量的数据交换。磁盘搜索与I/O能力:选择更高的转速、更大的硬盘缓存、组件磁盘阵列(RAID);磁盘搜索与I/O能力的提升最直接反应在于数据库大量的查询和读写以及文件的读写。网络带宽的提升可考虑的因素包括: 更大带宽、多线路接入、独享带宽;服务器在大负载的情况下,对网络带宽的占用是十分可观的。策略:硬件设施是应对大负载的基础,硬件设施的投入可根据实际压力和预算量力而行。4、解决之道——部署篇4.1、服务器分离4.2、数据库集群和库表散列4.3、镜像4.4、负载均衡分类:1)、DNS轮循2)代理服务器负载均衡3)地址转换网关负载均衡4)NAT负载均衡5)反向代理负载均衡6)混合型负载均衡策略:根据硬件投入和业务需求,选择合理的部署方案。部署方案1:适用范围:静态内容为主体的网站和应用系统;对系统安全要求较高的网站和应用系统。Main Server:主服务器承载程序的主体运行压力,处理网站或应用系统中的动态请求;将静态页面推送至多个发布服务器;将附件文件推送至文件服务器;安全要求较高,以静态为主的网站,可将服务器置于内网屏蔽外网的访问。DB Server:数据库服务器承载数据库读写压力;只与主服务器进行数据量交换,屏蔽外网访问。File/Video Server:文件/视频服务器承载系统中占用系统资源和带宽资源较大的数据流;作为大附件的存储和读写仓库;作为视频服务器将具备视频自动处理能力。发布服务器组:只负责静态页面的发布,承载绝大多数的Web请求;通过Nginx进行负载均衡部署。部署方案2:适用范围:以动态交互内容为主体的网站或应用系统;负载压力较大,且预算比较充足的网站或应用系统;Web服务器组:Web服务无主从关系,属平行冗余设计;通过前端负载均衡设备或Nginx反向代理实现负载均衡;划分专用文件服务器/视频服务器有效分离轻/重总线;每台Web服务器可通过DEC可实现连接所有数据库,同时划分主从。数据库服务器组:相对均衡的承载数据库读写压力;通过数据库物理文件的映射实现多数据库的数据同步。共享磁盘/磁盘阵列将用于数据物理文件的统一读写用于大型附件的存储仓库通过自身物理磁盘的均衡和冗余,确保整体系统的IO效率和数据安全;方案特性:通过前端负载均衡,合理分配Web压力;通过文件/视频服务器与常规Web服务器的分离,合理分配轻重数据流;通过数据库服务器组,合理分配数据库IO压力;每台Web服务器通常只连接一台数据库服务器,通过DEC的心跳检测,可在极短时间内自动切换至冗余数据库服务器;磁盘阵列的引入,大幅提升系统IO效率的同时,极大增强了数据安全性。5、解决之道——环境篇5.1、操作系统操作系统的选择,关注点在于•是否适应于搭建SiteEngine所需要的环境程序?•系统本身占用的资源比;•系统安全性;•系统是否易于操作?策略:我们选择FreeBSD,而且是最小化安装以后的FreeBSD。5.2、Web服务器Web服务器很大一部分资源占用来自于处理Web请求,通常情况下这也就是Apache产生的压力,Apache是世界使用排名第一的Web服务器软件。它可以运行在几乎所有广泛使用的计算机平台上。在高并发连接的情况下,Nginx是Apache服务器不错的替代品。Nginx (“engine x”) 是俄罗斯人编写的一款高性能的 HTTP 和反向代理服务器。在国内,已经有新浪、搜狐通行证、网易新闻、网易博客、金山逍遥网、金山爱词霸、校内网、YUPOO相册、豆瓣、迅雷看看等多家网站、频道使用 Nginx 服务器。Nginx的优势:高并发连接:官方测试能够支撑5万并发连接,在实际生产环境中跑到2~3万并发连接数。内存消耗少:在3万并发连接下,开启的10个Nginx 进程才消耗150M内存(15M*10=150M)。内置的健康检查功能:如果 Nginx Proxy 后端的某台 Web 服务器宕机了,不会影响前端访问。策略:相对于老牌的Apache,我们选择Lighttpd和Nginx这些具有更小的资源占用率和更高的负载能力的web服务器。5.3、MysqlMySQL本身具备了很强的负载能力,MySQL优化是一项很复杂的工作,因为这最终需要对系统优化的很好理解。大家都知道数据库工作就是大量的、短时的查询和读写,除了程序开发时需要注意建立索引、提高查询效率等软件开发技巧之外,从硬件设施的角度影响MySQL执行效率最主要来自于磁盘搜索、磁盘IO水平、CPU周期、内存带宽。根据服务器上的硬件和软件条件进行MySQl优化。MySQL优化的核心在于系统资源的分配,这不等于无限制的给MySQL分配更多的资源。在MySQL配置文件中我们介绍几个最值得关注的参数:改变索引缓冲区长度(key_buffer)改变表长(read_buffer_size)设定打开表的数目的最大值(table_cache)对缓长查询设定一个时间限制(long_query_time)如果条件允许 ,一般MySQL服务器最好安装在Linux操作系统中,而不是安装在FreeBSD中。策略: MySQL优化需要根据业务系统的数据库读写特性和服务器硬件配置,制定不同的优化方案,并且可以根据需要部署MySQL的主从结构。5.4、PHP1、加载尽可能少的模块;2、如果是在windows平台下,尽可能使用IIS或者Nginx来替代我们平常用的Apache;3、安装加速器(都是通过缓存php代码预编译的结果和数据库结果来提高php代码的执行速度)eAcceleratoreAccelerator是一个自由开放源码php加速器,优化和动态内容缓存,提高了性能php脚本的缓存性能,使得PHP脚本在编译的状态下,对服务器的开销几乎完全消除。ApcAlternative PHP Cache(APC)是 PHP 的一个免费公开的优化代码缓存。它用来提供免费,公开并且强健的架构来缓存和优化 PHP 的中间代码。memcachememcache是由Danga Interactive开发的,高性能的,分布式的内存对象缓存系统,用于在动态应用中减少数据库负载,提升访问速度。主要机制是通过在内存里维护一个统一的巨大的hash表,Memcache能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等Xcache国人开发的缓存器,策略: 为PHP安装加速器。5.5、代理服务器(缓存服务器)Squid Cache(简称为Squid)是一个流行的自由软件(GNU通用公共许可证)的代理服务器和Web缓存服务器。Squid有广泛的用途,从作为网页服务器的前置cache服务器缓存相关请求来提高Web服务器的速度,到为一组人共享网络资源而缓存万维网,域名系统和其他网络搜索,到通过过滤流量帮助网络安全,到局域网通过代理上网。Squid主要设计用于在Unix一类系统运行。策略:安装Squid 反向代理服务器,能够大幅度提高服务器效率。6、解决之道——SiteEngine篇7、解决之道——测试篇7.1、测试方法7.2、测试用例7.3、压力测试压力测试是一种基本的质量保证行为,它是每个重要软件测试工作的一部分。压力测试的基本思路很简单:不是在常规条件下运行手动或自动测试,而是在计算机数量较少或系统资源匮乏的条件下运行测试。通常要进行压力测试的资源包括内部内存、CPU 可用性、磁盘空间和网络带宽等。一般用并发来做压力测试。压力测试工具:webbench,ApacheBench等7.4、漏洞测试在我们的系统中漏洞主要包括:sql注入漏洞,xss跨站脚本攻击等。安全方面还包括系统软件,如操作系统漏洞,mysql、apache等的漏洞,一般可以通过升级来解决。
2023年08月08日
28 阅读
0 评论
0 点赞
2023-08-08
Yar – 并行的RPC框架(Concurrent RPC framework)
Yar – 并行的RPC框架(Concurrent RPC framework)Yar(yet another RPC framework, 教主问我为啥都是Ya打头, 呵呵, 因为这样名字好起)是我在3个多月前, 为了解决一个实际的问题, 而开发的一个PHP扩展的, RPC框架, 和现有的RPC框架(xml-rpc, soap)不同, 这是一个轻量级的框架, 支持多种打包协议(msgpack, json, php), 并且最重要的一个特点是, 它是可并行化的..考虑如下的场景:传统的Web应用, 一个进程, 一个请求, 天经地义. 然而, 当一个请求的处理中, 涉及到多出数据源, 并且他们之间具有一定的不依赖性.还是传统的Web应用, 一个应用随着业务快速增长, 开发人员的流转, 就会慢慢的进入一个恶性循环, 代码量上只有加法没有了减法. 因为随着系统变复杂, 牵一发就会动全局, 而新来的维护者, 对原有的体系并没有那么多时间给他让他全面掌握. 即使有这么多时间, 要想掌握以前那么多的维护者的思维的结合, 也不是一件容易的事情…那么, 长次以往, 这个系统将会越来越不可维护…. 到一个大型应用进入这个恶性循环, 那么等待他的只有重构了.那么, 能不能对这个系统做解耦呢?我们已经做了很多解耦了, 数据, 中间件, 业务, 逻辑, 等等, 各种分层. 但到Web应用这块, 还能怎么分呢, MVC我们已经做过了….基于此, Yar或许能解决你遇到的这俩个问题…Yar是一个非常轻量级的RPC框架, 我在实现Yar的时候, 追求了极致的轻量级, 它使用非常简单, 对于Server端:<?phpclass API {/**the doc info will be generated automatically into service info page.@params@return*/ public function api($parameter, $option = "foo") { } protected function client_can_not_see() { }}$service = new Yar_Server(new API());$service->handle();?>和Soap使用方法很相像吧? 是的, 就这样, 你的API类就可以对外提供服务了..Yar为了方便开发, 把文档和接口绑定到了一起, 对于上面的例子, 如果我们是简单的GET请求这个接口地址的话, 我们就会看到如下的信息页面:这样, 我们可以在注释中,把接口的信息标注好, 就可以让文档和接口在一起了.而对于Client端来说, 简单的串行调用, 会非常之简单:<?php$client = new Yar_Client("http://host/api/");$result = $client->api("parameter);?>这样一来, 如果你有多个服务, 你只需要一个client.那么, 最激动人心的并行化调用呢?<?phpfunction callback($retval, $callinfo) { var_dump($retval);}Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");Yar_Concurrent_Client::call("http://host/api/", "api", array("parameters"), "callback");Yar_Concurrent_Client::loop(); //send?>这样, 所有的请求会一次发出, 只要有任何一个请求完成, 回调函数”callback”就会被立即调用.这里还有一个细节, Yar见缝插针的不会浪费任何时间, 在这些请求发送完成以后, Yar会调用一次callback, 和普通的请求返回回调不同, 这次的调用的$callinfo参数为空.这样一来, 我们就可以先发送请求, 然后再第一次回调, 继续做我们当前进程的工作, 等所有工作结束以后, 再交给Yar去获取并行RPC的响应.<?phpfunction callback($retval, $callinfo) {if ($callinfo == NULL) { //做本地的逻辑 return TRUE; } //RPC请求返回, 返回值在$retval}有了这些, 我们就可以把一个Web应用中, 多个数据源并行处理, 从而也能把这些逻辑解耦, 分开部署…当然Yar目前还在试用阶段, 所以还没有发布任何一个包(Yar at PECL), 但是有兴趣的同学可以现在就把代码clone下去试用哦(虽然没有正式投入试用, 不过已经经过了验证).Yar: Yar at GithubPS, 如果要使用Msgpack(一个高效的二进制打包协议)做为打包协议, 需要单独安装Msgpack扩展(Msgpack), 这个扩展目前也是我在维护, 我会在近几天把他在PECL上发布, 尽请期待.
2023年08月08日
11 阅读
0 评论
0 点赞
2023-08-08
Memcache基础教程
Memcache基础教程Memcache是什么Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库的压力。它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。Memcache官方网站:http://www.danga.com/memcached,更多详细的信息可以来这里了解 🙂为什么会有Memcache和memcached两种名称?其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。Memcache的安装分为两个过程:memcache服务器端的安装和memcached客户端的安装。所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储所谓客户端的安装就是指php(或者其他程序,Memcache还有其他不错的api接口提供)去使用服务器端的Memcache提供的函数,需要php添加扩展。具体的配置大家可以参考:Linux下的Memcache安装:http://www.ccvita.com/257.htmlWindows下的Memcache安装:http://www.ccvita.com/258.htmlMemcache基础教程:http://www.ccvita.com/259.htmlDiscuz!的Memcache缓存实现:http://www.ccvita.com/261.htmlMemcache协议中文版:http://www.ccvita.com/306.htmlMemcache分布式部署方案:http://www.ccvita.com/395.htmlPHP的Memcache< ?php//连接$mem = new Memcache;$mem->connect("192.168.0.200", 12000);//保存数据$mem->set('key1', 'This is first value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val ."";//替换数据$mem->replace('key1', 'This is replace value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val . "";//保存数组$arr = array('aaa', 'bbb', 'ccc', 'ddd');$mem->set('key2', $arr, 0, 60);$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";//删除数据$mem->delete('key1');$val = $mem->get('key1');echo "Get key1 value: " . $val . "";//清除所有数据$mem->flush();$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";//关闭连接$mem->close();?>如果正常的话,浏览器将输出:Get key1 value: This is first valueGet key1 value: This is replace valueGet key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )Get key1 value:Get key2 value:程序代码分析初始化一个Memcache的对象:$mem = new Memcache;连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:$mem->connect("192.168.0.200", 12000);保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:$mem->set('key1', 'This is first value', 0, 60);从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:$val = $mem->get('key1');echo "Get key1 value: " . $val;现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:$mem->replace('key1', 'This is replace value', 0, 60);$val = $mem->get('key1');echo "Get key1 value: " . $val;同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出$arr = array('aaa', 'bbb', 'ccc', 'ddd');$mem->set('key2', $arr, 0, 60);$val2 = $mem->get('key2');print_r($val2);现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果$mem->delete('key1');$val = $mem->get('key1');echo "Get key1 value: " . $val . "";最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接$mem->flush();$val2 = $mem->get('key2');echo "Get key2 value: ";print_r($val2);echo "";代码使用<?php//1.实例化一个Memcache对象$mem=new Memcache;//2. 连接到指定的memcache中$mem->connect("127.0.0.1",11211);//0表示不压缩数据,如果使用压缩MEMCACHE_COMPRESSEDif(!$mem->add("name","test1",0,30)){echo "name 已经存在了";}else{echo "ok!";}//可以放入数值if(!$mem->add("age",100,0,30)){echo "age 已经存在了";}else{echo "ok!";}//可以放入booleanif(!$mem->set("ok",true,0,30)){echo "ok 保存成功";}else{echo "ok!";}//放入数组$arr1=array("aa"=>"北京","bb"=>"天津");//对数组进行序列化,在网络传输的时候,为了保证,数据类型的不丢失,//先序列化,再发生.//$arr1=serialize($arr1);$arr2=json_encode($arr1);print_r($arr2);$mem->add("arr",$arr1,MEMCACHE_COMPRESSED,100);//对象require "Person.class.php";$person=new Person(10,"xiaoming");$mem->add("per1",$person,MEMCACHE_COMPRESSED,100);//取出$per2=$mem->get("per1");var_dump($per2);echo "对象名字=".$per2->name;//string, int,float, boolean array object null resource//不能把resource 类型放入到memcache$con=mysql_connect("localhost","root","root");echo "<br/>";var_dump($con);$mem->add("mylink",$con);?>关于如何使用多个memcached 缓存服务器.<?php$mem=new Memcache();//如果我们网站,需要多个memached缓存系统.//$mem->connect("localhost",11211); (立即向localhost的11211端口发出连接)$mem->addServer("192.168.1.100",11211);//256 ->10m$mem->addServer("192.168.1.200",11211);$mem->addServer("192.168.1.222",11211);//创建多个memcache服务使用.//addServer 会根据负载均衡算法,自动放入每个服务器$mem->add("name","zs",0,100);?>注意:string, int,float, boolean array object null resource 中除了 resource 不能存放,其它都可以.Memcache的使用使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。分布式应用Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。减少数据库压力这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。我考虑的一种简单方法:后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进行相应的hash算法计算得出一个hash数据key(比如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置一个失效时间,比如一个小时,那么一个小时中的数据都是从缓存中提取的,有效减少数据库的压力。缺点是数据不实时,当数据做了修改以后,无法实时到前端显示,并且还有可能对内存占用比较大,毕竟每次select出来的数据数量可能比较巨大,这个是需要考虑的因素。Memcache的安全我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。内网访问最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pidMemcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接设置防火墙防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。iptables -Fiptables -P INPUT DROPiptables -A INPUT -p tcp -s 192.168.0.2 --dport 11211 -j ACCEPTiptables -A INPUT -p udp -s 192.168.0.2 --dport 11211 -j ACCEPT上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。Memcache的使用和协议分析详解
2023年08月08日
11 阅读
0 评论
0 点赞
1
...
81
82
83
...
112