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


    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条
    
    • 1
    • 2
    • 3

    第二种:AOF方式

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

    appendonly yes
    
    • 1

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

    appendfilename appendonly.aof
    
    • 1

    redis写命令同步的时机

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

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

    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);	//(单位/秒)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    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();
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35

    发布/订阅

    //调用
    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();
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    xxxx.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);
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
  • 相关阅读:
    SpringBoot统一封装controller层返回的结果
    Apache的安装与目录结构详细解说
    vs调试技巧(详细)
    【Flutter】widgets (1) 组件概述 widget tree 常见的widgets
    Python 解析器BeautifulSoup4
    Vue.js的快速入门(Vue、axios、node、js、npm、wepback的快速入门)
    推特群推掀开营销新篇章
    如何控制MySQL事务提交后,刷redo-log的策略?
    【Python基础入门5】关于数据类型
    蓝桥杯刷题(六)
  • 原文地址:https://blog.csdn.net/hgb24660/article/details/121999710