Redis

基于Swoole和Redis实现的并发队列处理系统

耗尽温柔 提交于 2021-02-01 20:18:33
背景 由于 PHP 不支持多线程,但是作为一个完善的系统,有很多操作都是需要异步完成的。为了完成这些异步操作,我们做了一个基于Redis队列任务系统。 大家知道,一个消息队列处理系统主要分为两大部分:消费者和生产者。 在我们的系统中,主系统作为生产者,任务系统作为消费者。 具体的工作流程如下: 1、主系统将需要需要处理的任务名称+任务参数push到队列中。 2、任务系统实时的对任务队列进行pop,pop出来一个任务就fork一个子进程,由子进程完成具体的任务逻辑。 具体代码如下: /** * 启动守护进程 */ public function runAction() { Tools::log_message( 'ERROR' , 'daemon/run' . ' | action: restart' , 'daemon-' ); while (true) { $this ->fork_process(); } exit ; } /** * 创建子进程 */ private function fork_process() { $ppid = getmypid(); $pid = pcntl_fork(); if ( $pid == 0 ) { // 子进程 $pid = posix_getpid(); // echo "* Process {$pid} was created nn"

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

高薪急招CTO&合伙人!还有年薪500k的技术岗虚位以待!

老子叫甜甜 提交于 2021-02-01 11:56:48
这是养码场内推功能上线后的 第31期 每周三定期放送! 可别错过~ 过完中秋想国庆 还得想想升职加薪怎么办…… 晋升 CTO不容易? 人工智能的门槛太高? 这一波内推 统统解决! 在放送详细岗位JD前,场主要和大家强调下 养码场内推岗位征集 ,有招聘需求的 技术人 可以 直接 添加【牛奶:milk6666666666】发布 内推技术岗位 信息! 1、若干优质内推岗位可进行养码场多渠道曝光; 2、免费、快速、精准触达8w+人技术社群; 3、让有招聘需求的技术人轻松get优质简历! 内推 就是 短!平!快! 养码场内推 第31期 技术岗位 大 放 送! 杭州稻芒数据技术有限公司 团队介绍: 稻芒数据 专注 城市房地产数据产品研发 ,基于住宅、商铺、办公等物业最小颗粒维度的地理位置属性和房屋价值属性为客户提供提供全方位、多场景的房地产大数据服务。 核心团队成员在房地产互联网领域深耕多年,成功交付多个房地产数据项目。稻芒数据致力于房地产数据的标准统一,共享融通。 工作地 点:杭州市滨江区长河路590号东忠科技园2幢7楼A715室 CTO&合伙人 Base:杭州 岗位职责: 负责管理 IT 团队和完成产品 IT 开发。 任职要求: 1、90后; 2、IT工作经验2年及以上; 3、python/Java/C++; 4、有带团队队或独立开发经验或架构师经验; 5

Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式)介绍

眉间皱痕 提交于 2021-02-01 11:53:14
在这里对jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比: 一、普通同步方式 最简单和基础的调用方式, @Test public void test1Normal() { Jedis jedis = new Jedis("localhost"); long start = System.currentTimeMillis(); for (int i = 0; i < 100000; i++) { String result = jedis.set("n" + i, "n" + i); } long end = System.currentTimeMillis(); System.out.println("Simple SET: " + ((end - start)/1000.0) + " seconds"); jedis.disconnect(); } 很简单吧,每次 set 之后都可以返回结果,标记是否成功。 二、事务方式(Transactions) redis的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。 看下面例子: @Test public void test2Trans() { Jedis jedis = new Jedis("localhost"); long start =

Java客户端Jedis 对Redis的几种调用方式包括事务、管道、分布式

血红的双手。 提交于 2021-02-01 11:45:31
在这里对 jedis关于事务、管道和分布式的调用方式做一个简单的介绍和对比: 一、 直接同步方式 最简单的调用方式。 二、事务方式 (Transactions) redis 的事务很简单,他主要目的是保障,一个client发起的事务中的命令可以连续的执行,而中间不会插入其他client的命令。调用jedis.watch(…)方法来监控key,如果调用后key值发生变化,则整个事务会执行失败。另外,事务中某个操作失败,并不会回滚其他操作。这一点需要注意。还有,可以使用discard()方法来取消事务。 三、管道 (Pipelining)异步方式 有时,我们需要采用异步方式,一次发送多个指令,不同步等待其返回结果。这样可以取得非常好的执行效率。这就是管道,调用方法如下: 四、分布式直连同步调用 五、 分布式直连异步调用 六、 分布式连接池同步调用 七、 分布式连接池异步调用 八、注意 1 、 事务和管道都是异步模式。在事务和管道中不能同步查询结果 。 2 、 分布式中,连接池的性能比直连的性能略好 。 3 、 分布式调用中不支持事务。因为事务是在服务器端实现,而在分布式中,每批次的调用对象都可能访问不同的机器,所以,没法进行事务。 4 、 分布式中,连接池方式调用线程安全 。 工具助手小程序 来源: oschina 链接: https://my.oschina.net/u

redis的缓存穿透,缓存雪崩,持久化方式

假装没事ソ 提交于 2021-02-01 11:14:09
Redis redis是一个可进行持久化的内存数据库,可以支持string,list,hsh,set,zet这五种数据类型。 redis的性能很高(redis的读取速度可以达到11万次每秒,写的速度达到8万次每秒) redis【缓存穿透】 缓存穿透是指去查询一个一定不存在的数据,比如说我一共有100个商品,然后你偏偏去查询第101,102个这些不存在的商品,这个时候我们通常情况下就先回去redis里面去查询,但是redis里面就存在,所以就会去数据库中查询,如果大量的这种请求过来,那么就都落在了数据库上面,而数据库也不存在这样的数据,那么缓存就如同虚设,增加了数据库的压力。 解决方法: 为了解决这个问题,我们可以缓存空值,也就是说即便数据库中查询出来的数据不存在,也会缓存空值在reids的缓存中,这样下一次就可以走我们的缓存而不是数据库啦,但是太多的空值会占用我们的缓存的内存空间,导致内存的浪费,我们就通过给它设置一个过期时间比如3分钟,这样过了3分钟后存入的空值就会清空,释放空间,但是这样又出现另外一个问题,就是说如果有人在三分钟内加了一条数据,这个时候就有了第101条数据啦,但是当我们用户去查的时候,走的缓存而缓存中却还是空值,导致缓存中的数据和数据库中的数据不一致,为了解决这个问题我们可以在后台增加数据的时候,同时主动更新缓存中存在的数据,或者去删除缓存中的数据

redis的场景应用多角度简单分析

十年热恋 提交于 2021-02-01 09:56:55
导读 redis的应用场景很多,不管是在数据存储还是分布式锁等方面,本篇文章主要对主从、哨兵、分片集群做一个简单的分析,不会讲的太深。 redis的应用场景很多,不管是在数据存储还是分布式锁等方面,本篇文章主要对主从、哨兵、分片集群做一个简单的分析,不会讲的太深。 主从模式 主从模式的应用场景有点类似于数据库的主从集群,主从往往是为了读写分离、backup 等目的才使用的,所谓主从模式简单的说就是有多个节点,里面包含主节点和从节点,结构如下图: 从节点在保持连接后每隔一个时间节点会主动的和主节点通信并发送同步请求,而后进行同步。 其实在整个流程中,最需要主要的就是数据间的同步,主要的同步方式有两种也就是全量同步和增量同步。 全量同步:全量同步一般使用在从节点刚接入主节点时进行全量复制,当然你也可以根据你的需求进行主动的全量同步 增量同步:Redis增量复制是指从节点初始化后开始正常工作时主服务器发生的写操作同步到从服务器的过程。 增量复制的过程主要是主服务器每执行一个写 命令 就会向从服务器发送相同的写 命令 ,从服务器接收并执行收到的写命令,一般使用缓冲区、队列(先进先出)等方式辅助进行增量的同步。 哨兵模式 哨兵模式是为了保证redis的高可用产生的架构,简单地说就是通过构建1个或多个哨兵对节点进行监控,如果master发生故障下线之后,哨兵之间会进行投票,在2

Redis简介,应用场景,优势

邮差的信 提交于 2021-02-01 09:56:25
Redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 Redis支持数据的备份,即master-slave模式的数据备份。 Redis 应用场景 主要能够体现 解决数据库的访问压力。 应用中当作缓存使用;例如:短信验证码时间有效期 session共享解决方案 Redis优势 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 丰富的数据类型 – Redis支持二进制案例的 String, List, Hash, Set 及 Ordered Set 数据类型操作。 原子 – Redis的所有操作都是原子性的。 丰富的特性 – Redis还支持 publish/subscribe(发布,订阅), 通知, key 过期等等特性。 备注: BSD开源协议是一个给于使用者很大自由的协议。 可以自由的使用,修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。当你发布使用了BSD协议的代码

Java高并发秒杀系统【观后总结】

落爺英雄遲暮 提交于 2021-02-01 09:23:54
项目简介 在慕课网上发现了一个JavaWeb项目,内容讲的是高并发秒杀,觉得挺有意思的,就进去学习了一番。 记录在该项目中学到了什么玩意.. 该项目源码对应的gitHub地址(由观看其视频的人编写,并非视频源代码): https://github.com/codingXiaxw/seckill 我结合其资料和观看视频的时候整理出从该项目学到了什么... 项目Dao层 日志记录工具: <!--1.日志 java日志有:slf4j,log4j,logback,common-logging slf4j:是规范/接口 日志实现:log4j,logback,common-logging 使用:slf4j+logback --> Mybatis之前没注意到的配置属性: 使用jdbc的getGeneratekeys获取自增主键值 ,这个属性还是挺有用的。 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration> <!--配置全局属性--> <settings> <!-

Java秒杀系统方案优化 高性能高并发实战(1)

五迷三道 提交于 2021-02-01 09:23:17
首先先把 springboot +thymeleaf 搞起来 ,参考 springboot 官方文档 本次学习 使用 springboot + thymeleaf+mybatis+redis+RabbitMQ 等实现,未完待继续补充 开发环境: IDEA 接口测试: PostMan 鸭梨测试:JMeter 整体结构 ####那么使用 idea ——>file -->new project --> maven project 修改 pom.xml 添加依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>springbootdemo</groupId> <artifactId>springbootdemo</artifactId> <version>1.0