Ⅰ php redis 怎麼刪除hash,而不是只刪除了單個或多個域
//刪除單個實體
$redis->hDel('hashkey','key1');
//刪除整個hash
$redis->del('hashkey');
刪除一個redis的key都是用del方法, 不管是string,hash,list,set等類型, 都一樣
Ⅱ 如何批量刪除Redis下特定pattern的keys
批量刪除Redis下特定pattern的keys:
可以使用linux的xargs來做到,如:
*/redis-cli keys "prefix*"
如果是訪問特定的資料庫,則可以:
*/redis-cli -n 0 keys "prefix*"
Redis是一個開源的使用ANSI C語言編寫、支持網路、可基於內存亦可持久化的日誌型、Key-Value資料庫,並提供多種語言的API。從2010年3月15日起,Redis的開發工作由VMware主持。從2013年5月開始,Redis的開發由Pivotal贊助。
redis是一個key-value存儲系統。和Memcached類似,它支持存儲的value類型相對更多,包括string(字元串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區別的是redis會周期性的把更新的數據寫入磁碟或者把修改操作寫入追加的記錄文件,並且在此基礎上實現了master-slave(主從)同步。
Ⅲ 在不影響性能的情況下,怎麼快速批量刪除redis數據
Redis在分布式應用中占據著越來越重要的地位,短短的幾萬行代碼,實現了一個高性能的數據存儲服務。最近mp中心的cm8集群出現過幾次redis超時的情況,但是查看redis機器的相關內存都沒有發現內存不夠,或者內存發生交換的情況,查看redis源碼之後,發現在某些情況下redis會出現超時的狀況,相關細節如下。
1. 網路。Redis的處理與網路息息相關,如果網路出現閃斷則容易發生redis超時的狀況。如果出現這種狀況首先應查看redis機器網路帶寬信息,判斷是否有閃斷情況發生。
2. 內存。redis所有的數據都放在內存里,當物理內存不夠時,linux os會使用swap內存,導致內存交換發生,這時如果有redis調用命令就會產生redis超時。這里可以通過調整/proc/sys/vm/swappiness參數,來設置物理內存使用超過多少就會進行swap。
int rdbSaveBackground(char *filename) { pid_t childpid; long long start; if (server.rdb_child_pid != -1) return REDIS_ERR; serverserver.dirty_before_bgsave = server.dirty; server.lastbgsave_try = time(NULL); start = ustime(); if ((childpid = fork()) == 0) { int retval; /* Child */ if (server.ipfd > 0) close(server.ipfd); if (server.sofd > 0) close(server.sofd); retval = rdbSave(filename); if (retval == REDIS_OK) { size_t private_dirty = zmalloc_get_private_dirty(); if (private_dirty) { redisLog(REDIS_NOTICE, "RDB: %zu MB of memory used by -on-write", private_dirty/(1024*1024)); } } exitFromChild((retval == REDIS_OK) ? 0 : 1); } else { /* Parent */ server.stat_fork_time = ustime()-start; if (childpid == -1) { server.lastbgsave_status = REDIS_ERR; redisLog(REDIS_WARNING,"Can't save in background: fork: %s", strerror(errno)); return REDIS_ERR; } redisLog(REDIS_NOTICE,"Background saving started by pid %d",childpid); server.rdb_save_time_start = time(NULL); server.rdb_child_pid = childpid; updateDictResizePolicy(); return REDIS_OK; } return REDIS_OK; /* unreached */ }
程序1
另外還有一些特殊情況也會導致swap發生。當我們使用rdb做為redis集群持久化時可能會發生物理內存不夠的情況(aof持久化只是保持支持不斷的追加redis集群變化操作,不太容易引起swap)。當使用rdb持久化時,如程序1所示主進程會fork一個子進程去mp redis中所有的數據,主進程依然為客戶端服務。此時主進程和子進程共享同一塊內存區域, linux內核採用寫時復制來保證數據的安全性。在這種模式下如果客戶端發來寫請求,內核將該頁賦值到一個新的頁面上並標記為寫,在將寫請求寫入該頁面。因此,在rdb持久化時,如果有其他請求,那麼redis會使用更多的內存,更容易發生swap,因此在可以快速恢復的場景下盡量少使用rdb持久化可以將rdb mp的條件設的苛刻一點,當然也可以選擇aof,但是aof也有他自身的缺點。另外也可以使用2.6以後的主從結構,將讀寫分離,這樣不會出現server進程上又讀又寫的情景發生 3. Redis單進程處理命令。Redis支持udp和tcp兩種連接,redis客戶端向redis伺服器發送包含redis命令的信息,redis伺服器收到信息後解析命令後執行相應的操作,redis處理命令是串列的具體流程如下。首先服務端建立連接如程序2所示,在創建socket,bind,listen後返迴文件描述符:
server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr);
程序2
對於redis這種服務來說,它需要處理成千上萬個連接(最高達到655350),需要使用多路復用來處理多個連接。這里redis提供了epoll,select, kqueue來實現,這里在默認使用epoll(ae.c)。拿到listen函數返回的文件描述符fd後,redis將fd和其處理acceptTcpHandler函數加入到事件驅動的鏈表中.實際上在加入事件隊列中,程序4事件驅動程序將套接字相關的fd文件描述符加入到epoll的監聽事件中。
if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE, acceptTcpHandler,NULL) == AE_ERR) redisPanic("Unrecoverable error creating server.ipfd file event."); int aeCreateFileEvent(aeEventLoop *eventLoop, int fd, int mask, aeFileProc *proc, void *clientData) { if (fd >= eventLoop->setsize) { errno = ERANGE; return AE_ERR; } aeFileEvent *fe = &eventLoop->events[fd]; if (aeApiAddEvent(eventLoop, fd, mask) == -1) return AE_ERR; fe->mask |= mask; if (mask & AE_READABLE) fe->rfileProc = proc; if (mask & AE_WRITABLE) fe->wfileProc = proc; fe->clientDataclientData = clientData; if (fd > eventLoop->maxfd) eventLoop->maxfd = fd; return AE_OK; }
程序3
static int aeApiAddEvent(aeEventLoop *eventLoop, int fd, int mask) { aeApiState *state = eventLoop->apidata; struct epoll_event ee; /* If the fd was already monitored for some event, we need a MOD * operation. Otherwise we need an ADD operation. */ int op = eventLoop->events[fd].mask == AE_NONE ? EPOLL_CTL_ADD : EPOLL_CTL_MOD; ee.events = 0; mask |= eventLoop->events[fd].mask; /* Merge old events */ if (mask & AE_READABLE) ee.events |= EPOLLIN; if (mask & AE_WRITABLE) ee.events |= EPOLLOUT; ee.data.u64 = 0; /* avoid valgrind warning */ ee.data.fd = fd; if (epoll_ctl(state->epfd,op,fd,&ee) == -1) return -1; return 0; }
程序4
在初始話完所有事件驅動後,如程序5所示主進程根據numevents = aeApiPoll(eventLoop, tvp)獲得io就緒的文件描述符和其對應的處理程序,並對fd進行處理。大致流程是accept()->createclient()->readQueryFromClient()。其中readQueryFromClient()讀取信息中的redis命令-> processInputBuffer()->call()最後完成命令。
void aeMain(aeEventLoop *eventLoop) { eventLoop->stop = 0; while (!eventLoop->stop) { if (eventLoop->beforesleep != NULL) eventLoop->beforesleep(eventLoop); aeProcessEvents(eventLoop, AE_ALL_EVENTS); } } int aeProcessEvents(aeEventLoop *eventLoop, int flags) {------------------------------- numevents = aeApiPoll(eventLoop, tvp); for (j = 0; j < numevents; j++) { aeFileEvent *fe = &eventLoop->events[eventLoop->fired[j].fd]; int mask = eventLoop->fired[j].mask; int fd = eventLoop->fired[j].fd; int rfired = 0; /* note the fe->mask & mask & ... code: maybe an already processed * event removed an element that fired and we still didn't * processed, so we check if the event is still valid. */ if (fe->mask & mask & AE_READABLE) { rfired = 1; fe->rfileProc(eventLoop,fd,fe->clientData,mask); } if (fe->mask & mask & AE_WRITABLE) { if (!rfired || fe->wfileProc != fe->rfileProc) fe->wfileProc(eventLoop,fd,fe->clientData,mask); } processed++; } }
程序5
從上述代碼可以看出redis利用ae事件驅動結合epoll多路復用實現了串列式的命令處理。所以一些慢命令例如sort,hgetall,union,mget都會使得單命令處理時間較長,容易引起後續命令time out.所以我們第一需要從業務上盡量避免使用慢命令,如將hash格式改為kv自行解析,第二增加redis實例個數,每個redis伺服器調用盡量少的慢命令。
Ⅳ redis 操作set集合怎麼刪除數據結構
在Redis中,Set和list都是字元串序列,非常相似,不同之處在於Set是用哈希表來保持字元串的唯一性,沒有先後順序,不像list一樣,可以在首尾增刪數據。
但是set也有自己的相應處理命令來完成對自己的操作。
Ⅳ 如何利用命令行方式實現redis清除緩存
為了能讓虛存更為充分的發揮作用以幫助我們提高系統的運行效率,我們可以將帶有很多較小值的Keys合並為帶有少量較大值的Keys。
其中最主要的方法就是將原有的Key/Value模式改為基於Hash的模式,這樣可以讓很多原來的Keys成為Hash中的屬性。
Ⅵ redis keys 管道命令 刪key會卡庫嗎
DEL 刪除給定的一個或多個 key,不存在的 key 會被忽略,返回值:被刪除 key 的數量
DUMP 序列化給定 key,返回被序列化的值,使用 RESTORE 命令可以將這個值反序列化為 Redis 鍵
EXISTS 檢查給定 key 是否存在
EXPIRE 為給定key設置有效時間,接受時間點
EXPIREAT 為給定key設置有效時間,接受時間戳timestamp
KEYS 查找所有符合給定模式 pattern 的 key;KEYS * 匹配資料庫中所有 key;KEYS h?llo 匹配 hello,hallo等。KEYS h[ae]llo匹配hello和hallo
MIGRATE 將 key 原子性地從當前實例傳送到目標實例的指定資料庫上,一旦傳送成功, key 保證會出現在目標實例上,而當前實例上的 key 會被刪除。執行的時候會阻塞進行遷移的兩個實例
MOVE 將當前資料庫的 key 移動到給定的資料庫 db 當中
OBJECT 從內部察看給定 key 的 Redis 對象
PERSIST 移除給定 key 的有效時間
PEXPIRE 以毫秒為單位設置 key 的有效時間
PEXPIREAT 以毫秒為單位設置 key 的有效時間(timespan)
PTTL 以毫秒為單位返回key的剩餘有效時間
RANDOMKEY 從當前資料庫中隨機返回(已使用的)一個key
RENAME 將Key改名
RENAMENX 當且僅當 newkey 不存在時,將 key 改名為 newkey
RESTORE 反序列化給定的序列化值,並將它和給定的 key 關聯
SORT 返回或保存給定列表、集合、有序集合 key 中經過排序的元素
TTL 以秒為單位,返回給定 key 的剩餘有效時間
TYPE 返回 key 所儲存的值的類型
SCAN 增量迭代
Ⅶ 對於redis的批量刪除指定key,有沒有好的方法
1. 終端
獲取所有Key命令:redis-cli keys 『*』 ;
獲取指定前綴的key:redis-cli KEYS 「e:*」
如果需要導出,可以redis-cli keys 『*』 > /data/redis_key.txt
刪除指定前綴的Key redis-cli KEYS 「e:*」 | xargs redis-cli DEL
Ⅷ redis 命令行的語法提示 如何去掉
Redis Pgmerge 命令將多個 HyperLogLog 合並為一個 HyperLogLog ,合並後的 HyperLogLog 的基數估算值是通過對所有 給定 HyperLogLog 進行並集計算得出的。
語法
redis Pgmerge 命令基本語法如下:
redis 127.0.0.1:6379> PFMERGE destkey sourcekey [sourcekey ]
可用版本
>= 2.8.9
返回值
返回 OK。
實例
redis 127.0.0.1:6379> PFADD hll1 foo bar zap a(integer) 1redis 127.0.0.1:6379> PFADD hll2 a b c foo(integer) 1redis 127.0.0.1:6379> PFMERGE hll3 hll1 hll2OKredis 127.0.0.1:6379> PFCOUNT hll3(integer) 6redis>
Ⅸ 如何刪除redis3.2 gems
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
Redis集群部署文檔(centos6系統)
(要讓集群正常工作至少需要3個主節點,在這里我們要創建6個redis節點,其中三個為主節點,三個為從節點,對應的redis節點的ip和埠對應關系如下)
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
127.0.0.1:7003
127.0.0.1:7004
127.0.0.1:7005
1:下載redis。官網下載3.0.0版本,之前2.幾的版本不支持集群模式
下載地址:https://github.com/antirez/redis/archive/3.0.0-rc2.tar.gz
2:上傳伺服器,解壓,編譯
tar -zxvf redis-3.0.0-rc2.tar.gz mv redis-3.0.0-rc2.tar.gz redis3.0cd /usr/local/redis3.0makemake install
3:創建集群需要的目錄
mkdir -p /usr.local/clustercd /usr.local/clustermkdir 7000mkdir 7001mkdir 7002mkdir 7003mkdir 7004mkdir 7005
4:修改配置文件redis.conf
cp /usr/local/redis3.0/redis.conf /usr.local/clustervi redis.conf##修改配置文件中的下面選項port 7000daemonize yescluster-enabled yescluster-config-file nodes.confcluster-node-timeout 5000appendonly yes##修改完redis.conf配置文件中的這些配置項之後把這個配置文件分別拷貝到7000/7001/7002/7003/7004/7005目錄下面cp /usr/local/cluster/redis.conf /usr/local/cluster/7000cp /usr/local/cluster/redis.conf /usr/local/cluster/7001cp /usr/local/cluster/redis.conf /usr/local/cluster/7002cp /usr/local/cluster/redis.conf /usr/local/cluster/7003cp /usr/local/cluster/redis.conf /usr/local/cluster/7004cp /usr/local/cluster/redis.conf /usr/local/cluster/7005 ##注意:拷貝完成之後要修改7001/7002/7003/7004/7005目錄下面redis.conf文件中的port參數,分別改為對應的文件夾的名稱
5:分別啟動這6個redis實例
cd /usr/local/cluster/7000redis-server redis.confcd /usr/local/cluster/7001redis-server redis.confcd /usr/local/cluster/7002redis-server redis.confcd /usr/local/cluster/7003redis-server redis.confcd /usr/local/cluster/7004redis-server redis.confcd /usr/local/cluster/7005redis-server redis.conf ##啟動之後使用命令查看redis的啟動情況ps -ef|grep redis如下圖顯示則說明啟動成功
6:執行redis的創建集群命令創建集群
cd /usr/local/redis3.0/src./redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
6.1執行上面的命令的時候會報錯,因為是執行的ruby的腳本,需要ruby的環境
錯誤內容:/usr/bin/env: ruby: No such file or directory
所以需要安裝ruby的環境,這里推薦使用yum install ruby安裝
yum install ruby
6.2然後再執行第6步的創建集群命令,還會報錯,提示缺少rubygems組件,使用yum安裝
錯誤內容:
./redis-trib.rb:24:in `require': no such file to load -- rubygems (LoadError)
from ./redis-trib.rb:24
yum install rubygems
6.3再次執行第6步的命令,還會報錯,提示不能載入redis,是因為缺少redis和ruby的介面,使用gem 安裝
錯誤內容:
/usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `gem_original_require': no such file to load -- redis (LoadError)
from /usr/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
from ./redis-trib.rb:25
gem install redis
6.4 再次執行第6步的命令,正常執行
輸入yes,然後配置完成。
至此redis集群即搭建成功!
7:使用redis-cli命令進入集群環境
redis-cli -c -p 7000
Ⅹ 如何批量刪除Redis下特定pattern的keys
在linux中 批量操作redis中的 keys的方法:
1.統計個數:
redis中名稱含有OMP_OFFLINE的key的個數;
src/redis-cli keys "*OMP_OFFLINE*"|wc -l
2.批量刪除
批量刪除 0號資料庫中名稱含有OMP_OFFLINE的key:
src/redis-cli -n 0 keys "*OMP_OFFLINE*"|xargs src/redis-cli -n 0 del
在redis的客戶端環境中並不支持批量刪除。