前提:
現在做的一個業務系統,用了redis做緩存。
系統做了緩存,通常在系統正常使用的過程中,可以節省很多系統資源,特別是數據庫資源。
但是,在開發、測試或者系統遇到問題的時候,也有很麻煩的事情。
通常的表現是,明明數據已經改了,在plsql develop 里面是正常的,為什么系統里面是沒變化,接口也沒有變。
然后,順着線路找去,在日志里面看到,原來是走了緩存,數據沒有更新。
或者是,重跑數據的時候,怎么系統里面都沒有值,找了一圈,發現走了緩存。
還有個終極的BUG,在客戶現象,因為要共有一個數據庫,搭了兩套tomcat環境,然后使用了同一個redis集群,
還是同一個庫,導致現網環境,相同的接口,出現的數據五花八門,導致客戶嚴重不滿意。
經查,一個同事,在測試接口的時候,測試數據,寫入redis緩存中,導致客戶看到的數據一直變化。
問題還巨難定位。
好像扯遠了。。。
正文。。。。
由於歷史原因,redis使用的是單獨的用戶,每次測試接口的時候,要去清空數據,需要切換用戶,進入目錄
執行 redis-cli -p 6379 ,輸入密碼,切換庫,然后才能flushdb。開發的時候,還沒什么事情,寫了個jedis的測試類,
直接把redis指定庫清空。
但是,在客戶現場,只能使用teamviewer遠程過去,當然也就不能使用測試類了。一般遠程還比較卡,用着及其不爽。
然后還有切來、切去的,煩得不行。
這樣,就萌生了,寫個腳本,直接把redis的指定庫清空的想法了。
直接上第一版
#!/bin/bash
redis-cli -h localhost -p 6379 -a xxx flushall
這樣,雖然可以帶到預期的效果,但就是覺得有點傻,一下全,清空了,其他系統(其他庫)的緩存怎么辦?
比較菜,不知道怎么處理,直接一條命令寫完,又不行
reids-cli -h localhost -p 6379
auth xxx
select 15
flushdb
當然,這樣是不行的,因為,shell腳本,命令是shell的命令,不能寫到第一句執行后的redis客戶端中。
最后一版:
#!/bin/bash cd /opt/xxx/xx/redis/bin db=15 #可以用第一個參數指定需求清除的庫 if [ -n "$1" ];then db=$1 fi /opt/wacos/server/redisha/bin/redis-cli -h localhost -p 6379 -a xxx <<END select ${db} flushdb END
把腳本放到任意目錄,修改cd的目錄,把幾號庫作為參數傳入,默認15號庫。
這個腳本的關鍵是 "<<END","END"
shell中,使用 “<<xx” “xx” 標記
可以將標記中間的命令,一條一條的輸入到redis客戶端中。就起到了預期的效果。
其他客戶端同理
oracle:
#!/bin/bash sqlplus scot/tiger <<END select * from dual; END
輸出:
[oracle@xxx bin]$ ./oracle.sh SQL*Plus: Release 11.2.0.1.0 Production on Mon Jan 29 23:19:32 2018 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connected to: Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> D - X SQL> Disconnected from Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options
其他客戶端類似。
thanks
