<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Myredis
{
//redis所有已知命令:
//append,auth,bgrewriteaof,bgsave,bitcount,bitop,blpop,brpop,brpoplpush,client-kill,client-list,client-getname, client-setname,config-get,config-set,config-resetstat,dbsize,debug-object,debug-segfault,decr,decrby,del,discard, dump,echo,eval,evalsha,exec,exists,expire,expireat,flushall,flushdb,get,getbit,getrange,getset,hdel,hexists,hget, hgetall,hincrby,hincrbyfloat,hkeys,hlen,hmget,hmset,hset,hsetnx,hvals,incr,incrby,incrbyfloat,info,keys,lastsave, lindex,linsert,llen,lpop,lpush,lpushx,lrange,lrem,lset,ltrim,mget,migrate,monitor,move,mset,msetnx,multi,object, persist,pexpire,pexpireat,pfadd,pfcount,pfmerge,ping,psetex,psubscribe,pttl,publish,punsubscribe,quit,randomkey,rename,renamenx,restore, rpop,rpoplpush,rpush,rpushx,sadd,save,scard,script-exists,script-flush,script-kill,script-load,sdiff,sdiffstore, select,set,setbit,setex,setnx,setrange,shutdown,sinter,sinterstore,sismember,slaveof,slowlog,smembers,smove,sort, spop,srandmember,srem,strlen,subscribe,sunion,sunionstore,sync,time,ttl,type,unsubscribe,unwatch,watch,zadd,zcard, zcount,zincrby,zinterstore,zrange,zrangebyscore,zrank,zrem,zremrangebyrank,zremrangebyscore,zrevrange, zrevrangebyscore,zrevrank,zscore,zunionstore,pubsub,config-rewrite,client-pause,hscan,scan,sscan,zscan private static $redis; public function __construct($arConfig = array('host'=>'127.0.0.1', 'port'=> 6379))
{
$this->host = $arConfig['host'];
$this->port = $arConfig['port'];
self::$redis = new Redis();
self::$redis->connect($this->host, $this->port);
return self::$redis;
} public function __call($sMethod, $arParam)
{
return call_user_func_array(array(self::$redis, $sMethod), $arParam);
} /******************* key *********************/ /**
* 查找所有符合给定模式 pattern 的 key 。
* KEYS * 匹配数据库中所有 key 。
* KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
* KEYS h*llo 匹配 hllo 和 heeeeello 等。
* KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
* 特殊符号用 \ 隔开。
* @author zhaoyingnan 2015-10-16 17:33
* @param string $sPattern 匹配模式
* @return array
**/
public function keys($sPattern = '*')
{
//echo $sPattern;
return self::$redis->keys($sPattern);
} /**
* 返回key是否存在。
* @author zhaoyingnan 2015-10-16 17:40
* @param string $sKey 要检测的 key
* @return bool
**/
public function exists($sKey)
{
if(!$sKey)return FALSE;
return self::$redis->exists($sKey);
} /**
* 设置key的过期时间。如果key已过期,将会被自动删除。设置了过期时间的key被称之为volatile。
* 在key过期之前可以重新更新他的过期时间,也可以使用PERSIST命令删除key的过期时间。
* @author zhaoyingnan 2015-10-16 17:46
* @param string $sKey key
* @param int $iSecond 生存周期(秒)
* @return bool
**/
public function expire($sKey, $iSecond = 60)
{
if(!$sKey)return FALSE;
return self::$redis->expire($sKey, $iSecond);
} /**
* 这个命令和 EXPIRE 命令的作用类似,但是它以毫秒为单位设置 key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。
* @author zhaoyingnan 2015-10-19 16:00
* @param string $sKey key
* @param int $iSecond 生存周期(秒)
* @return bool
**/
public function pexpire($sKey, $iMilliseconds = 60000)
{
if(!$sKey)return FALSE;
return self::$redis->pexpire($sKey, $iMilliseconds);
} /**
* EXPIREAT 的作用和 EXPIRE类似,都用于为 key 设置生存时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳 Unix timestamp 。
* @author zhaoyingnan 2015-10-16 18:03
* @param string $sKey key
* @param int $iUnixtimestamp UNIX 时间戳(秒)
* @return bool
**/
public function expireat($sKey, $iUnixtimestamp)
{
if(!$sKey || !$iUnixtimestamp)return FALSE;
return self::$redis->expireat($sKey, $iUnixtimestamp);
} /**
* PEXPIREAT 这个命令和 EXPIREAT命令类似,但它以毫秒为单位设置 key 的过期 unix 时间戳,而不是像 EXPIREAT 那样,以秒为单位。
* EXPIREAT 的作用和 EXPIRE类似,都用于为 key 设置生存时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳 Unix timestamp 。
* @author zhaoyingnan 2015-10-16 18:03
* @param string $sKey key
* @param int $iMilliseconds UNIX 时间戳(毫秒)
* @return bool
**/
public function pexpireat($sKey, $iMilliseconds)
{
if(!$sKey || !$iMilliseconds)return FALSE;
return self::$redis->pexpireat($sKey, $iMilliseconds);
} /**
* 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
* @author zhaoyingnan 2015-10-16 17:52
* @param string $sKey key
* @return int 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key 的剩余生存时间。
**/
public function ttl($sKey)
{
if(!$sKey)return -2;
return self::$redis->ttl($sKey);
} /**
* 这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间,而不是像 TTL 命令那样,以秒为单位。
* @author zhaoyingnan 2015-10-19 16:06
* @param string $sKey key
* @return int 当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key 的剩余生存时间。
**/
public function pttl($sKey)
{
if(!$sKey)return -2;
return self::$redis->pttl($sKey);
} /**
* 将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。
* 这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等到超时。
* @author zhaoyingnan 2015-10-16 18:24
* @param string $sHost 目标 ip
* @param int $iPort 端口
* @param string $sKey 要操作的 key
* @param int $iDb 目标实例的数据库的编号
* @param int $iTimeout timeout 参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在 timeout 毫秒内完成,只是说数据传送的时间不能超过这个 timeout 数。
* @return bool 注:当目标实例的指定的数据库中存在指定的 key 返回 FALS,当前实例中的 key 并没有被删除,也没有移动到目标实例上,目标实例上的 key 还是原来的
**/
public function migrate($sHost, $iPort, $sKey, $iDb, $iTimeout)
{
if(!$sHost || !$iPort || !$sKey || !$iDb || !$iTimeout)return FALSE;
return self::$redis->migrate($sHost, $iPort, $sKey, $iDb, $iTimeout);
} /**
* 将当前数据库的 key 移动到给定的数据库 db 当中。
* 如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。
* @author zhaoyingnan 2015-10-19 15:42
* @param string $sKey key
* @param int $iDb 移动到给定的数据库 id
* @return bool
**/
public function move($sKey, $iDb)
{
if(!$sKey || !$iDb)return FALSE;
return self::$redis->move($sKey, $iDb);
} /**
* 移除给定key的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。
* @author zhaoyingnan 2015-10-19 15:55
* @param string $sKey key
* @return bool 当生存时间移除成功时,返回 1 如果 key 不存在或 key 没有设置生存时间,返回 0
**/
public function persist($sKey)
{
if(!$sKey)return FALSE;
return self::$redis->persist($sKey);
} /**
* 从当前数据库返回一个随机的key。
* @author zhaoyingnan 2015-10-19 16:08
* @return string 如果数据库没有任何key,返回nil,否则返回一个随机的key。
**/
public function randomkey()
{
return self::$redis->randomkey();
} /**
* 将key重命名为newkey,如果key与newkey相同,将返回一个错误。如果newkey已经存在,则值将被覆盖。
* @author zhaoyingnan 2015-10-19 16:12
* @param string $sKey key
* @param string $sNewKey 重命名后的 key 值
* @return bool
**/
public function rename($sKey, $sNewKey)
{
if(!$sKey || !$sNewKey)return FALSE;
return self::$redis->rename($sKey, $sNewKey);
} /**
* 当且仅当 newkey 不存在时,将 key 改名为 newkey 。当 key 不存在时,返回一个错误。
* @author zhaoyingnan 2015-10-19 16:16
* @param string $sKey key
* @param string $sNewKey 重命名后的 key 值
* @return bool
**/
public function renamenx($sKey, $sNewKey)
{
if(!$sKey || !$sNewKey)return FALSE;
return self::$redis->renamenx($sKey, $sNewKey);
} /**
* 返回 key 所储存的值的类型。
* @author zhaoyingnan 2015-10-19 16:25
* @param string $sKey key
* @return string none (key不存在) string (字符串) list (列表) set (集合) zset (有序集) hash (哈希表)
**/
public function type($sKey)
{
return self::$redis->type($sKey);
} /******************* string *********************/ /**
* 将key和value对应。如果key已经存在了,它会被覆盖,而不管它是什么类型。
* @author zhaoyingnan 2015-10-19 16:35
* @param string $sKey key
* @param string $sValue key 对应的值
* @return bool
**/
public function set($sKey, $sValue)
{
if(!$sKey)return FALSE;
return self::$redis->set($sKey, $sValue);
} /**
* 设置key对应字符串value,并且设置key在给定的 seconds 时间之后超时过期。
* @author zhaoyingnan 2015-11-03 11:25
* @param string $sKey 被操作的 key
* @param int $iSecond 生命周期(秒)
* @param string $sValue key 对应的 value
* @return bool
**/
public function setex($sKey, $iSecond, $sValue)
{
if(!$sKey || !$sValue)return FALSE;
$iSecond = $iSecond ? abs((intval($iSecond))) : 30;
return self::$redis->setex($sKey, $iSecond, $sValue);
} /**
* 设置key对应字符串value,并且设置key在给定的 milliseconds 时间之后超时过期。
* @author zhaoyingnan 2015-11-03 11:25
* @param string $sKey 被操作的 key
* @param int $iMillSecond 生命周期(毫秒)
* @param string $sValue key 对应的 value
* @return bool
**/
public function psetex($sKey, $iMilliseconds , $sValue)
{
if(!$sKey || !$sValue)return FALSE;
$iMilliseconds = $iMilliseconds ? abs((intval($iMilliseconds))) : 30;
return self::$redis->psetex($sKey, $iMilliseconds, $sValue);
} /**
* 自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。
* @author zhaoyingnan 2015-10-19 18:10
* @param string $sKey key
* @param string $sValue 设置的新的值
* @return string
**/
public function getset($sKey, $sValue)
{
if(!$sKey)return '';
return self::$redis->getset($sKey, $sValue);
} /**
* 对应给定的keys到他们相应的values上。MSET会用新的value替换已经存在的value,就像普通的SET命令一样。
* 如果你不想覆盖已经存在的values,请参看命令MSETNX。
* MSET是原子的,所以所有给定的keys是一次性set的。客户端不可能看到这种一部分keys被更新而另外的没有改变的情况。
* @author zhaoyingnan 2015-11-03 11:04
* @param array $arArray 被设置的关联数组
* @return bool
**/
public function mset($arArray = array())
{
if(!$arArray)return FALSE;
return self::$redis->mset($arArray);
} /**
* 对应给定的keys到他们相应的values上。
* 只要有一个key已经存在,MSETNX一个操作都不会执行。
* 由于这种特性,MSETNX可以实现要么所有的操作都成功,要么一个都不执行,这样可以用来设置不同的key,来表示一个唯一的对象的不同字段。
* MSETNX是原子的,所以所有给定的keys是一次性set的。客户端不可能看到这种一部分keys被更新而另外的没有改变的情况。
* @author zhaoyingnan 2015-11-03 11:11
* @param array $arArray 被设置的关联数组
* @return bool TRUE 所有的key被set, FALSE 没有key被set(至少其中有一个key是存在的)
**/
public function msetnx($arArray = array())
{
if(!$arArray)return FALSE;
return self::$redis->msetnx($arArray);
} /**
* 如果key不存在,就设置key对应字符串value。
* 在这种情况下,该命令和SET一样。当key已经存在时,就不做任何操作。
* SETNX是"SET if Not eXists"。
* @author zhaoyingnan 2015-11-03 11:49
* @param string $sKey key
* @param string $sValue 值
* @return bool TRUE key被set, FALSE key没有被set
**/
public function setnx($sKey, $sValue)
{
if(!$sKey)return FALSE;
return self::$redis->setnx($sKey, $sValue);
} /**
* 返回key的value。如果key不存在,返回特殊值nil。如果key的value不是string,就返回错误,因为GET只处理string类型的values。
* @author zhaoyingnan 2015-10-19 17:57
* @param string $sKey key
* @return string
**/
public function get($sKey)
{
if(!$sKey)return '';
return self::$redis->get($sKey);
} /**
* 返回所有指定的key的value。对于每个不对应string或者不存在的key,都返回特殊值nil。正因为此,这个操作从来不会失败。
* @author zhaoyingnan 2015-11-03 10:55
* @param array $arKey 要获取的 key 的数组
* @return array redis返回的是以数字为索引的数组,这里返回的是一个关联数组
**/
public function mget($arKey = array())
{
if(!$arKey)return array();
$arResult = self::$redis->mget($arKey);
return array_combine($arKey, $arResult);
} /**
* 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。
* 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。
* @author zhaoyingnan 2015-10-19 16:34
* @param string $sKey key
* @param string $sValue 追加的值
* @return int
**/
public function append($sKey, $sValue)
{
if(!$sKey)return FALSE;
return self::$redis->append($sKey, $sValue);
} /**
* 对key对应的数字做加1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。
* 如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。
* 这个操作最大支持在64位有符号的整型数字。
* @author zhaoyingnan 2015-10-19 17:44
* @param string $sKey key
* @return string
**/
public function incr($sKey)
{
if(!$sKey)return '';
return self::$redis->incr($sKey);
} /**
* 将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0。
* 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
* @author zhaoyingnan 2015-10-19 17:44
* @param string $sKey key
* @param int $iIncrement 步进值
* @return string
**/
public function incrby($sKey, $iIncrement)
{
if(!$sKey || !$iIncrement)return '';
return self::$redis->incrby($sKey, $iIncrement);
} /**
* 将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0。
* 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
* @author zhaoyingnan 2015-10-19 17:44
* @param string $sKey key
* @param fload $floatIncrement 步进值
* @return string
**/
public function incrbyfloat($sKey, $floatIncrement)
{
if(!$sKey || !$floatIncrement)return '';
return self::$redis->incrbyfloat($sKey, $floatIncrement);
} /**
* 对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。
* 如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。
* @author zhaoyingnan 2015-10-19 17:44
* @param string $sKey key
* @return string
**/
public function decr($sKey)
{
if(!$sKey)return '';
return self::$redis->decr($sKey);
} /**
* 将key对应的数字减decrement。如果key不存在,操作之前,key就会被置为0。
* 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
* @author zhaoyingnan 2015-10-19 17:44
* @param string $sKey key
* @param int $iIncrement 步进值
* @return string
**/
public function decrby($sKey, $iIncrement)
{
if(!$sKey || !$iIncrement)return '';
return self::$redis->decrby($sKey, $iIncrement);
} /**
* 这个命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。
* 返回key对应的字符串value的子串,这个子串是由start和end位移决定的(两者都在string内)。
* 可以用负的位移来表示从string尾部开始数的下标。所以-1就是最后一个字符,-2就是倒数第二个,以此类推。
* 这个函数处理超出范围的请求时,都把结果限制在string内。
* @author zhaoyingnan 2015-10-19 18:04
* @param string $sKey key
* @pause int $iStart 开始位置
* @pause int $iEnd 结束位置
* @return string
**/
public function getrange($sKey, $iStart = 0, $iEnd = -1)
{
if(!$sKey)return '';
return self::$redis->getrange($sKey, $iStart, $iEnd);
} /**
* 返回key的string类型value的长度。如果key对应的非string类型,就返回错误。
* @author zhaoyingnan 2015-11-03 11:40
* @param string $sKey
* @return
**/
public function strlen($sKey)
{
if(!$sKey)return FALSE;
return self::$redis->strlen($sKey);
} /******************* list *********************/ /**
* 将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。
* 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。
* 可以使用一个命令把多个元素 push 进入列表,只需在命令末尾加上多个指定的参数。
* 元素是从最左端的到最右端的、一个接一个被插入到 list 的头部。 所以对于这个命令例子 LPUSH mylist a b c,返回的列表是 c 为第一个元素, b 为第二个元素, a 为第三个元素。
* @author zhaoyingnan 2015-11-03 11:59
* @param string $sKey
* @param array $arValue 需要 push 到 key 中的值的数组
* @return int 在 push 操作后的 list 长度。
**/
public function lpush($sKey, $arValue = array())
{
if(!$sKey || !$arValue)return 0;
foreach($arValue as $val)
self::$redis->lpush($sKey, $val);
return self::llen($sKey);
} /**
* 只有当 key 已经存在并且存着一个 list 的时候,在这个 key 下面的 list 的头部插入 value。
* 与 LPUSH 相反,当 key 不存在的时候不会进行任何操作。
* @author zhaoyingnan 2015-11-03 13:21
* @param string $sKey
* @param array $arValue 需要 push 到 key 中的值的数组
* @return int
**/
public function lpushx($sKey, $arValue = array())
{
if(!$sKey || !$arValue)return 0;
foreach($arValue as $val)
self::$redis->lpushx($sKey, $val);
return self::llen($sKey);
} /**
* 向存于 key 的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。
* 当 key 保存的不是一个列表,那么会返回一个错误。
* 可以使用一个命令把多个元素打入队列,只需要在命令后面指定多个参数。
* 元素是从左到右一个接一个从列表尾部插入。 比如命令 RPUSH mylist a b c 会返回一个列表,其第一个元素是 a ,第二个元素是 b ,第三个元素是 c。
* @author zhaoyingnan 2015-11-03 12:15
* @param string $sKey
* @param array $arValue 需要 push 到 key 中的值的数组
* @return int 在 push 操作后的 list 长度。
**/
public function rpush($sKey, $arValue = array())
{
if(!$sKey || !$arValue)return 0;
foreach($arValue as $val)
self::$redis->lpush($sKey, $val);
return self::llen($sKey);
} /**
* 将值 value 插入到列表 key 的表尾, 当且仅当 key 存在并且是一个列表。
* 和 RPUSH 命令相反, 当 key 不存在时,RPUSHX 命令什么也不做。
* @author zhaoyingnan 2015-11-03 13:23
* @param string $sKey
* @param array $arValue 需要 push 到 key 中的值的数组
* @return int 在 push 操作后的 list 长度。
**/
public function rpushx($sKey, $arValue = array())
{
if(!$sKey || !$arValue)return 0;
foreach($arValue as $val)
self::$redis->rpushx($sKey, $val);
return self::llen($sKey);
} /**
* 返回存储在 key 里的list的长度。
* @author zhaoyingnan 2015-11-03 12:12
* @param string $sKey
* @return bool 如果 key 不存在,那么就被看作是空list,并且返回长度为 0。 当存储在 key 里的值不是一个list的话,会返回error。
**/
public function llen($sKey)
{
if(!$sKey)return 0;
return self::$redis->llen($sKey);
} /**
* 返回 key 对应的列表里的元素的索引 index 的值
* 下标是从0开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。
* 负数索引用于指定从列表尾部开始索引的元素。在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。
* 当 key 位置的值不是一个列表的时候,会返回一个error。
* @author zhaoyingnan 2015-11-03 13:30
* @param string $sKey
* @param array $index key 对应的列表中的 index 索引
* @return mix
**/
public function lindex($sKey, $index = 0)
{
if(!$sKey)return FALSE;
return self::$redis->lindex($sKey, intval($index));
} /**
* 设置 index 位置的list元素的值为 value。
* 下标是从0开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。
* 当index超出范围时会返回一个error。
* @author zhaoyingnan 2015-11-03 14:27
* @param string $sKey
* @param int $index key 对应的 list 中小标为 index
* @param string $sValue 被设置的值
* @return
**/
public function lset($sKey, $index, $sValue)
{
if(!$sKey || !$sValue)return FALSE;
return self::$redis->lset($sKey, $index, $sValue);
} /**
* 把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。
* 当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。
* 当 key 存在,但保存的不是一个list的时候,会返回error。
* @author zhaoyingnan 2015-11-03 13:42
* @param string $sKey
* @param string $sPosion 在基准值前面或者后面(BEFORE or AFTER)
* @param string $pivot 列表中的基准值
* @param string $sValue 被插入的值
* @return mix 经过插入操作后的list长度,或者当 pivot 值找不到的时候返回 -1。
**/
public function linsert($sKey, $sPosion, $pivot, $sValue)
{
if(!$sKey || !$pivot || !$sValue)return FALSE;
$sPosion = in_array($sPosion, array('BEFORE', 'AFTER')) ? strtoupper($sPosion) : 'BEFORE';
return self::$redis->linsert($sKey, $sPosion, $pivot, $sValue);
} /**
* 从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:
* count > 0: 从头往尾移除值为 value 的元素。
* count < 0: 从尾往头移除值为 value 的元素。
* count = 0: 移除所有值为 value 的元素。
* 比如, LREM list -2 "hello" 会从存于 list 的列表里移除最后两个出现的 "hello"。
* 需要注意的是,如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0。
* @author zhaoyingnan 2015-11-03 13:53
* @param string $sKey
* @param int $iCount count > 0: 从头往尾移除值为 value 的元素。 count < 0: 从尾往头移除值为 value 的元素。 count = 0: 移除所有值为 value 的元素。
* @param string $sValue 要删除的值
* @return int
**/
//public function lremu($sKey, $iCount, $sValue)
//{
// var_dump($sValue);
// if(!$sKey || !$sValue)return FALSE;
// return self::$redis->lrem($sKey, intval($iCount), $sValue);
//} /**
* 修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素。
* start 和 stop 都是由0开始计数的, 这里的 0 是列表里的第一个元素(表头),1 是第二个元素,以此类推。
* @author zhaoyingnan 2015-11-03 14:45
* @param string $sKey
* @param int $iStart 指定范围内的开始位置
* @param int $iEnd 制定范围内的结束位置
* @return bool
**/
public function ltrim($sKey, $iStart, $iEnd)
{
if(!$sKey)return FALSE;
return self::$redis->ltrim($sKey, intval($iStart), intval($iEnd));
} /**
* 返回存储在 key 的列表里指定范围内的元素。
* start 和 end 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头),第二个元素下标是1,以此类推。
* 偏移量也可以是负数,表示偏移量是从list尾部开始计数。 例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推。
* @author zhaoyingnan 2015-11-03 14:54
* @param string $sKey
* @param int $iStart 开始位置
* @param int $iEnd 结束位置
* @return array
**/
public function lrange($sKey, $iStart, $iEnd)
{
if(!$sKey)return FALSE;
return self::$redis->lrange($sKey, intval($iStart), intval($iEnd));
} /**
* 移除并且返回 key 对应的 list 的第一个元素。
* @author zhaoyingnan 2015-11-03 21:49
* @param string $sKey
* @return bool
**/
public function lpop($sKey)
{
if(!$sKey)return FALSE;
return self::$redis->lpop($sKey);
} /**
* 移除并返回存于 key 的 list 的最后一个元素。
* @author zhaoyingnan 2015-11-03 21:49
* @param string $sKey
* @return bool
**/
public function rpop($sKey)
{
if(!$sKey)return FALSE;
return self::$redis->rpop($sKey);
} /******************* set *********************/ /**
* 添加一个或多个指定的member元素到集合的 key中.
* 指定的一个或者多个元素member 如果已经在集合key中存在则忽略.
* 如果集合key 不存在,则新建集合key,并添加member元素到集合key中.
* 如果key 的类型不是集合则返回错误.
* @author zhaoyingnan 2015-11-03 21:55
* @param string $sKey
* @param array $arMember 被添加的元素的数组
* @return int 返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素.
**/
public function sadd($sKey, $arMember = array())
{
if(!$sKey)return FALSE;
$iCount = 0;
foreach($arMember as $val)
{
if(self::$redis->sadd($sKey, $val))
$iCount++;
}
return $iCount;
} /**
* 返回集合存储的key的基数 (集合元素的数量).
* @author zhaoyingnan 2015-11-03 22:09
* @param string $sKey
* @return int
**/
public function scard($sKey)
{
if(!$sKey)return 0;
return self::$redis->scard($sKey);
} /**
* 返回一个集合与给定集合的差集的元素.
* @author zhaoyingnan 2015-11-03 22:13
* @param array $arKey
* @return array
**/
public function sdiff($arKey)
{
if(!$arKey)return array();
return self::$redis->sdiff($arKey);
} /**
* 该命令类似于 SDIFF, 不同之处在于该命令不返回结果集,而是将结果存放在destination集合中.
* 如果destination 已经存在, 则将其覆盖重写.
* @author zhaoyingnan 2015-11-04 10:16
* @param string $sNewKey
* @param array $arKey
* @return int 结果集元素的个数.
**/
public function sdiffstore($sNewKey, $arKey)
{
if(!$arKey || !$sNewKey)return 0;
if($arResult = self::$redis->sdiff($arKey))
return $this->sadd($sNewKey, $arResult);
return 0;
} /**
* 返回指定所有的集合的成员的交集.
* @author zhaoyingnan 2015-11-04 10:18
* @param array $arKey
* @return array
**/
public function sinter($arKey)
{
if(!$arKey)return array();
return self::$redis->sinter($arKey);
} /**
* 这个命令与SINTER命令类似, 但是它并不是直接返回结果集,而是将结果保存在 destination集合中.
* 如果destination 集合存在, 则会被重写.
* @author zhaoyingnan 2015-11-04 10:23
* @param string $sNewKey
* @param array $arKey
* @return int 结果集元素的个数.
**/
public function sinterstore($sNewKey, $arKey)
{
if(!$arKey || !$sNewKey)return 0;
if($arResult = self::$redis->sinter($arKey))
return $this->sadd($sNewKey, $arResult);
return 0;
} /**
* 返回成员 member 是否是存储的集合 key的成员.
* @author zhaoyingnan 2015-11-04 10:25
* @param string $sKey
* @param string $member
* @return int 如果member元素是集合key的成员,则返回1,如果member元素不是key的成员,或者集合key不存在,则返回0
**/
public function sismember($sKey, $member)
{
if(!$sKey || !$member)return FALSE;
return self::$redis->sismember($sKey, $member);
} /**
* 返回key集合所有的元素.
* @author zhaoyingnan 2015-11-04 10:29
* @param string $sKey
* @return array
**/
public function smembers($sKey)
{
if(!$sKey)return array();
return self::$redis->smembers($sKey);
} /**
* 将member从source集合移动到destination集合中.
* 如果source 集合不存在或者不包含指定的元素,smove命令不执行任何操作并且返回0.
* 否则对象将会从source集合中移除,并添加到destination集合中去,
* 如果destination集合已经存在该元素,则smove命令仅将该元素充source集合中移除.
* 如果source 和destination不是集合类型,则返回错误.
* @author zhaoyingnan 2015-11-04 10:33
* @param string $sFromKey
* @param string $sToKsy
* @param string $member
* @return bool
**/
public function smove($sFromKey, $sToKsy, $member)
{
if(!$sFromKey || !$sToKsy || !$member)return FALSE;
return self::$redis->smove($sFromKey, $sToKsy, $member);
} /**
* 移除并返回一个集合中的随机元素
* 该命令与 SRANDMEMBER相似,不同的是srandmember命令返回一个随机元素但是不移除.
* @author zhaoyingnan 2015-11-04 10:42
* @param string $sKey
* @return mix
**/
public function spop($sKey)
{
if(!$sKey)return FALSE;
return self::$redis->spop($sKey);
} /**
* 仅提供key参数,那么随机返回key集合中的一个元素.
* 仅提供key参数时,该命令作用类似于SPOP命令, 不同的是SPOP命令会将被选择的随机元素从集合中移除, 而SRANDMEMBER仅仅是返回该随记元素,而不做任何操作.
* Redis 2.6开始, 可以接受 count 参数,
* 如果count是整数且小于元素的个数,返回含有 count 个不同的元素的数组,
* 如果count是个整数且大于集合中元素的个数时,仅返回整个集合的所有元素,
* 当count是负数,则会返回一个包含count的绝对值的个数元素的数组,
* 如果count的绝对值大于元素的个数,则返回的结果集里会出现一个元素出现多次的情况.
* @author zhaoyingnan 2015-11-04 10:46
* @param string $sKey
* @param int $iCount
* @return mix
**/
public function srandmember($sKey, $iCount = 1)
{
if(!$sKey)return FALSE;
return self::$redis->srandmember($sKey, $iCount);
} /**
* 在key集合中移除指定的元素.
* 如果指定的元素不是key集合中的元素则忽略 如果key集合不存在则被视为一个空的集合,该命令返回0.
* 如果key的类型不是一个集合,则返回错误.
* @author zhaoyingnan 2015-11-04 10:53
* @param string $sKey
* @param array $member
* @return mix
**/
public function srem($sKey, $member = array())
{
if(!$sKey || !$member)return FALSE;
$iCount = 0;
foreach($member as $val)
{
if(self::$redis->srem($sKey, $val))
$iCount++;
}
return $iCount;
} /**
* 返回给定的多个集合的并集中的所有成员.
* @author zhaoyingnan 2015-11-04 10:59
* @param array $arKey
* @return array
**/
public function sunion($arKey)
{
if(!$arKey)return array();
return self::$redis->sunion($arKey);
} /**
* 该命令作用类似于SUNION命令,不同的是它并不返回结果集,而是将结果存储在destination集合中.
* 如果destination 已经存在,则将其覆盖.
* @author zhaoyingnan 2015-11-04 11:05
* @param string $sNewKey 新的key
* @param array $arKey 多个 key 的数组
* @return int 结果集中元素的个数.
**/
public function sunionstore($sNewKey, $arKey)
{
if(!$arKey || !$sNewKey)return 0;
if($arResult = self::$redis->sunion($arKey))
{
return $this->sadd($sNewKey, $arResult);
}
return 0;
} /******************* set *********************/ /**
* 命令添加指定的成员到key对应的有序集合中,每个成员都有一个分数。你可以指定多个分数/成员组合。
* 如果一个指定的成员已经在对应的有序集合中了,那么其分数就会被更新成最新的,并且该成员会重新调整到正确的位置,以确保集合有序。
* 如果key不存在,就会创建一个含有这些成员的有序集合,就好像往一个空的集合中添加一样。
* 如果key存在,但是它并不是一个有序集合,那么就返回一个错误。
* 分数的值必须是一个表示数字的字符串,并且可以是double类型的浮点数。
* @author zhaoyingnan 2015-11-04 13:45
* @param string $sKey
* @param array $arMember array(array('score1', 'member1'), array('score2', 'member2'),.....)
* @return mix
**/
public function zadd($sKey, $arMember)
{
if(!$sKey || !$arMember || !is_array($arMember))return 0;
$iCount = 0;
foreach($arMember as $arVal)
{
if(self::$redis->zadd($sKey, $arVal[0], $arVal[1]))
$iCount++;
}
return $iCount;
} /**
* 返回key的有序集元素个数
* @author zhaoyingnan 2015-11-04 13:48
* @param string $sKey
* @return int
**/
public function zcard($sKey)
{
if(!$sKey)return 0;
return self::$redis->zcard($sKey);
} /**
* 返回有序集key中,score值在min和max之间(默认包括score值等于min或max)的成员
* @author zhaoyingnan 2015-11-04 13:54
* @param string $sKey
* @param int $min
* @param int $max
* @return int
**/
public function zcount($sKey, $min = 0, $max = -1)
{
if(!$sKey)return 0;
return self::$redis->zcount($sKey, $min, $max);
} /**
* 返回有序集key中,成员member的score值。
* 如果member元素不是有序集key的成员,或key不存在,返回nil。
* @access public
* @author zhaoyingnan 2015-11-10 15:26
* @param string $sKey
* @param string $member
* @return mix
* @note
**/
public function zscore($sKey, $member)
{
if(!$sKey || !$member)return 0;
return self::$redis->zscore($sKey, $member);
} /**
* 为有序集key的成员member的score值加上增量increment。
* 如果key中不存在member,就在key中添加一个member,score是increment(就好像它之前的score是0.0)。
* 如果key不存在,就创建一个只含有指定member成员的有序集合。
* 当key不是有序集类型时,返回一个错误。
* score值必须是字符串表示的整数值或双精度浮点数,并且能接受double精度的浮点数。也有可能给一个负数来减少score的值。
* @access public
* @author zhaoyingnan 2015-11-10 13:48
* @param string $sVar
* @param int $iVar
* @param string $sVar
* @return mix member成员的新score值,以字符串形式表示。当key不是有序集类型时,返回一个错误。
* @note
**/
public function zincrby($sKey, $iIncrement, $member)
{
if(!$sKey || !$iIncrement || !$member)return FALSE;
return self::$redis->zincrby($sKey, $iIncrement, $member);
} /**
* 返回有序集key中,指定区间内的成员(按下标指定区间)
* 下标参数start和stop都以0为底,也就是说,以0表示有序集第一个成员,以1表示有序集第二个成员,以此类推。
* 你也可以使用负数下标,以-1表示最后一个成员,-2表示倒数第二个成员,以此类推。
* 如果你需要成员按score值递减(score相等时按字典序递减)来排列,请使用ZREVRANGE命令。
* 可以通过使用WITHSCORES选项,来让成员和它的score值一并返回,返回列表以value1,score1, ..., valueN,scoreN的格式表示,而不是value1,...,valueN。
* 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
* @author zhaoyingnan 2015-11-04 14:00
* @param string $sKey
* @param int $iStart
* @param int $iEnd
* @return array
**/
public function zrange($sKey, $iStart = 0, $iEnd = -1, $isWITHSCORES = FALSE)
{
if(!$sKey)return 0;
return self::$redis->zrange($sKey, $iStart, $iEnd, $isWITHSCORES);
} /**
* 返回有序集key中,指定区间内的成员。
* 其中成员的位置按score值递减(从大到小)来排列。具有相同score值的成员按字典序的反序排列。
* 除了成员按score值递减的次序排列这一点外,ZREVRANGE命令的其他方面和ZRANGE命令一样
* @access public
* @author zhaoyingnan 2015-11-10 14:44
* @param string $sKey
* @param int $iStart
* @param int $iEnd
* @return array
* @note
**/
public function zrevrange($sKey, $iStart = 0, $iEnd = -1, $isWITHSCORES = FALSE)
{
if(!$sKey)return 0;
return self::$redis->zrevrange($sKey, $iStart, $iEnd, $isWITHSCORES);
} /**
* 返回key的有序集合中的分数在min和max之间的所有元素(包括分数等于max或者min的元素)。
* 元素被认为是从低分到高分排序的。
* 具有相同分数的元素按字典序排列(这个根据redis对有序集合实现的情况而定,并不需要进一步计算)。
* 可选的LIMIT参数指定返回结果的数量及区间(类似SQL中SELECT LIMIT offset, count)。
* 注意,如果offset太大,定位offset就可能遍历整个有序集合,这会增加O(N)的复杂度。
* 可选参数WITHSCORES会返回元素和其分数,而不只是元素。这个选项在redis2.0之后的版本都可用。
* 区间及无限
* min和max可以是-inf和+inf,这样一来,你就可以在不知道有序集的最低和最高score值的情况下,使用ZRANGEBYSCORE这类命令。
* 默认情况下,区间的取值使用闭区间(小于等于或大于等于),你也可以通过给参数前增加(符号来使用可选的开区间(小于或大于)。
* @author zhaoyingnan 2015-11-04 14:18
* @param string $sKey
* @param mix $min 分数的区间的最小值(闭区间)
* @param mix $max 分数的区间的最大值(闭区间)
* @param array $arWith = array('withscores' => TRUE, 'limit' => array(0, 1))
* @return array
**/
public function zrangebyscore($sKey, $min = '-inf', $max = '+inf', $arWith = array('withscores'=>TRUE, 'limit'=>array(0, 1)))
{
if(!$sKey)return array();
return self::$redis->zrangebyscore($sKey, $min, $max, $arWith);
} /**
* 返回key的有序集合中的分数在max和min之间的所有元素(包括分数等于max或者min的元素)。
* 与有序集合的默认排序相反,对于这个命令,元素被认为是从高分到低具有相同分数的元素按字典反序。
* 除了反序之外, ng, ZREVRANGEBYSCORE 和ZRANGEBYSCORE类似。
* @access public
* @author zhaoyingnan 2015-11-10 14:39
* @param string $sKey
* @param mix $max 分数的区间的最大值(闭区间)
* @param mix $min 分数的区间的最小值(闭区间)
* @param array $arWith = array('withscores' => TRUE, 'limit' => array(0, 1))
**/
public function zrevrangebyscore($sKey, $max = '+inf', $min = '-inf', $arWith = array('withscores'=>TRUE, 'limit'=>array(0, 1)))
{
if(!$sKey)return array();
return self::$redis-> zrevrangebyscore($sKey, $max, $min, $arWith);
} /**
* 返回有序集key中成员member的排名。
* 其中有序集成员按score值递增(从小到大)顺序排列。
* 排名以0为底,也就是说,score值最小的成员排名为0,那实际的排名则为1
* @access public
* @author zhaoyingnan 2015-11-10 13:38
* @param string $sKey
* @param string $member
* @return int 返回实际的排名
* @note
**/
public function zrank($sKey, $member)
{
if(!$sKey || !$member)return 0;
return self::$redis->zrank($sKey, $member)+1;
} /**
* 返回有序集key中成员member的排名,其中有序集成员按score值从大到小排列。排名以0为底,也就是说,score值最大的成员排名为0。
* 使用ZRANK命令可以获得成员按score值递增(从小到大)排列的排名。
* @access public
* @author zhaoyingnan 2015-11-10 14:51
* @param string $sKey
* @param string $member
* @return int 返回实际的排名
* @note
**/
public function zrevrank($sKey, $member)
{
if(!$sKey || !$member)return 0;
return self::$redis->zrevrank($sKey, $member)+1;
} /**
* 从key对应的有序集合中删除给定的成员。如果给定的成员不存在就忽略。
* @access public
* @author zhaoyingnan 2015-11-10 15:01
* @param string $sKey
* @param array $arMember 倍删除的成员数组
* @return int 返回的是从有序集合中删除的成员个数,不包括不存在的成员。
* @note
**/
public function zrem($sKey, $arMember = array())
{
if(!$sKey || !$arMember)return 0;
$iCount = 0;
foreach($arMember as $sVal)
{
if(self::$redis->zrem($sKey, $sVal))
$iCount++;
}
return $iCount;
} /**
* 移除有序集key中,指定排名(rank)区间内的所有成员。下标参数start和stop都以0为底,0处是分数最小的那个元素。
* 这些索引也可是负数,表示位移从最高分处开始数。例如,-1是分数最高的元素,-2是分数第二高的,依次类推。
* @access public
* @author zhaoyingnan 2015-11-10 15:08
* @param string $sKey
* @param int $iStart 指定的开始排名区间(闭区间)
* @param int $iEnd 指定的结束排名区间(闭区间)
* @return int 删除的元素的个数。
* @note
**/
public function zremrangebyrank($sKey, $iStart = 0, $iEnd = -1)
{
//如果不填写$iStart和$iEnd不填写的话,会删除$sKey的所有成员
if(!$sKey)return 0;
return self::$redis->zremrangebyrank($sKey, $iStart, $iEnd);
} /**
* 移除有序集key中,所有score值介于min和max之间(包括等于min或max)的成员。
* 自版本2.1.6开始,score值等于min或max的成员也可以不包括在内,语法请参见ZRANGEBYSCORE命令。
* @access public
* @author zhaoyingnan 2015-11-10 15:08
* @param string $sKey
* @param mix $min 指定的 score 区间的最小值(闭区间)
* @param mix $max 指定的 score 区间的最大值(闭区间)
* @return int 删除的元素的个数。
* @note
**/
public function zremrangebyscore($sKey, $min = '-inf', $max = '+inf')
{
//如果不填写$min和$max不填写的话,会删除$sKey的所有成员
if(!$sKey)return 0;
return self::$redis->zremrangebyscore($sKey, $min, $max);
}
}
?>

PHP Redis的更多相关文章

  1. 使用redis构建可靠分布式锁

    关于分布式锁的概念,具体实现方式,直接参阅下面两个帖子,这里就不多介绍了. 分布式锁的多种实现方式 分布式锁总结 对于分布式锁的几种实现方式的优劣,这里再列举下 1. 数据库实现方式 优点:易理解 缺 ...

  2. Ignite性能测试以及对redis的对比

    测试方法 为了对Ignite做一个基本了解,做了一个性能测试,测试方法也比较简单主要是针对client模式,因为这种方法和使用redis的方式特别像.测试方法很简单主要是下面几点: 不作参数优化,默认 ...

  3. mac osx 安装redis扩展

    1 php -v查看php版本 2 brew search php|grep redis 搜索对应的redis   ps:如果没有brew 就根据http://brew.sh安装 3 brew ins ...

  4. Redis/HBase/Tair比较

    KV系统对比表 对比维度 Redis Redis Cluster Medis Hbase Tair 访问模式    支持Value大小 理论上不超过1GB(建议不超过1MB) 理论上可配置(默认配置1 ...

  5. Redis数据库

    Redis是k-v型数据库的典范,设计思想及数据结构实现都值得学习. 1.数据类型 value支持五种数据类型:1.字符串(strings)2.字符串列表(lists)3.字符串集合(sets)4.有 ...

  6. redis 学习笔记(2)

    redis-cluster 简介 redis-cluster是一个分布式.容错的redis实现,redis-cluster通过将各个单独的redis实例通过特定的协议连接到一起实现了分布式.集群化的目 ...

  7. redis 学习笔记(1)

    redis持久化 snapshot数据快照(rdb) 这是一种定时将redis内存中的数据写入磁盘文件的一种方案,这样保留这一时刻redis中的数据镜像,用于意外回滚.redis的snapshot的格 ...

  8. python+uwsgi导致redis无法长链接引起性能下降问题记录

    今天在部署python代码到预生产环境时,web站老是出现redis链接未初始化,无法连接到服务的提示,比对了一下开发环境与测试环境代码,完全一致,然后就是查看各种日志,排查了半天也没有查明是什么原因 ...

  9. nginx+iis+redis+Task.MainForm构建分布式架构 之 (redis存储分布式共享的session及共享session运作流程)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,上一篇分享文章制作是在windows上使用的nginx,一般正式发布的时候是在linux来配 ...

  10. windows+nginx+iis+redis+Task.MainForm构建分布式架构 之 (nginx+iis构建服务集群)

    本次要分享的是利用windows+nginx+iis+redis+Task.MainForm组建分布式架构,由标题就能看出此内容不是一篇分享文章能说完的,所以我打算分几篇分享文章来讲解,一步一步实现分 ...

随机推荐

  1. lodash常用方法2--修改

    1.map function timesThree(n) { return n * 3; } _.map([1, 2], timesThree); // => [3, 6] 2.remove 移 ...

  2. linux TCP: time wait bucket table overflow

    早上一台rabbitmq和Java所在的服务器,客户端反馈超级卡,看io和cpu都不高.发现六七万消息挤压,临时性问题解决之后,看/var/log/messages,发现很多TCP: time wai ...

  3. Android ant自动打包脚本:自动替换友盟渠道、版本号、包名

    本文最后修改时间:2014-3-10 Android项目开发时,给公司人员安装,频繁升级,版本号总需要改,太麻烦,跟着时间变,自动升级才方便. Android项目开发新版时,手机上可能要装两个版本,一 ...

  4. jQuery fullPage.js 全屏滚动

    fullPage 是一款不依赖任何 js 库的全屏滚动组件,支持垂直/水平滚动.CSS3 旋转/缩放动画,支持 IE5.5+,支持移动设备. 在线实例 垂直滚动 水平滚动 CSS3 动画1 CSS3 ...

  5. 异常之Tomcat7.0服务器无法发布项目

    今天突然就不能发布tomcat 7.0服务器了,并弹出对话框,报出如下错误: Cannot acquire J2EEFlexProjDeployable object for module test ...

  6. 为Titanium创建自己的安卓推送模块

    在手机应用中,推送是一个非常重要的功能.相对来说ios应用的推送功能很容易做,因为它统一都是用苹果的APNS服务实现的.但安卓这边就比较混乱了,虽然谷歌也推出了类似苹果的官方推送服务,但由于谷歌的服务 ...

  7. JavaScript学习笔记-函数

    函数的两种创建方式:函数定义表达式.函数声明语句 编译时,函数声明语句创建的函数会‘被提前’至外部函数的作用域顶部,在该作用域内可以被随意调用: 而函数表达式创建的函数,要调用它必须赋值给一个变量,编 ...

  8. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q16-Q18)

    Question 16 You are designing a SharePoint 2010 solution to manage statements of work. You need to d ...

  9. 【代码笔记】iOS-改变导航条标题的颜色为红色

    一,效果图. 二,代码. RootViewController.m - (void)viewDidLoad { [super viewDidLoad]; // Do any additional se ...

  10. iOS 学习 - 11.圆角(小于等于四个)类似气泡和计算字符高度

    使用贝塞尔曲线, // 小于四个角 圆角 -(void)setbor{ NSString *str = @" couldn't fit this all in a comment to @l ...