PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法

这篇具有很好参考价值的文章主要介绍了PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

PHP使用Redis实战实录系列

  • PHP使用Redis实战实录1:宝塔环境搭建、6379端口配置、Redis服务启动失败解决方案
  • PHP使用Redis实战实录2:Redis扩展方法和PHP连接Redis的多种方案
  • PHP使用Redis实战实录3:数据类型比较、大小限制和性能扩展
  • PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法

PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法,漏刻有时,php,php,redis,单例模式

为了应对不同的场景,redis分为是单机模式、主从模式、哨兵模式、集群模式四种模式。

  1. 单机模式(Standalone Mode):单机模式是最基本的 Redis 运行模式,它在单个实例上运行,不涉及复杂的集群配置。它被广泛用于开发和测试环境。

  2. 主从复制模式(Master-Slave Replication):主从复制模式通过将一个 Redis 实例设为主节点(Master)和一个或多个 Redis 实例设为从节点(Slave),实现数据的复制和备份。主节点负责写操作,而从节点复制主节点的数据,可以用于读操作或故障转移。

  3. 哨兵模式(Redis Sentinel Mode):Sentinel 是 Redis 提供的一个高可用解决方案,它通过在主从复制模式的基础上添加 Sentinel 进程来实现自动故障检测和故障切换。Sentinel 进程监视主节点和从节点的状态,并在主节点故障时自动将从节点升级为主节点。

  4. Cluster 模式(Redis Cluster Mode):集群模式是 Redis 最常用的分布式解决方案,它将多个 Redis 节点组成一个集群,每个节点负责存储一部分数据,并在节点之间自动进行数据分片和数据迁移。集群模式提供了高扩展性和高可用性。

这些运行模式可以根据需求选择合适的方案来使用 Redis,例如在开发和测试环境中使用单机模式,生产环境中使用主从复制或集群模式来提供高可用性和横向扩展能力。

一、单例模式

在 PHP 中使用 Redis 的单例模式可以确保在应用程序中只创建一个 Redis 连接实例,以便在多个地方共享该连接。

下面是一个简单的示例,展示如何使用单例模式实现 Redis 连接:

面对对象封装类(1)

class RedisSingleton
{
    private static $instance;
    private static $redis;

    private function __construct()
    {
        self::$redis = new Redis();
        self::$redis->connect('127.0.0.1', 6379);
        // 进行其他 Redis 相关的初始化操作
    }

    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new RedisSingleton();
        }
        return self::$instance;
    }

    public function getRedis()
    {
        return self::$redis;
    }
}

// 在应用程序中使用 Redis 单例模式
$redisSingleton = RedisSingleton::getInstance();
$redis = $redisSingleton->getRedis();

// 使用 $redis 进行操作,例如 $redis->get('key')、$redis->set('key', 'value') 等

面对对象封装类(2)

将redis变量放在配置文件,进行整体调用;

/*
 *  Redis操作类
 *  单例+支持长连接 模式
 */

class RedisSingleton
{
    const REDISTIMEOUT = 0; //超时
    private static $_instance = []; //类单例数组
    private $hash;
    private $redis; //redis连接句柄

    private function __construct($redis_config = [])
    {

        $this->redis = new Redis();
        $this->hash = $redis_config["redis_db"];

        if ($redis_config["redis_pconnect"]) {
            $this->redis->pconnect($redis_config["redis_host"], $redis_config["redis_port"], self::REDISTIMEOUT);
        } else {
            $this->redis->connect($redis_config["redis_host"], $redis_config["redis_port"], self::REDISTIMEOUT);
        }
        //设置连接密码
        if ($redis_config["redis_auth"]) {
            $this->redis->auth($redis_config["redis_auth"]);
        }
        //选择库 0-15
        $this->redis->select($this->hash);
    }

    //外部获取实例
    public static function getInstance($redis_config)
    {
        if (!isset(self::$_instance[$redis_config["redis_db"]])) {
            self::$_instance[$redis_config["redis_db"]] = new self($redis_config);
        }

        //防止挂掉
        try {
            self::$_instance[$redis_config["redis_db"]]->Ping() == 'Pong';
        } catch (Exception $e) {
            throw new Exception("连接错误");
        }
        return self::$_instance[$redis_config["redis_db"]];
    }

    //获取redis的连接实例
    public function getRedisConnect()
    {
        return $this->redis;
    }

    public function __call($method, $args)
    {
        return call_user_func_array([$this->redis, $method], $args);
    }


    /**
     * 关闭单例时做清理工作
     */
    public function __destruct()
    {
        $key = $this->hash;
        $this->redis->close();
        self::$_instance[$key] = null;
    }

    private function __clone()
    {
    }
}

$redis_config = [
    "redis_host" => "127.0.0.1",
    "redis_port" => "6379",
    "redis_db" => 0,
    "redis_auth" => "kYABzc8u3zNs7cq",
    "redis_pconnect" => 0
];

$redis = RedisSingleton::getInstance($redis_config);
$redis->set("hello", "world1");

在上述示例中,RedisSingleton 类的 getInstance 方法返回一个 Redis 单例实例。当需要使用 Redis 连接时,可以调用 getRedis 方法获取该实例的 Redis 连接对象。

通过这种方式,无论在应用程序中的哪个位置需要使用 Redis,都可以共享同一个 Redis 连接实例,避免了重复创建连接的开销。

二、面向过程操作Redis

1.php连接redis

/*1.Connection*/
$redis = new Redis();
$redis->connect('127.0.0.1',6379,1);//短链接,本地host,端口为6379,超过1秒放弃链接
$redis->open('127.0.0.1',6379,1);//短链接(同上)
$redis->pconnect('127.0.0.1',6379,1);//长链接,本地host,端口为6379,超过1秒放弃链接
$redis->popen('127.0.0.1',6379,1);//长链接(同上)
$redis->auth('password');//登录验证密码,返回【true | false】
$redis->select(0);//选择redis库,0~15 共16个库
$redis->close();//释放资源
$redis->ping(); //检查是否还再链接,[+pong]
$redis->ttl('key');//查看失效时间[-1 | timestamps]
$redis->persist('key');//移除失效时间[ 1 | 0]
$redis->sort('key',[$array]);//返回或保存给定列表、集合、有序集合key中经过排序的元素,$array为参数limit等 [array|false]

2.共性的运算归类

/*2.共性的运算归类*/
$redis->expire('key',10);//设置失效时间[true | false]
$redis->move('key',15);//把当前库中的key移动到15库中[0|1]
//string
$redis->strlen('key');//获取当前key的长度
$redis->append('key','string');//把string追加到key现有的value中[追加后的个数]
$redis->incr('key');//自增1,如不存在key,赋值为1(只对整数有效,存储以10进制64位,redis中为str)[new_num | false]
$redis->incrby('key',$num);//自增$num,不存在为赋值,值需为整数[new_num | false]
$redis->decr('key');//自减1,[new_num | false]
$redis->decrby('key',$num);//自减$num,[ new_num | false]
$redis->setex('key',10,'value');//key=value,有效期为10秒[true]
//list
$redis->llen('key');//返回列表key的长度,不存在key返回0, [ len | 0]
//set
$redis->scard('key');//返回集合key的基数(集合中元素的数量)。[num | 0]
$redis->sMove('key1', 'key2', 'member');//移动,将member元素从key1集合移动到key2集合。[1 | 0]
//Zset
$redis->zcard('key');//返回集合key的基数(集合中元素的数量)。[num | 0]
$redis->zcount('key',0,-1);//返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员。[num | 0]
//hash
$redis->hexists('key','field');//查看hash中是否存在field,[1 | 0]
$redis->hincrby('key','field',$int_num);//为哈希表key中的域field的值加上量(+|-)num,[new_num | false]
$redis->hlen('key');//返回哈希表key中域的数量。[ num | 0]
 

3.Redis服务器操作

/*3.Server*/
$redis->dbSize();//返回当前库中的key的个数
$redis->flushAll();//清空整个redis[总true]
$redis->flushDB();//清空当前redis库[总true]
$redis->save();//同步??把数据存储到磁盘-dump.rdb[true]
$redis->bgsave();//异步??把数据存储到磁盘-dump.rdb[true]
$redis->info();//查询当前redis的状态 [verson:2.4.5....]
$redis->lastSave();//上次存储时间key的时间[timestamp]
$redis->watch('key','keyn');//监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断 [true]
$redis->unwatch('key','keyn');//取消监视一个(或多个) key [true]
$redis->multi(Redis::MULTI);//开启事务,事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令在一个原子时间内执行。
$redis->multi(Redis::PIPELINE);//开启管道,事务块内的多条命令会按照先后顺序被放进一个队列当中,最后由 EXEC 命令在一个原子时间内执行。
$redis->exec();//执行所有事务块内的命令,;【事务块内所有命令的返回值,按命令执行的先后顺序排列,当操作被打断时,返回空值 false】

4.String增删改操作

/*4.String,键值对,创建更新同操作*/
$redis->setOption(Redis::OPT_PREFIX,'hf_');//设置表前缀为hf_
$redis->set('key',1);//设置key=aa value=1 [true]
$redis->mset($arr);//设置一个或多个键值[true]
$redis->setnx('key','value');//key=value,key存在返回false[|true]
$redis->get('key');//获取key [value]
$redis->mget($arr);//(string|arr),返回所查询键的值
$redis->del($key_arr);//(string|arr)删除key,支持数组批量删除【返回删除个数】
$redis->delete($key_str,$key2,$key3);//删除keys,[del_num]
$redis->getset('old_key','new_value');//先获得key的值,然后重新赋值,[old_value | false]

5.List增删改操作

/*5.List栈的结构,注意表头表尾,创建更新分开操作*/
$redis->lpush('key','value');//增,只能将一个值value插入到列表key的表头,不存在就创建 [列表的长度 |false]
$redis->rpush('key','value');//增,只能将一个值value插入到列表key的表尾 [列表的长度 |false]
$redis->lInsert('key', Redis::AFTER, 'value', 'new_value');//增,将值value插入到列表key当中,位于值value之前或之后。[new_len | false]
$redis->lpushx('key','value');//增,只能将一个值value插入到列表key的表头,不存在不创建 [列表的长度 |false]
$redis->rpushx('key','value');//增,只能将一个值value插入到列表key的表尾,不存在不创建 [列表的长度 |false]
$redis->lpop('key');//删,移除并返回列表key的头元素,[被删元素 | false]
$redis->rpop('key');//删,移除并返回列表key的尾元素,[被删元素 | false]
$redis->lrem('key','value',0);//删,根据参数count的值,移除列表中与参数value相等的元素count=(0|-n表头向尾|+n表尾向头移除n个value) [被移除的数量 | 0]
$redis->ltrim('key',start,end);//删,列表修剪,保留(start,end)之间的值 [true|false]
$redis->lset('key',index,'new_v');//改,从表头数,将列表key下标为第index的元素的值为new_v, [true | false]
$redis->lindex('key',index);//查,返回列表key中,下标为index的元素[value|false]
$redis->lrange('key',0,-1);//查,(start,stop|0,-1)返回列表key中指定区间内的元素,区间以偏移量start和stop指定。[array|false]

6.set增删改操作


/*6.Set,没有重复的member,创建更新同操作*/
$redis->sadd('key','value1','value2','valuen');//增,改,将一个或多个member元素加入到集合key当中,已经存在于集合的member元素将被忽略。[insert_num]
$redis->srem('key','value1','value2','valuen');//删,移除集合key中的一个或多个member元素,不存在的member元素会被忽略 [del_num | false]
$redis->smembers('key');//查,返回集合key中的所有成员 [array | '']
$redis->sismember('key','member');//判断member元素是否是集合key的成员 [1 | 0]
$redis->spop('key');//删,移除并返回集合中的一个随机元素 [member | false]
$redis->srandmember('key');//查,返回集合中的一个随机元素 [member | false]
$redis->sinter('key1','key2','keyn');//查,返回所有给定集合的交集 [array | false]
$redis->sunion('key1','key2','keyn');//查,返回所有给定集合的并集 [array | false]
$redis->sdiff('key1','key2','keyn');//查,返回所有给定集合的差集 [array | false]
 

7.Zset增删改操作

/*7.Zset,没有重复的member,有排序顺序,创建更新同操作*/
$redis->zAdd('key',$score1,$member1,$scoreN,$memberN);//增,改,将一个或多个member元素及其score值加入到有序集key当中。[num | 0]
$redis->zrem('key','member1','membern');//删,移除有序集key中的一个或多个成员,不存在的成员将被忽略。[del_num | 0]
$redis->zscore('key','member');//查,通过值反拿权 [num | null]
$redis->zrange('key',$start,$stop);//查,通过(score从小到大)【排序名次范围】拿member值,返回有序集key中,【指定区间内】的成员 [array | null]
$redis->zrevrange('key',$start,$stop);//查,通过(score从大到小)【排序名次范围】拿member值,返回有序集key中,【指定区间内】的成员 [array | null]
$redis->zrangebyscore('key',$min,$max[,$config]);//查,通过scroe权范围拿member值,返回有序集key中,指定区间内的(从小到大排)成员[array | null]
$redis->zrevrangebyscore('key',$max,$min[,$config]);//查,通过scroe权范围拿member值,返回有序集key中,指定区间内的(从大到小排)成员[array | null]
$redis->zrank('key','member');//查,通过member值查(score从小到大)排名结果中的【member排序名次】[order | null]
$redis->zrevrank('key','member');//查,通过member值查(score从大到小)排名结果中的【member排序名次】[order | null]
$redis->ZINTERSTORE();//交集
$redis->ZUNIONSTORE();//差集

8.Hash表结构增删改操作


/*8.Hash,表结构,创建更新同操作*/
$redis->hset('key','field','value');//增,改,将哈希表key中的域field的值设为value,不存在创建,存在就覆盖【1 | 0】
$redis->hget('key','field');//查,取值【value|false】
$arr = array('one'=>1,2,3);$arr2 = array('one',0,1);
$redis->hmset('key',$arr);//增,改,设置多值$arr为(索引|关联)数组,$arr[key]=field, [ true ]
$redis->hmget('key',$arr2);//查,获取指定下标的field,[$arr | false]
$redis->hgetall('key');//查,返回哈希表key中的所有域和值。[当key不存在时,返回一个空表]
$redis->hkeys('key');//查,返回哈希表key中的所有域。[当key不存在时,返回一个空表]
$redis->hvals('key');//查,返回哈希表key中的所有值。[当key不存在时,返回一个空表]
$redis->hdel('key',$arr2);//删,删除指定下标的field,不存在的域将被忽略,[num | false]

@漏刻有时文章来源地址https://www.toymoban.com/news/detail-619495.html

到了这里,关于PHP使用Redis实战实录4:单例模式和面向过程操作redis的语法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • php 单例模式

    1,单例模式,属于创建设计模式,简单来说就是一个类只能有一个实例化对象,并提供一个当前类的全局唯一可访问入口; 2,例子  可继承的单例模式:

    2024年02月15日
    浏览(29)
  • 实战 php 使用 wkhtmltopdf 生成pdf的全过程

    公司里边有生成pdf报告的业务需求,之前有过尝试用tcpdf,直接生成的pdf的过程,但是pdf报告的内容数据,根据不同内容的变化,都是各种各样的bug,一直处理修修补补的状态,让后台开发人员很是头疼. 经过思索和甄选,总结出我们的业务中是由于样式不可控导致的,当时从逻辑上就思考

    2024年02月02日
    浏览(60)
  • java的面向对象编程(oop)——static概述及初始单例设计模式

    过了入门阶段,开始学习进阶语法了。每天进步一点点,打好基础,daydayup! 什么是面向对象编程(oop),可以看这篇 java的面向对象编程(oop)概述及案例  static的意思为静态,用于修饰成员变量及成员方法。 成员变量根据有无static可以分为两种 ——类变量及实例变量 1,类

    2024年01月19日
    浏览(53)
  • 设计模式学习笔记 - 面向对象 - 3.面向对象比面向过程有哪些优势?面向过程真的过时了吗?

    在过往的工作中,我发现很多人搞不清面向对象和面向过程的区别,总认为使用面向对象编程语言来开发,就是在面向面向对象编程了。而实际上,他们只是在用面向对象编程语言,编写面向过程风格的代码而已,并没有发挥面向对象编程的优势。这就相当于手握一把屠龙刀

    2024年02月22日
    浏览(49)
  • 【WinForm】C#实现商场收银软件,从面向过程到面向对象,设计模式的应用

    实现商场收银系统从简单的面向过程到面向对象的演变。 最容易想到的: 单价*数量=总价 根据输入的单价和数量,直接计算,将结果显示在listbox控件中。 重置按钮可以清零。 1、运行效果 2、界面设计 3、代码 版本2在版本1的基础上增加了打折优惠。 1、运行效果 打折下拉框

    2024年02月09日
    浏览(45)
  • 用策略模式干掉代码里大量的if-eles或则Swatch,提升B格由面向过程转为面向对象

    其实很简单 if里面的多个魔法常量 和HashMap里面的key是不是可以等比互换呢!! 所以我们核心就是从一个类似于HashMap这种的容器里去获取某一个key,就等同于进去到了if 的对应分支 而if 的对应分支 里面的业务,交给HashMap的Value去调方法完成没毛病把 --比如上述代码是判断字

    2024年02月08日
    浏览(42)
  • PHP代码加密实战过程 Swoole Loader

    帮一个客户处理一个小程序bug修复,前面不知道客户是直接购买一个倒闭的公司产品,还是破解版本的。 其中一些核心工具类代码进行了加密,通过排查就找到了 Swoole Compiler  今天演示下如何进行代码加密: 大致步骤 如下: 注册 Swoole Compiler  账号 地址:Swoole-Compiler - 最

    2024年02月11日
    浏览(43)
  • 第08章_面向对象编程(高级)(static,单例设计模式,理解mian方法,代码块,final,抽象类与抽象方法,接口,内部类,枚举类,注解,包装类)

    回顾类中的实例变量(即非static的成员变量) 创建两个Circle对象: Circle类中的变量radius是一个实例变量(instance variable),它属于类的每一个对象,c1中的radius变化不会影响c2的radius,反之亦然。 如果想让一个成员变量被类的所有实例所共享,就用static修饰即可,称为类变量(

    2024年01月25日
    浏览(49)
  • 单例模式及其使用场景

    单例模式(Singleton):指在一个系统中某个类只存在一个实例,类中自行实例化,实例向该系统提供统一的访问接口。 单例模式有两种表现形式,饿汉式:类加载时,就进行实例化;懒汉式,第一次引用类时才进行实例化。 饿汉式,代码如图1所示,我们以日志记录器类为例

    2024年02月08日
    浏览(48)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包