PHP Redis,phpredis
Jun 13, 2016 am 08:51 AMPHP 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 * 匹配數(shù)據(jù)庫中所有 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> * 設(shè)置key的過期時間。如果key已過期,將會被自動刪除。設(shè)置了過期時間的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 命令的作用類似,但是它以毫秒為單位設(shè)置 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 設(shè)置生存時間。不同在于 EXPIREAT 命令接受的時間參數(shù)是 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命令類似,但它以毫秒為單位設(shè)置 key 的過期 unix 時間戳,而不是像 EXPIREAT 那樣,以秒為單位。 </span><span> 96</span> <span> * EXPIREAT 的作用和 EXPIRE類似,都用于為 key 設(shè)置生存時間。不同在于 EXPIREAT 命令接受的時間參數(shù)是 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 當(dāng) key 不存在時,返回 -2 。當(dāng) key 存在但沒有設(shè)置剩余生存時間時,返回 -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 當(dāng) key 不存在時,返回 -2 。當(dāng) key 存在但沒有設(shè)置剩余生存時間時,返回 -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 原子性地從當(dāng)前實例傳送到目標實例的指定數(shù)據(jù)庫上,一旦傳送成功, key 保證會出現(xiàn)在目標實例上,而當(dāng)前實例上的 key 會被刪除。 </span><span> 134</span> <span> * 這個命令是一個原子操作,它在執(zhí)行的時候會阻塞進行遷移的兩個實例,直到以下任意結(jié)果發(fā)生:遷移成功,遷移失敗,等到超時。 </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 目標實例的數(shù)據(jù)庫的編號 </span><span> 140</span> <span> * @param int $iTimeout timeout 參數(shù)以毫秒為格式,指定當(dāng)前實例和目標實例進行溝通的最大間隔時間。這說明操作并不一定要在 timeout 毫秒內(nèi)完成,只是說數(shù)據(jù)傳送的時間不能超過這個 timeout 數(shù)。 </span><span> 141</span> <span> * @return bool 注:當(dāng)目標實例的指定的數(shù)據(jù)庫中存在指定的 key 返回 FALS,當(dāng)前實例中的 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> * 將當(dāng)前數(shù)據(jù)庫的 key 移動到給定的數(shù)據(jù)庫 db 當(dāng)中。 </span><span> 151</span> <span> * 如果當(dāng)前數(shù)據(jù)庫(源數(shù)據(jù)庫)和給定數(shù)據(jù)庫(目標數(shù)據(jù)庫)有相同名字的給定 key ,或者 key 不存在于當(dāng)前數(shù)據(jù)庫,那么 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 移動到給定的數(shù)據(jù)庫 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 )轉(zhuǎn)換成『持久的』(一個不帶生存時間、永不過期的 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 當(dāng)生存時間移除成功時,返回 1 如果 key 不存在或 key 沒有設(shè)置生存時間,返回 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> * 從當(dāng)前數(shù)據(jù)庫返回一個隨機的key。 </span><span> 177</span> <span> * @author zhaoyingnan 2015-10-19 16:08 </span><span> 178</span> <span> * @return string 如果數(shù)據(jù)庫沒有任何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已經(jīng)存在,則值將被覆蓋。 </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> * 當(dāng)且僅當(dāng) newkey 不存在時,將 key 改名為 newkey 。當(dāng) 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對應(yīng)。如果key已經(jīng)存在了,它會被覆蓋,而不管它是什么類型。 </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 對應(yīng)的值 </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> * 設(shè)置key對應(yīng)字符串value,并且設(shè)置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 對應(yīng)的 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> * 設(shè)置key對應(yīng)字符串value,并且設(shè)置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 對應(yīng)的 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對應(yīng)到value并且返回原來key對應(yīng)的value。如果key存在但是對應(yīng)的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 設(shè)置的新的值 </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> * 對應(yīng)給定的keys到他們相應(yīng)的values上。MSET會用新的value替換已經(jīng)存在的value,就像普通的SET命令一樣。 </span><span> 282</span> <span> * 如果你不想覆蓋已經(jīng)存在的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 被設(shè)置的關(guān)聯(lián)數(shù)組 </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> * 對應(yīng)給定的keys到他們相應(yīng)的values上。 </span><span> 296</span> <span> * 只要有一個key已經(jīng)存在,MSETNX一個操作都不會執(zhí)行。 </span><span> 297</span> <span> * 由于這種特性,MSETNX可以實現(xiàn)要么所有的操作都成功,要么一個都不執(zhí)行,這樣可以用來設(shè)置不同的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 被設(shè)置的關(guān)聯(lián)數(shù)組 </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不存在,就設(shè)置key對應(yīng)字符串value。 </span><span> 311</span> <span> * 在這種情況下,該命令和SET一樣。當(dāng)key已經(jīng)存在時,就不做任何操作。 </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。對于每個不對應(yīng)string或者不存在的key,都返回特殊值nil。正因為此,這個操作從來不會失敗。 </span><span> 338</span> <span> * @author zhaoyingnan 2015-11-03 10:55 </span><span> 339</span> <span> * @param array $arKey 要獲取的 key 的數(shù)組 </span><span> 340</span> <span> * @return array redis返回的是以數(shù)字為索引的數(shù)組,這里返回的是一個關(guān)聯(lián)數(shù)組 </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 已經(jīng)存在,并且值為字符串,那么這個命令會把 value 追加到原來值(value)的結(jié)尾。 </span><span> 351</span> <span> * 如果 key 不存在,那么它將首先創(chuàng)建一個空字符串的key,再執(zhí)行追加操作,這種情況 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對應(yīng)的數(shù)字做加1操作。如果key不存在,那么在操作之前,這個key對應(yīng)的值會被置為0。 </span><span> 365</span> <span> * 如果key有一個錯誤類型的value或者是一個不能表示成數(shù)字的字符串,就返回錯誤。 </span><span> 366</span> <span> * 這個操作最大支持在64位有符號的整型數(shù)字。 </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對應(yīng)的數(shù)字加decrement。如果key不存在,操作之前,key就會被置為0。 </span><span> 379</span> <span> * 如果key的value類型錯誤或者是個不能表示成數(shù)字的字符串,就返回錯誤。這個操作最多支持64位有符號的正型數(shù)字。 </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對應(yīng)的數(shù)字加decrement。如果key不存在,操作之前,key就會被置為0。 </span><span> 393</span> <span> * 如果key的value類型錯誤或者是個不能表示成數(shù)字的字符串,就返回錯誤。這個操作最多支持64位有符號的正型數(shù)字。 </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對應(yīng)的數(shù)字做減1操作。如果key不存在,那么在操作之前,這個key對應(yīng)的值會被置為0。 </span><span> 407</span> <span> * 如果key有一個錯誤類型的value或者是一個不能表示成數(shù)字的字符串,就返回錯誤。這個操作最大支持在64位有符號的整型數(shù)字。 </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對應(yīng)的數(shù)字減decrement。如果key不存在,操作之前,key就會被置為0。 </span><span> 420</span> <span> * 如果key的value類型錯誤或者是個不能表示成數(shù)字的字符串,就返回錯誤。這個操作最多支持64位有符號的正型數(shù)字。 </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對應(yīng)的字符串value的子串,這個子串是由start和end位移決定的(兩者都在string內(nèi))。 </span><span> 435</span> <span> * 可以用負的位移來表示從string尾部開始數(shù)的下標。所以-1就是最后一個字符,-2就是倒數(shù)第二個,以此類推。 </span><span> 436</span> <span> * 這個函數(shù)處理超出范圍的請求時,都把結(jié)果限制在string內(nèi)。 </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 結(jié)束位置 </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對應(yīng)的非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 操作前會創(chuàng)建一個空列表。 </span><span> 465</span> <span> * 如果 key 對應(yīng)的值不是一個 list 的話,那么會返回一個錯誤。 </span><span> 466</span> <span> * 可以使用一個命令把多個元素 push 進入列表,只需在命令末尾加上多個指定的參數(shù)。 </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 中的值的數(shù)組 </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> * 只有當(dāng) key 已經(jīng)存在并且存著一個 list 的時候,在這個 key 下面的 list 的頭部插入 value。 </span><span> 483</span> <span> * 與 LPUSH 相反,當(dāng) 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 中的值的數(shù)組 </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 不存在,那么會創(chuàng)建一個空的列表然后再進行 push 操作。 </span><span> 499</span> <span> * 當(dāng) key 保存的不是一個列表,那么會返回一個錯誤。 </span><span> 500</span> <span> * 可以使用一個命令把多個元素打入隊列,只需要在命令后面指定多個參數(shù)。 </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 中的值的數(shù)組 </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 的表尾, 當(dāng)且僅當(dāng) key 存在并且是一個列表。 </span><span> 517</span> <span> * 和 RPUSH 命令相反, 當(dāng) 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 中的值的數(shù)組 </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。 當(dāng)存儲在 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 對應(yīng)的列表里的元素的索引 index 的值 </span><span> 545</span> <span> * 下標是從0開始索引的,所以 0 是表示第一個元素, 1 表示第二個元素,并以此類推。 </span><span> 546</span> <span> * 負數(shù)索引用于指定從列表尾部開始索引的元素。在這種方法下,-1 表示最后一個元素,-2 表示倒數(shù)第二個元素,并以此往前推。 </span><span> 547</span> <span> * 當(dāng) 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 對應(yīng)的列表中的 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> * 設(shè)置 index 位置的list元素的值為 value。 </span><span> 561</span> <span> * 下標是從0開始索引的,所以 0 是表示第一個元素, 1 表示第二個元素,并以此類推。 </span><span> 562</span> <span> * 當(dāng)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 對應(yīng)的 list 中小標為 index </span><span> 566</span> <span> * @param string $sValue 被設(shè)置的值 </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> * 當(dāng) key 不存在時,這個list會被看作是空list,任何操作都不會發(fā)生。 </span><span> 578</span> <span> * 當(dāng) 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 經(jīng)過插入操作后的list長度,或者當(dāng) 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 次出現(xiàn)的值為 value 的元素。 這個 count 參數(shù)通過下面幾種方式影響這個操作: </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 的列表里移除最后兩個出現(xiàn)的 "hello"。 </span><span> 599</span> <span> * 需要注意的是,如果list里沒有存在key就會被當(dāng)作空list處理,所以當(dāng) 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開始計數(shù)的, 這里的 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 指定范圍內(nèi)的開始位置 </span><span> 619</span> <span> * @param int $iEnd 制定范圍內(nèi)的結(jié)束位置 </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 的列表里指定范圍內(nèi)的元素。 </span><span> 630</span> <span> * start 和 end 偏移量都是基于0的下標,即list的第一個元素下標是0(list的表頭),第二個元素下標是1,以此類推。 </span><span> 631</span> <span> * 偏移量也可以是負數(shù),表示偏移量是從list尾部開始計數(shù)。 例如, -1 表示列表的最后一個元素,-2 是倒數(shù)第二個,以此類推。 </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 結(jié)束位置 </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 對應(yīng)的 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 如果已經(jīng)在集合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 被添加的元素的數(shù)組 </span><span> 678</span> <span> * @return int 返回新成功添加到集合里元素的數(shù)量,不包括已經(jīng)存在于集合中的元素. </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的基數(shù) (集合元素的數(shù)量). </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, 不同之處在于該命令不返回結(jié)果集,而是將結(jié)果存放在destination集合中. </span><span> 718</span> <span> * 如果destination 已經(jīng)存在, 則將其覆蓋重寫. </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 結(jié)果集元素的個數(shù). </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>

Hot AI Tools

Undress AI Tool
Undress images for free

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics

The method to get the current session ID in PHP is to use the session_id() function, but you must call session_start() to successfully obtain it. 1. Call session_start() to start the session; 2. Use session_id() to read the session ID and output a string similar to abc123def456ghi789; 3. If the return is empty, check whether session_start() is missing, whether the user accesses for the first time, or whether the session is destroyed; 4. The session ID can be used for logging, security verification and cross-request communication, but security needs to be paid attention to. Make sure that the session is correctly enabled and the ID can be obtained successfully.

To extract substrings from PHP strings, you can use the substr() function, which is syntax substr(string$string,int$start,?int$length=null), and if the length is not specified, it will be intercepted to the end; when processing multi-byte characters such as Chinese, you should use the mb_substr() function to avoid garbled code; if you need to intercept the string according to a specific separator, you can use exploit() or combine strpos() and substr() to implement it, such as extracting file name extensions or domain names.

UnittestinginPHPinvolvesverifyingindividualcodeunitslikefunctionsormethodstocatchbugsearlyandensurereliablerefactoring.1)SetupPHPUnitviaComposer,createatestdirectory,andconfigureautoloadandphpunit.xml.2)Writetestcasesfollowingthearrange-act-assertpat

In PHP, the most common method is to split the string into an array using the exploit() function. This function divides the string into multiple parts through the specified delimiter and returns an array. The syntax is exploit(separator, string, limit), where separator is the separator, string is the original string, and limit is an optional parameter to control the maximum number of segments. For example $str="apple,banana,orange";$arr=explode(",",$str); The result is ["apple","bana

JavaScript data types are divided into primitive types and reference types. Primitive types include string, number, boolean, null, undefined, and symbol. The values are immutable and copies are copied when assigning values, so they do not affect each other; reference types such as objects, arrays and functions store memory addresses, and variables pointing to the same object will affect each other. Typeof and instanceof can be used to determine types, but pay attention to the historical issues of typeofnull. Understanding these two types of differences can help write more stable and reliable code.

std::chrono is used in C to process time, including obtaining the current time, measuring execution time, operation time point and duration, and formatting analysis time. 1. Use std::chrono::system_clock::now() to obtain the current time, which can be converted into a readable string, but the system clock may not be monotonous; 2. Use std::chrono::steady_clock to measure the execution time to ensure monotony, and convert it into milliseconds, seconds and other units through duration_cast; 3. Time point (time_point) and duration (duration) can be interoperable, but attention should be paid to unit compatibility and clock epoch (epoch)

ToaccessenvironmentvariablesinPHP,usegetenv()orthe$_ENVsuperglobal.1.getenv('VAR_NAME')retrievesaspecificvariable.2.$_ENV['VAR_NAME']accessesvariablesifvariables_orderinphp.iniincludes"E".SetvariablesviaCLIwithVAR=valuephpscript.php,inApach

LateStaticBindinginPHPallowsstatic::torefertotheclassinitiallycalledatruntimeininheritancescenarios.BeforePHP5.3,self::alwaysreferencedtheclasswherethemethodwasdefined,causingChildClass::sayHello()tooutput"ParentClass".Withlatestaticbinding
