Redis基础特性及应用练习-php

news2024/11/27 0:29:28

redis持久化(persistence)

redis支持两种方式的持久化,可以单独使用或者结合起来使用。

第一种:RDB方式(redis默认的持久化方式)

rdb方式的持久化是通过快照完成的,当符合一定条件时redis会自动将内存中的所有数据执行快照操作并存储到硬盘上。默认存储在dump.rdb文件中。(文件名在配置文件中dbfilename)
redis进行快照的时机(在配置文件redis.conf中)

save 900 1  //表示900秒内至少一个键被更改则进行快照。
save 300 10  //表示300秒内10条被更改则快照
save 60 10000  //60秒内10000条

第二种:AOF方式

aof方式的持久化是通过日志文件的方式。默认情况下redis没有开启aof,可以通过参数appendonly参数开启。

appendonly yes

aof文件的保存位置和rdb文件的位置相同,都是dir参数设置的,默认的文件名是appendonly.aof,可以通过appendfilename参数修改

appendfilename appendonly.aof

redis写命令同步的时机

appendfsync always 每次都会执行
appendfsync everysec 默认 每秒执行一次同步操作(推荐,默认)
appendfsync no不主动进行同步,由操作系统来做,30秒一次

宝塔设置:
在这里插入图片描述

redis中键的生存时间(expire)

class Myredis{
	protected $redis;

    public function __construct() {
    	//实例化Redis类
		$redis = new Redis();
		//选择指定的redis数据库连接,默认端口号为6379
		$redis->connect('127.0.0.1',6379);
		$this->redis = $redis;
    }

    public function expire(string $name,int $expire){
    	$this->redis->expire($name, $expire);
		// $redis->ttl(‘foo’); //返回有效期值1s
		// $redis->expire(‘foo’); //取消expire行为
    }
}
$redis = new Myredis();
$redis->expire("name",10);	//(单位/秒)

redis的事务(transaction)

    public function transaction(){
    	//Redis 事务的本质是一组命令的集合。事务支持一次执行多个命令,一个事务中所有命令都会被序列化。在事务执行过程,会按照顺序串行化执行队列中的命令,其他客户端提交的命令请求不会插入到事务执行命令序列中。
    	/**
    	//1 Redis事务没有隔离级别
		$this->redis->multi();
		$this->redis->decrby("number",10);
		//发送 EXEC 命令前被放入队列缓存,并不会被实际执行,也就不存在事务内的查询要看到事务里的更新,事务外查询不能看到。
    	if($this->redis->get("number") < 0){
    		return $this->redis->discard();
    	}
    	$this->redis->incrby("number2",10);
    	$this->redis->exec();	//number:-10, number2:10
    	*/

		/**
    	//2 Redis不保证原子性
    	//Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。事务中任意命令执行失败,其余的命令仍会被执行。
    	$this->redis->multi();
		$this->redis->decrby("number",10);
		$this->redis->incrby("number2",10,21,321);	//err
		$this->redis->incrby("number3",10);
		$this->redis->exec(); //number:-10, number3: 10
		//Redis中,单条命令是原子性执行的,但事务不保证原子性,且没有回滚。
		*/

		// Watch 命令用于监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断
		$this->redis->watch('number');
		sleep(10);	//期间改掉number,下面的命令都不会执行
		$this->redis->multi();
		$this->redis->set('favorite_fruit','cherry');
		$this->redis->incrBy('number',3);
		$this->redis->exec();

    }
    $redis->transaction();

发布/订阅

//调用
public function Publish_Subscribe(){
   	//通过订阅/发布,添加数据库数据。 tb_people表
   	$channelName = "tb_people";
	//向指定频道发送消息
	try {
	    $redis = new Redis();
	    $redis->connect('127.0.0.1', 6379);
	    for ($i=0;$i<5;$i++){
	        $data = array('name' => 'key'.$i);
	        $ret = $redis->publish($channelName, json_encode($data));
	        print_r($ret);
	    }
	} catch (Exception $e){
	    echo $e->getMessage();
	}
}

xxxx.php:单独起个php文件,订阅信息

<?php
//设置php脚本执行时间
set_time_limit(0);
//设置socket连接超时时间
ini_set('default_socket_timeout', -1);

$servername = "localhost";
$username = "root";
$password = "root";
try {
    $conn = new PDO("mysql:host=$servername;dbname=my_mysql;port=3306", $username, $password);
    // echo "连接成功";
}catch(PDOException $e){
    echo $e->getMessage();
}

//声明测试频道名称
$channelName = "tb_people";
try {
    $redis = new Redis();
    //建立一个长链接
    $redis->pconnect('127.0.0.1', 6379);
    //阻塞获取消息
    $redis->subscribe(array($channelName), function ($redis, $chan, $msg) use($conn){
        // echo "channel:".$chan.",message:".$msg."\n";
        $arr_msg = json_decode($msg,true);
        $sqlquery = "INSERT INTO tb_people (name) 
		VALUES ('".$arr_msg['name']."')";
		$conn->query($sqlquery);
		echo "成功";
    });
} catch (Exception $e){
    echo $e->getMessage();
}
mysql_close($con);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/979878.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Ansible playbook简介与初步实战,实现批量机器应用下载与安装

一.Ansible playbook简介 playbook是ansible用于配置&#xff0c;部署&#xff0c;和管理被节点的剧本通过playbook的详细描述&#xff0c;执行其中的一些列tasks&#xff0c;可以让远端的主机达到预期的状态。playbook就像ansible控制器给被控节点列出的一系列to-do-list&…

webpack(四)plugin

定义 和loader的区别 loader:文件加载器&#xff0c;能够加载资源&#xff0c;并对这些文件进行一些处理&#xff0c;诸如编译、压缩等&#xff0c;最终一起打包到指定的文件中。plugin:赋予了webpack各种灵活的功能&#xff0c;例如打包优化、资源管理、环境变量注入等&…

【c++ debug】cmake编译报错 No such file or directory

1. 报错&#xff1a;error while loading shared libraries: libprotoc.so.24: cannot open shared object file: No such file or directory 问题原因&#xff1a;找不到动态库 解决方法&#xff1a;添加动态库路径 export LD_LIBRARY_PATH$LD_LIBRARY_PATH:/your/protobuf/l…

企业架构LNMP学习笔记18

nginx的日志&#xff1a; 日志类型&#xff1a; access.log 访问日志、查看统计用户的访问信息&#xff0c;流量。 error.log 错误日志&#xff0c;错误信息&#xff0c;重写信息。 access.log日志文件内容示例&#xff1a; 192.168.17.1 - - [06/Sep/2023:20:37:39 0800] …

莫迪会见英伟达ceo黄仁勋:印度在人工智能领域的巨大潜力

据外媒报道&#xff0c;印度总理纳伦德拉莫迪&#xff08;Narendra Modi&#xff09;于9月5日晚上会见了英伟达创始人兼首席执行官&#xff08;CEO&#xff09;黄仁勋&#xff0c;讨论了印度在人工智能&#xff08;AI&#xff09;领域的巨大潜力。这是莫迪和黄仁勋的第二次会面…

LC2335. 装满杯子需要的最短总时长(JAVA)

装满杯子需要的最短总时长 题目描述递归法代码演示数学法代码演示 题目描述 难度 - 简单 Leetcode - 2335. 装满杯子需要的最短总时长 现有一台饮水机&#xff0c;可以制备冷水、温水和热水。每秒钟&#xff0c;可以装满 2 杯 不同 类型的水或者 1 杯任意类型的水。 给你一个下…

通过wordpress 自定义主题的额外CSS删除指定区块

最近用wordpress建站&#xff0c;想要删除指定区块&#xff0c;发现相关的教程蛮少的&#xff0c;作为小白的我搜了相关教程&#xff0c;好像没找到&#xff0c;只能自己慢慢摸索了&#xff0c;看了很多&#xff0c;终于尝试实现了&#xff0c;特记录下&#xff0c;免得自己忘了…

国美零售上半年几乎“全军覆没”,黄光裕回归后的至暗时刻

在黄光裕“回归”的900天之后&#xff0c;国美零售&#xff08;00493&#xff09;迎来了有史以来最为艰难的至暗时刻&#xff0c;营收同比暴跌超96%&#xff0c;股价为0.053港元&#xff0c;市值仅剩25.79亿港股。 2023年8月31日&#xff0c;国美零售发布了2023年上半年财报。报…

深入研究 Spring Cloud 和 Dubbo

什么是 SpringCloud Spring Cloud 框架为开发人员提供了快速构建健壮云应用程序的工具。我们还可以构建基于微服务的应用程序&#xff0c;例如配置管理、服务发现、断路器、智能路由、集群状态、微代理、控制总线、一次性令牌等。使用 Spring Cloud&#xff0c;开发人员可以快…

F5负载均衡融入新理念,全栈分布式云可持续发展

伴随企业上云速度加快&#xff0c;市场对云计算不断提出更高要求&#xff0c;中国分布式云计算发展进入实践落地阶段。作为一个因负载均衡而闻名的公司&#xff0c;F5紧密关注“加快建设数字中国”“加快发展方式绿色转型”等重大战略&#xff0c;积极探索分布式云计算的发展的…

使用Python实现二维应力云图

要画应力分布云图&#xff0c;可以使用Python中的科学计算和可视化库来实现 import numpy as np import matplotlib.pyplot as plt# 生成示例数据 x np.linspace(0, 10, 100) # X轴数据范围 y np.linspace(0, 5, 50) # Y轴数据范围 X, Y np.meshgrid(x, y) # 生成网…

2001-2022年上市公司供应链研究数据大全

2001-2022年上市公司供应链研究数据大全 1、时间&#xff1a;2001-2022年 2、指标&#xff1a; 供应链集中度指标、第一大客户销售额、前五大客户销售额、第一大供应商采购额、前五大供应商采购额、营业总收入、第一大客户销售额占总销售额比率、第一大供应商采购额 占总采购…

axmol引擎支持构建WASM了,非常简单

自axmol-2.0.0-rc6起&#xff0c;axmol引擎带了了实验性的wasm构建支持&#xff0c;提供简单易用的命令即可构建wasm应用在浏览器上跑&#xff0c;具体步骤&#xff1a; 下载最新引擎仓库&#xff0c;git clone https://github.com/axmolengine/axmol 并进入引擎根目录Windows…

git修改默认分支

git checkout 分支 切换到当前分支 git branch --set-upstream-toorigin/complete(远程分支名) 设置当前分支的上游分支为远程分支complete git branch --unset-upstream master 取消master上游分支的身份 现在&#xff0c;使用git commit&#xff0c;git push 命令可以直接…

【数学建模竞赛】评价类赛题常用算法解析

解析常见的评价类算法 常见的评价类算法 层次分析法 层次分析法&#xff08;Analytic Hierarchy Process&#xff0c;简称AHP&#xff09;是一种主观赋值评价方法&#xff0c;由美国运筹学家Saaty于20世纪70年代初期提出。该方法将与决策有关的元素分解成目标、准则、方案等多…

C++的向上转型

在 C/C++ 中经常会发生数据类型的转换,例如将 int 类型的数据赋值给 float 类型的变量时,编译器会先把 int 类型的数据转换为 float 类型再赋值;反过来,float 类型的数据在经过类型转换后也可以赋值给 int 类型的变量。 数据类型转换的前提是,编译器知道如何对数据进行取舍…

TreeList 的 增加、删除节点-----DevExpress

private void FrmDictionaryManaged_Load(object sender, EventArgs e){// treeList1.DataSource CreateDataTable();treeList2.DataSource CreateTreeList();// 绑定TreeList控件到数据源treeList1.DataSource GetData();treeList1.KeyFieldName "ID";treeList1.…

【Python小项目之Tkinter应用】Python的GUI库Tkinter实现随机点名工具或抽奖工具并封装成.exe可执行文件

文章目录 一、项目背景二、需求分析UI界面设计如下&#xff1a;具体需求如下&#xff1a; 二、实现思路三、项目关键代码读取excel中的人员名单实现随机滚动抽取主函数中Tkinter的界面相关操作实现窗口相关背景图设置组件相关 完整代码 四、将程序封装成.exe可执行文件将代码转…

【C++基础】6. 常量

文章目录 【 1. 常量的分类 】1.1 整型常量1.2 浮点常量1.3 字符常量1.4 字符串常量1.5 布尔常量 【 2. 常量的定义 】2.1 #define 预处理器2.2 const 关键字 常量 是固定值&#xff0c;在程序执行期间不会改变。这些固定的值&#xff0c;又叫做字面量。常量可以是任何的基本数…

Linux C进程间通信(IPC)

概述 每个进程有独立的进程空间&#xff1a; 好处————安全 缺点&#xff1a;开销大&#xff08;独立的地址空间&#xff09;&#xff1b;进程的通信更加困难&#xff08;对其他进程的操作开销也大&#xff09; 广义上的进程间通信&#xff1a; A进程写给文件/数据库&am…