PHP实现raids扩展类

class Redis
{
    /**
     * @var RedisBase $redis
     */
    private static $redis;
    private static $expire = 0; //默认存储时间(秒)
    private static $host = '127.0.0.1';
    private static $port = '6379';
    private static $password = '';
    private static $db = 1;
    private static $timeout = 0;
    private static $prefix = '';

    /**
     * 初始化Redis连接
     * 所有配置参数在实例化Redis类时加入参数即可
     */
    public function __construct($config = [])
    {
        self::_initialize($config);
    }

    /**
     * 初始化操作
     * @param array $config
     */
    public static function _initialize(array $config = [])
    {
        if ($config && is_array($config)) {
            self::config($config);
        }
        if (self::$redis == null) {
            self::$redis = new RedisBase();
        }
        if (!self::$redis->connect(self::$host, self::$port, self::$timeout)) {
            throw new \Exception('Redis连接失败');
        }
        if (!empty(self::$password)) {
            self::$redis->auth(self::$password); //如果有设置密码,则需要连接密码
        }
        if (self::$db != '') {
            self::$redis->select(self::$db); //选择缓存库
        }
    }

    /**
     * 加载配置参数
     * @param array $config 配置数组
     */
    private static function config(array $config = [])
    {
        if (isset($config['host']) && $config['host'] != '') {
            self::$host = $config['host'];
        }
        if (isset($config['port']) && $config['port'] != '') {
            self::$port = $config['port'];
        }
        if (isset($config['password']) && $config['password'] != '') {
            self::$password = $config['password'];
        }
        if (isset($config['db']) && $config['db'] != '') {
            self::$db = $config['db'];
        }
        if (isset($config['expire']) && $config['expire'] != '') {
            self::$expire = $config['expire'];
        }
        if (isset($config['timeout']) && $config['timeout'] != '') {
            self::$timeout = $config['timeout'];
        }
        if (isset($config['prefix']) && $config['prefix'] != '') {
            self::$prefix = $config['prefix'];
        }
    }

    /**
     * 切换到指定的数据库, 数据库索引号用数字值指定
     * @param int $db 存储库
     * @return void
     */
    public static function selectDb($db)
    {
        self::$redis->select((int)$db);
    }

    /**
     * 创建当前数据库的备份(该命令将在 redis 安装目录中创建dump.rdb文件)
     * @return bool 成功true否则false (如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可)
     */
    public static function saveDb()
    {
        return self::$redis->save();
    }

    /**
     * 设置过期时间
     * @param string|int $key 键名
     * @param int $expire 过期时间(秒)
     * @return bool 返回布尔值  [如果成功返回true,如果键不存在或已过期则返回false]
     */
    public static function expire($key, int $expire = 0)
    {
        $key = self::$prefix . $key;
        $expire = $expire ?: self::$expire;
        if (self::$redis->expire($key, $expire)) {
            return true;
        }
        return false;
    }

    /**
     * 删除一个键值
     * @param string|int $key 键名
     * @return int 成功返回1 ,失败或不存在键返回0
     */
    public static function del($key)
    {
        $key = self::$prefix . $key;
        return self::$redis->del($key);
    }

    /**
     * 截取字符串,支持汉字
     * @param string|int $key 键名
     * @param int $start 起始位,从0开始
     * @param int $end 截取长度
     * @return string   返回字符串,如果键不存在或值不是字符串类型则返回false
     */
    public static function substr($key, int $start, int $end = 0)
    {
        $key = self::$prefix . $key;
        $value = self::$redis->get($key);
        if ($value && is_string($value)) {
            if ($end) {
                return mb_substr($value, $start, $end);
            }
            return mb_substr($value, $start);
        }
        return false;
    }

    /**
     * 获取键值
     * @param string|int $key 键名
     * @return mixed 返回值
     */
    public static function get($key)
    {
        $key = self::$prefix . $key;
        $value = self::$redis->get($key);
        if (is_object($value)) {
            return $value;
        }
        return is_numeric($value) ? $value : unserialize($value);
    }

    /**
     * 设置指定 key 的值,并返回 key 的旧值
     * @param string|int $key 键名
     * @param mixed $value 要指定的健值,支持数组
     * @param int $expire 过期时间,如果不填则用全局配置
     * @return mixed 返回旧值,如果旧值不存在则返回false,并新创建key的键值
     */
    public static function replace($key, $value, int $expire = 0)
    {
        $key = self::$prefix . $key;
        $value = self::$redis->getSet($key, $value);
        $expire = $expire ?: self::$expire;
        self::$redis->expire($key, $expire);
        return is_numeric($value) ? $value : unserialize($value);
    }

    /**
     * 同时设置一个或多个键值对。(支持数组值)
     * @param array $arr [要设置的键值对数组]
     * @return bool 返回布尔值,成功true否则false
     */
    public static function mset(array $arr)
    {
        $newArr = [];
        foreach ($arr as $key => $value) {
            $value = is_int($value) ? $value : serialize($value);
            $k = self::$prefix . $key;
            $newArr[$k] = $value;
        }
        unset($value, $arr);
        if (self::$redis->mset($newArr)) {
            return true;
        }
        return false;
    }

    /**
     * 返回所有(一个或多个)给定 key 的值
     * 可传入一个或多个键名参数,键名字符串类型,如 $values = $redis::mget('one','two','three', ...);
     * @return array|false 返回包含所有指定键值数组,如果不存在则返回false
     */
    public static function mget()
    {
        $keys = func_get_args();
        if ($keys) {
            $keys = array_map(function ($v) {
                return self::$prefix . $v;
            }, $keys);
            $values = self::$redis->mget($keys);
            if ($values) {
                foreach ($values as &$value) {
                    $value = is_numeric($value) ? $value : unserialize($value);
                }
                return $values;
            }
        }
        return false;
    }

    /**
     * 查询剩余过期时间(秒)
     * @param string|int $key 键名
     * @return int 返回剩余的时间,如果已过期则返回负数
     */
    public static function expireTime($key)
    {
        $key = self::$prefix . $key;
        return self::$redis->ttl($key);
    }

    /**
     * 指定的 key 不存在时,为 key 设置指定的值(SET if Not Exists)
     * @param string|int $key 键名
     * @param mixed $value 要指定的健值,支持数组
     * @param int $expire 过期时间,如果不填则用全局配置
     * @return bool  设置成功返回true 否则false
     */
    public static function setnx($key, $value, int $expire = 0)
    {
        $key = self::$prefix . $key;
        $value = is_int($value) ? $value : serialize($value);
        $res = self::$redis->setnx($key, $value);
        if ($res) {
            $expire = $expire ?: self::$expire;
            $expire && self::$redis->expire($key, $expire);
        }
        return $res;
    }

    /**
     * 返回对应键值的长度
     * @param string|int $key 键名
     * @return int  返回字符串的长度,如果键值是数组则返回数组元素的个数,如果键值不存在则返回0
     */
    public static function valueLen($key)
    {
        $key = self::$prefix . $key;
        $value = self::$redis->get($key);
        $length = 0;
        if ($value) {
            if (is_array($value)) {
                $length = count($value);
            } else {
                $length = strlen($value);
            }
        }
        return $length;
    }

    /**
     * 将 key 中储存的数字值自增
     * @param string|int $key 键名
     * @param int $int 自增量,如果不填则默认是自增量为 1
     * @return int  返回自增后的值,如果键不存在则新创建一个值为0,并在此基础上自增,返回自增后的数值.如果键值不是可转换的整数,则返回false
     */
    public static function inc($key, int $int = 0)
    {
        $key = self::$prefix . $key;
        if ($int) {
            return self::$redis->incrby($key, $int);
        } else {
            return self::$redis->incr($key);
        }
    }

    /**
     * 将 key 中储存的数字值自减
     * @param string|int $key 键名
     * @param int $int 自减量,如果不填则默认是自减量为 1
     * @return int  返回自减后的值,如果键不存在则新创建一个值为0,并在此基础上自减,返回自减后的数值.如果键值不是可转换的整数,则返回false
     */
    public static function dec($key, int $int = 0)
    {
        $key = self::$prefix . $key;
        if ($int) {
            return self::$redis->decrby($key, $int);
        } else {
            return self::$redis->decr($key);
        }
    }

    /**
     * 为指定的 key 追加值
     * @param string|int $key 键名
     * @param mixed $value 要指定的健值,支持数组
     * @param bool $pos 要追加的位置,默认false为追加至末尾,true则追加到开头
     * @param int $expire 过期时间,如果不填则用全局配置
     * @return bool  设置成功返回true 否则false,支付向字符串或者数组追加内容,向字符串追加时加入的值必须为字符串类型,如果健不存在则创建新的键值对
     */
    public static function append($key, $value, bool $pos = false, int $expire = 0)
    {
        $key = self::$prefix . $key;
        $cache = self::$redis->get($key);
        if ($cache) {
            if (is_array($cache)) {
                if ($pos === true) {
                    $value = array_unshift($cache, $value);
                } else {
                    $value = array_push($cache, $value);
                }
            } else {
                if (!is_string($value)) {
                    return false;
                }
                if ($pos === true) {
                    $value .= $cache;
                } else {
                    $value = $cache . $value;
                }
            }
        }
        return self::$redis->set($key, $value, $expire);
    }

    /**
     * 存储一个键值
     * @param string|int $key 键名
     * @param mixed $value 键值,支持数组、对象
     * @param int $expire 过期时间(秒)
     * @return bool 返回布尔值
     */
    public static function set($key, $value, int $expire = 0)
    {
        $key = self::$prefix . $key;
        if (is_int($key) || is_string($key)) {
            //如果是int类型的数字就不要序列化,否则用自增自减功能会失败,
            //如果不序列化,set()方法只能保存字符串和数字类型,
            //如果不序列化,浮点型数字会有失误,如13.6保存,获取时是13.59999999999
            $value = is_int($value) ? $value : serialize($value);
            $expire = $expire ?: self::$expire;
            if (self::$redis->set($key, $value)) {
                $expire && self::$redis->expire($key, $expire);
                return true;
            }
            return false;
        }
        return false;
    }


    // +--------------------------------------------------
    // | 以上方法均为字符串常用方法,并且把数组也兼容了
    // | 以下为哈希表处理方法
    // +--------------------------------------------------

    /**
     * 删除哈希表 key 中的一个或多个指定字段,不存在的字段将被忽略
     * @param string $table 表名
     * @param $columns string 删除的列,可以是多个  hdel($table,'a','b','c')
     * @return int  返回被成功删除字段的数量,不包括被忽略的字段,(删除哈希表用self::del($table))
     */
    public static function hdel($table, $columns)
    {
        $columns = func_get_args();
        $table = $columns[0];
        $table = self::$prefix . $table;
        $count = count($columns);
        $num = 0;
        for ($i = 1; $i < $count; $i++) {
            $num += self::$redis->hdel($table, $columns[$i]);
        }
        return $num;
    }

    /**
     * 查看哈希表的指定字段是否存在
     * @param string $table 表名
     * @param string $column 字段名
     * @return bool  存在返回true,否则false
     */
    public static function hexists($table, $column)
    {
        $table = self::$prefix . $table;
        if ((int)self::$redis->hexists($table, $column)) {
            return true;
        }
        return false;
    }

    /**
     * 为哈希表中的字段值加上指定增量值(支持整数和浮点数)
     * @param string $table 表名
     * @param string $column 字段名
     * @param int $num 增量值,默认1, 也可以是负数值,相当于对指定字段进行减法操作
     * @return int|float|bool  返回计算后的字段值,如果字段值不是数字值则返回false,如果哈希表不存在或字段不存在返回false
     */
    public static function hinc($table, $column, int $num = 1)
    {
        $table = self::$prefix . $table;
        $value = self::$redis->hget($table, $column);
        if (is_numeric($value)) { //数字类型,包括整数和浮点数
            $value += $num;
            self::$redis->hset($table, $column, $value);
            return $value;
        } else {
            return false;
        }
    }

    /**
     * 获取哈希表字段值
     * @param string $table 表名
     * @param string $column 字段名
     * @return string|false  返回字段值,如果字段值是数组保存的返回json格式字符串,转换成数组json_encode($value),如果字段不存在返回false;
     */
    public static function hget($table, $column)
    {
        $table = self::$prefix . $table;
        return self::$redis->hget($table, $column);
    }

    /**
     * 为哈希表中的字段赋值
     * @param string $table 哈希表名
     * @param string $column 字段名
     * @param string|array $value 字段值
     * @param int $expire 过期时间, 如果不填则不设置过期时间
     * @return int  如果成功返回 1,否则返回 0.当字段值已存在时覆盖旧值并且返回 0
     */
    public static function hset($table, $column, $value, int $expire = 0)
    {
        $table = self::$prefix . $table;
        $value = is_array($value) ? json_encode($value) : $value;
        $res = self::$redis->hset($table, $column, $value);
        if ($expire) {
            self::$redis->expire($table, $expire);
        }
        return $res;
    }

    /**
     * 获取哈希表中的所有字段
     * @param string $table 表名
     * @return array  返回包含所有字段的数组
     */
    public static function hkeys($table)
    {
        $table = self::$prefix . $table;
        return self::$redis->hkeys($table);
    }

    /**
     * 返回哈希表所有域(field)的值
     * @param string $table 表名
     * @return array  返回包含所有字段值的数组,数字索引
     */
    public static function hvals($table)
    {
        $table = self::$prefix . $table;
        return self::$redis->hvals($table);
    }

    /**
     * 获取哈希表中字段的数量
     * @param string $table 表名
     * @return int 如果哈希表不存在则返回0
     */
    public static function hlen($table)
    {
        $table = self::$prefix . $table;
        return self::$redis->hlen($table);
    }

    /**
     * 获取哈希表中,一个或多个给定字段的值
     * @param string $table 表名
     * @param string $columns 字段名
     * @return array  返回键值对数组,如果字段不存在则字段值为null, 如果哈希表不存在返回空数组
     */
    public static function hmget($table, $columns)
    {
        $table = self::$prefix . $table;
        $data = self::$redis->hgetall($table);
        $result = [];
        if ($data) {
            $columns = func_get_args();
            unset($columns[0]);
            foreach ($columns as $value) {
                $result[$value] = $data[$value] ?? null;
            }
        }
        return $result;
    }

    /**
     * 返回哈希表中,所有的字段和值
     * @param string $table 表名
     * @return array   返回键值对数组
     */
    public static function hgetall($table)
    {
        $table = self::$prefix . $table;
        return self::$redis->hgetall($table);
    }

    /**
     * 同时将多个 field-value (字段-值)对设置到哈希表中
     * @param string $table 表名
     * @param array $data 要添加的键值对
     * @param int $expire 过期时间,不填则不设置过期时间
     * @return bool 成功返回true,否则false
     */
    public static function hmset($table, array $data, int $expire = 0)
    {
        $table = self::$prefix . $table;
        $result = self::$redis->hmset($table, $data);
        if ($expire) {
            self::$redis->expire($table, $expire);
        }
        return $result;
    }


    /**
     * 为哈希表中不存在的的字段赋值
     * @param string $table 哈希表名
     * @param string $column 字段名
     * @param string|array $value 字段值
     * @param int $expire 过期时间, 如果不填则不设置过期时间
     * @return bool  如果成功返回true,否则返回 false.
     */
    public static function hsetnx($table, $column, $value, int $expire = 0)
    {
        $table = self::$prefix . $table;
        if (is_array($value)) {
            $value = json_encode($value);
        }
        $result = self::$redis->hsetnx($table, $column, $value);
        if ($expire) {
            self::$redis->expire($table, $expire);
        }
        return $result;
    }



    // +--------------------------------------------------
    // | 以上方法均为哈希表常用方法
    // | 以下为列表处理方法
    // +--------------------------------------------------


    /**
     * 将一个或多个值插入到列表头部(值可重复)或列表尾部。如果列表不存在,则创建新列表并插入值
     * @param string $list 列表名
     * @param string|array $value 要插入的值,如果是多个值请放入数组传入
     * @param string $pop 要插入的位置,默认first头部,last表示尾部
     * @param int $expire 过期时间, 如果不填则不设置过期时间
     * @return int  返回列表的长度
     */
    public static function lpush($list, $value, $pop = 'first', int $expire = 0)
    {
        $list = self::$prefix . $list;
        $result = false;
        if (is_array($value)) {
            foreach ($value as $v) {
                $result = ($pop == 'last') ? self::$redis->rpush($list, $v) : self::$redis->lpush($list, $v);
            }
        } else {
            $result = ($pop == 'last') ? self::$redis->rpush($list, $value) : self::$redis->lpush($list, $value);
        }
        if ($expire) {
            self::$redis->expire($list, $expire);
        }
        return $result;
    }

    /**
     * 通过索引获取列表中的元素
     * @param string $list 列表名
     * @param int $index 索引位置,从0开始计,默认0表示第一个元素,-1表示最后一个元素索引
     * @return string  返回指定索引位置的元素
     */
    public static function lindex($list, int $index = 0)
    {
        $list = self::$prefix . $list;
        return self::$redis->lindex($list, $index);
    }

    /**
     * 通过索引来设置元素的值
     * @param string $list 列表名
     * @param string $value 元素值
     * @param int $index 索引值
     * @return bool  成功返回true,否则false.当索引参数超出范围,或列表不存在返回false。
     */
    public static function lset($list, $index, $value)
    {
        $list = self::$prefix . $list;
        return self::$redis->lset($list, $index, $value);
    }

    /**
     * 返回列表的长度
     * @param string $list 列表名
     * @return int  列表长度
     */
    public static function llen($list)
    {
        $list = self::$prefix . $list;
        return self::$redis->llen($list);
    }

    /**
     * 移出并获取列表的第一个元素或最后一个元素
     * @param string $list 列表名
     * @param string $pop 移出并获取的位置,默认first为第一个元素
     * @return string|bool  列表第一个元素或最后一个元素,如果列表不存在则返回false
     */
    public static function lpop($list, $pop = 'first')
    {
        $list = self::$prefix . $list;
        if ($pop == 'last') {
            return self::$redis->rpop($list);
        }
        return self::$redis->lpop($list);
    }

    /**
     * 从列表中弹出最后一个值,将弹出的元素插入到另外一个列表开头并返回这个元素
     * @param string $list1 要弹出元素的列表名
     * @param string $list2 要接收元素的列表名
     * @return string|bool  返回被弹出的元素,如果其中有一个列表不存在则返回false
     */
    public static function lpoppush($list1, $list2)
    {
        $list1 = self::$prefix . $list1;
        $list2 = self::$prefix . $list2;
        if (self::$redis->lrange($list1, 0, -1) && self::$redis->lrange($list2, 0, -1)) {
            return self::$redis->brpoplpush($list1, $list2, 500);
        }
        return false;
    }

    /**
     * 返回列表中指定区间内的元素
     * @param string $list 列表名
     * @param int $start 起始位置,从0开始计,默认0
     * @param int $end 结束位置,-1表示最后一个元素,默认-1
     * @return array  返回列表元素数组
     */
    public static function lrange($list, int $start = 0, int $end = -1)
    {
        $list = self::$prefix . $list;
        return self::$redis->lrange($list, $start, $end);
    }

    /**
     * 用于在指定的列表元素前或者后插入元素。如果元素有重复则选择第一个出现的。当指定元素不存在于列表中时,不执行任何操作
     * @param string $list 列表名
     * @param string $element 指定的元素
     * @param string $value 要插入的元素
     * @param string $pop 要插入的位置,before前,after后。默认before
     * @return int  返回列表的长度。 如果没有找到指定元素 ,返回 -1 。 如果列表不存在或为空列表,返回 0 。
     */
    public static function linsert($list, $element, $value, $pop = 'before')
    {
        $list = self::$prefix . $list;
        return self::$redis->linsert($list, $pop, $element, $value);
    }

    /**
     * 移除列表中指定的元素
     * @param string $list 列表名
     * @param string $element 指定的元素
     * @param int $count 要删除的个数,0表示删除所有指定元素,负整数表示从表尾搜索, 默认0
     * @return int  被移除元素的数量。 列表不存在时返回 0
     */
    public static function lrem($list, $element, $count = 0)
    {
        $list = self::$prefix . $list;
        return self::$redis->lrem($list, $count, $element);
    }

    /**
     * 让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除
     * @param string $list 列表名
     * @param int $start 起始位置,从0开始
     * @param int $stop 结束位置,负数表示倒数第n个
     * @return bool  成功返回true否则false
     */
    public static function ltrim($list, $start, $stop)
    {
        $list = self::$prefix . $list;
        return self::$redis->ltrim($list, $start, $stop);
    }



    // +--------------------------------------------------
    // | 以上方法均为列表常用方法
    // | 以下为集合处理方法(集合分为有序和无序集合)
    // +--------------------------------------------------


    /**
     * 将一个或多个元素加入到无序集合中,已经存在于集合的元素将被忽略.如果集合不存在,则创建一个只包含添加的元素作成员的集合。
     * @param string $set 集合名称
     * @param string|array $value 元素值(唯一),如果要加入多个元素请传入多个元素的数组
     * @return int  返回被添加元素的数量.如果$set不是集合类型时返回0
     */
    public static function sadd($set, $value)
    {
        $set = self::$prefix . $set;
        $num = 0;
        if (is_array($value)) {
            foreach ($value as $key => $v) {
                $num += self::$redis->sadd($set, $v);
            }
        } else {
            $num += self::$redis->sadd($set, $value);
        }
        return $num;
    }

    /**
     * 返回无序集合中的所有的成员
     * @param string $set 集合名称
     * @return  array  返回包含所有成员的数组
     */
    public static function smembers($set)
    {
        $set = self::$prefix . $set;
        return self::$redis->smembers($set);
    }

    /**
     * 获取集合中元素的数量。
     * @param string $set 集合名称
     * @return int  返回集合的成员数量
     */
    public static function scard($set)
    {
        $set = self::$prefix . $set;
        return self::$redis->scard($set);
    }

    /**
     * 移除并返回集合中的一个随机元素
     * @param string $set 集合名称
     * @return string|bool  返回移除的元素,如果集合为空则返回false
     */
    public static function spop($set)
    {
        $set = self::$prefix . $set;
        return self::$redis->spop($set);
    }

    /**
     * 移除集合中的一个或多个成员元素,不存在的成员元素会被忽略
     * @param string $set 集合名称
     * @param string|array $member 要移除的元素,如果要移除多个请传入多个元素的数组
     * @return int  返回被移除元素的个数
     */
    public static function srem($set, $member)
    {
        $set = self::$prefix . $set;
        $num = 0;
        if (is_array($member)) {
            foreach ($member as $value) {
                $num += self::$redis->srem($set, $value);
            }
        } else {
            $num += self::$redis->srem($set, $member);
        }
        return $num;
    }

    /**
     * 返回集合中的一个或多个随机元素
     * @param string $set 集合名称
     * @param int $count 要返回的元素个数,0表示返回单个元素,大于等于集合基数则返回整个元素数组。默认0
     * @return string|array   返回随机元素,如果是返回多个则为数组返回
     */
    public static function srand($set, int $count = 0)
    {
        $set = self::$prefix . $set;
        return ($count == 0) ? self::$redis->srandmember($set) : self::$redis->srandmember($set, $count);
    }

    /**
     * 返回给定集合之间的差集(集合1对于集合2的差集)。不存在的集合将视为空集
     * @param string $set1 集合1名称
     * @param string $set2 集合2名称
     * @return array  返回差集(即筛选存在集合1中但不存在于集合2中的元素)
     */
    public static function sdiff($set1, $set2)
    {
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->sdiff($set1, $set2);
    }

    /**
     * 将给定集合set1和set2之间的差集存储在指定的set集合中。如果指定的集合已存在,则会被覆盖。
     * @param string $set 指定存储的集合
     * @param string $set1 集合1
     * @param string $set2 集合2
     * @return int  返回指定存储集合元素的数量
     */
    public static function sdiffstore($set, $set1, $set2)
    {
        $set = self::$prefix . $set;
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->sdiffstore($set, $set1, $set2);
    }

    /**
     * 返回set1集合和set2集合的交集(即筛选同时存在集合1和集合2中的元素)
     * @param string $set1 集合1
     * @param string $set2 集合2
     * @return array  返回包含交集元素的数组
     */
    public static function sinter($set1, $set2)
    {
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->sinter($set1, $set2);
    }

    /**
     * 将给定集合set1和set2之间的交集存储在指定的set集合中。如果指定的集合已存在,则会被覆盖。
     * @param string $set 指定存储的集合
     * @param string $set1 集合1
     * @param string $set2 集合2
     * @return int  返回指定存储集合元素的数量
     */
    public static function sinterstore($set, $set1, $set2)
    {
        $set = self::$prefix . $set;
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->sinterstore($set, $set1, $set2);
    }

    /**
     * 判断成员元素是否是集合的成员
     * @param string $set 集合名称
     * @param string $member 要判断的元素
     * @return bool 如果成员元素是集合的成员返回true,否则false
     */
    public static function sismember($set, $member)
    {
        $set = self::$prefix . $set;
        return self::$redis->sismember($set, $member);
    }

    /**
     * 将元素从集合1中移动到集合2中
     * @param string $set1 集合1
     * @param string $set2 集合2
     * @param string $member 要移动的元素成员
     * @return bool  成功返回true,否则false
     */
    public static function smove($set1, $set2, $member)
    {
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->smove($set1, $set2, $member);
    }

    /**
     * 返回集合1和集合2的并集(即两个集合合并后去重的结果)。不存在的集合被视为空集。
     * @param string $set1 集合1
     * @param string $set2 集合2
     * @return array  返回并集数组
     */
    public static function sunion($set1, $set2)
    {
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->sunion($set1, $set2);
    }

    /**
     * 将给定集合set1和set2之间的并集存储在指定的set集合中。如果指定的集合已存在,则会被覆盖。
     * @param string $set 指定存储的集合
     * @param string $set1 集合1
     * @param string $set2 集合2
     * @return int  返回指定存储集合元素的数量
     */
    public static function sunionstore($set, $set1, $set2)
    {
        $set = self::$prefix . $set;
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->sunionstore($set, $set1, $set2);
    }


    /* ----------------------以下有序集合----------------------- */

    /**
     * 将一个或多个成员元素及其分数值加入到有序集当中,如果成员已存在则更新它的分数值,如果集合不存在则创建
     * @param string $set 集合名称
     * @param array $arr 元素(唯一)与其分数值(分数值可以是整数值或双精度浮点数)组成的数组
     * @return int  返回添加成功的成员数量
     */
    public static function zadd($set, $arr)
    {
        $set = self::$prefix . $set;
        $num = 0;
        if ($arr && is_array($arr)) {
            foreach ($arr as $key => $value) {
                if (is_numeric($value)) {
                    $num += self::$redis->zadd($set, $value, $key);
                }
            }
        }
        return $num;
    }

    /**
     * 返回有序集中,指定区间内的成员。默认返回所有成员(默认升序排列)
     * @param string $set 集合名称
     * @param int $start 起始位置,从0开始计,默认0
     * @param int $stop 结束位置,-1表示最后一位,默认-1
     * @param bool $desc 排序,false默认升序,true为倒序
     * @return array  返回有序集合中指定区间内的成员数组(默认返回所有)
     */
    public static function zrange($set, int $start = 0, int $stop = -1, bool $desc = false)
    {
        $set = self::$prefix . $set;
        if ($desc === true) {
            return self::$redis->ZREVRANGE($set, $start, $stop, 'WITHSCORES');
        }
        return self::$redis->zrange($set, $start, $stop, 'WITHSCORES');
    }

    /**
     * 返回有序集合中成员数量
     * @param string $set 集合名称
     * @return int  返回成员的数量
     */
    public static function zcard($set)
    {
        $set = self::$prefix . $set;
        return self::$redis->zcard($set);
    }

    /**
     * 计算有序集合中指定分数区间的成员数量
     * @param string $set 集合名称
     * @param int|float $min 最小分数值
     * @param int|float $max 最大分数值
     * @return int  返回指定区间的成员数量
     */
    public static function zcount($set, $min, $max)
    {
        $set = self::$prefix . $set;
        return self::$redis->zcount($set, $min, $max);
    }

    /**
     * 对有序集合中指定成员的分数加上增量
     * @param string $set 集合名称
     * @param string $member 指定元素
     * @param int $num 增量值,负数表示进行减法运算,默认1
     * @return float  返回运算后的分数值(浮点型)
     */
    public static function zinc($set, $member, int $num = 1)
    {
        $set = self::$prefix . $set;
        return self::$redis->zincrby($set, $num, $member);
    }

    /**
     * 计算set1和set2有序集的交集,并将该交集(结果集)储存到新集合set中。
     * @param string $set 指定存储的集合名称
     * @param string $set1 集合1
     * @param string $set2 集合2
     * @return int  返回保存到目标结果集的的成员数量
     */
    public static function zinterstore($set, $set1, $set2)
    {
        $set = self::$prefix . $set;
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->zinterstore($set, 2, $set1, $set2);
    }


    /**
     * 计算set1和set2有序集的并集,并将该并集(结果集)储存到新集合set中。
     * @param string $set 指定存储的集合名称
     * @param string $set1 集合1
     * @param string $set2 集合2
     * @return int  返回保存到目标结果集的的成员数量
     */
    public static function zunionstore($set, $set1, $set2)
    {
        $set = self::$prefix . $set;
        $set1 = self::$prefix . $set1;
        $set2 = self::$prefix . $set2;
        return self::$redis->zunionstore($set, 2, $set1, $set2);
    }

    /**
     * 返回有序集合中指定分数区间的成员列表。有序集成员按分数值递增(从小到大)次序排列
     * @param string $set 集合名称
     * @param string $min 最小分数值字符串表示,'1'表示>=1,(1'表示>1
     * @param string $max 最大分数值字符串表示,'100'表示<=1,(100'表示<100
     * @param bool $withscores 返回的数组是否包含分数值,默认true, false不包含
     * @return array   返回指定区间的成员,默认是元素=>分数值的键值对数组。如果只要返回包含元素的数组请设置$withscores=false
     */
    public static function zrangebyscore($set, $min, $max, bool $withscores = true)
    {
        $set = self::$prefix . $set;
        if ($withscores === true) {
            return self::$redis->zrangebyscore($set, $min, $max, ['withscores' => '-inf']);
        }
        return self::$redis->zrangebyscore($set, $min, $max);
    }

    /**
     * 返回有序集中指定成员的排名。其中有序集成员按分数值递增(从小到大)顺序排列。
     * @param string $set 集合名称
     * @param string $member 成员名称(元素)
     * @return int|bool   返回 member 的排名, 如果member不存在返回false
     */
    public static function zrank($set, $member)
    {
        $set = self::$prefix . $set;
        return self::$redis->zrank($set, $member);
    }

    /**
     * 移除有序集中的一个或多个成员,不存在的成员将被忽略。
     * @param string $set 有序集合名称
     * @param string|array $members 要移除的成员,如果要移除多个请传入多个成员的数组
     * @return int   返回被移除的成员数量,不存在的成员将被忽略
     */
    public static function zrem($set, $members)
    {
        $set = self::$prefix . $set;
        $num = 0;
        if (is_array($members)) {
            foreach ($members as $value) {
                $num += self::$redis->zrem($set, $value);
            }
        } else {
            $num += self::$redis->zrem($set, $members);
        }
        return $num;
    }

    /**
     * 移除有序集中,指定分数(score)区间内的所有成员。
     * @param string $set 集合名称
     * @param int $min 最小分数值
     * @param int $max 最大分数值
     * @return int  返回被移除的成员数量
     */
    public static function zrembyscore($set, $min, $max)
    {
        $set = self::$prefix . $set;
        return self::$redis->zremrangebyscore($set, $min, $max);
    }

    /**
     * 移除有序集中,指定排名(rank)区间内的所有成员(这个排名数字越大排名越高,最低排名0开始)
     * @param string $set 集合名称
     * @param int $min 最小排名,从0开始计
     * @param int $max 最大排名
     * @return int  返回被移除的成员数量,如移除排名为倒数5名的成员:$redis::zremrank($set,0,4);
     */
    public static function zrembyrank($set, $min, $max)
    {
        $set = self::$prefix . $set;
        return self::$redis->zremrangebyrank($set, $min, $max);
    }

    /**
     * 返回有序集中,成员的分数值。
     * @param string $set 集合名称
     * @param string $member 成员
     * @return float|bool   返回分数值(浮点型),如果成员不存在返回false
     */
    public static function zscore($set, $member)
    {
        $set = self::$prefix . $set;
        return self::$redis->zscore($set, $member);
    }

    /**
     * 开启事务
     */
    public static function transation()
    {
        self::$redis->multi();
    }

    /**
     * 提交事务
     */
    public static function commit()
    {
        self::$redis->exec();
    }

    /**
     * 取消事务
     */
    public static function discard()
    {
        self::$redis->discard();
    }

    public static function myself()
    {
        return self::$redis;
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ZH蔚来

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值