Home  >  Article  >  php教程  >  PHP Redis,phpredis

PHP Redis,phpredis

WBOY
WBOYOriginal
2016-06-13 08:51:141393browse

PHP Redis,phpredis

<span>   1</span> <?php <span>if (!<span>defined</span>('BASEPATH')) <span>exit</span>('No direct script access allowed'<span>); 
</span><span>   2</span> <span>class</span><span> Myredis
</span><span>   3</span> <span>{
</span><span>   4</span>     <span>//</span><span>redis所有已知命令:
</span><span>   5</span> <span>    //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</span>
<span>   6</span> 
<span>   7</span>     <span>private</span> <span>static</span> <span>$redis</span><span>;
</span><span>   8</span> 
<span>   9</span>     <span>public</span> <span>function</span> __construct(<span>$arConfig</span> = <span>array</span>('host'=>'127.0.0.1', 'port'=> 6379<span>))
</span><span>  10</span> <span>    {
</span><span>  11</span>         <span>$this</span>->host    =    <span>$arConfig</span>['host'<span>];
</span><span>  12</span>         <span>$this</span>->port    =    <span>$arConfig</span>['port'<span>];
</span><span>  13</span>         self::<span>$redis</span>    =    <span>new</span><span>    Redis();
</span><span>  14</span>         self::<span>$redis</span>->connect(<span>$this</span>->host, <span>$this</span>-><span>port);
</span><span>  15</span>         <span>return</span> self::<span>$redis</span><span>;
</span><span>  16</span> <span>    }
</span><span>  17</span> 
<span>  18</span>     <span>public</span> <span>function</span> __call(<span>$sMethod</span>, <span>$arParam</span><span>)
</span><span>  19</span> <span>    {
</span><span>  20</span>         <span>return</span> <span>call_user_func_array</span>(<span>array</span>(self::<span>$redis</span>, <span>$sMethod</span>), <span>$arParam</span><span>);
</span><span>  21</span> <span>    }
</span><span>  22</span> 
<span>  23</span>     <span>/*</span><span>****************** key ********************</span><span>*/</span>
<span>  24</span> 
<span>  25</span>     <span>/*</span><span>*
</span><span>  26</span> <span>     * 查找所有符合给定模式 pattern 的 key 。
</span><span>  27</span> <span>     * KEYS * 匹配数据库中所有 key 。
</span><span>  28</span> <span>     * KEYS h?llo 匹配 hello , hallo 和 hxllo 等。
</span><span>  29</span> <span>     * KEYS h*llo 匹配 hllo 和 heeeeello 等。
</span><span>  30</span> <span>     * KEYS h[ae]llo 匹配 hello 和 hallo ,但不匹配 hillo 。
</span><span>  31</span> <span>     * 特殊符号用 \ 隔开。
</span><span>  32</span> <span>     * @author    zhaoyingnan    2015-10-16 17:33
</span><span>  33</span> <span>     * @param    string        $sPattern    匹配模式
</span><span>  34</span> <span>     * @return    array
</span><span>  35</span> <span>     *</span><span>*/</span>
<span>  36</span>     <span>public</span> <span>function</span> keys(<span>$sPattern</span> = '*'<span>)
</span><span>  37</span> <span>    {
</span><span>  38</span>         <span>//</span><span>echo $sPattern;</span>
<span>  39</span>         <span>return</span> self::<span>$redis</span>->keys(<span>$sPattern</span><span>);
</span><span>  40</span> <span>    }
</span><span>  41</span> 
<span>  42</span>     <span>/*</span><span>*
</span><span>  43</span> <span>     * 返回key是否存在。
</span><span>  44</span> <span>     * @author    zhaoyingnan    2015-10-16 17:40
</span><span>  45</span> <span>     * @param    string        $sKey        要检测的 key
</span><span>  46</span> <span>     * @return    bool
</span><span>  47</span> <span>     *</span><span>*/</span>
<span>  48</span>     <span>public</span> <span>function</span> exists(<span>$sKey</span><span>)
</span><span>  49</span> <span>    {
</span><span>  50</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span>  51</span>         <span>return</span> self::<span>$redis</span>->exists(<span>$sKey</span><span>);
</span><span>  52</span> <span>    }
</span><span>  53</span> 
<span>  54</span>     <span>/*</span><span>*
</span><span>  55</span> <span>     * 设置key的过期时间。如果key已过期,将会被自动删除。设置了过期时间的key被称之为volatile。
</span><span>  56</span> <span>     * 在key过期之前可以重新更新他的过期时间,也可以使用PERSIST命令删除key的过期时间。
</span><span>  57</span> <span>     * @author    zhaoyingnan    2015-10-16 17:46
</span><span>  58</span> <span>     * @param    string        $sKey        key
</span><span>  59</span> <span>     * @param    int            $iSecond    生存周期(秒)
</span><span>  60</span> <span>     * @return    bool
</span><span>  61</span> <span>     *</span><span>*/</span>
<span>  62</span>     <span>public</span> <span>function</span> expire(<span>$sKey</span>, <span>$iSecond</span> = 60<span>)
</span><span>  63</span> <span>    {
</span><span>  64</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span>  65</span>         <span>return</span> self::<span>$redis</span>->expire(<span>$sKey</span>, <span>$iSecond</span><span>);
</span><span>  66</span> <span>    }
</span><span>  67</span> 
<span>  68</span>     <span>/*</span><span>*
</span><span>  69</span> <span>     * 这个命令和 EXPIRE 命令的作用类似,但是它以毫秒为单位设置 key 的生存时间,而不像 EXPIRE 命令那样,以秒为单位。
</span><span>  70</span> <span>     * @author    zhaoyingnan    2015-10-19 16:00
</span><span>  71</span> <span>     * @param    string        $sKey        key
</span><span>  72</span> <span>     * @param    int            $iSecond    生存周期(秒)
</span><span>  73</span> <span>     * @return    bool
</span><span>  74</span> <span>     *</span><span>*/</span>
<span>  75</span>     <span>public</span> <span>function</span> pexpire(<span>$sKey</span>, <span>$iMilliseconds</span> = 60000<span>)
</span><span>  76</span> <span>    {
</span><span>  77</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span>  78</span>         <span>return</span> self::<span>$redis</span>->pexpire(<span>$sKey</span>, <span>$iMilliseconds</span><span>);
</span><span>  79</span> <span>    }
</span><span>  80</span> 
<span>  81</span>     <span>/*</span><span>*
</span><span>  82</span> <span>     * EXPIREAT 的作用和 EXPIRE类似,都用于为 key 设置生存时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳 Unix timestamp 。
</span><span>  83</span> <span>     * @author    zhaoyingnan    2015-10-16 18:03
</span><span>  84</span> <span>     * @param    string        $sKey        key
</span><span>  85</span> <span>     * @param    int            $iUnixtimestamp    UNIX 时间戳(秒)
</span><span>  86</span> <span>     * @return    bool
</span><span>  87</span> <span>     *</span><span>*/</span>
<span>  88</span>     <span>public</span> <span>function</span> expireat(<span>$sKey</span>, <span>$iUnixtimestamp</span><span>)
</span><span>  89</span> <span>    {
</span><span>  90</span>         <span>if</span>(!<span>$sKey</span> || !<span>$iUnixtimestamp</span>)<span>return</span> <span>FALSE</span><span>;
</span><span>  91</span>         <span>return</span> self::<span>$redis</span>->expireat(<span>$sKey</span>, <span>$iUnixtimestamp</span><span>);
</span><span>  92</span> <span>    }
</span><span>  93</span> 
<span>  94</span>     <span>/*</span><span>*
</span><span>  95</span> <span>     * PEXPIREAT 这个命令和 EXPIREAT命令类似,但它以毫秒为单位设置 key 的过期 unix 时间戳,而不是像 EXPIREAT 那样,以秒为单位。
</span><span>  96</span> <span>     * EXPIREAT 的作用和 EXPIRE类似,都用于为 key 设置生存时间。不同在于 EXPIREAT 命令接受的时间参数是 UNIX 时间戳 Unix timestamp 。
</span><span>  97</span> <span>     * @author    zhaoyingnan    2015-10-16 18:03
</span><span>  98</span> <span>     * @param    string        $sKey        key
</span><span>  99</span> <span>     * @param    int            $iMilliseconds    UNIX 时间戳(毫秒)
</span><span> 100</span> <span>     * @return    bool
</span><span> 101</span> <span>     *</span><span>*/</span>
<span> 102</span>     <span>public</span> <span>function</span> pexpireat(<span>$sKey</span>, <span>$iMilliseconds</span><span>)
</span><span> 103</span> <span>    {
</span><span> 104</span>         <span>if</span>(!<span>$sKey</span> || !<span>$iMilliseconds</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 105</span>         <span>return</span> self::<span>$redis</span>->pexpireat(<span>$sKey</span>, <span>$iMilliseconds</span><span>);
</span><span> 106</span> <span>    }
</span><span> 107</span> 
<span> 108</span>     <span>/*</span><span>*
</span><span> 109</span> <span>     * 以秒为单位,返回给定 key 的剩余生存时间(TTL, time to live)。
</span><span> 110</span> <span>     * @author    zhaoyingnan    2015-10-16 17:52
</span><span> 111</span> <span>     * @param    string        $sKey        key
</span><span> 112</span> <span>     * @return    int            当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key 的剩余生存时间。
</span><span> 113</span> <span>     *</span><span>*/</span>
<span> 114</span>     <span>public</span> <span>function</span> ttl(<span>$sKey</span><span>)
</span><span> 115</span> <span>    {
</span><span> 116</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> -2<span>;
</span><span> 117</span>         <span>return</span> self::<span>$redis</span>->ttl(<span>$sKey</span><span>);
</span><span> 118</span> <span>    }
</span><span> 119</span> 
<span> 120</span>     <span>/*</span><span>*
</span><span> 121</span> <span>     * 这个命令类似于 TTL 命令,但它以毫秒为单位返回 key 的剩余生存时间,而不是像 TTL 命令那样,以秒为单位。
</span><span> 122</span> <span>     * @author    zhaoyingnan    2015-10-19 16:06
</span><span> 123</span> <span>     * @param    string        $sKey        key
</span><span> 124</span> <span>     * @return    int            当 key 不存在时,返回 -2 。当 key 存在但没有设置剩余生存时间时,返回 -1 。否则,以秒为单位,返回 key 的剩余生存时间。
</span><span> 125</span> <span>     *</span><span>*/</span>
<span> 126</span>     <span>public</span> <span>function</span> pttl(<span>$sKey</span><span>)
</span><span> 127</span> <span>    {
</span><span> 128</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> -2<span>;
</span><span> 129</span>         <span>return</span> self::<span>$redis</span>->pttl(<span>$sKey</span><span>);
</span><span> 130</span> <span>    }
</span><span> 131</span> 
<span> 132</span>     <span>/*</span><span>*
</span><span> 133</span> <span>     * 将 key 原子性地从当前实例传送到目标实例的指定数据库上,一旦传送成功, key 保证会出现在目标实例上,而当前实例上的 key 会被删除。
</span><span> 134</span> <span>     * 这个命令是一个原子操作,它在执行的时候会阻塞进行迁移的两个实例,直到以下任意结果发生:迁移成功,迁移失败,等到超时。
</span><span> 135</span> <span>     * @author    zhaoyingnan    2015-10-16 18:24
</span><span> 136</span> <span>     * @param    string        $sHost        目标 ip
</span><span> 137</span> <span>     * @param    int            $iPort        端口
</span><span> 138</span> <span>     * @param    string        $sKey        要操作的 key
</span><span> 139</span> <span>     * @param    int            $iDb        目标实例的数据库的编号
</span><span> 140</span> <span>     * @param    int            $iTimeout    timeout 参数以毫秒为格式,指定当前实例和目标实例进行沟通的最大间隔时间。这说明操作并不一定要在 timeout 毫秒内完成,只是说数据传送的时间不能超过这个 timeout 数。
</span><span> 141</span> <span>     * @return    bool        注:当目标实例的指定的数据库中存在指定的 key 返回 FALS,当前实例中的 key 并没有被删除,也没有移动到目标实例上,目标实例上的 key 还是原来的
</span><span> 142</span> <span>     *</span><span>*/</span>
<span> 143</span>     <span>public</span> <span>function</span> migrate(<span>$sHost</span>, <span>$iPort</span>, <span>$sKey</span>, <span>$iDb</span>, <span>$iTimeout</span><span>)
</span><span> 144</span> <span>    {
</span><span> 145</span>         <span>if</span>(!<span>$sHost</span> || !<span>$iPort</span> || !<span>$sKey</span> || !<span>$iDb</span> || !<span>$iTimeout</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 146</span>         <span>return</span> self::<span>$redis</span>->migrate(<span>$sHost</span>, <span>$iPort</span>, <span>$sKey</span>, <span>$iDb</span>, <span>$iTimeout</span><span>);
</span><span> 147</span> <span>    }
</span><span> 148</span> 
<span> 149</span>     <span>/*</span><span>*
</span><span> 150</span> <span>     * 将当前数据库的 key 移动到给定的数据库 db 当中。
</span><span> 151</span> <span>     * 如果当前数据库(源数据库)和给定数据库(目标数据库)有相同名字的给定 key ,或者 key 不存在于当前数据库,那么 MOVE 没有任何效果。
</span><span> 152</span> <span>     * @author    zhaoyingnan    2015-10-19 15:42
</span><span> 153</span> <span>     * @param    string        $sKey    key
</span><span> 154</span> <span>     * @param    int            $iDb    移动到给定的数据库 id
</span><span> 155</span> <span>     * @return    bool
</span><span> 156</span> <span>     *</span><span>*/</span>
<span> 157</span>     <span>public</span> <span>function</span> move(<span>$sKey</span>, <span>$iDb</span><span>)
</span><span> 158</span> <span>    {
</span><span> 159</span>         <span>if</span>(!<span>$sKey</span> || !<span>$iDb</span>)<span>return</span> <span>FALSE</span><span>;    
</span><span> 160</span>         <span>return</span> self::<span>$redis</span>->move(<span>$sKey</span>, <span>$iDb</span><span>);
</span><span> 161</span> <span>    }
</span><span> 162</span> 
<span> 163</span>     <span>/*</span><span>*
</span><span> 164</span> <span>     * 移除给定key的生存时间,将这个 key 从『易失的』(带生存时间 key )转换成『持久的』(一个不带生存时间、永不过期的 key )。
</span><span> 165</span> <span>     * @author    zhaoyingnan    2015-10-19 15:55
</span><span> 166</span> <span>     * @param    string        $sKey    key
</span><span> 167</span> <span>     * @return    bool        当生存时间移除成功时,返回 1  如果 key 不存在或 key 没有设置生存时间,返回 0
</span><span> 168</span> <span>     *</span><span>*/</span>
<span> 169</span>     <span>public</span> <span>function</span> persist(<span>$sKey</span><span>)
</span><span> 170</span> <span>    {
</span><span> 171</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;    
</span><span> 172</span>         <span>return</span> self::<span>$redis</span>->persist(<span>$sKey</span><span>);
</span><span> 173</span> <span>    }
</span><span> 174</span> 
<span> 175</span>     <span>/*</span><span>*
</span><span> 176</span> <span>     * 从当前数据库返回一个随机的key。
</span><span> 177</span> <span>     * @author    zhaoyingnan    2015-10-19 16:08
</span><span> 178</span> <span>     * @return    string        如果数据库没有任何key,返回nil,否则返回一个随机的key。    
</span><span> 179</span> <span>     *</span><span>*/</span>
<span> 180</span>     <span>public</span> <span>function</span><span> randomkey()
</span><span> 181</span> <span>    {
</span><span> 182</span>         <span>return</span> self::<span>$redis</span>-><span>randomkey();
</span><span> 183</span> <span>    }
</span><span> 184</span> 
<span> 185</span>     <span>/*</span><span>*
</span><span> 186</span> <span>     * 将key重命名为newkey,如果key与newkey相同,将返回一个错误。如果newkey已经存在,则值将被覆盖。
</span><span> 187</span> <span>     * @author    zhaoyingnan    2015-10-19 16:12
</span><span> 188</span> <span>     * @param    string        $sKey    key
</span><span> 189</span> <span>     * @param    string        $sNewKey    重命名后的 key 值    
</span><span> 190</span> <span>     * @return    bool
</span><span> 191</span> <span>     *</span><span>*/</span>
<span> 192</span>     <span>public</span> <span>function</span> <span>rename</span>(<span>$sKey</span>, <span>$sNewKey</span><span>)
</span><span> 193</span> <span>    {
</span><span> 194</span>         <span>if</span>(!<span>$sKey</span> || !<span>$sNewKey</span>)<span>return</span> <span>FALSE</span><span>;    
</span><span> 195</span>         <span>return</span> self::<span>$redis</span>-><span>rename</span>(<span>$sKey</span>, <span>$sNewKey</span><span>);
</span><span> 196</span> <span>    }
</span><span> 197</span> 
<span> 198</span>     <span>/*</span><span>*
</span><span> 199</span> <span>     * 当且仅当 newkey 不存在时,将 key 改名为 newkey 。当 key 不存在时,返回一个错误。
</span><span> 200</span> <span>     * @author    zhaoyingnan    2015-10-19 16:16
</span><span> 201</span> <span>     * @param    string        $sKey    key
</span><span> 202</span> <span>     * @param    string        $sNewKey    重命名后的 key 值    
</span><span> 203</span> <span>     * @return    bool
</span><span> 204</span> <span>     *</span><span>*/</span>
<span> 205</span>     <span>public</span> <span>function</span> renamenx(<span>$sKey</span>, <span>$sNewKey</span><span>)
</span><span> 206</span> <span>    {
</span><span> 207</span>         <span>if</span>(!<span>$sKey</span> || !<span>$sNewKey</span>)<span>return</span> <span>FALSE</span><span>;    
</span><span> 208</span>         <span>return</span> self::<span>$redis</span>->renamenx(<span>$sKey</span>, <span>$sNewKey</span><span>);
</span><span> 209</span> <span>    }
</span><span> 210</span> 
<span> 211</span>     <span>/*</span><span>*
</span><span> 212</span> <span>     * 返回 key 所储存的值的类型。
</span><span> 213</span> <span>     * @author    zhaoyingnan    2015-10-19 16:25
</span><span> 214</span> <span>     * @param    string        $sKey    key
</span><span> 215</span> <span>     * @return    string        none (key不存在) string (字符串) list (列表) set (集合) zset (有序集) hash (哈希表)
</span><span> 216</span> <span>     *</span><span>*/</span>
<span> 217</span>     <span>public</span> <span>function</span> type(<span>$sKey</span><span>)
</span><span> 218</span> <span>    {
</span><span> 219</span>         <span>return</span> self::<span>$redis</span>->type(<span>$sKey</span><span>);
</span><span> 220</span> <span>    }
</span><span> 221</span> 
<span> 222</span>     <span>/*</span><span>****************** string ********************</span><span>*/</span>
<span> 223</span> 
<span> 224</span>     <span>/*</span><span>*
</span><span> 225</span> <span>     * 将key和value对应。如果key已经存在了,它会被覆盖,而不管它是什么类型。
</span><span> 226</span> <span>     * @author    zhaoyingnan    2015-10-19 16:35
</span><span> 227</span> <span>     * @param    string        $sKey        key
</span><span> 228</span> <span>     * @param    string        $sValue        key 对应的值
</span><span> 229</span> <span>     * @return    bool
</span><span> 230</span> <span>     *</span><span>*/</span>
<span> 231</span>     <span>public</span> <span>function</span> set(<span>$sKey</span>, <span>$sValue</span><span>)
</span><span> 232</span> <span>    {
</span><span> 233</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 234</span>         <span>return</span> self::<span>$redis</span>->set(<span>$sKey</span>, <span>$sValue</span><span>);
</span><span> 235</span> <span>    }
</span><span> 236</span> 
<span> 237</span>     <span>/*</span><span>*
</span><span> 238</span> <span>     * 设置key对应字符串value,并且设置key在给定的 seconds 时间之后超时过期。
</span><span> 239</span> <span>     * @author    zhaoyingnan    2015-11-03 11:25
</span><span> 240</span> <span>     * @param    string        $sKey        被操作的 key
</span><span> 241</span> <span>     * @param    int            $iSecond    生命周期(秒)
</span><span> 242</span> <span>     * @param    string        $sValue        key 对应的 value
</span><span> 243</span> <span>     * @return    bool
</span><span> 244</span> <span>     *</span><span>*/</span>
<span> 245</span>     <span>public</span> <span>function</span> setex(<span>$sKey</span>, <span>$iSecond</span>, <span>$sValue</span><span>)
</span><span> 246</span> <span>    {
</span><span> 247</span>         <span>if</span>(!<span>$sKey</span> || !<span>$sValue</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 248</span>         <span>$iSecond</span> = <span>$iSecond</span> ? <span>abs</span>((<span>intval</span>(<span>$iSecond</span>))) : 30<span>;
</span><span> 249</span>         <span>return</span> self::<span>$redis</span>->setex(<span>$sKey</span>, <span>$iSecond</span>, <span>$sValue</span><span>);
</span><span> 250</span> <span>    }
</span><span> 251</span> 
<span> 252</span>     <span>/*</span><span>*
</span><span> 253</span> <span>     * 设置key对应字符串value,并且设置key在给定的 milliseconds 时间之后超时过期。
</span><span> 254</span> <span>     * @author    zhaoyingnan    2015-11-03 11:25
</span><span> 255</span> <span>     * @param    string        $sKey        被操作的 key
</span><span> 256</span> <span>     * @param    int            $iMillSecond    生命周期(毫秒)
</span><span> 257</span> <span>     * @param    string        $sValue        key 对应的 value
</span><span> 258</span> <span>     * @return    bool
</span><span> 259</span> <span>     *</span><span>*/</span>
<span> 260</span>     <span>public</span> <span>function</span> psetex(<span>$sKey</span>, <span>$iMilliseconds</span> , <span>$sValue</span><span>)
</span><span> 261</span> <span>    {
</span><span> 262</span>         <span>if</span>(!<span>$sKey</span> || !<span>$sValue</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 263</span>         <span>$iMilliseconds</span> = <span>$iMilliseconds</span> ? <span>abs</span>((<span>intval</span>(<span>$iMilliseconds</span>))) : 30<span>;
</span><span> 264</span>         <span>return</span> self::<span>$redis</span>->psetex(<span>$sKey</span>, <span>$iMilliseconds</span>, <span>$sValue</span><span>);
</span><span> 265</span> <span>    }
</span><span> 266</span> 
<span> 267</span>     <span>/*</span><span>*
</span><span> 268</span> <span>     * 自动将key对应到value并且返回原来key对应的value。如果key存在但是对应的value不是字符串,就返回错误。
</span><span> 269</span> <span>     * @author    zhaoyingnan    2015-10-19 18:10
</span><span> 270</span> <span>     * @param    string        $sKey        key
</span><span> 271</span> <span>     * @param    string        $sValue        设置的新的值
</span><span> 272</span> <span>     * @return    string
</span><span> 273</span> <span>     *</span><span>*/</span>
<span> 274</span>     <span>public</span> <span>function</span> getset(<span>$sKey</span>, <span>$sValue</span><span>)
</span><span> 275</span> <span>    {
</span><span> 276</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> ''<span>;
</span><span> 277</span>         <span>return</span> self::<span>$redis</span>->getset(<span>$sKey</span>, <span>$sValue</span><span>);
</span><span> 278</span> <span>    }
</span><span> 279</span> 
<span> 280</span>     <span>/*</span><span>*
</span><span> 281</span> <span>     * 对应给定的keys到他们相应的values上。MSET会用新的value替换已经存在的value,就像普通的SET命令一样。
</span><span> 282</span> <span>     * 如果你不想覆盖已经存在的values,请参看命令MSETNX。
</span><span> 283</span> <span>     * MSET是原子的,所以所有给定的keys是一次性set的。客户端不可能看到这种一部分keys被更新而另外的没有改变的情况。
</span><span> 284</span> <span>     * @author    zhaoyingnan    2015-11-03 11:04
</span><span> 285</span> <span>     * @param    array        $arArray    被设置的关联数组
</span><span> 286</span> <span>     * @return    bool
</span><span> 287</span> <span>     *</span><span>*/</span>
<span> 288</span>     <span>public</span> <span>function</span> mset(<span>$arArray</span> = <span>array</span><span>())
</span><span> 289</span> <span>    {
</span><span> 290</span>         <span>if</span>(!<span>$arArray</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 291</span>         <span>return</span> self::<span>$redis</span>->mset(<span>$arArray</span><span>);
</span><span> 292</span> <span>    }
</span><span> 293</span> 
<span> 294</span>     <span>/*</span><span>*
</span><span> 295</span> <span>     * 对应给定的keys到他们相应的values上。
</span><span> 296</span> <span>     * 只要有一个key已经存在,MSETNX一个操作都不会执行。 
</span><span> 297</span> <span>     * 由于这种特性,MSETNX可以实现要么所有的操作都成功,要么一个都不执行,这样可以用来设置不同的key,来表示一个唯一的对象的不同字段。
</span><span> 298</span> <span>     * MSETNX是原子的,所以所有给定的keys是一次性set的。客户端不可能看到这种一部分keys被更新而另外的没有改变的情况。
</span><span> 299</span> <span>     * @author    zhaoyingnan    2015-11-03 11:11
</span><span> 300</span> <span>     * @param    array        $arArray    被设置的关联数组
</span><span> 301</span> <span>     * @return    bool        TRUE 所有的key被set, FALSE 没有key被set(至少其中有一个key是存在的)
</span><span> 302</span> <span>     *</span><span>*/</span>
<span> 303</span>     <span>public</span> <span>function</span>    msetnx(<span>$arArray</span> = <span>array</span><span>())
</span><span> 304</span> <span>    {
</span><span> 305</span>         <span>if</span>(!<span>$arArray</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 306</span>         <span>return</span> self::<span>$redis</span>->msetnx(<span>$arArray</span><span>);
</span><span> 307</span> <span>    }
</span><span> 308</span> 
<span> 309</span>     <span>/*</span><span>*
</span><span> 310</span> <span>     * 如果key不存在,就设置key对应字符串value。
</span><span> 311</span> <span>     * 在这种情况下,该命令和SET一样。当key已经存在时,就不做任何操作。
</span><span> 312</span> <span>     * SETNX是"SET if Not eXists"。
</span><span> 313</span> <span>     * @author    zhaoyingnan    2015-11-03 11:49
</span><span> 314</span> <span>     * @param    string        $sKey        key
</span><span> 315</span> <span>     * @param    string        $sValue        值
</span><span> 316</span> <span>     * @return    bool        TRUE key被set, FALSE key没有被set
</span><span> 317</span> <span>     *</span><span>*/</span>
<span> 318</span>     <span>public</span> <span>function</span> setnx(<span>$sKey</span>, <span>$sValue</span><span>)
</span><span> 319</span> <span>    {
</span><span> 320</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 321</span>         <span>return</span> self::<span>$redis</span>->setnx(<span>$sKey</span>, <span>$sValue</span><span>);
</span><span> 322</span> <span>    }
</span><span> 323</span> 
<span> 324</span>     <span>/*</span><span>*
</span><span> 325</span> <span>     * 返回key的value。如果key不存在,返回特殊值nil。如果key的value不是string,就返回错误,因为GET只处理string类型的values。
</span><span> 326</span> <span>     * @author    zhaoyingnan    2015-10-19 17:57
</span><span> 327</span> <span>     * @param    string        $sKey        key
</span><span> 328</span> <span>     * @return    string
</span><span> 329</span> <span>     *</span><span>*/</span>
<span> 330</span>     <span>public</span> <span>function</span> get(<span>$sKey</span><span>)
</span><span> 331</span> <span>    {
</span><span> 332</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> ''<span>;
</span><span> 333</span>         <span>return</span> self::<span>$redis</span>->get(<span>$sKey</span><span>);
</span><span> 334</span> <span>    }
</span><span> 335</span> 
<span> 336</span>     <span>/*</span><span>*
</span><span> 337</span> <span>     * 返回所有指定的key的value。对于每个不对应string或者不存在的key,都返回特殊值nil。正因为此,这个操作从来不会失败。
</span><span> 338</span> <span>     * @author    zhaoyingnan    2015-11-03 10:55
</span><span> 339</span> <span>     * @param    array        $arKey        要获取的 key 的数组
</span><span> 340</span> <span>     * @return    array        redis返回的是以数字为索引的数组,这里返回的是一个关联数组
</span><span> 341</span> <span>     *</span><span>*/</span>
<span> 342</span>     <span>public</span> <span>function</span> mget(<span>$arKey</span> = <span>array</span><span>())
</span><span> 343</span> <span>    {
</span><span> 344</span>         <span>if</span>(!<span>$arKey</span>)<span>return</span> <span>array</span><span>();
</span><span> 345</span>         <span>$arResult</span> = self::<span>$redis</span>->mget(<span>$arKey</span><span>);
</span><span> 346</span>         <span>return</span> <span>array_combine</span>(<span>$arKey</span>, <span>$arResult</span><span>);
</span><span> 347</span> <span>    }
</span><span> 348</span> 
<span> 349</span>     <span>/*</span><span>*
</span><span> 350</span> <span>     * 如果 key 已经存在,并且值为字符串,那么这个命令会把 value 追加到原来值(value)的结尾。
</span><span> 351</span> <span>     * 如果 key 不存在,那么它将首先创建一个空字符串的key,再执行追加操作,这种情况 APPEND 将类似于 SET 操作。
</span><span> 352</span> <span>     * @author    zhaoyingnan    2015-10-19 16:34
</span><span> 353</span> <span>     * @param    string        $sKey        key
</span><span> 354</span> <span>     * @param    string        $sValue        追加的值
</span><span> 355</span> <span>     * @return    int
</span><span> 356</span> <span>     *</span><span>*/</span>
<span> 357</span>     <span>public</span> <span>function</span> append(<span>$sKey</span>, <span>$sValue</span><span>)
</span><span> 358</span> <span>    {
</span><span> 359</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 360</span>         <span>return</span> self::<span>$redis</span>->append(<span>$sKey</span>, <span>$sValue</span><span>);
</span><span> 361</span> <span>    }
</span><span> 362</span> 
<span> 363</span>     <span>/*</span><span>*
</span><span> 364</span> <span>     * 对key对应的数字做加1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。
</span><span> 365</span> <span>     * 如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。
</span><span> 366</span> <span>     * 这个操作最大支持在64位有符号的整型数字。
</span><span> 367</span> <span>     * @author    zhaoyingnan    2015-10-19 17:44
</span><span> 368</span> <span>     * @param    string        $sKey        key
</span><span> 369</span> <span>     * @return    string
</span><span> 370</span> <span>     *</span><span>*/</span>
<span> 371</span>     <span>public</span> <span>function</span> incr(<span>$sKey</span><span>)
</span><span> 372</span> <span>    {
</span><span> 373</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> ''<span>;
</span><span> 374</span>         <span>return</span> self::<span>$redis</span>->incr(<span>$sKey</span><span>);
</span><span> 375</span> <span>    }
</span><span> 376</span> 
<span> 377</span>     <span>/*</span><span>*
</span><span> 378</span> <span>     * 将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0。
</span><span> 379</span> <span>     * 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
</span><span> 380</span> <span>     * @author    zhaoyingnan    2015-10-19 17:44
</span><span> 381</span> <span>     * @param    string        $sKey        key
</span><span> 382</span> <span>     * @param    int            $iIncrement    步进值
</span><span> 383</span> <span>     * @return    string
</span><span> 384</span> <span>     *</span><span>*/</span>
<span> 385</span>     <span>public</span> <span>function</span> incrby(<span>$sKey</span>, <span>$iIncrement</span><span>)
</span><span> 386</span> <span>    {
</span><span> 387</span>         <span>if</span>(!<span>$sKey</span> || !<span>$iIncrement</span>)<span>return</span> ''<span>;
</span><span> 388</span>         <span>return</span> self::<span>$redis</span>->incrby(<span>$sKey</span>, <span>$iIncrement</span><span>);
</span><span> 389</span> <span>    }
</span><span> 390</span> 
<span> 391</span>     <span>/*</span><span>*
</span><span> 392</span> <span>     * 将key对应的数字加decrement。如果key不存在,操作之前,key就会被置为0。
</span><span> 393</span> <span>     * 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
</span><span> 394</span> <span>     * @author    zhaoyingnan    2015-10-19 17:44
</span><span> 395</span> <span>     * @param    string        $sKey        key
</span><span> 396</span> <span>     * @param    fload        $floatIncrement    步进值
</span><span> 397</span> <span>     * @return    string
</span><span> 398</span> <span>     *</span><span>*/</span>
<span> 399</span>     <span>public</span> <span>function</span> incrbyfloat(<span>$sKey</span>, <span>$floatIncrement</span><span>)
</span><span> 400</span> <span>    {
</span><span> 401</span>         <span>if</span>(!<span>$sKey</span> || !<span>$floatIncrement</span>)<span>return</span> ''<span>;
</span><span> 402</span>         <span>return</span> self::<span>$redis</span>->incrbyfloat(<span>$sKey</span>, <span>$floatIncrement</span><span>);
</span><span> 403</span> <span>    }
</span><span> 404</span> 
<span> 405</span>     <span>/*</span><span>*
</span><span> 406</span> <span>     * 对key对应的数字做减1操作。如果key不存在,那么在操作之前,这个key对应的值会被置为0。
</span><span> 407</span> <span>     * 如果key有一个错误类型的value或者是一个不能表示成数字的字符串,就返回错误。这个操作最大支持在64位有符号的整型数字。
</span><span> 408</span> <span>     * @author    zhaoyingnan    2015-10-19 17:44
</span><span> 409</span> <span>     * @param    string        $sKey        key
</span><span> 410</span> <span>     * @return    string
</span><span> 411</span> <span>     *</span><span>*/</span>
<span> 412</span>     <span>public</span> <span>function</span> decr(<span>$sKey</span><span>)
</span><span> 413</span> <span>    {
</span><span> 414</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> ''<span>;
</span><span> 415</span>         <span>return</span> self::<span>$redis</span>->decr(<span>$sKey</span><span>);
</span><span> 416</span> <span>    }
</span><span> 417</span> 
<span> 418</span>     <span>/*</span><span>*
</span><span> 419</span> <span>     * 将key对应的数字减decrement。如果key不存在,操作之前,key就会被置为0。
</span><span> 420</span> <span>     * 如果key的value类型错误或者是个不能表示成数字的字符串,就返回错误。这个操作最多支持64位有符号的正型数字。
</span><span> 421</span> <span>     * @author    zhaoyingnan    2015-10-19 17:44
</span><span> 422</span> <span>     * @param    string        $sKey        key
</span><span> 423</span> <span>     * @param    int            $iIncrement    步进值
</span><span> 424</span> <span>     * @return    string
</span><span> 425</span> <span>     *</span><span>*/</span>
<span> 426</span>     <span>public</span> <span>function</span> decrby(<span>$sKey</span>, <span>$iIncrement</span><span>)
</span><span> 427</span> <span>    {
</span><span> 428</span>         <span>if</span>(!<span>$sKey</span> || !<span>$iIncrement</span>)<span>return</span> ''<span>;
</span><span> 429</span>         <span>return</span> self::<span>$redis</span>->decrby(<span>$sKey</span>, <span>$iIncrement</span><span>);
</span><span> 430</span> <span>    }
</span><span> 431</span> 
<span> 432</span>     <span>/*</span><span>*
</span><span> 433</span> <span>     * 这个命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。 
</span><span> 434</span> <span>     * 返回key对应的字符串value的子串,这个子串是由start和end位移决定的(两者都在string内)。
</span><span> 435</span> <span>     * 可以用负的位移来表示从string尾部开始数的下标。所以-1就是最后一个字符,-2就是倒数第二个,以此类推。
</span><span> 436</span> <span>     * 这个函数处理超出范围的请求时,都把结果限制在string内。
</span><span> 437</span> <span>     * @author    zhaoyingnan    2015-10-19 18:04
</span><span> 438</span> <span>     * @param    string        $sKey        key
</span><span> 439</span> <span>     * @pause    int            $iStart        开始位置
</span><span> 440</span> <span>     * @pause    int            $iEnd        结束位置
</span><span> 441</span> <span>     * @return    string
</span><span> 442</span> <span>     *</span><span>*/</span>
<span> 443</span>     <span>public</span> <span>function</span> getrange(<span>$sKey</span>, <span>$iStart</span> = 0, <span>$iEnd</span> = -1<span>)
</span><span> 444</span> <span>    {
</span><span> 445</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> ''<span>;
</span><span> 446</span>         <span>return</span> self::<span>$redis</span>->getrange(<span>$sKey</span>, <span>$iStart</span>, <span>$iEnd</span><span>);
</span><span> 447</span> <span>    }
</span><span> 448</span> 
<span> 449</span>     <span>/*</span><span>*
</span><span> 450</span> <span>     * 返回key的string类型value的长度。如果key对应的非string类型,就返回错误。
</span><span> 451</span> <span>     * @author    zhaoyingnan    2015-11-03 11:40
</span><span> 452</span> <span>     * @param    string        $sKey
</span><span> 453</span> <span>     * @return    
</span><span> 454</span> <span>     *</span><span>*/</span>
<span> 455</span>     <span>public</span> <span>function</span> <span>strlen</span>(<span>$sKey</span><span>)
</span><span> 456</span> <span>    {
</span><span> 457</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 458</span>         <span>return</span> self::<span>$redis</span>-><span>strlen</span>(<span>$sKey</span><span>);
</span><span> 459</span> <span>    }
</span><span> 460</span> 
<span> 461</span>     <span>/*</span><span>****************** list ********************</span><span>*/</span>
<span> 462</span> 
<span> 463</span>     <span>/*</span><span>*
</span><span> 464</span> <span>     * 将所有指定的值插入到存于 key 的列表的头部。如果 key 不存在,那么在进行 push 操作前会创建一个空列表。 
</span><span> 465</span> <span>     * 如果 key 对应的值不是一个 list 的话,那么会返回一个错误。
</span><span> 466</span> <span>     * 可以使用一个命令把多个元素 push 进入列表,只需在命令末尾加上多个指定的参数。
</span><span> 467</span> <span>     * 元素是从最左端的到最右端的、一个接一个被插入到 list 的头部。 所以对于这个命令例子 LPUSH mylist a b c,返回的列表是 c 为第一个元素, b 为第二个元素, a 为第三个元素。
</span><span> 468</span> <span>     * @author    zhaoyingnan    2015-11-03 11:59
</span><span> 469</span> <span>     * @param    string        $sKey
</span><span> 470</span> <span>     * @param    array        $arValue    需要 push 到 key 中的值的数组
</span><span> 471</span> <span>     * @return    int            在 push 操作后的 list 长度。
</span><span> 472</span> <span>     *</span><span>*/</span>
<span> 473</span>     <span>public</span> <span>function</span> lpush(<span>$sKey</span>, <span>$arValue</span> = <span>array</span><span>())
</span><span> 474</span> <span>    {
</span><span> 475</span>         <span>if</span>(!<span>$sKey</span> || !<span>$arValue</span>)<span>return</span> 0<span>;
</span><span> 476</span>         <span>foreach</span>(<span>$arValue</span> <span>as</span> <span>$val</span><span>)
</span><span> 477</span>             self::<span>$redis</span>->lpush(<span>$sKey</span>, <span>$val</span><span>);
</span><span> 478</span>         <span>return</span> self::llen(<span>$sKey</span><span>);
</span><span> 479</span> <span>    }
</span><span> 480</span> 
<span> 481</span>     <span>/*</span><span>*
</span><span> 482</span> <span>     * 只有当 key 已经存在并且存着一个 list 的时候,在这个 key 下面的 list 的头部插入 value。 
</span><span> 483</span> <span>     * 与 LPUSH 相反,当 key 不存在的时候不会进行任何操作。
</span><span> 484</span> <span>     * @author    zhaoyingnan    2015-11-03 13:21
</span><span> 485</span> <span>     * @param    string        $sKey
</span><span> 486</span> <span>     * @param    array        $arValue    需要 push 到 key 中的值的数组
</span><span> 487</span> <span>     * @return    int
</span><span> 488</span> <span>     *</span><span>*/</span>
<span> 489</span>     <span>public</span> <span>function</span> lpushx(<span>$sKey</span>, <span>$arValue</span> = <span>array</span><span>())
</span><span> 490</span> <span>    {
</span><span> 491</span>         <span>if</span>(!<span>$sKey</span> || !<span>$arValue</span>)<span>return</span> 0<span>;
</span><span> 492</span>         <span>foreach</span>(<span>$arValue</span> <span>as</span> <span>$val</span><span>)
</span><span> 493</span>             self::<span>$redis</span>->lpushx(<span>$sKey</span>, <span>$val</span><span>);
</span><span> 494</span>         <span>return</span> self::llen(<span>$sKey</span><span>);
</span><span> 495</span> <span>    }
</span><span> 496</span> 
<span> 497</span>     <span>/*</span><span>*
</span><span> 498</span> <span>     * 向存于 key 的列表的尾部插入所有指定的值。如果 key 不存在,那么会创建一个空的列表然后再进行 push 操作。 
</span><span> 499</span> <span>     * 当 key 保存的不是一个列表,那么会返回一个错误。
</span><span> 500</span> <span>     * 可以使用一个命令把多个元素打入队列,只需要在命令后面指定多个参数。
</span><span> 501</span> <span>     * 元素是从左到右一个接一个从列表尾部插入。 比如命令 RPUSH mylist a b c 会返回一个列表,其第一个元素是 a ,第二个元素是 b ,第三个元素是 c。
</span><span> 502</span> <span>     * @author    zhaoyingnan    2015-11-03 12:15
</span><span> 503</span> <span>     * @param    string        $sKey
</span><span> 504</span> <span>     * @param    array        $arValue    需要 push 到 key 中的值的数组
</span><span> 505</span> <span>     * @return    int            在 push 操作后的 list 长度。
</span><span> 506</span> <span>     *</span><span>*/</span>
<span> 507</span>     <span>public</span> <span>function</span> rpush(<span>$sKey</span>, <span>$arValue</span> = <span>array</span><span>())
</span><span> 508</span> <span>    {
</span><span> 509</span>         <span>if</span>(!<span>$sKey</span> || !<span>$arValue</span>)<span>return</span> 0<span>;
</span><span> 510</span>         <span>foreach</span>(<span>$arValue</span> <span>as</span> <span>$val</span><span>)
</span><span> 511</span>             self::<span>$redis</span>->lpush(<span>$sKey</span>, <span>$val</span><span>);
</span><span> 512</span>         <span>return</span> self::llen(<span>$sKey</span><span>);
</span><span> 513</span> <span>    }
</span><span> 514</span> 
<span> 515</span>     <span>/*</span><span>*
</span><span> 516</span> <span>     * 将值 value 插入到列表 key 的表尾, 当且仅当 key 存在并且是一个列表。 
</span><span> 517</span> <span>     * 和 RPUSH 命令相反, 当 key 不存在时,RPUSHX 命令什么也不做。
</span><span> 518</span> <span>     * @author    zhaoyingnan    2015-11-03 13:23
</span><span> 519</span> <span>     * @param    string        $sKey
</span><span> 520</span> <span>     * @param    array        $arValue    需要 push 到 key 中的值的数组
</span><span> 521</span> <span>     * @return    int            在 push 操作后的 list 长度。
</span><span> 522</span> <span>     *</span><span>*/</span>
<span> 523</span>     <span>public</span> <span>function</span> rpushx(<span>$sKey</span>, <span>$arValue</span> = <span>array</span><span>())
</span><span> 524</span> <span>    {
</span><span> 525</span>         <span>if</span>(!<span>$sKey</span> || !<span>$arValue</span>)<span>return</span> 0<span>;
</span><span> 526</span>         <span>foreach</span>(<span>$arValue</span> <span>as</span> <span>$val</span><span>)
</span><span> 527</span>             self::<span>$redis</span>->rpushx(<span>$sKey</span>, <span>$val</span><span>);
</span><span> 528</span>         <span>return</span> self::llen(<span>$sKey</span><span>);
</span><span> 529</span> <span>    }
</span><span> 530</span> 
<span> 531</span>     <span>/*</span><span>*
</span><span> 532</span> <span>     * 返回存储在 key 里的list的长度。 
</span><span> 533</span> <span>     * @author    zhaoyingnan    2015-11-03 12:12
</span><span> 534</span> <span>     * @param    string        $sKey
</span><span> 535</span> <span>     * @return    bool        如果 key 不存在,那么就被看作是空list,并且返回长度为 0。 当存储在 key 里的值不是一个list的话,会返回error。
</span><span> 536</span> <span>     *</span><span>*/</span>
<span> 537</span>     <span>public</span> <span>function</span> llen(<span>$sKey</span><span>)
</span><span> 538</span> <span>    {
</span><span> 539</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> 0<span>;
</span><span> 540</span>         <span>return</span> self::<span>$redis</span>->llen(<span>$sKey</span><span>);
</span><span> 541</span> <span>    }
</span><span> 542</span> 
<span> 543</span>     <span>/*</span><span>*
</span><span> 544</span> <span>     * 返回 key 对应的列表里的元素的索引 index 的值
</span><span> 545</span> <span>     * 下标是从0开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。 
</span><span> 546</span> <span>     * 负数索引用于指定从列表尾部开始索引的元素。在这种方法下,-1 表示最后一个元素,-2 表示倒数第二个元素,并以此往前推。
</span><span> 547</span> <span>     * 当 key 位置的值不是一个列表的时候,会返回一个error。
</span><span> 548</span> <span>     * @author    zhaoyingnan    2015-11-03 13:30
</span><span> 549</span> <span>     * @param    string        $sKey
</span><span> 550</span> <span>     * @param    array        $index        key 对应的列表中的 index 索引
</span><span> 551</span> <span>     * @return    mix
</span><span> 552</span> <span>     *</span><span>*/</span>
<span> 553</span>     <span>public</span> <span>function</span> lindex(<span>$sKey</span>, <span>$index</span> = 0<span>)
</span><span> 554</span> <span>    {
</span><span> 555</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 556</span>         <span>return</span> self::<span>$redis</span>->lindex(<span>$sKey</span>, <span>intval</span>(<span>$index</span><span>));
</span><span> 557</span> <span>    }
</span><span> 558</span> 
<span> 559</span>     <span>/*</span><span>*
</span><span> 560</span> <span>     * 设置 index 位置的list元素的值为 value。
</span><span> 561</span> <span>     * 下标是从0开始索引的,所以 0 是表示第一个元素, 1 表示第二个元素,并以此类推。 
</span><span> 562</span> <span>     * 当index超出范围时会返回一个error。
</span><span> 563</span> <span>     * @author    zhaoyingnan    2015-11-03 14:27
</span><span> 564</span> <span>     * @param    string        $sKey
</span><span> 565</span> <span>     * @param    int            $index        key 对应的 list 中小标为 index
</span><span> 566</span> <span>     * @param    string        $sValue        被设置的值
</span><span> 567</span> <span>     * @return    
</span><span> 568</span> <span>     *</span><span>*/</span>
<span> 569</span>     <span>public</span> <span>function</span> lset(<span>$sKey</span>, <span>$index</span>, <span>$sValue</span><span>)
</span><span> 570</span> <span>    {
</span><span> 571</span>         <span>if</span>(!<span>$sKey</span> || !<span>$sValue</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 572</span>         <span>return</span> self::<span>$redis</span>->lset(<span>$sKey</span>, <span>$index</span>, <span>$sValue</span><span>);
</span><span> 573</span> <span>    }
</span><span> 574</span> 
<span> 575</span>     <span>/*</span><span>*
</span><span> 576</span> <span>     * 把 value 插入存于 key 的列表中在基准值 pivot 的前面或后面。
</span><span> 577</span> <span>     * 当 key 不存在时,这个list会被看作是空list,任何操作都不会发生。
</span><span> 578</span> <span>     * 当 key 存在,但保存的不是一个list的时候,会返回error。
</span><span> 579</span> <span>     * @author    zhaoyingnan    2015-11-03 13:42
</span><span> 580</span> <span>     * @param    string        $sKey
</span><span> 581</span> <span>     * @param    string        $sPosion    在基准值前面或者后面(BEFORE or AFTER)
</span><span> 582</span> <span>     * @param    string        $pivot        列表中的基准值
</span><span> 583</span> <span>     * @param    string        $sValue        被插入的值
</span><span> 584</span> <span>     * @return    mix            经过插入操作后的list长度,或者当 pivot 值找不到的时候返回 -1。
</span><span> 585</span> <span>     *</span><span>*/</span>
<span> 586</span>     <span>public</span> <span>function</span> linsert(<span>$sKey</span>, <span>$sPosion</span>, <span>$pivot</span>, <span>$sValue</span><span>)
</span><span> 587</span> <span>    {
</span><span> 588</span>         <span>if</span>(!<span>$sKey</span> || !<span>$pivot</span> || !<span>$sValue</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 589</span>         <span>$sPosion</span> = <span>in_array</span>(<span>$sPosion</span>, <span>array</span>('BEFORE', 'AFTER')) ? <span>strtoupper</span>(<span>$sPosion</span>) : 'BEFORE'<span>;
</span><span> 590</span>         <span>return</span> self::<span>$redis</span>->linsert(<span>$sKey</span>, <span>$sPosion</span>, <span>$pivot</span>, <span>$sValue</span><span>);
</span><span> 591</span> <span>    }
</span><span> 592</span> 
<span> 593</span>     <span>/*</span><span>*
</span><span> 594</span> <span>     * 从存于 key 的列表里移除前 count 次出现的值为 value 的元素。 这个 count 参数通过下面几种方式影响这个操作:
</span><span> 595</span> <span>     * count > 0: 从头往尾移除值为 value 的元素。
</span><span> 596</span> <span>     * count <span> 597</span> <span>     * count = 0: 移除所有值为 value 的元素。
</span><span> 598</span> <span>     * 比如, LREM list -2 "hello" 会从存于 list 的列表里移除最后两个出现的 "hello"。
</span><span> 599</span> <span>     * 需要注意的是,如果list里没有存在key就会被当作空list处理,所以当 key 不存在的时候,这个命令会返回 0。
</span><span> 600</span> <span>     * @author    zhaoyingnan    2015-11-03 13:53
</span><span> 601</span> <span>     * @param    string        $sKey
</span><span> 602</span> <span>     * @param    int            $iCount        count > 0: 从头往尾移除值为 value 的元素。 count <span> 603</span> <span>     * @param    string        $sValue        要删除的值
</span><span> 604</span> <span>     * @return    int
</span><span> 605</span> <span>     *</span><span>*/</span>
<span> 606</span>     <span>//</span><span>public function lremu($sKey, $iCount, $sValue)
</span><span> 607</span> <span>    //{
</span><span> 608</span> <span>    //    var_dump($sValue);
</span><span> 609</span> <span>    //    if(!$sKey || !$sValue)return FALSE;
</span><span> 610</span> <span>    //    return self::$redis->lrem($sKey, intval($iCount), $sValue);
</span><span> 611</span> <span>    //}</span>
<span> 612</span> 
<span> 613</span>     <span>/*</span><span>*
</span><span> 614</span> <span>     * 修剪(trim)一个已存在的 list,这样 list 就会只包含指定范围的指定元素。
</span><span> 615</span> <span>     * start 和 stop 都是由0开始计数的, 这里的 0 是列表里的第一个元素(表头),1 是第二个元素,以此类推。
</span><span> 616</span> <span>     * @author    zhaoyingnan    2015-11-03 14:45
</span><span> 617</span> <span>     * @param    string        $sKey
</span><span> 618</span> <span>     * @param    int            $iStart        指定范围内的开始位置
</span><span> 619</span> <span>     * @param    int            $iEnd        制定范围内的结束位置
</span><span> 620</span> <span>     * @return    bool
</span><span> 621</span> <span>     *</span><span>*/</span>
<span> 622</span>     <span>public</span> <span>function</span> <span>ltrim</span>(<span>$sKey</span>, <span>$iStart</span>, <span>$iEnd</span><span>)
</span><span> 623</span> <span>    {
</span><span> 624</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 625</span>         <span>return</span> self::<span>$redis</span>-><span>ltrim</span>(<span>$sKey</span>, <span>intval</span>(<span>$iStart</span>), <span>intval</span>(<span>$iEnd</span><span>));
</span><span> 626</span> <span>    }
</span><span> 627</span> 
<span> 628</span>     <span>/*</span><span>*
</span><span> 629</span> <span>     * 返回存储在 key 的列表里指定范围内的元素。
</span><span> 630</span> <span>     * start 和 end 偏移量都是基于0的下标,即list的第一个元素下标是0(list的表头),第二个元素下标是1,以此类推。
</span><span> 631</span> <span>     * 偏移量也可以是负数,表示偏移量是从list尾部开始计数。 例如, -1 表示列表的最后一个元素,-2 是倒数第二个,以此类推。
</span><span> 632</span> <span>     * @author    zhaoyingnan    2015-11-03 14:54
</span><span> 633</span> <span>     * @param    string        $sKey
</span><span> 634</span> <span>     * @param    int            $iStart        开始位置
</span><span> 635</span> <span>     * @param    int            $iEnd        结束位置
</span><span> 636</span> <span>     * @return    array
</span><span> 637</span> <span>     *</span><span>*/</span>
<span> 638</span>     <span>public</span> <span>function</span> lrange(<span>$sKey</span>, <span>$iStart</span>, <span>$iEnd</span><span>)
</span><span> 639</span> <span>    {
</span><span> 640</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 641</span>         <span>return</span> self::<span>$redis</span>->lrange(<span>$sKey</span>, <span>intval</span>(<span>$iStart</span>), <span>intval</span>(<span>$iEnd</span><span>));
</span><span> 642</span> <span>    }
</span><span> 643</span> 
<span> 644</span>     <span>/*</span><span>*
</span><span> 645</span> <span>     * 移除并且返回 key 对应的 list 的第一个元素。
</span><span> 646</span> <span>     * @author    zhaoyingnan    2015-11-03 21:49
</span><span> 647</span> <span>     * @param    string        $sKey
</span><span> 648</span> <span>     * @return    bool
</span><span> 649</span> <span>     *</span><span>*/</span>
<span> 650</span>     <span>public</span> <span>function</span> lpop(<span>$sKey</span><span>)
</span><span> 651</span> <span>    {
</span><span> 652</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 653</span>         <span>return</span> self::<span>$redis</span>->lpop(<span>$sKey</span><span>);
</span><span> 654</span> <span>    }
</span><span> 655</span> 
<span> 656</span>     <span>/*</span><span>*
</span><span> 657</span> <span>     * 移除并返回存于 key 的 list 的最后一个元素。
</span><span> 658</span> <span>     * @author    zhaoyingnan    2015-11-03 21:49
</span><span> 659</span> <span>     * @param    string        $sKey
</span><span> 660</span> <span>     * @return    bool
</span><span> 661</span> <span>     *</span><span>*/</span>
<span> 662</span>     <span>public</span> <span>function</span> rpop(<span>$sKey</span><span>)
</span><span> 663</span> <span>    {
</span><span> 664</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 665</span>         <span>return</span> self::<span>$redis</span>->rpop(<span>$sKey</span><span>);
</span><span> 666</span> <span>    }
</span><span> 667</span> 
<span> 668</span>     <span>/*</span><span>****************** set ********************</span><span>*/</span>
<span> 669</span> 
<span> 670</span>     <span>/*</span><span>*
</span><span> 671</span> <span>     * 添加一个或多个指定的member元素到集合的 key中.
</span><span> 672</span> <span>     * 指定的一个或者多个元素member 如果已经在集合key中存在则忽略.
</span><span> 673</span> <span>     * 如果集合key 不存在,则新建集合key,并添加member元素到集合key中.
</span><span> 674</span> <span>     * 如果key 的类型不是集合则返回错误.
</span><span> 675</span> <span>     * @author    zhaoyingnan    2015-11-03 21:55
</span><span> 676</span> <span>     * @param    string        $sKey
</span><span> 677</span> <span>     * @param    array        $arMember    被添加的元素的数组
</span><span> 678</span> <span>     * @return    int            返回新成功添加到集合里元素的数量,不包括已经存在于集合中的元素.
</span><span> 679</span> <span>     *</span><span>*/</span>
<span> 680</span>     <span>public</span> <span>function</span> sadd(<span>$sKey</span>, <span>$arMember</span> = <span>array</span><span>())
</span><span> 681</span> <span>    {
</span><span> 682</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> <span>FALSE</span><span>;
</span><span> 683</span>         <span>$iCount</span> = 0<span>;
</span><span> 684</span>         <span>foreach</span>(<span>$arMember</span> <span>as</span> <span>$val</span><span>)
</span><span> 685</span> <span>        {
</span><span> 686</span>             <span>if</span>(self::<span>$redis</span>->sadd(<span>$sKey</span>, <span>$val</span><span>))
</span><span> 687</span>                 <span>$iCount</span>++<span>;
</span><span> 688</span> <span>        }
</span><span> 689</span>         <span>return</span> <span>$iCount</span><span>;
</span><span> 690</span> <span>    }
</span><span> 691</span> 
<span> 692</span>     <span>/*</span><span>*
</span><span> 693</span> <span>     * 返回集合存储的key的基数 (集合元素的数量).
</span><span> 694</span> <span>     * @author    zhaoyingnan    2015-11-03 22:09
</span><span> 695</span> <span>     * @param    string        $sKey
</span><span> 696</span> <span>     * @return    int
</span><span> 697</span> <span>     *</span><span>*/</span>
<span> 698</span>     <span>public</span> <span>function</span> scard(<span>$sKey</span><span>)
</span><span> 699</span> <span>    {
</span><span> 700</span>         <span>if</span>(!<span>$sKey</span>)<span>return</span> 0<span>;
</span><span> 701</span>         <span>return</span> self::<span>$redis</span>->scard(<span>$sKey</span><span>);
</span><span> 702</span> <span>    }
</span><span> 703</span> 
<span> 704</span>     <span>/*</span><span>*
</span><span> 705</span> <span>     * 返回一个集合与给定集合的差集的元素.
</span><span> 706</span> <span>     * @author    zhaoyingnan    2015-11-03 22:13
</span><span> 707</span> <span>     * @param    array        $arKey
</span><span> 708</span> <span>     * @return    array
</span><span> 709</span> <span>     *</span><span>*/</span>
<span> 710</span>     <span>public</span> <span>function</span> sdiff(<span>$arKey</span><span>)
</span><span> 711</span> <span>    {
</span><span> 712</span>         <span>if</span>(!<span>$arKey</span>)<span>return</span> <span>array</span><span>();
</span><span> 713</span>         <span>return</span> self::<span>$redis</span>->sdiff(<span>$arKey</span><span>);
</span><span> 714</span> <span>    }
</span><span> 715</span> 
<span> 716</span>     <span>/*</span><span>*
</span><span> 717</span> <span>     * 该命令类似于 SDIFF, 不同之处在于该命令不返回结果集,而是将结果存放在destination集合中.
</span><span> 718</span> <span>     * 如果destination 已经存在, 则将其覆盖重写.
</span><span> 719</span> <span>     * @author    zhaoyingnan    2015-11-04 10:16
</span><span> 720</span> <span>     * @param    string        $sNewKey
</span><span> 721</span> <span>     * @param    array        $arKey
</span><span> 722</span> <span>     * @return    int            结果集元素的个数.
</span><span> 723</span> <span>     *</span><span>*/</span>
<span> 724</span>     <span>public</span> <span>function</span> sdiffstore(<span>$sNewKey</span>, <span>$arKey</span><span>)
</span><span> 725</span> <span>    {
</span><span> 726</span>         <span>if</span>(!<span>$arKey</span> || !<span>$sNewKey</span>)<span>return</span> 0<span>;
</span><span> 727</span>         <span>if</span>(<span>$arResult</span> = self::<span>$redis</span>->sdiff(<span>$arKey</span><span>))
</span><span> 728</span>             <span>return</span> <span>$this</span>->sadd(<span>$sNewKey</span>, <span>$arResult</span><span>);
</span><span> 729</span>         <span>return</span> 0<span>;
</span><span> 730</span> <span>    }
</span><span> 731</span> 
<span> 732</span>     <span>/*</span><span>*
</span><span> 733</span> <span>     * 返回指定所有的集合的成员的交集.
</span><span> 734</span> <span>     * @author    zhaoyingnan    2015-11-04 10:18
</span><span> 735</span> <span>     * @param    array        $arKey
</span><span> 736</span> <span>     * @return    array
</span><span> 737</span> <span>     *</span><span>*/</span>
<span> 738</span>     <span>public</span> <span>function</span> sinter(<span>$arKey</span><span>)
</span><span> 739</span> <span>    {
</span><span> 740</span>         <span>if</span>(!<span>$arKey</span>)<span>return</span> <span>array</span><span>();
</span><span> 741</span>         <span>return</span> self::<sp></sp></span></span>
Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn