redis使用方式
【cache VS storage】
redis是作為緩存,還是作為存儲(chǔ)使用?
1.作為緩存的話枉侧,業(yè)務(wù)方必須為每個(gè)key都設(shè)置過期時(shí)間羡藐,并且請(qǐng)注明當(dāng)redis內(nèi)存到達(dá)配額上限時(shí)是否允許key被逐出(默認(rèn)LRU)
2.作為存儲(chǔ)使用几缭,業(yè)務(wù)方需要考慮數(shù)據(jù)的清洗策略婿禽,否則redis的內(nèi)存量會(huì)一直增長(zhǎng)藐窄,最終達(dá)到上限,導(dǎo)致服務(wù)不可用蘸鲸。
對(duì)同一套redis的使用榨婆,不要出現(xiàn)部分key設(shè)置了過期時(shí)間,另外部分key沒有設(shè)置過期時(shí)間的情況氮唯。
【內(nèi)存使用量鉴吹,以及未來(lái)的增長(zhǎng)趨勢(shì)如何?】
預(yù)計(jì)整個(gè)業(yè)務(wù)單份內(nèi)存量,5GB/10GB/20GB還是更多?未來(lái)2年內(nèi)會(huì)增漲到大概多少GB?
redis內(nèi)存使用量估算方式:(key的平均長(zhǎng)度+value的平均長(zhǎng)度) * kv個(gè)數(shù) * 2
為什么要 乘以 2 ?
redis內(nèi)存的估算本身很復(fù)雜惩琉,與key是否設(shè)置了過期時(shí)間豆励,key的大小,value的類型和大小瞒渠,value采用的編碼和存儲(chǔ)方式良蒸,redis實(shí)例自身垃圾回收的速度,每秒寫入量的大小等都相關(guān)伍玖。所以乘以2是比較保守的估算方式嫩痰。
對(duì)內(nèi)存資源的評(píng)估請(qǐng)本著認(rèn)真負(fù)責(zé)的態(tài)度,既要能滿足業(yè)務(wù)擴(kuò)展的需求窍箍,又要杜絕資源的浪費(fèi)串纺。
【qps量,以及未來(lái)的增長(zhǎng)趨勢(shì)如何椰棘?】
整個(gè)redis集群需要提供的qps量纺棺,1w、2w還是5w邪狞,甚至更多祷蝌?未來(lái)1-2年預(yù)估會(huì)達(dá)到多少?
qps在5000以下的帆卓,請(qǐng)優(yōu)先考慮使用mysql巨朦,我們的mysql可以滿足絕大部分業(yè)務(wù)需求乡翅,同時(shí)提供更好的高可用和數(shù)據(jù)安全解決方案。對(duì)于qps很凶锝肌(例如只有幾百甚至幾十的qps),但是業(yè)務(wù)場(chǎng)景非常適合使用Redis的尚洽,請(qǐng)說(shuō)明具體原因悔橄。
【業(yè)務(wù)使用的命令? KEY設(shè)計(jì)方式?】
一般redis是由dba來(lái)維護(hù)的,我們申請(qǐng)redis的時(shí)候腺毫,業(yè)務(wù)線要列舉用到的命令癣疟,這樣方便DBA對(duì)業(yè)務(wù)更深入的理解,幫助業(yè)務(wù)優(yōu)化和定位問題潮酒。
比如:
讀命令:get, lrange, hget 等等
寫(或讀寫)命令:setex, set, lpush, lpop 等等
KEY設(shè)計(jì)方式:給出key的例子睛挚,要簡(jiǎn)短,易懂急黎,比如:key1=user:name**
注:部分高危命令慎用扎狱,有些公司會(huì)做屏蔽,即使有密碼也無(wú)法使用勃教,被屏蔽的命令列表參考:
(1)如果命令來(lái)自于白名單列表淤击,那么不管是否設(shè)置了密碼,都跳過密碼驗(yàn)證階段故源。目的是為了方便dba的管理和兼容之前的各種監(jiān)控統(tǒng)計(jì)腳本污抬,否則改造代價(jià)太大。
(2)用戶即使提供了密碼绳军,也無(wú)法使用如下高危命令印机,除非用戶的ip地址在白名單中。也即门驾,在白名單中的ip地址射赛,可以執(zhí)行如下命令。而不在白名單中的ip奶是,即使提供了密碼咒劲,也不能使用如下的高危命令:
bgrewriteaof config get config set
config resetstat config rewrite flushall
flushdb shutdown save
bgsave client kill client list
slowlog monitor slaveof
info
【機(jī)房部署】
redis需要部署在哪個(gè)機(jī)房?
是否有跨機(jī)房部署需求?我們一般不推薦跨機(jī)房部署redis。例如如果前端和業(yè)務(wù)邏輯都在node1機(jī)房诫隅,那么推薦redis也部署在node1機(jī)房
【是否使用java】
如果dba提供了針對(duì)java的客戶端腐魂,該客戶端具有自動(dòng)sharding、連接池等功能逐纬,并通過zookeeper和redis哨兵保證了redis集群的高可用蛔屹,因此推薦使用dba提供的java client來(lái)訪問redis.
如果是非java語(yǔ)言,需要訪問redis豁生,請(qǐng)另行與dba溝通兔毒。
【業(yè)務(wù)的namespace及業(yè)務(wù)聯(lián)系人郵件漫贞、郵件組】
namespace需要dba和業(yè)務(wù)人員共同商定。該名稱最好能反映出redis所屬的部門育叁,例如支付迅脐、無(wú)線、酒店等豪嗽,另外能反映出業(yè)務(wù)用途谴蔑,例如qmp_status等.這樣方便日后的溝通和問題定位
namespace不要超過20個(gè)字符,多個(gè)單詞用_分隔
單機(jī)redis安裝
1.安裝redis官網(wǎng):[http://redis.io/download](http://redis.io/download)
可能需要安裝make
yum -y install gcc automake autoconf libtool make
安裝redis:
$ wget [http://download.redis.io/releases/redis-2.8.17.tar.gz]
$ tar -zxvf redis-2.8.17.tar.gz
$ cd redis-2.8.17
$ make
$ make install
安裝完成后龟梦,會(huì)在redis安裝目錄下出現(xiàn)一個(gè)src文件夾隐锭,redis-cli 、redis-server在這個(gè)目錄下
獲取項(xiàng)目中redis信息
1.在項(xiàng)目中引入redis bean
```
<bean id="beanRedis" class="redis client class">
<constructor-arg index="0">
<value>need param</value>
</constructor-arg>
<constructor-arg index="1">
<value>need param</value>
</constructor-arg>
</bean>
```
2.一般公司redis集群信息
clustername ip port timeout coresize maxsize
cluster6399 *.*.*.* 6399 1000 10 40
3.redis-cli獲取redis信息
sudo redis-cli -h 127.0.0.1 -p 6399 -a 密碼 (ip port 根據(jù)自己環(huán)境不同)
smembers onekey
4.查看key剩余過期時(shí)間
ttl onekey
當(dāng) key 不存在時(shí)计贰,返回 -2 钦睡。
當(dāng) key 存在但沒有設(shè)置剩余生存時(shí)間時(shí),返回 -1 躁倒。
否則荞怒,以秒為單位,返回 key 的剩余生存時(shí)間秧秉。
在 Redis 2.8 以前挣输,當(dāng) key 不存在,或者 key 沒有設(shè)置剩余生存時(shí)間時(shí)福贞,命令都返回 -1
項(xiàng)目中遇到的一些bug
1.redis存儲(chǔ)與java讀取 數(shù)據(jù)結(jié)構(gòu)不一致
redis中存的string 撩嚼,取的時(shí)候用的對(duì)象類型鸿染,應(yīng)該一致
2.java獲取緩存數(shù)據(jù)失敗紊选,重新查找接口問題
3.memcached遷移到redis,共存期間乡洼,hash算法不一致拇舀,導(dǎo)致獲取不到數(shù)據(jù)
緩存測(cè)試case參考
場(chǎng)景逻族,老服務(wù)A使用memcached ,新服務(wù)B使用redis骄崩,在遷移過程會(huì)有數(shù)據(jù)共存的現(xiàn)象聘鳞,這邊列出的可能不夠詳細(xì),僅供參考:
1.redis 讀寫要拂;
2.數(shù)據(jù)一致性:B寫抠璃,A讀; A寫脱惰,B讀搏嗡;
3.容量評(píng)估(考慮命中率);
4.超時(shí)時(shí)間;
5.緩存失效采盒;
等等
網(wǎng)絡(luò)辟謠
1.關(guān)于bind做網(wǎng)絡(luò)限制的錯(cuò)誤解釋
bind 127.0.0.1
翻看網(wǎng)上的文章旧乞,此處多翻譯為“指定redis只接收來(lái)自于該IP地址的請(qǐng)求,如果不進(jìn)行設(shè)置磅氨,那么將處理所有請(qǐng)求尺栖,在生產(chǎn)環(huán)境中最好設(shè)置該項(xiàng)”。
這種解釋會(huì)totally搞糊涂初學(xué)者烦租,甚至是錯(cuò)誤的延赌。該處的英文原文為:
If you want you can bind a single interface, if the bind option is not specified all the interfaces will listen for incoming connections.
bind 127.0.0.1該處說(shuō)明bind的是interface,也就是說(shuō)是網(wǎng)絡(luò)接口左权。服務(wù)器可以有一個(gè)網(wǎng)絡(luò)接口(通俗的說(shuō)網(wǎng)卡),或者多個(gè)痴颊。
打個(gè)比方說(shuō)機(jī)器上有兩個(gè)網(wǎng)卡赏迟,分別為192.168.205.5 和192.168.205.6,如果bind 192.168.205.5蠢棱,那么
只有該網(wǎng)卡地址接受外部請(qǐng)求锌杀,如果不綁定,則兩個(gè)網(wǎng)卡口都接受請(qǐng)求泻仙。