redis mysql 案例_redis 使用案例

2023-10-27

1.使用redis消息列队发布信息

在一些用户创造用户的应用中(如SNS,微博),可能出现1秒有上千万个用户同时发布消息的情况,此时如果使用mysql可能出现‘too many connections’ 错误,当然,把mysql的max_connections 参数设置为更大数,不过这是一个治标不治本的方法,这是可以考虑使用redis。

使用redis的list类型作为消息列队,把用户发布的消息暂时存储在消息列队中,接着使用一个cron程序把消息列队中的消息插入mysql,这样有效率降低mysql的并发量。

例如发布一条微博使用一下接口:

<?php $uid =get_uid();$content =get_content();$timestamp = time();$weibo = newweibo();$weibo->pot($uid,$contnet,$timestamp);?>

weibo对象的post方法就是发布微博的接口,它直接把微博写入mysql。参数$uid是用户的UID,$content是微博的内容,$timestamp是发布的时间戳。

为了降低mysql的并发数,先把用户发布的微博存在redis中,代码如下:

<?php $redis = new redis('127.0.0.1',6379);$redis ->connect();$weibo_info =['uid' => get_uid(),

'content' => get_cntent(),

'timestamp' => time()

];$redis->lpush('weibo_list',json_encode($weibo_info));$redis ->close();?>

先把微博信息使用json_encode编码成JSON格式。然后使用redis对象的lpush方法把微博信息插入到weibo_list列队。

把微博存到redis以后,编写一个cron程序吧redis中的微博信息插入到mysql中代码如下:

<?php $redis = new redis('127.0.0.1',6379);$redis->connect();$weibo = newweibo();while(true){if($redis->lsize('weibo_list') > 0){$info = $redis->rpop('weibo_list');$info = json_decode($info);$weibo -> post($info->uid,$info->content,$info->timestamp);

}else{sleep(1);

}

}$redis ->close();?>

在cron程序中,先使用redis对象的rpop()方法从weibo_list列表中取得一条微博信息,然后使用json_decode ()函数解码,最后调用weibo对象的post方法把微博信息插入mysql。

使用消息列队有一个缺点,就是‘延时’。为了把延时降低,运行多个cron程序同时把消息列队中的数据插入mysql。使用消息列队的好处是扩展性好,当一台redis服务器不能应付大量并发时,使用‘一致性Hash算法’把并发分发到redis服务器。

2.使用redis代替文件存储session

PHP默认使用文件存储session,如果并发量大,效率非常低。而redis对高并发的支持非常好,所以,可以使用redis替代文件存储session。

在讲解实例之前,先了解php的session_set_save_handler函数的作用和使用方法。该函数定义设置用户自定义会话存储函数(如打开、关闭、写入等)。原型如下:

bool session_set_save_handler(callback open,callback close,callback read,callback write,callback destroy,callback gc,callable create_sid)

sesson_set_save_handler 函数各参数作用如下:

open 回调函数类似于类的构造函数, 在会话打开的时候会被调用。 这是自动开始会话或者通过调用 session_start() 手动开始会话 之后第一个被调用的回调函数。 此回调函数操作成功返回 TRUE,反之返回 FALSE。

close 回调函数类似于类的析构函数。 在 write 回调函数调用之后调用。 当调用 session_write_close() 函数之后,也会调用 close 回调函数。 此回调函数操作成功返回 TRUE,反之返回 FALSE。

read如果会话中有数据,read 回调函数必须返回将会话数据编码(序列化)后的字符串。 如果会话中没有数据,read 回调函数返回空字符串。

在自动开始会话或者通过调用 session_start() 函数手动开始会话之后,PHP 内部调用 read 回调函数来获取会话数据。 在调用 read 之前,PHP 会调用 open 回调函数。

read 回调返回的序列化之后的字符串格式必须与 write 回调函数保存数据时的格式完全一致。 PHP 会自动反序列化返回的字符串并填充

write在会话保存数据时会调用 write 回调函数。 此回调函数接收当前会话 ID 以及 session.serialize_handler 设定值来完成。

序列化后的数据将和会话 ID 关联在一起进行保存。 当调用 read 回调函数获取数据时,所返回的数据必须要和 传入 write 回调函数的数据完全保持一致。

PHP 会在脚本执行完毕或调用 session_write_close() 函数之后调用此回调函数。 注意,在调用完此回调函数之后,PHP 内部会调用 close回调函数。

destroy当调用 session_destroy() 函数, 或者调用 session_regenerate_id() 函数并且设置 destroy 参数为 TRUE 时, 会调用此回调函数。此回调函数操作成功返回 TRUE,反之返回 FALSE。

gc为了清理会话中的旧数据,PHP 会不时的调用垃圾收集回调函数。 调用周期由 session.gc_probability 和 session.gc_divisor 参数控制。 传入到此回调函数的 lifetime 参数由 session.gc_maxlifetime 设置。 此回调函数操作成功返回 TRUE,反之返回 FALSE。

create_sid当需要新的会话 ID 时被调用的回调函数。 回调函数被调用时无传入参数, 其返回值应该是一个字符串格式的、有效的会话 ID。

在使用该函数前,先把php.ini配置文件的session.save_handler选项设置为user,否则session_set_save_handler 不会生效。

编写一个session管理sessionManager,代码如下:

<?phpclassSessionManager {private $redis;private $sessionSavePath;private $sessionName;private $sessionExpireTime = 30;public function__construct(){$this->redis = newredis();$this->redis->connect('127.0.0.1',6379);$retval = session_set_save_handler(

[$this,'open'],[$this,'close'],[$this,'read'],[$this,'write'],[$this,'destroy'],[$this,'gc']

);session_start();

}public function open($path,$name){return true;

}public functionclose(){return true;

}public function read($id){$value = $this->redis->get($id);if($value){return $value;

}else{return '';

}

}public function write($id,$data){if($this->redis->set($id,$data)){$this->redis->expire($id,$this->sessionExpireTime);return true;

}return false;

}public function destroy($id){if($this->redis->delete($id)){return false;

}return false;

}public function gc($maxlifetime){return true;

}public function__destruct(){session_write_close();

}

}

SessionManager构造函数主要用来连接redis服务器,使用session_set_save_handler函数设置session函数回调,并调用session_start函数开始session功能。因为本例中open、close和gc回调的作用不大,所以直接返回true。

在write回调函数中,以SessionID作为key,把session的数据作为value存储到redis服务器,设置session的过期时间为30秒。在read回调函数中,以SessionID作为key从redis服务器中读取数据,并返回数据。而在destroy回调函数中,则以sessionID 作为key从redis服务器中删除对应的session数据。

使用时只需要包含SessionManager类,然后实例化一个SessionManager对象。下面例子使用SessionManager来管理session,首先创建一个session_set.php,输入代码如下:

include('SessionManager.php');newSessionManager();$_SESSION['username'] = 'newsession';

然后再建立一个sesion_get.php 文件代码如下:

include('SessionManager.php');newSessionManager();echo $_SESSION['username'];

测试时先访问 session_set.php 然后再访问 session_get.php

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

redis mysql 案例_redis 使用案例 的相关文章

  • NVIDIA安装驱动不成功的解决方式

    很多小朋友在重装或升级nvidia驱动时出现这样的错误 或是GeForce Experience安装不成功 如果排除了显示型号不对 系统没打补丁等原因 那么主要就是因为系统自动安装的驱动或是第三方安装的驱动赖在系统里 与你下载的新驱动产生冲
  • High-Resolution Image Synthesis with Latent Diffusion Models论文阅读+代码复现

    摘要 扩散模型在图像数据和其他数据上实现了最先进的合成结果 并且它的公式允许引导机制来控制图像生成的过程而无需重新训练 然而 这种模型直接在像素空间上操作 因此 功能强大的扩散模型通常需要花费大量的计算资源与推理时间 为了在有限的计算资源上
  • Elasticsearch6.4专题之杂记:遇到的异常与解决方案2

    11 lucene util BytesRefHash MaxBytesLengthExceededException bytes can be at most 32766 in length got 56965 解决方案 设置keywor
  • python界面怎么改颜色_Python界面怎么换颜色?求解!!!

    打开电脑 找到idle 并打开idle界面 打开之后默认经典的编码界面如下 白色背景 中文字体 字号也比较小 点击如图所示options选项 工具栏第五个按钮选择 这个按钮下方有一个configure idle选项 意思是配置idle 选中
  • SPI协议读写SD卡介绍

    前言 在前面的文章中 我们主要介绍了如何利用SDIO协议对SD卡进行读写操作的流程及注意事项 虽然SDIO协议读写SD卡的效率很高 但是 操作却比较麻烦 另外 还需要使用的芯片具有SDIO外设 这对于不具备SDIO外设的芯片而言 绝对是一个
  • 弱网测试用什么农_弱网测试方法整理

    说明 首先看一下其他文章对弱网测试的描述 弱网测试 属于健壮性测试的内容 为什么要做呢 现在IT行业飞速发展 各种APP都有 尤其是现在的人们更习惯在上下班的路上去关注一些新闻 看看股市 小说 直播 玩游戏等等 那么就会面临一个问题 在地铁
  • leetcode分类刷题:二叉树(一、简单的层序遍历)

    二叉树的深度优先遍历题目是让我有点晕 先把简单的层序遍历总结下吧 配合队列进行的层序遍历在逻辑思维上自然直观 不容易出错 102 二叉树的层序遍历 本题是二叉树的层序遍历模板 每次循环将一层节点出队 再将一层节点入队 也是所有可用层序遍历解
  • 小程序开发调用微信支付以及微信回调地址配置

    首先观看微信提供的文档 https pay weixin qq com wiki doc api wxa wxa api php chapter 7 3 index 1 清楚调用微信支付必须传递的参数 因为微信提供了小程序唤起微信支付的方法
  • emoji数据清洗

    在对微博等文本数据进行处理的时候发现以往的颜文字之外还会抓取到emoji数据 这部分虽然可以匹配到 但是经常挂一漏万 在网上检索到有一个emoji库可以使用 直接pip安装emoji库 import emoji import re def
  • Postman —— 配置环境变量

    PostMan是一套比较方便的接口测试工具 但我们在使用过程中 可能会出现创建了API请求 但API的URL会随着服务器IP地址的变化而改变 这样的情况下 如果每一个API都重新修改URL的话那将是非常的麻烦 所以PostMan中也提供环境
  • 第二届“移动云杯”大赛医疗行业应用子赛道答疑会成功召开

    为帮助参赛团队了解第二届 移动云杯 算力网络应用创新大赛的命题背景 作品立意 提高作品质量 9月13日 我们召开了第二届 移动云杯 大赛答疑会 特别针对医疗行业应用子赛道的赛题作讲解和答疑 赛题背景 随着科技的不断进步 精准医学技术得到了广
  • 使用C++搭配OpenGL写了一个RenderEngine

    最近在学习OpenGL 看书看的再多 也不如自己动手写一个来看看 耗时一个多月 由于才学不久 各位大佬勿喷 用到了glfw Imgui glm这几个库 整合的资源里都带了 相机类 ifndef CAMERA H define CAMERA
  • 鉴源实验室

    作者 李伟 上海控安安全测评部总监 来源 鉴源实验室 社群 添加微信号 TICPShanghai 加入 上海控安51fusa安全社区 引言 上一篇开始我们介绍白盒的代码结构覆盖率测试 已经完成了语句覆盖测试的讲解 本篇我们介绍分支覆盖 01
  • Linux脚本实战之猜数字

    Linux脚本实战之猜数字 一 脚本要求 二 脚本示例一 三 脚本示例二 一 脚本要求 1 系统环境为RHEL8 0 2 脚本生成一个100以内的随机数 提示用户猜数字 3 根据用户的输入 提示猜对了 猜大了或猜小了 直到用户猜对为止 二
  • 使用构建Docker镜像的方式部署Vue+node项目

    目录 一 安装镜像 二 创建Dockerfile文件构建容器 1 添加Dockerfile文件 2 上传文件 3 构建镜像 4 运行容器 三 如何优化 Docker 镜像 准备工作 电脑安装了node js 配置了vue cli 环境 远程
  • windows驱动开发3:第一个驱动及调试

    一 创建项目 新建一个以Kernel Mode Driver Empty KMDF 为模板的驱动项目 项目名称HelloDriver 在项目中新建一个hello cpp文件作为驱动入口文件 写一点简单的代码做测试 hello cpp代码 i
  • python基于图像颜色的火焰识别

    本文基于图像颜色 主要结合RGB和HSI两种判断依据进行火焰识别 判断依据参考了以下文章 实在是非常感谢 OpenCV学习记录之视频中的火焰检测识别 python版基于颜色的火焰识别 判断条件如下 R gt redThre R gt G g
  • 数据竞赛专题

    为了帮助更多竞赛选手入门进阶比赛 通过数据竞赛提升理论实践能力和团队协作能力 DataFountain 和 Datawhale 联合邀请了数据挖掘 CV NLP领域多位竞赛大咖 将从赛题理解 数据探索 数据预处理 特征工程 模型建立与参数调
  • mmcv读取配置文件,在windows上无法创建临时文件解决方法

    报错是写入 盘的Temp没有权限 因此修改到其他目录 在config中修改以下两个函数 def substitute predefined vars filename temp config name file dirname osp di

随机推荐

  • 用工厂模式管理多个solidity智能合约

    我们写了一份小的计算合约作为Hello World 如果我们可以创建一个允许用户创建自己的计数器的合约怎么办 让我们创建我们的合约CounterFactory 它将管理所有其他计数器Counters 它将包含一个映射 将所有者与其计数器合约
  • captcha验证码入门

    kaptcha是一个简单易用的验证码生成工具 而且支持中文 你还可以配置其很多属性 用法 1 首先到http code google com p kaptcha downloads list把压缩文件下下来 然后把里面的jar文件加到自己的
  • 项目一:用OpenCV识别银行卡号

    import cv2 def sort contours cnts method left to right reverse False i 0 if method right to left or method bottom to top
  • 阿里巴巴的数据库连接池 druid 优点

    阿里的 druid 它不仅仅是一个数据库连接池 它还包含一个ProxyDriver 一系列内置的JDBC组件库 一个SQL Parser Druid 相对于其他数据库连接池的优点 1 强大的监控特性 通过Druid提供的监控功能 可以清楚知
  • 凯恩帝数控系统面板介绍_凯恩帝数控车床操作面板按钮详解!

    KND1TB数控系统操作 在 视图 下拉菜单或者浮动菜单中选择 控制面板切换 后 数控系统操作键盘会出现在视窗的右上角 其左侧为数控系统显示屏 如下图所示 用操作键盘结合显示屏可以进行数控系统操作 KND1TB 输入面板 按键介绍 数字键
  • 黑苹果系统--Parallels Desktop虚拟机使用

    1 挂载外部磁盘到windows虚拟机 1 通过USB将外部磁盘连接至Mac 2 在虚拟机配置窗口中 选择 Hardware gt Add gt Hard Disk 3 在 Type 菜单中选择 Physical Disk 并在 Locat
  • Linux EOIP — 二层协议

    一 协议介绍 EOIP是一个 MikroTik的 Linux使用 TAP的 EoIP EoIPv6隧道的实现 EoIP Ethernet over IP 和 EoIPv6 Ethernet over IPv6 是 MikroTik Rout
  • MATLAB---同态滤波

    同态滤波 clc clear close all 清理命令区 清理工作区 关闭显示图形 warning off 消除警告 feature jit off 加速代码运行 tic filename pathname uigetfile bmp
  • 如何确定自己的科研课题?

    许多研究生刚入学的时候对科研都是一头雾水 不知道文献如何检索 不知道科研该如何发展 总有一段很长的时间在惆怅着我究竟该做些什么 而在写科研论文 确定科研选题就是第一步 那么 到底如何才能确定自己的科研课题呢 本文主要为大家分享以下三点 选题
  • 手把手_下载与安装Ubuntu_18.04_Linux系统

    1 下载Ubuntu镜像文件 1 找到官网 Ubuntu官网 注 不想了解官网的 请直接跳到清华镜像网 2 找到下载入口 如果您要下载最新版本的系统 就直接点击download 1 但是本文以18 04版本为例 故此 点击2处 3 找到国内
  • Python(7)

    Python 7 目录 Python 7 函数 全局变量与局部变量 文件 错误与异常 finally 函数 python的函数使用def定义 def add a b return a b def multiply a b return a
  • ESP8266连接 TCP

    AT GMR查看固件版本 v1 0以上固件命令如下 恢复到初始状态 AT RESTORE 设置WiFi应用模式为Station和Server共存模式 AT CWMODE 3 连接路由器 SSID为路由器用户名 Password为密码 AT
  • cocosCreator 物理关节组件

    cocosCreator 物理关节组件 重点 距离关节 旋转关节 绳子关节 轮子关节 焊接关节 棱柱关节 马达关节 重点 开启物理系统 物理系统默认是关闭的 如果需要使用物理系统 那么首先需要做的事情就是开启物理系统 否则你在编辑器里做的所
  • 如何在WPS、Word里插入高亮代码块

    需要使用Notepad step1 我们首先需要在Notepad 里安装好NppExport插件 步骤如下 第1步 打开 插件管理 第2步 搜索并安装 NppExport 插件 安装后 在已安装界面如下图所示 step2 然后将代码复制在N
  • ws协议与http协议的异同_websocket和http的区别

    websocket和http的区别 1 WebSocket是双向通信协议 模拟Socket协议 可以双向发送或接受信息 而HTTP是单向的 2 WebSocket是需要浏览器和服务器握手进行建立连接的 而http是浏览器发起向服务器的连接
  • 企业运维经典面试题汇总(2)

    1 写一个脚本查找最后创建时间是三天前 后缀是 log的文件并删除 find ctime 3 name log rm rf 2 统计ip访问情况 要求分析nginx访问日志 找出访问页面数量在前十位的ip cat access log aw
  • IDEA-Docker配置CA证书和远程访问

    前言 为了优化idea docker部署 防止自己服务器端口2375被黑 这里简单介绍一下idea docker的ca证书配置 1 新建一个脚本docker ca sh 将下面的脚本复制进去 注意修改一下docker主机ip 创建 Dock
  • spring boot org.springframework.context.annotation.ConflictingBeanDefinitionException

    org springframework context annotation ConflictingBeanDefinitionException 分析接解决方法 错误信息 分析接解决方法 annotation ConflictingBea
  • [从零开始学DeepFaceLab-10]: 使用-命令行八大操作步骤-第6步:模型的选择与训练 - 模型训练

    目录 总体流程 步骤6 模型的选择与训练 模型训练命令 6 1 命令 6 train Quick96 bat 适用CPU only情形以及快速学习 必需之一
  • redis mysql 案例_redis 使用案例

    1 使用redis消息列队发布信息 在一些用户创造用户的应用中 如SNS 微博 可能出现1秒有上千万个用户同时发布消息的情况 此时如果使用mysql可能出现 too many connections 错误 当然 把mysql的max con