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ù)庫(kù)中所有 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> * 特殊符號(hào)用 \ 隔開(kāi)。 </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 要檢測(cè)的 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的過(guò)期時(shí)間。如果key已過(guò)期,將會(huì)被自動(dòng)刪除。設(shè)置了過(guò)期時(shí)間的key被稱(chēng)之為volatile。 </span><span> 56</span> <span> * 在key過(guò)期之前可以重新更新他的過(guò)期時(shí)間,也可以使用PERSIST命令刪除key的過(guò)期時(shí)間。 </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> * 這個(gè)命令和 EXPIRE 命令的作用類(lèi)似,但是它以毫秒為單位設(shè)置 key 的生存時(shí)間,而不像 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類(lèi)似,都用于為 key 設(shè)置生存時(shí)間。不同在于 EXPIREAT 命令接受的時(shí)間參數(shù)是 UNIX 時(shí)間戳 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 時(shí)間戳(秒) </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 這個(gè)命令和 EXPIREAT命令類(lèi)似,但它以毫秒為單位設(shè)置 key 的過(guò)期 unix 時(shí)間戳,而不是像 EXPIREAT 那樣,以秒為單位。 </span><span> 96</span> <span> * EXPIREAT 的作用和 EXPIRE類(lèi)似,都用于為 key 設(shè)置生存時(shí)間。不同在于 EXPIREAT 命令接受的時(shí)間參數(shù)是 UNIX 時(shí)間戳 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 時(shí)間戳(毫秒) </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 的剩余生存時(shí)間(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 不存在時(shí),返回 -2 。當(dāng) key 存在但沒(méi)有設(shè)置剩余生存時(shí)間時(shí),返回 -1 。否則,以秒為單位,返回 key 的剩余生存時(shí)間。 </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> * 這個(gè)命令類(lèi)似于 TTL 命令,但它以毫秒為單位返回 key 的剩余生存時(shí)間,而不是像 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 不存在時(shí),返回 -2 。當(dāng) key 存在但沒(méi)有設(shè)置剩余生存時(shí)間時(shí),返回 -1 。否則,以秒為單位,返回 key 的剩余生存時(shí)間。 </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í)例傳送到目標(biāo)實(shí)例的指定數(shù)據(jù)庫(kù)上,一旦傳送成功, key 保證會(huì)出現(xiàn)在目標(biāo)實(shí)例上,而當(dāng)前實(shí)例上的 key 會(huì)被刪除。 </span><span> 134</span> <span> * 這個(gè)命令是一個(gè)原子操作,它在執(zhí)行的時(shí)候會(huì)阻塞進(jìn)行遷移的兩個(gè)實(shí)例,直到以下任意結(jié)果發(fā)生:遷移成功,遷移失敗,等到超時(shí)。 </span><span> 135</span> <span> * @author zhaoyingnan 2015-10-16 18:24 </span><span> 136</span> <span> * @param string $sHost 目標(biāo) 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 目標(biāo)實(shí)例的數(shù)據(jù)庫(kù)的編號(hào) </span><span> 140</span> <span> * @param int $iTimeout timeout 參數(shù)以毫秒為格式,指定當(dāng)前實(shí)例和目標(biāo)實(shí)例進(jìn)行溝通的最大間隔時(shí)間。這說(shuō)明操作并不一定要在 timeout 毫秒內(nèi)完成,只是說(shuō)數(shù)據(jù)傳送的時(shí)間不能超過(guò)這個(gè) timeout 數(shù)。 </span><span> 141</span> <span> * @return bool 注:當(dāng)目標(biāo)實(shí)例的指定的數(shù)據(jù)庫(kù)中存在指定的 key 返回 FALS,當(dāng)前實(shí)例中的 key 并沒(méi)有被刪除,也沒(méi)有移動(dòng)到目標(biāo)實(shí)例上,目標(biāo)實(shí)例上的 key 還是原來(lái)的 </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ù)庫(kù)的 key 移動(dòng)到給定的數(shù)據(jù)庫(kù) db 當(dāng)中。 </span><span> 151</span> <span> * 如果當(dāng)前數(shù)據(jù)庫(kù)(源數(shù)據(jù)庫(kù))和給定數(shù)據(jù)庫(kù)(目標(biāo)數(shù)據(jù)庫(kù))有相同名字的給定 key ,或者 key 不存在于當(dāng)前數(shù)據(jù)庫(kù),那么 MOVE 沒(méi)有任何效果。 </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 移動(dòng)到給定的數(shù)據(jù)庫(kù) 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的生存時(shí)間,將這個(gè) key 從『易失的』(帶生存時(shí)間 key )轉(zhuǎn)換成『持久的』(一個(gè)不帶生存時(shí)間、永不過(guò)期的 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)生存時(shí)間移除成功時(shí),返回 1 如果 key 不存在或 key 沒(méi)有設(shè)置生存時(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ù)庫(kù)返回一個(gè)隨機(jī)的key。 </span><span> 177</span> <span> * @author zhaoyingnan 2015-10-19 16:08 </span><span> 178</span> <span> * @return string 如果數(shù)據(jù)庫(kù)沒(méi)有任何key,返回nil,否則返回一個(gè)隨機(jī)的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相同,將返回一個(gè)錯(cuò)誤。如果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 不存在時(shí),將 key 改名為 newkey 。當(dāng) key 不存在時(shí),返回一個(gè)錯(cuò)誤。 </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 所儲(chǔ)存的值的類(lèi)型。 </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對(duì)應(yīng)。如果key已經(jīng)存在了,它會(huì)被覆蓋,而不管它是什么類(lèi)型。 </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 對(duì)應(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對(duì)應(yīng)字符串value,并且設(shè)置key在給定的 seconds 時(shí)間之后超時(shí)過(guò)期。 </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 對(duì)應(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對(duì)應(yīng)字符串value,并且設(shè)置key在給定的 milliseconds 時(shí)間之后超時(shí)過(guò)期。 </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 對(duì)應(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> * 自動(dòng)將key對(duì)應(yīng)到value并且返回原來(lái)key對(duì)應(yīng)的value。如果key存在但是對(duì)應(yīng)的value不是字符串,就返回錯(cuò)誤。 </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> * 對(duì)應(yīng)給定的keys到他們相應(yīng)的values上。MSET會(huì)用新的value替換已經(jīng)存在的value,就像普通的SET命令一樣。 </span><span> 282</span> <span> * 如果你不想覆蓋已經(jīng)存在的values,請(qǐng)參看命令MSETNX。 </span><span> 283</span> <span> * MSET是原子的,所以所有給定的keys是一次性set的。客戶(hù)端不可能看到這種一部分keys被更新而另外的沒(méi)有改變的情況。 </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> * 對(duì)應(yīng)給定的keys到他們相應(yīng)的values上。 </span><span> 296</span> <span> * 只要有一個(gè)key已經(jīng)存在,MSETNX一個(gè)操作都不會(huì)執(zhí)行。 </span><span> 297</span> <span> * 由于這種特性,MSETNX可以實(shí)現(xiàn)要么所有的操作都成功,要么一個(gè)都不執(zhí)行,這樣可以用來(lái)設(shè)置不同的key,來(lái)表示一個(gè)唯一的對(duì)象的不同字段。 </span><span> 298</span> <span> * MSETNX是原子的,所以所有給定的keys是一次性set的??蛻?hù)端不可能看到這種一部分keys被更新而另外的沒(méi)有改變的情況。 </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 沒(méi)有key被set(至少其中有一個(gè)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對(duì)應(yīng)字符串value。 </span><span> 311</span> <span> * 在這種情況下,該命令和SET一樣。當(dāng)key已經(jīng)存在時(shí),就不做任何操作。 </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沒(méi)有被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,就返回錯(cuò)誤,因?yàn)镚ET只處理string類(lèi)型的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。對(duì)于每個(gè)不對(duì)應(yīng)string或者不存在的key,都返回特殊值nil。正因?yàn)榇耍@個(gè)操作從來(lái)不會(huì)失敗。 </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ù)組,這里返回的是一個(gè)關(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)存在,并且值為字符串,那么這個(gè)命令會(huì)把 value 追加到原來(lái)值(value)的結(jié)尾。 </span><span> 351</span> <span> * 如果 key 不存在,那么它將首先創(chuàng)建一個(gè)空字符串的key,再執(zhí)行追加操作,這種情況 APPEND 將類(lèi)似于 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> * 對(duì)key對(duì)應(yīng)的數(shù)字做加1操作。如果key不存在,那么在操作之前,這個(gè)key對(duì)應(yīng)的值會(huì)被置為0。 </span><span> 365</span> <span> * 如果key有一個(gè)錯(cuò)誤類(lèi)型的value或者是一個(gè)不能表示成數(shù)字的字符串,就返回錯(cuò)誤。 </span><span> 366</span> <span> * 這個(gè)操作最大支持在64位有符號(hào)的整型數(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對(duì)應(yīng)的數(shù)字加decrement。如果key不存在,操作之前,key就會(huì)被置為0。 </span><span> 379</span> <span> * 如果key的value類(lèi)型錯(cuò)誤或者是個(gè)不能表示成數(shù)字的字符串,就返回錯(cuò)誤。這個(gè)操作最多支持64位有符號(hào)的正型數(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 步進(jìn)值 </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對(duì)應(yīng)的數(shù)字加decrement。如果key不存在,操作之前,key就會(huì)被置為0。 </span><span> 393</span> <span> * 如果key的value類(lèi)型錯(cuò)誤或者是個(gè)不能表示成數(shù)字的字符串,就返回錯(cuò)誤。這個(gè)操作最多支持64位有符號(hào)的正型數(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 步進(jìn)值 </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> * 對(duì)key對(duì)應(yīng)的數(shù)字做減1操作。如果key不存在,那么在操作之前,這個(gè)key對(duì)應(yīng)的值會(huì)被置為0。 </span><span> 407</span> <span> * 如果key有一個(gè)錯(cuò)誤類(lèi)型的value或者是一個(gè)不能表示成數(shù)字的字符串,就返回錯(cuò)誤。這個(gè)操作最大支持在64位有符號(hào)的整型數(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對(duì)應(yīng)的數(shù)字減decrement。如果key不存在,操作之前,key就會(huì)被置為0。 </span><span> 420</span> <span> * 如果key的value類(lèi)型錯(cuò)誤或者是個(gè)不能表示成數(shù)字的字符串,就返回錯(cuò)誤。這個(gè)操作最多支持64位有符號(hào)的正型數(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 步進(jìn)值 </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> * 這個(gè)命令是被改成GETRANGE的,在小于2.0的Redis版本中叫SUBSTR。 </span><span> 434</span> <span> * 返回key對(duì)應(yīng)的字符串value的子串,這個(gè)子串是由start和end位移決定的(兩者都在string內(nèi))。 </span><span> 435</span> <span> * 可以用負(fù)的位移來(lái)表示從string尾部開(kāi)始數(shù)的下標(biāo)。所以-1就是最后一個(gè)字符,-2就是倒數(shù)第二個(gè),以此類(lèi)推。 </span><span> 436</span> <span> * 這個(gè)函數(shù)處理超出范圍的請(qǐng)求時(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 開(kāi)始位置 </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類(lèi)型value的長(zhǎng)度。如果key對(duì)應(yīng)的非string類(lèi)型,就返回錯(cuò)誤。 </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 不存在,那么在進(jìn)行 push 操作前會(huì)創(chuàng)建一個(gè)空列表。 </span><span> 465</span> <span> * 如果 key 對(duì)應(yīng)的值不是一個(gè) list 的話(huà),那么會(huì)返回一個(gè)錯(cuò)誤。 </span><span> 466</span> <span> * 可以使用一個(gè)命令把多個(gè)元素 push 進(jìn)入列表,只需在命令末尾加上多個(gè)指定的參數(shù)。 </span><span> 467</span> <span> * 元素是從最左端的到最右端的、一個(gè)接一個(gè)被插入到 list 的頭部。 所以對(duì)于這個(gè)命令例子 LPUSH mylist a b c,返回的列表是 c 為第一個(gè)元素, b 為第二個(gè)元素, a 為第三個(gè)元素。 </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 長(zhǎng)度。 </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)存在并且存著一個(gè) list 的時(shí)候,在這個(gè) key 下面的 list 的頭部插入 value。 </span><span> 483</span> <span> * 與 LPUSH 相反,當(dāng) key 不存在的時(shí)候不會(huì)進(jìn)行任何操作。 </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 不存在,那么會(huì)創(chuàng)建一個(gè)空的列表然后再進(jìn)行 push 操作。 </span><span> 499</span> <span> * 當(dāng) key 保存的不是一個(gè)列表,那么會(huì)返回一個(gè)錯(cuò)誤。 </span><span> 500</span> <span> * 可以使用一個(gè)命令把多個(gè)元素打入隊(duì)列,只需要在命令后面指定多個(gè)參數(shù)。 </span><span> 501</span> <span> * 元素是從左到右一個(gè)接一個(gè)從列表尾部插入。 比如命令 RPUSH mylist a b c 會(huì)返回一個(gè)列表,其第一個(gè)元素是 a ,第二個(gè)元素是 b ,第三個(gè)元素是 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 長(zhǎng)度。 </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 存在并且是一個(gè)列表。 </span><span> 517</span> <span> * 和 RPUSH 命令相反, 當(dāng) key 不存在時(shí),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 長(zhǎng)度。 </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> * 返回存儲(chǔ)在 key 里的list的長(zhǎng)度。 </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 不存在,那么就被看作是空l(shuí)ist,并且返回長(zhǎng)度為 0。 當(dāng)存儲(chǔ)在 key 里的值不是一個(gè)list的話(huà),會(huì)返回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 對(duì)應(yīng)的列表里的元素的索引 index 的值 </span><span> 545</span> <span> * 下標(biāo)是從0開(kāi)始索引的,所以 0 是表示第一個(gè)元素, 1 表示第二個(gè)元素,并以此類(lèi)推。 </span><span> 546</span> <span> * 負(fù)數(shù)索引用于指定從列表尾部開(kāi)始索引的元素。在這種方法下,-1 表示最后一個(gè)元素,-2 表示倒數(shù)第二個(gè)元素,并以此往前推。 </span><span> 547</span> <span> * 當(dāng) key 位置的值不是一個(gè)列表的時(shí)候,會(huì)返回一個(gè)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 對(duì)應(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> * 下標(biāo)是從0開(kāi)始索引的,所以 0 是表示第一個(gè)元素, 1 表示第二個(gè)元素,并以此類(lèi)推。 </span><span> 562</span> <span> * 當(dāng)index超出范圍時(shí)會(huì)返回一個(gè)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 對(duì)應(yīng)的 list 中小標(biāo)為 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 的列表中在基準(zhǔn)值 pivot 的前面或后面。 </span><span> 577</span> <span> * 當(dāng) key 不存在時(shí),這個(gè)list會(huì)被看作是空l(shuí)ist,任何操作都不會(huì)發(fā)生。 </span><span> 578</span> <span> * 當(dāng) key 存在,但保存的不是一個(gè)list的時(shí)候,會(huì)返回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 在基準(zhǔn)值前面或者后面(BEFORE or AFTER) </span><span> 582</span> <span> * @param string $pivot 列表中的基準(zhǔn)值 </span><span> 583</span> <span> * @param string $sValue 被插入的值 </span><span> 584</span> <span> * @return mix 經(jīng)過(guò)插入操作后的list長(zhǎng)度,或者當(dāng) pivot 值找不到的時(shí)候返回 -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 的元素。 這個(gè) count 參數(shù)通過(guò)下面幾種方式影響這個(gè)操作: </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" 會(huì)從存于 list 的列表里移除最后兩個(gè)出現(xiàn)的 "hello"。 </span><span> 599</span> <span> * 需要注意的是,如果list里沒(méi)有存在key就會(huì)被當(dāng)作空l(shuí)ist處理,所以當(dāng) key 不存在的時(shí)候,這個(gè)命令會(huì)返回 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 要?jiǎng)h除的值 </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)一個(gè)已存在的 list,這樣 list 就會(huì)只包含指定范圍的指定元素。 </span><span> 615</span> <span> * start 和 stop 都是由0開(kāi)始計(jì)數(shù)的, 這里的 0 是列表里的第一個(gè)元素(表頭),1 是第二個(gè)元素,以此類(lèi)推。 </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)的開(kā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> * 返回存儲(chǔ)在 key 的列表里指定范圍內(nèi)的元素。 </span><span> 630</span> <span> * start 和 end 偏移量都是基于0的下標(biāo),即list的第一個(gè)元素下標(biāo)是0(list的表頭),第二個(gè)元素下標(biāo)是1,以此類(lèi)推。 </span><span> 631</span> <span> * 偏移量也可以是負(fù)數(shù),表示偏移量是從list尾部開(kāi)始計(jì)數(shù)。 例如, -1 表示列表的最后一個(gè)元素,-2 是倒數(shù)第二個(gè),以此類(lèi)推。 </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 開(kāi)始位置 </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 對(duì)應(yīng)的 list 的第一個(gè)元素。 </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 的最后一個(gè)元素。 </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> * 添加一個(gè)或多個(gè)指定的member元素到集合的 key中. </span><span> 672</span> <span> * 指定的一個(gè)或者多個(gè)元素member 如果已經(jīng)在集合key中存在則忽略. </span><span> 673</span> <span> * 如果集合key 不存在,則新建集合key,并添加member元素到集合key中. </span><span> 674</span> <span> * 如果key 的類(lèi)型不是集合則返回錯(cuò)誤. </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> * 返回集合存儲(chǔ)的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> * 返回一個(gè)集合與給定集合的差集的元素. </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> * 該命令類(lèi)似于 SDIFF, 不同之處在于該命令不返回結(jié)果集,而是將結(jié)果存放在destination集合中. </span><span> 718</span> <span> * 如果destination 已經(jīng)存在, 則將其覆蓋重寫(xiě). </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é)果集元素的個(gè)數(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

In PHP, you can use square brackets or curly braces to obtain string specific index characters, but square brackets are recommended; the index starts from 0, and the access outside the range returns a null value and cannot be assigned a value; mb_substr is required to handle multi-byte characters. For example: $str="hello";echo$str[0]; output h; and Chinese characters such as mb_substr($str,1,1) need to obtain the correct result; in actual applications, the length of the string should be checked before looping, dynamic strings need to be verified for validity, and multilingual projects recommend using multi-byte security functions uniformly.

AgeneratorinPHPisamemory-efficientwaytoiterateoverlargedatasetsbyyieldingvaluesoneatatimeinsteadofreturningthemallatonce.1.Generatorsusetheyieldkeywordtoproducevaluesondemand,reducingmemoryusage.2.Theyareusefulforhandlingbigloops,readinglargefiles,or

To prevent session hijacking in PHP, the following measures need to be taken: 1. Use HTTPS to encrypt the transmission and set session.cookie_secure=1 in php.ini; 2. Set the security cookie attributes, including httponly, secure and samesite; 3. Call session_regenerate_id(true) when the user logs in or permissions change to change to change the SessionID; 4. Limit the Session life cycle, reasonably configure gc_maxlifetime and record the user's activity time; 5. Prohibit exposing the SessionID to the URL, and set session.use_only

You can use substr() or mb_substr() to get the first N characters in PHP. The specific steps are as follows: 1. Use substr($string,0,N) to intercept the first N characters, which is suitable for ASCII characters and is simple and efficient; 2. When processing multi-byte characters (such as Chinese), mb_substr($string,0,N,'UTF-8'), and ensure that mbstring extension is enabled; 3. If the string contains HTML or whitespace characters, you should first use strip_tags() to remove the tags and trim() to clean the spaces, and then intercept them to ensure the results are clean.

There are two main ways to get the last N characters of a string in PHP: 1. Use the substr() function to intercept through the negative starting position, which is suitable for single-byte characters; 2. Use the mb_substr() function to support multilingual and UTF-8 encoding to avoid truncating non-English characters; 3. Optionally determine whether the string length is sufficient to handle boundary situations; 4. It is not recommended to use strrev() substr() combination method because it is not safe and inefficient for multi-byte characters.

The urlencode() function is used to encode strings into URL-safe formats, where non-alphanumeric characters (except -, _, and .) are replaced with a percent sign followed by a two-digit hexadecimal number. For example, spaces are converted to signs, exclamation marks are converted to!, and Chinese characters are converted to their UTF-8 encoding form. When using, only the parameter values ??should be encoded, not the entire URL, to avoid damaging the URL structure. For other parts of the URL, such as path segments, the rawurlencode() function should be used, which converts the space to . When processing array parameters, you can use http_build_query() to automatically encode, or manually call urlencode() on each value to ensure safe transfer of data. just

To set and get session variables in PHP, you must first always call session_start() at the top of the script to start the session. 1. When setting session variables, use $_SESSION hyperglobal array to assign values ??to specific keys, such as $_SESSION['username']='john_doe'; it can store strings, numbers, arrays and even objects, but avoid storing too much data to avoid affecting performance. 2. When obtaining session variables, you need to call session_start() first, and then access the $_SESSION array through the key, such as echo$_SESSION['username']; it is recommended to use isset() to check whether the variable exists to avoid errors

Key methods to prevent SQL injection in PHP include: 1. Use preprocessing statements (such as PDO or MySQLi) to separate SQL code and data; 2. Turn off simulated preprocessing mode to ensure true preprocessing; 3. Filter and verify user input, such as using is_numeric() and filter_var(); 4. Avoid directly splicing SQL strings and use parameter binding instead; 5. Turn off error display in the production environment and record error logs. These measures comprehensively prevent the risk of SQL injection from mechanisms and details.
