PHP Redis,phpredis
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>

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

PHP 8.4 membawa beberapa ciri baharu, peningkatan keselamatan dan peningkatan prestasi dengan jumlah penamatan dan penyingkiran ciri yang sihat. Panduan ini menerangkan cara memasang PHP 8.4 atau naik taraf kepada PHP 8.4 pada Ubuntu, Debian, atau terbitan mereka

Kod Visual Studio, juga dikenali sebagai Kod VS, ialah editor kod sumber percuma — atau persekitaran pembangunan bersepadu (IDE) — tersedia untuk semua sistem pengendalian utama. Dengan koleksi sambungan yang besar untuk banyak bahasa pengaturcaraan, Kod VS boleh menjadi c

Tutorial ini menunjukkan cara memproses dokumen XML dengan cekap menggunakan PHP. XML (bahasa markup extensible) adalah bahasa markup berasaskan teks yang serba boleh yang direka untuk pembacaan manusia dan parsing mesin. Ia biasanya digunakan untuk penyimpanan data

Rentetan adalah urutan aksara, termasuk huruf, nombor, dan simbol. Tutorial ini akan mempelajari cara mengira bilangan vokal dalam rentetan yang diberikan dalam PHP menggunakan kaedah yang berbeza. Vokal dalam bahasa Inggeris adalah a, e, i, o, u, dan mereka boleh menjadi huruf besar atau huruf kecil. Apa itu vokal? Vokal adalah watak abjad yang mewakili sebutan tertentu. Terdapat lima vokal dalam bahasa Inggeris, termasuk huruf besar dan huruf kecil: a, e, i, o, u Contoh 1 Input: String = "TutorialSpoint" Output: 6 menjelaskan Vokal dalam rentetan "TutorialSpoint" adalah u, o, i, a, o, i. Terdapat 6 yuan sebanyak 6

Jika anda seorang pembangun PHP yang berpengalaman, anda mungkin merasakan bahawa anda telah berada di sana dan telah melakukannya. Anda telah membangunkan sejumlah besar aplikasi, menyahpenyahpepijat berjuta-juta baris kod dan mengubah suai sekumpulan skrip untuk mencapai op

CMS bermaksud Sistem Pengurusan Kandungan. Ia adalah aplikasi perisian atau platform yang membolehkan pengguna mencipta, mengurus dan mengubah suai kandungan digital tanpa memerlukan pengetahuan teknikal lanjutan. CMS membolehkan pengguna membuat dan menyusun kandungan seperti teks, imej, video dan dokumen dengan mudah serta menerbitkannya di tapak web atau platform digital lain.

Array adalah struktur data linear yang digunakan untuk memproses data dalam pengaturcaraan. Kadang -kadang apabila kita sedang memproses tatasusunan kita perlu menambah unsur -unsur baru ke array yang sedia ada. Dalam artikel ini, kami akan membincangkan beberapa cara untuk menambah unsur -unsur ke akhir array dalam PHP, dengan contoh kod, output, dan analisis kerumitan masa dan ruang untuk setiap kaedah. Berikut adalah cara yang berbeza untuk menambah elemen ke array: Gunakan kurungan persegi [] Dalam PHP, cara untuk menambah unsur -unsur ke akhir array adalah menggunakan kurungan persegi []. Sintaks ini hanya berfungsi dalam kes -kes di mana kita mahu menambah hanya satu elemen. Berikut adalah sintaks: $ array [] = nilai; Contoh

Nexo Exchange: Platform Pinjaman Cryptocurrency Swiss Analisis mendalam Nexo adalah platform yang menyediakan perkhidmatan pinjaman cryptocurrency, menyokong gadai janji dan pinjaman lebih daripada 40 aset crypto, mata wang fiat dan stablecoins. Ia menguasai pasaran Eropah dan Amerika dan komited untuk meningkatkan kecekapan, keselamatan dan pematuhan platform. Ramai pelabur ingin tahu di mana pertukaran Nexo didaftarkan, dan jawapannya ialah: Switzerland. Nexo ditubuhkan pada tahun 2018 oleh syarikat Swiss Fintech Credissimo. Nexo Exchange Lokasi dan Peraturan Geografi: Nexo beribu pejabat di Zug, Switzerland, rantau yang mesra cryptocurrency yang terkenal. Platform ini secara aktif bekerjasama dengan pengawasan pelbagai kerajaan dan telah berada di Rangkaian Penguatkuasaan Undang -undang Jenayah Kewangan AS (FINCEN) dan Kewangan Kanada
