Swoft

面试官问:你说说Redis的几个过期策略?

这一生的挚爱 提交于 2021-02-19 10:47:41
在使用redis时,一般会设置一个过期时间,当然也有不设置过期时间的,也就是永久不过期。当设置了过期时间,redis是如何判断是否过期,以及根据什么策略来进行删除的。 设置过期时间 expire key time(以秒为单位) 这是最常用的方式 setex(String key, int seconds, String value) 字符串独有的方式 除了字符串自己独有设置过期时间的方法外,其他方法都需要依靠expire方法来设置时间如果没有设置时间,那缓存就是永不过期如果设置了过期时间,之后又想让缓存永不过期,使用persist key 三种过期策略 定时删除 在设置key的过期时间的同时,为该key创建一个定时器,让定时器在key的过期时间来临时,对key进行删除 优点: 保证内存被尽快释放 缺点: 若过期key很多,删除这些key会占用很多的CPU时间,在CPU时间紧张的情况下,CPU不能把所有的时间用来做要紧的事儿,还需要去花时间删除这些key 定时器的创建耗时,若为每一个设置过期时间的key创建一个定时器(将会有大量的定时器产生),性能影响严重 懒汉式式删除 key过期的时候不删除,每次通过key获取值的时候去检查是否过期,若过期,则删除,返回null。 优点: 删除操作只发生在通过key取值的时候发生,而且只删除当前key,所以对CPU时间的占用是比较少的

PHP程序员在二三线城市更受欢迎

一曲冷凌霜 提交于 2021-02-01 12:56:43
PHP 开发工程师处在初级、中级和高级阶段需要掌握的技能也不同,本文分享 PHP 工程师处在不同阶段下需要掌握的技能。 PHP 初级开发工程师 PHP 初级开发工程师需要掌握的技能 1. 走进 PHP 的世界 PHP 介绍、 PHP 版本发展历史、 PHP 薪资水平和职业发展、WEB开发中基础概念介绍、 PHP 开发环境搭建、HTML+CSS等入门内容。 2. PHP 基础语法 变量、数据类型、常量、流程控制、运算符、字符串、数组、函数等。 3. PHP 进阶 HTTP协议、超全局变量,会话控制(session,cookie),文件系统,上传文件,图像处理等。 4. MySQL数据库 库,表,字段类型,SQL语句,事务,锁,表引擎,索引,函数,存储过程,视图等 5. PHP 操作MySQL数据库 使用mysql扩展函数操作数据库,实现增,删,改,查,搜索,排序,翻页等功能。 6.实现常用的功能模块 注册,登录,记住登录状态,找回密码,无限级,权限(RBAC)等。 7. 网站安全 SQL注入,XSS(跨站脚本攻击),CSRF(跨站请求伪造),ARP攻击,DDOS攻击,撞库,钓鱼网站,SSL等。 8.微信接口开发 微信号申请、微信类型、接收消息、发送消息、微信JS-SDK、微信支付等。 9. Soket编程 socket、TCP/UDP、构造HTTP协议字符串、发送协议、XML

PHP网站开发—网站架构优化性能概念

℡╲_俬逩灬. 提交于 2021-01-25 17:34:38
最开始的网站架构 最初业务量不大,访问量小,此时的架构,应用程序、数据库、文件都部署在一台服务器上,有些甚至仅仅是租用主机空间 1. 应用、数据、文件分离 将应用程序、数据库、文件各自部署在独立的服务器上,并且根据服务器的用途配置不同的硬件,达到最佳的性能效果。 2. 利用缓存改善网站性能 大部分网站访问都遵循28原则,即80%的访问请求,最终落在20%的数据上,所以我们可以对热点数据进行缓存,减少热点数据的访问路径,提高用户体验。缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理。 2.1 本地缓存 本地缓存,顾名思义是将数据缓存在应用服务器本地,可以存在内存中,也可以存在文件,组件。本地缓存的特点是速度快,但因为本地空间有限所以缓存数据量也有限。 2.2 分布式缓存 分布式缓存的特点是,可以缓存海量的数据,并且扩展非常容易,在门户类网站中常常被使用,速度按理没有本地缓存快,常用的分布式缓存是Memcached、Redis。 2.3 反向代理 部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,如果没有缓存数据才会继续访问应用服务器获取,这样做减少了获取数据的成本。 2.4 CDN 假设我们的服务器都部署在杭州的机房,对于浙江的用户来说访问是较快的,而对于北京的用户访问是较慢的

网站架构优化性能概念

核能气质少年 提交于 2021-01-23 20:38:34
最开始的网站架构 最初业务量不大,访问量小,此时的架构,应用程序、数据库、文件都部署在一台服务器上,有些甚至仅仅是租用主机空间 1. 应用、数据、文件分离 将应用程序、数据库、文件各自部署在独立的服务器上,并且根据服务器的用途配置不同的硬件,达到最佳的性能效果。 2. 利用缓存改善网站性能 大部分网站访问都遵循28原则,即80%的访问请求,最终落在20%的数据上,所以我们可以对热点数据进行缓存,减少热点数据的访问路径,提高用户体验。缓存实现常见的方式是本地缓存、分布式缓存。当然还有CDN、反向代理。 2.1 本地缓存 本地缓存,顾名思义是将数据缓存在应用服务器本地,可以存在内存中,也可以存在文件,组件。本地缓存的特点是速度快,但因为本地空间有限所以缓存数据量也有限。 2.2 分布式缓存 分布式缓存的特点是,可以缓存海量的数据,并且扩展非常容易,在门户类网站中常常被使用,速度按理没有本地缓存快,常用的分布式缓存是Memcached、Redis。 2.3 反向代理 部署在网站的机房,当用户请求达到时首先访问反向代理服务器,反向代理服务器将缓存的数据返回给用户,如果没有缓存数据才会继续访问应用服务器获取,这样做减少了获取数据的成本。 2.4 CDN 假设我们的服务器都部署在杭州的机房,对于浙江的用户来说访问是较快的,而对于北京的用户访问是较慢的

php使用shmop函数创建共享内存减少负载

回眸只為那壹抹淺笑 提交于 2020-12-26 11:54:39
PHP做内存共享有两套接口。一个是shm,它实际上是变量共享,会把对象变量序列化后再储存。使用起来倒是挺方便,但是序列化存储对于效率优先的内存访问操作而言就没啥意义了。另外一个是shmop,它是Linux和Windows通用的,不过功能上比shm弱了一些,在 Linux 上,这些函数直接是通过调用 shm* 系列的函数实现,而 Winodows 上也通过对系统函数的封装实现了同样的调用。 要创建共享内存段需要使用函数shmop,那么前提需要开启扩展。 shmop主要函数 shmop_open (创建或打开共享内存块)、shmop_write (向共享内存块中写入数据)、shmop_read (从共享内存块中读取数据)、shmop_size (获取共享内存块的大小)、shmop_close (关闭共享内存块)、shmop_delete (删除共享内存块) <?php //创建一块共享内存 $shm_key = 0x4337b101; $shm_id = @shmop_open($shm_key, 'c', 0644, 1024); //读取并写入数据 $data = shmop_read($shm_id, 0, 1024); shmop_write($shm_id, json_encode($data), 0); $size = shmop_size($shm_id); /

解锁Redis锁的正确姿势

北城以北 提交于 2020-12-16 16:04:04
redis是php的好朋友,在php写业务过程中,有时候会使用到锁的概念,同时只能有一个人可以操作某个行为。这个时候我们就要用到锁。锁的方式有好几种,php不能在内存中用锁,不能使用zookeeper加锁,使用数据库做锁又消耗比较大,这个时候我们一般会选用redis做锁机制。 setnx 锁在redis中最简单的数据结构就是string。最早的时候,上锁的操作一般使用setnx,这个命令是当:lock不存在的时候set一个val,或许你还会记得使用expire来增加锁的过期,解锁操作就是使用del命令,伪代码如下: 1if (Redis::setnx("my:lock", 1)) { 2 Redis::expire("my:lock", 10); 3 // ... do something 4 5 Redis::del("my:lock") 6} 这里其实是有问题的,问题就在于setnx和expire中间如果遇到crash等行为,可能这个lock就不会被释放了。于是进一步的优化方案可能是在lock中存储timestamp。判断timestamp的长短。 set 现在官方建议直接使用set来实现锁。我们可以使用set命令来替代setnx,就是下面这个样子 1if (Redis::set("my:lock", 1, "nx", "ex", 10)) { 2 ... do

PHP事件机制

依然范特西╮ 提交于 2020-11-01 22:01:27
先用 3W1H(who what why how) 分析法的思路来解释一下 事件机制 , 更重要的是, 这个有什么用. 正常 的程序执行, 或者说人的思维趋势, 都是按照 时间线性串行 的, 保持 连续性 . 不过现实中会存在各种 打断 , 程序也不是永远都是 就绪状态 , 那么, 就需要有一种机制, 来处理可能出现的各种打断, 或者在程序不同状态之间切换. 事件机制发展到现在, 有时候也算是一种预留手段, 根据你的经验在需要的地方 埋点 , 方便之后 打补丁 . swoft 的事件机制基于 PSR-14 实现, 高度内聚简洁. 由三部分组成: EventManager: 事件管理器 Event: 事件 EventHandler / Listener: 事件处理器/监听器 执行流程: 先生成 EventManager 将 Event 和 EventHandler 注册到 EventManager 触发 Event, EventManager 就会调用相应的 EventHandler 使用起来就更加简单了: namespace Swoft\Event; class ListenerQueue implements \IteratorAggregate, \Countable { protected $store; /** * 优先级队列 * @var

PHP实现对短信验证码发送次数的限制(防机刷验证码)

本秂侑毒 提交于 2020-10-27 16:54:36
场景 在注册,修改密码,找回密码等场景里,我们都会遇到发送手机短信进行验证码验证,我们都知道,手机的这个短信接口是需要购买了,为了防刷,我们就会对短信验证码发送次数的限制,我们应该如何防止呢? 很多人都会这样做:对用户获取短信验证码的手机号、ip、和浏览器(使用唯一标识)进行限制。 本文介绍的方法是对用户每天只能通过同一浏览器或同一ip地址获取验证码10次或者同一手机号只能获取3次短信验证码,三种限制为“或”关系,一条超限就不发验证码。方法是通过在服务器端将用户的手机号、ip、ur_r标识记录并写入文件,再通过读取文件记录判断用户请求发送验证码的次数来做限制。 方法如下: 这里是获取短信验证码页面: <!DOCTYPE html> < html > < head ></ head > < body > <!-- 隐藏表单uv_r标识,用于对获取验证码的浏览器进行限制,唯一标识存储于浏览器cookie中。在用户进行获取短信验证码操作时将标识传入后台代码(可以通过js传入后台,此处未提供js代码) --> < input type = "hidden" name = "uv_r" value = "" id = "uv_r" > </ body > < script type = ”text/javascript” > /* 使用js获取cookie中ur_r唯一标识,如果不存在

PHP事件机制

你说的曾经没有我的故事 提交于 2020-10-24 17:23:05
先用 3W1H(who what why how) 分析法的思路来解释一下 事件机制 。 更重要的是, 这个有什么用? 正常 的程序执行, 或者说人的思维趋势, 都是按照 时间线性串行 的, 保持 连续性 . 不过现实中会存在各种 打断 , 程序也不是永远都是 就绪状态 , 那么, 就需要有一种机制, 来处理可能出现的各种打断, 或者在程序不同状态之间切换。 事件机制发展到现在, 有时候也算是一种预留手段, 根据你的经验在需要的地方 埋点 , 方便之后 打补丁。 swoft 的事件机制基于 PSR-14 实现, 高度内聚简洁。 由三部分组成: EventManager: 事件管理器 Event: 事件 EventHandler / Listener: 事件处理器/监听器 执行流程: 先生成 EventManager 将 Event 和 EventHandler 注册到 EventManager 触发 Event, EventManager 就会调用相应的 EventHandler 使用起来就更加简单了: namespace SwoftEvent; class ListenerQueue implements IteratorAggregate, Countable { protected $store; /** * 优先级队列 * @var SplPriorityQueue */

PHP解耦的三重境界(浅谈服务容器)

混江龙づ霸主 提交于 2020-10-24 11:05:17
在完成整个软件项目开发的过程中,有时需要多人合作,有时也可以自己独立完成,不管是哪一种,随着代码量上升,写着写着就“失控”了,渐渐“丑陋接口,肮脏实现”,项目维护成本和难度上升,到了难以维持的程度,只有重构或者重新开发。 第一重境界 假设场景:我们需要写一个处理类,能够同时操作会话,数据库和文件系统。我们或许会这么写。 境界特征:可以运行,但是严重耦合 class DB{ public function DB($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class FileSystem{ public function FileSystem($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Session{ public function Session($arg1,$arg2){ echo 'constructed!'.PHP_EOL; } } class Writer{ public function Write(){ $db=new DB(1,2); $filesystem=new FileSystem(3,4); $session=new Session(5,6); } } $writer=new Writer(); $writer->write(); 写法缺点: 1