您好,登錄后才能下訂單哦!
這篇文章給大家介紹Redis批量刪除key以及setnx使用場景的分析,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對(duì)大家能有所幫助。
1, 批量刪除key
redis中要?jiǎng)h除某個(gè)key的值,只能通過del key的方式進(jìn)行刪除。如果要批量刪除呢?很遺憾,Redis并不支持按key的正則方式進(jìn)行刪除的操作。那如何去達(dá)到這個(gè)效果呢?可以使用linux的管道命令,如下:
/usr/local/redis/bin/redis-cli keys abc:* | xargs /usr/local/redis/bin/redis-cli del
前面的/usr/local/redis/bin/redis-cli是redis的客戶端,keys abc:* 表示獲取到以abc:開頭的所有key,然后把這些key,當(dāng)做參數(shù)(xargs),傳遞給管道后面的del命令。這樣就實(shí)現(xiàn)了批量刪除key的功能。但是如果key的前綴后面接著就是空格,那這個(gè)正則就無法命中了。
當(dāng)然,在redis命令后面,還可以加上很多其他的參數(shù),比如:
-h ip //表示某個(gè)ip主機(jī) -p port //表示該主機(jī)端口 -a password //表示連接密碼 -n 1 //表示選擇節(jié)點(diǎn)號(hào)為1的數(shù)據(jù)庫節(jié)點(diǎn)(不寫默認(rèn)連接為0),對(duì)應(yīng)的命令為 select 1
比如
/usr/local/redis/bin/redis-cli -n 1 keys "ab:token*" | xargs /usr/local/redis/bin/redis-cli -n 1 del (integer) 188 //表示刪除了188個(gè)key
注意管道前后都加了相同的參數(shù),否則會(huì)匹配不上。
當(dāng)然,如果要全部刪除某個(gè)節(jié)點(diǎn)的數(shù)據(jù),可以直接使用
flushdb flushall
這兩個(gè)命令。
2, redis 的 expire key time_in_seconds 命令,后面的過期時(shí)間,必須是整數(shù),不能為小數(shù)。否則會(huì)報(bào) ERR value is not an integer or out of range 錯(cuò)誤。
3,redis的setnx使用場景
<?php public function abc() { //唯一key $key = 'string_key_'.$uniqueId; //redis實(shí)例 $redis = app('redis')->connection('cache'); $random = rand(1, 10000); //將唯一key賦值為$random值,如果成功,表示加上了鎖,如果未成功,等待鎖釋放,直到獲取到鎖 while (!$locked = $redis->setnx($key, $random)) { sleep(0.05); } //設(shè)置成功后加過期時(shí)間 $ttl = 1; $redis->expire($key, $ttl); //業(yè)務(wù)邏輯處理 //如果業(yè)務(wù)邏輯處理完,為防止del把其他請求的鎖刪掉,這里加上$random值校驗(yàn),確保這里刪除的鎖是本次周期內(nèi)的 if ($redis->get($key) == $random) { $redis->del([$key]); } //返回結(jié)果 return $result; }
這里要注意的是,如果業(yè)務(wù)處理邏輯未處理完,此時(shí)key失效了,那第二個(gè)請求過來,它可以直接獲取到一個(gè)新的鎖,然后執(zhí)行一個(gè)新的業(yè)務(wù)邏輯,造成實(shí)際上的并發(fā)。所以,這里的 過期時(shí)間,一定要設(shè)置得比 業(yè)務(wù)處理邏輯更長一些,讓業(yè)務(wù)邏輯處理完。
4,對(duì)redis進(jìn)行連接限制保護(hù)時(shí),有三部分:
在redis配置文件中的protected-mode 設(shè)置,yes 表示 以保護(hù)模式運(yùn)行,需要配置 bind ip 或者需要設(shè)置訪問密碼(requirepass);
bind ip 綁定IP 配置,它限制的是哪些IP才可以連接本redis,其中0.0.0.0是允許所以外網(wǎng)連接,當(dāng)然127.0.0.1就是本機(jī);
requirepass 設(shè)置訪問密碼;
有四種方式可以改變保護(hù)模式,如下
DENIED Redis is running in protected mode because protected mode is enabled, no bind address was specified, no authentication password is requested to clients. In this mode connections are only accepted from the loopback interface. If you want to connect from external computers to Redis you may adopt one of the following solutions: //如果你想要從外部電腦連接Redis,你可能需要采用以下方案中的一種 1) Just disable protected mode sending the command 'CONFIG SET protected-mode no' from the loopback interface by connecting to Redis from the same host the server is running, however MAKE SURE Redis is not publicly accessible from internet if you do so. Use CONFIG REWRITE to make this change permanent. 2) Alternatively you can just disable the protected mode by editing the Redis configuration file, and setting the protected mode option to 'no', and then restarting the server. 3) If you started the server manually just for testing, restart it with the '--protected-mode no' option. 4) Setup a bind address or an authentication password. NOTE: You only need to do one of the above things in order for the server to start accepting connections from the outside
關(guān)于Redis批量刪除key以及setnx使用場景的分析就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。