Redis是(shi)什么?
Redis is an open source, BSD licensed, advanced key-value store. It is often referred to as a data structure server since keys can contain strings, hashes, lists, sets and sorted sets.
redis是開源,BSD許可,高級的key-value存儲系(xi)統.
可以用(yong)來存儲(chu)字(zi)符串(chuan),哈希結(jie)構(gou),鏈表,集合,因此,常用(yong)來提供數據結(jie)構(gou)服務.
redis和memcached相比,的(de)獨特(te)之處:
1: redis可以用來(lai)做存(cun)儲(chu)(storge), 而memccached是用來(lai)做緩存(cun)(cache)
這(zhe)個特點(dian)主要因(yin)為其有(you)”持(chi)久(jiu)化(hua)”的功(gong)能(neng).
2: 存(cun)儲(chu)的數據(ju)有”結構”,對于memcached來說,存(cun)儲(chu)的數據(ju),只有1種類型--”字(zi)符串”,
而(er)redis則可以存儲字符串,鏈表,哈希結構,集(ji)合,有(you)序集(ji)合.
Redis下載安裝
1:官(guan)方站點(dian): redis.io 下載最(zui)(zui)新版(ban)或者最(zui)(zui)新stable版(ban)
2:解(jie)壓源(yuan)碼并(bing)進入目錄
3: 不用configure
4: 直接make
(如(ru)果是32位機器 make 32bit)
注:易碰到(dao)的(de)問題,時(shi)間錯誤(wu).
原因: 源碼是官方configure過的,但官方configure時,生成的文件有時間戳信息(xi),
Make只能發(fa)生(sheng)在configure之后,
如果你的虛(xu)擬機的時間不對,比如說是2012年
解決: date -s ‘yyyy-mm-dd hh:mm:ss’ 重寫時間(jian)
再 clock -w 寫入cmos
5: 可選(xuan)步驟: make test 測試(shi)編(bian)譯情(qing)況
(可能出現: need tcl >8.4這種情(qing)況, yum install tcl)
6: 安裝到指定的目錄,比如(ru) /usr/local/redis
make PREFIX=/usr/local/redis install
注: PREFIX要大寫
7: make install之后,得到如下幾個文件(jian)
redis-benchmark 性能測試工具
redis-check-aof 日(ri)(ri)志(zhi)文件檢測(ce)工(比如斷電造(zao)成日(ri)(ri)志(zhi)損壞(huai),可(ke)以檢測(ce)并(bing)修復)
redis-check-dump 快照文件檢測(ce)工具,效果類上
redis-cli 客(ke)戶端
redis-server 服(fu)務(wu)端(duan)
8: 復制配置文件
Cp /path/redis.conf /usr/local/redis
9: 啟動與連接
/path/to/redis/bin/redis-server ./path/to/conf-file
例(li):[root@localhost redis]# ./bin/redis-server ./redis.conf
連接: 用(yong)redis-cli
#/path/to/redis/bin/redis-cli [-h localhost -p 6379 ]
10: 讓redis以后臺進程(cheng)的形(xing)式運(yun)行
編輯conf配置文件,修改如下內容(rong);
daemonize yes
Redis對于key的操作命令
del key1 key2 ... Keyn
作用: 刪除1個(ge)或多個(ge)鍵
返回值: 不存在的(de)key忽略掉,返回真正(zheng)刪除的(de)key的(de)數量
rename key newkey
作用: 給key賦一個(ge)新(xin)的key名
注:如果newkey已(yi)存在,則newkey的(de)原值被(bei)覆(fu)蓋
renamenx key newkey
作(zuo)用(yong): 把key改(gai)名為(wei)newkey
返回: 發生(sheng)修改返回1,未發生(sheng)修改返回0
注: nx--> not exists, 即, newkey不存在(zai)時,作改名動作
move key db
redis 127.0.0.1:6379[1]> select 2
OK
redis 127.0.0.1:6379[2]> keys *
(empty list or set)
redis 127.0.0.1:6379[2]> select 0
OK
redis 127.0.0.1:6379> keys *
1) "name"
2) "cc"
3) "a"
4) "b"
redis 127.0.0.1:6379> move cc 2
(integer) 1
redis 127.0.0.1:6379> select 2
OK
redis 127.0.0.1:6379[2]> keys *
1) "cc"
redis 127.0.0.1:6379[2]> get cc
"3"
(注意(yi): 一個redis進程(cheng),打開(kai)(kai)了不止一個數(shu)據(ju)庫, 默認打開(kai)(kai)16個數(shu)據(ju)庫,從0到15編號,
如果想打開更多數據(ju)庫,可以從(cong)配置文件修改(gai))
keys pattern 查詢相應的key
在redis里,允許模(mo)糊查詢key
有3個通配符(fu) *, ? ,[]
*: 通配任意(yi)多個字符(fu)
?: 通配單個字符
[]: 通配(pei)括(kuo)號內(nei)的某1個(ge)字符
redis 127.0.0.1:6379> flushdb
OK
redis 127.0.0.1:6379> keys *
(empty list or set)
redis 127.0.0.1:6379> mset one 1 two 2 three 3 four 4
OK
redis 127.0.0.1:6379> keys o*
1) "one"
redis 127.0.0.1:6379> key *o
(error) ERR unknown command 'key'
redis 127.0.0.1:6379> keys *o
1) "two"
redis 127.0.0.1:6379> keys ???
1) "one"
2) "two"
redis 127.0.0.1:6379> keys on?
1) "one"
redis 127.0.0.1:6379> set ons yes
OK
redis 127.0.0.1:6379> keys on[eaw]
1) "one"
randomkey 返回隨機key
exists key
判斷key是(shi)否存(cun)在,返回1/0
type key
返回key存儲的(de)值的(de)類型
有string,link,set,order set, hash
ttl key
作用: 查詢key的生命(ming)周期
返回: 秒數
注:對于不存在的key或已(yi)過(guo)期的key/不過(guo)期的key,都返(fan)回-1
Redis2.8中,對于不存(cun)在的(de)key,返(fan)回-2
expire key 整型值
作用: 設置(zhi)key的生(sheng)命(ming)周期,以秒為(wei)單位(wei)
同理:
pexpire key 毫秒數(shu), 設置生命周期
pttl key, 以毫秒返回生命周期
persist key
作(zuo)用: 把(ba)指定(ding)key置為永久有效(xiao)
Redis字符串類型的操作
set key value [ex 秒數(shu)] / [px 毫秒數(shu)] [nx] /[xx]
如: set a 1 ex 10 , 10秒有(you)效
Set a 1 px 9000 , 9秒有效
注: 如果ex,px同時寫,以(yi)后(hou)面的(de)有效(xiao)期為(wei)準
如 set a 1 ex 100 px 9000, 實際有效期是9000毫秒
nx: 表示(shi)key不存在時,執(zhi)行操作
xx: 表示key存在時,執行操(cao)作(zuo)
mset multi set , 一次性設置多(duo)個鍵值(zhi)
例: mset key1 v1 key2 v2 ....
get key
作(zuo)用:獲(huo)取key的值(zhi)
mget key1 key2 ..keyn
作用:獲取多個key的(de)值
setrange key offset value
作用:把(ba)字符串的offset偏移字節(jie),改成(cheng)value
redis 127.0.0.1:6379> set greet hello
OK
redis 127.0.0.1:6379> setrange greet 2 x
(integer) 5
redis 127.0.0.1:6379> get greet
"hexlo"
注意: 如果偏移量>字符(fu)長(chang)度, 該字符(fu)自動補0x00
redis 127.0.0.1:6379> setrange greet 6 !
(integer) 7
redis 127.0.0.1:6379> get greet
"heyyo\x00!"
append key value
作用: 把value追加到(dao)key的原值上
getrange key start stop
作(zuo)用: 是獲取字符串中(zhong) [start, stop]范圍的值(zhi)
注意: 對于字符串的下標(biao),左數從0開始(shi),右(you)數從-1開始(shi)
redis 127.0.0.1:6379> set title 'chinese'
OK
redis 127.0.0.1:6379> getrange title 0 3
"chin"
redis 127.0.0.1:6379> getrange title 1 -2
"hines"
注意:
1: start>=length, 則返回空字符串
2: stop>=length,則截取至字符結尾
3: 如果start 所(suo)處位(wei)置(zhi)在stop右邊, 返回空字符串
getset key newvalue
作用: 獲(huo)取(qu)并返回舊值,設置新(xin)值
redis 127.0.0.1:6379> set cnt 0
OK
redis 127.0.0.1:6379> getset cnt 1
"0"
redis 127.0.0.1:6379> getset cnt 2
"1"
incr key
作用(yong): 指定的(de)key的(de)值加1,并(bing)返回加1后的(de)值
注意:
1:不存在的key當成0,再incr操作
2: 范圍為64有符號
incrby key number
redis 127.0.0.1:6379> incrby age 90
(integer) 92
incrbyfloat key floatnumber
redis 127.0.0.1:6379> incrbyfloat age 3.5
"95.5"
decr key
redis 127.0.0.1:6379> set age 20
OK
redis 127.0.0.1:6379> decr age
(integer) 19
decrby key number
redis 127.0.0.1:6379> decrby age 3
(integer) 16
getbit key offset
作用:獲取值的二進制(zhi)表示(shi),對應位上的值(從左,從0編號)
redis 127.0.0.1:6379> set char A
OK
redis 127.0.0.1:6379> getbit char 1
(integer) 1
redis 127.0.0.1:6379> getbit char 2
(integer) 0
redis 127.0.0.1:6379> getbit char 7
(integer) 1
setbit key offset value
設置offset對應二進制(zhi)位(wei)上的值
返回: 該位上(shang)的舊值
注意:
1:如果offset過(guo)大,則會在中間填充(chong)0,
2: offset最大(da)大(da)到多少
3:offset最大(da)2^32-1,可推出最大(da)的的字符串為512M
bitop operation destkey key1 [key2 ...]
對key1,key2..keyN作operation,并(bing)將(jiang)結果保存到 destkey 上。
operation 可以(yi)是(shi) AND 、 OR 、 NOT 、 XOR
redis 127.0.0.1:6379> setbit lower 7 0
(integer) 0
redis 127.0.0.1:6379> setbit lower 2 1
(integer) 0
redis 127.0.0.1:6379> get lower
" "
redis 127.0.0.1:6379> set char Q
OK
redis 127.0.0.1:6379> get char
"Q"
redis 127.0.0.1:6379> bitop or char char lower
(integer) 1
redis 127.0.0.1:6379> get char
"q"
注意: 對于NOT操作(zuo), key不能(neng)多個
link 鏈表結構
lpush key value
作用(yong): 把(ba)值插(cha)入到鏈接頭部
rpop key
作(zuo)用(yong): 返(fan)回(hui)并刪除(chu)鏈(lian)表尾元素
rpush,lpop: 不(bu)解(jie)釋
lrange key start stop
作用: 返回鏈表中[start ,stop]中的元素
規(gui)律: 左(zuo)數(shu)從(cong)0開始,右數(shu)從(cong)-1開始
lrem key count value
作用: 從key鏈表中刪除 value值(zhi)
注: 刪除count的絕對值個(ge)value后結束
Count>0 從(cong)表頭刪除
Count<0 從表尾刪除
ltrim key start stop
作用: 剪切key對應(ying)的鏈接,切[start,stop]一段(duan),并把該(gai)段(duan)重新賦給key
lindex key index
作用: 返回index索(suo)引(yin)上(shang)的值(zhi),
如 lindex key 2
llen key
作用:計算鏈(lian)接表的元(yuan)素個數
redis 127.0.0.1:6379> llen task
(integer) 3
redis 127.0.0.1:6379>
linsert key after|before search value
作用: 在key鏈表中尋找’search’,并(bing)在search值之(zhi)(zhi)前|之(zhi)(zhi)后,.插入value
注: 一旦找到一個search后,命令就結束了,因此不(bu)會插入(ru)多個value
rpoplpush source dest
作用: 把source的(de)(de)尾部(bu)拿(na)出,放在dest的(de)(de)頭部(bu),
并返回 該單元值
場景(jing): task + bak 雙鏈表完成(cheng)安全(quan)隊列
Task列表 bak列表
|
|
|
|
|
|
|
|
業務邏輯:
1:Rpoplpush task bak
2:接收返(fan)回(hui)值,并做業務處理
3:如(ru)果成(cheng)功,rpop bak 清除任(ren)務. 如(ru)不成(cheng)功,下(xia)次從bak表里取任(ren)務
brpop ,blpop key timeout
作(zuo)用:等待(dai)彈出key的尾/頭元(yuan)素,
Timeout為等(deng)待超時(shi)(shi)時(shi)(shi)間
如(ru)果timeout為0,則一直等待(dai)
場景: 長輪詢(xun)Ajax,在線聊天時,能夠(gou)用到
Setbit 的實際應(ying)用
場(chang)景: 1億個用(yong)戶, 每(mei)個用(yong)戶 登(deng)陸/做(zuo)任(ren)意操作 ,記為(wei) 今天活(huo)躍(yue),否則記為(wei)不活(huo)躍(yue)
每周(zhou)評出: 有獎活(huo)躍(yue)用戶: 連續7天活(huo)動
每月評,等等...
思路:
Userid dt active
1 2013-07-27 1
1 2013-0726 1
如(ru)果是放(fang)在表(biao)中, 1:表(biao)急(ji)劇增大(da),2:要用(yong)group ,sum運算,計算較慢
用(yong): 位圖法 bit-map
Log0721: ‘011001...............0’
......
log0726 : ‘011001...............0’
Log0727 : ‘0110000.............1’
1: 記錄(lu)用戶(hu)登陸(lu):
每天按(an)日(ri)期生成(cheng)一個位(wei)圖, 用(yong)戶登陸(lu)后,把(ba)user_id位(wei)上的bit值置為1
2: 把1周的位圖 and 計算,
位上為1的(de),即是連續登陸(lu)的(de)用戶
redis 127.0.0.1:6379> setbit mon 100000000 0
(integer) 0
redis 127.0.0.1:6379> setbit mon 3 1
(integer) 0
redis 127.0.0.1:6379> setbit mon 5 1
(integer) 0
redis 127.0.0.1:6379> setbit mon 7 1
(integer) 0
redis 127.0.0.1:6379> setbit thur 100000000 0
(integer) 0
redis 127.0.0.1:6379> setbit thur 3 1
(integer) 0
redis 127.0.0.1:6379> setbit thur 5 1
(integer) 0
redis 127.0.0.1:6379> setbit thur 8 1
(integer) 0
redis 127.0.0.1:6379> setbit wen 100000000 0
(integer) 0
redis 127.0.0.1:6379> setbit wen 3 1
(integer) 0
redis 127.0.0.1:6379> setbit wen 4 1
(integer) 0
redis 127.0.0.1:6379> setbit wen 6 1
(integer) 0
redis 127.0.0.1:6379> bitop and res mon feb wen
(integer) 12500001
如上例,優點:
1: 節(jie)約空間, 1億人每天(tian)的登(deng)陸情況,用1億bit,約1200WByte,約10M 的字符就能表示
2: 計算方便
集合 set 相關命令
集(ji)合的性(xing)質: 唯(wei)一性(xing),無序性(xing),確定性(xing)
注(zhu): 在string和link的命令中,可以(yi)通過range 來訪問string中的某幾個(ge)字符(fu)或某幾個(ge)元(yuan)素
但,因為集(ji)合的無序性,無法通過下標或范圍(wei)來(lai)訪問部分元素.
因此想看元素,要(yao)么(me)隨機(ji)先一個,要(yao)么(me)全選
sadd key value1 value2
作(zuo)用: 往(wang)集合(he)key中(zhong)增加(jia)元素
srem value1 value2
作(zuo)用: 刪(shan)除集(ji)合中集(ji)為 value1 value2的(de)元(yuan)素(su)
返回值(zhi): 忽略(lve)不存在的元(yuan)素后(hou),真正(zheng)刪除掉的元(yuan)素的個數
spop key
作(zuo)用: 返回并刪除集合中(zhong)key中(zhong)1個(ge)隨機(ji)元素
隨機--體(ti)現了(le)無序(xu)性
srandmember key
作(zuo)用(yong): 返回集合key中,隨機的1個(ge)元素.
sismember key value
作用: 判斷(duan)value是否在key集合中
是返回1,否返回0
smembers key
作(zuo)用: 返回集中(zhong)(zhong)中(zhong)(zhong)所有的元(yuan)素
scard key
作用: 返回集(ji)合(he)中(zhong)元素的(de)個數(shu)
smove source dest value
作用:把source中的value刪除(chu),并添(tian)加到dest集(ji)合中
sinter key1 key2 key3
作(zuo)用: 求出key1 key2 key3 三個集合中的(de)交集,并返回
redis 127.0.0.1:6379> sadd s1 0 2 4 6
(integer) 4
redis 127.0.0.1:6379> sadd s2 1 2 3 4
(integer) 4
redis 127.0.0.1:6379> sadd s3 4 8 9 12
(integer) 4
redis 127.0.0.1:6379> sinter s1 s2 s3
1) "4"
redis 127.0.0.1:6379> sinter s3 s1 s2
1) "4"
sinterstore dest key1 key2 key3
作用(yong): 求出key1 key2 key3 三個集合中的交(jiao)集,并賦給dest
suion key1 key2.. Keyn
作用: 求出key1 key2 keyn的(de)并集,并返回
sdiff key1 key2 key3
作用(yong): 求出key1與(yu)key2 key3的差集
即(ji)key1-key2-key3
order set 有序集合
zadd key score1 value1 score2 value2 ..
添加元素
redis 127.0.0.1:6379> zadd stu 18 lily 19 hmm 20 lilei 21 lilei
(integer) 3
zrem key value1 value2 ..
作(zuo)用: 刪除集合中的元素
zremrangebyscore key min max
作用: 按照(zhao)socre來刪(shan)除元(yuan)素,刪(shan)除score在[min,max]之間(jian)的(de)
redis 127.0.0.1:6379> zremrangebyscore stu 4 10
(integer) 2
redis 127.0.0.1:6379> zrange stu 0 -1
1) "f"
zremrangebyrank key start end
作用: 按排名刪除元素(su),刪除名次(ci)在[start,end]之間的
redis 127.0.0.1:6379> zremrangebyrank stu 0 1
(integer) 2
redis 127.0.0.1:6379> zrange stu 0 -1
1) "c"
2) "e"
3) "f"
4) "g"
zrank key member
查(cha)詢member的排名(升(sheng)續 0名開始)
zrevrank key memeber
查(cha)詢 member的(de)排名(ming)(降續 0名(ming)開(kai)始(shi))
ZRANGE key start stop [WITHSCORES]
把集(ji)合排(pai)序(xu)后,返回名次(ci)[start,stop]的元素
默認是升續排列
Withscores 是把score也打印出來
zrevrange key start stop
作用:把集合(he)降序排(pai)列,取名字[start,stop]之間的元(yuan)素
zrangebyscore key min max [withscores] limit offset N
作用: 集合(升(sheng)續)排序后,取score在(zai)[min,max]內的元素,
并跳過 offset個(ge), 取出N個(ge)
redis 127.0.0.1:6379> zadd stu 1 a 3 b 4 c 9 e 12 f 15 g
(integer) 6
redis 127.0.0.1:6379> zrangebyscore stu 3 12 limit 1 2 withscores
1) "c"
2) "4"
3) "e"
4) "9"
zcard key
返回元素個數
zcount key min max
返回[min,max] 區間內元素的數量(liang)
zinterstore destination numkeys key1 [key2 ...]
[WEIGHTS weight [weight ...]]
[AGGREGATE SUM|MIN|MAX]
求key1,key2的交集,key1,key2的權(quan)重分別是 weight1,weight2
聚合方法用: sum |min|max
聚合(he)(he)的結(jie)果,保存在(zai)dest集合(he)(he)內
注意(yi): weights ,aggregate如何理解?
答: 如果有交集(ji), 交集(ji)元(yuan)素又(you)有socre,score怎么處理?
Aggregate sum->score相加 , min 求(qiu)最小score, max 最大score
另: 可以通過weigth設置不(bu)同(tong)key的權(quan)重, 交集時,socre * weights
詳見下例
redis 127.0.0.1:6379> zadd z1 2 a 3 b 4 c
(integer) 3
redis 127.0.0.1:6379> zadd z2 2.5 a 1 b 8 d
(integer) 3
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1
1) "b"
2) "a"
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "4"
3) "a"
4) "4.5"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate sum
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "4"
3) "a"
4) "4.5"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 aggregate min
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "1"
3) "a"
4) "2"
redis 127.0.0.1:6379> zinterstore tmp 2 z1 z2 weights 1 2
(integer) 2
redis 127.0.0.1:6379> zrange tmp 0 -1 withscores
1) "b"
2) "5"
3) "a"
4) "7"
Hash 哈希數據類型相關命令
hset key field value
作(zuo)用: 把key中 filed域的值設為value
注:如(ru)果(guo)沒有(you)field域,直接添加,如(ru)果(guo)有(you),則覆(fu)蓋原field域的(de)值
hmset key field1 value1 [field2 value2 field3 value3 ......fieldn valuen]
作用: 設置field1->N 個(ge)域, 對(dui)應(ying)的值是value1->N
(對應PHP理解為 $key = array(file1=>value1, field2=>value2 ....fieldN=>valueN))
hget key field
作用: 返回key中field域的值
hmget key field1 field2 fieldN
作用: 返回key中field1 field2 fieldN域的值
hgetall key
作(zuo)用:返回(hui)key中,所有域與其值(zhi)
hdel key field
作用: 刪除key中 field域
hlen key
作用: 返(fan)回key中元素(su)的數(shu)量
hexists key field
作用(yong): 判斷key中(zhong)有(you)沒有(you)field域
hinrby key field value
作用: 是(shi)把key中的field域的值增(zeng)長(chang)整型值value
hinrby float key field value
作用: 是把key中的field域的值增長浮點值value
hkeys key
作(zuo)用: 返回(hui)key中所有的field
kvals key
作用: 返回key中(zhong)所有的value
Redis 中的事務
Redis支(zhi)持簡單的事務
Redis與 mysql事務的對比
|
|
Mysql |
Redis |
|
開啟 |
start transaction |
muitl |
|
語句 |
普通sql |
普通命令 |
|
失敗 |
rollback 回滾 |
discard 取消 |
|
成功 |
commit |
exec |
注: rollback與discard 的區別
如果已經成(cheng)功執行了2條(tiao)語(yu)(yu)句, 第3條(tiao)語(yu)(yu)句出錯.
Rollback后,前2條的語句(ju)影響消(xiao)失.
Discard只是(shi)結束本次事務,前2條語(yu)句造成的影響仍然還(huan)在
注:
在mutil后(hou)面的(de)語(yu)句(ju)中, 語(yu)句(ju)出錯可能有2種情況
1: 語法就有問題,
這種,exec時,報錯(cuo), 所有語(yu)句(ju)得不到(dao)執(zhi)行
2: 語法本身沒錯,但適用(yong)對(dui)象(xiang)有(you)問題(ti). 比(bi)如 zadd 操作list對(dui)象(xiang)
Exec之(zhi)后,會執行正(zheng)確的語(yu)(yu)句,并跳(tiao)過有不(bu)適當的語(yu)(yu)句.
(如果zadd操作list這種事怎么避免(mian)? 這一點,由程序員負責)
思考:
我正在買票
Ticket -1 , money -100
而票(piao)只有(you)1張, 如果在我multi之(zhi)后,和(he)exec之(zhi)前(qian), 票(piao)被別人買(mai)了---即ticket變成0了.
我該如何觀察這種情景,并(bing)不再(zai)提交
悲觀的想法:
世界充滿危險,肯定有人(ren)和(he)我(wo)搶, 給 ticket上(shang)鎖, 只(zhi)有我(wo)能(neng)操作(zuo). [悲觀鎖]
樂觀的想法:
沒有(you)那么人和(he)我(wo)搶,因此,我(wo)只需(xu)要注(zhu)意,
--有沒有人(ren)更改ticket的(de)值(zhi)就可(ke)以了(le) [樂(le)觀(guan)鎖]
Redis的事務中(zhong),啟用(yong)的是樂(le)觀鎖,只(zhi)負責監(jian)測(ce)key沒(mei)有被改動.
具體的命令---- watch命令
例:
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
redis 127.0.0.1:6379> exec
(nil) // 返回(hui)nil,說(shuo)明監視的ticket已經改變了,事務(wu)就取(qu)消了.
redis 127.0.0.1:6379> get ticket
"0"
redis 127.0.0.1:6379> get money
"200"
watch key1 key2 ... keyN
作用:監聽(ting)key1 key2..keyN有沒有變(bian)化(hua),如果有變(bian), 則事務(wu)取消
unwatch
作用: 取消所(suo)有(you)watch監聽
消息訂閱
使用辦法:
訂閱端: Subscribe 頻道名稱
發布端: publish 頻(pin)道名稱 發布內容
客戶端例子:
redis 127.0.0.1:6379> subscribe news
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "news"
3) (integer) 1
1) "message"
2) "news"
3) "good good study"
1) "message"
2) "news"
3) "day day up"
服務端例子:
redis 127.0.0.1:6379> publish news 'good good study'
(integer) 1
redis 127.0.0.1:6379> publish news 'day day up'
(integer) 1
Redis持久化配置
Redis的持久化(hua)有(you)2種方式 1快(kuai)照 2是日志
Rdb快照的配(pei)置選(xuan)項
save 900 1 // 900內,有1條寫入,則產生快照(zhao)
save 300 1000 // 如(ru)果300秒內有1000次(ci)寫(xie)入(ru),則產(chan)生快(kuai)照
save 60 10000 // 如果(guo)60秒內有10000次寫入,則產生(sheng)快(kuai)照(zhao)
(這3個選項(xiang)都屏(ping)蔽,則rdb禁用)
stop-writes-on-bgsave-error yes // 后臺備份進(jin)程(cheng)出錯(cuo)時,主進(jin)程(cheng)停不(bu)停止(zhi)寫入?
rdbcompression yes // 導出的(de)rdb文件是否壓縮
Rdbchecksum yes // 導入rbd恢復時數據時,要(yao)不要(yao)檢驗rdb的完整性
dbfilename dump.rdb //導出(chu)來的rdb文件名
dir ./ //rdb的(de)放置路徑
Aof 的配置
appendonly no # 是否打(da)開 aof日志功能(neng)
appendfsync always # 每1個命令,都立即同步(bu)到aof. 安全,速度慢
appendfsync everysec # 折(zhe)衷方案,每秒寫(xie)1次
appendfsync no # 寫入(ru)(ru)工作(zuo)交(jiao)給操(cao)作(zuo)系統,由操(cao)作(zuo)系統判(pan)斷緩(huan)沖區(qu)大小,統一寫入(ru)(ru)到(dao)aof. 同(tong)步頻率(lv)低(di),速度快,
no-appendfsync-on-rewrite yes: # 正在導出rdb快照(zhao)的過程中(zhong),要不要停止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小(xiao)比(bi)起上次(ci)重(zhong)寫時(shi)的大小(xiao),增長率100%時(shi),重(zhong)寫
auto-aof-rewrite-min-size 64mb #aof文件(jian),至少超(chao)過(guo)64M時,重寫(xie)
注: 在dump rdb過程中,aof如果停止(zhi)同(tong)步,會不會丟失?
答(da): 不(bu)會,所有的操(cao)(cao)作緩存在內存的隊(dui)列里(li), dump完成后,統一操(cao)(cao)作.
注: aof重寫是指什(shen)么?
答: aof重寫(xie)是(shi)指把內(nei)存中的數據,逆(ni)化成命(ming)令,寫(xie)入到.aof日志里.
以解決(jue) aof日志過(guo)大的(de)問題.
問(wen): 如果rdb文件,和(he)aof文件都存在,優先用誰(shui)來恢復(fu)數據?
答: aof
問: 2種(zhong)是否可(ke)以同時用?
答: 可以,而且(qie)推(tui)薦這么(me)做(zuo)
問: 恢復(fu)時(shi)rdb和aof哪個恢復(fu)的快
答: rdb快,因為其是數據的內存映射,直接載入到內存,而aof是命令,需要逐條執行
redis 服務器端命令
redis 127.0.0.1:6380> time ,顯示服務器時(shi)間 , 時(shi)間戳(秒), 微秒數
1) "1375270361"
2) "504511"
redis 127.0.0.1:6380> dbsize // 當前數據庫的key的數量
(integer) 2
redis 127.0.0.1:6380> select 2
OK
redis 127.0.0.1:6380[2]> dbsize
(integer) 0
redis 127.0.0.1:6380[2]>
BGREWRITEAOF 后臺進程重寫AOF
BGSAVE 后臺保存rdb快(kuai)照
SAVE 保存rdb快(kuai)照
LASTSAVE 上(shang)次保(bao)存時間
Slaveof master-Host port , 把當前(qian)實例設為master的(de)slave
Flushall 清空所(suo)有(you)庫(ku)所(suo)有(you)鍵
Flushdb 清(qing)空當前庫所有鍵
Showdown [save/nosave]
注: 如(ru)果不小心運行了(le)flushall, 立即(ji) shutdown nosave ,關閉服務器
然后 手(shou)工(gong)編輯aof文(wen)件, 去掉文(wen)件中的 “flushall ”相關(guan)行, 然后開(kai)啟服務器,就(jiu)可(ke)以(yi)導入回原來數據.
如(ru)果(guo),flushall之后,系統恰好bgrewriteaof了,那么aof就(jiu)清空了,數據丟(diu)失.
Slowlog 顯示慢查(cha)詢
注:多慢才叫慢?
答(da): 由slowlog-log-slower-than 10000 ,來指定,(單位是微秒)
服務器儲存多(duo)少(shao)條慢查詢的記錄?
答(da): 由 slowlog-max-len 128 ,來做限制
Info [Replication/CPU/Memory..]
查看redis服務器的信(xin)息
Config get 配(pei)置(zhi)項
Config set 配置(zhi)(zhi)項 值 (特殊的(de)選項,不(bu)允許用此命(ming)令(ling)設置(zhi)(zhi),如slave-of, 需要用單(dan)獨(du)的(de)slaveof命(ming)令(ling)來設置(zhi)(zhi))
Redis運維時需要注意的參數
1: 內存
# Memory
used_memory:859192 數據結構的(de)空間(jian)
used_memory_rss:7634944 實(shi)占空間(jian)
mem_fragmentation_ratio:8.89 前2者的比例,1.N為(wei)佳,如果此(ci)值過大(da),說明redis的內存的碎片化嚴重,可以導(dao)出再導(dao)入一次.
2: 主從復制
# Replication
role:slave
master_host:192.168.1.128
master_port:6379
master_link_status:up
3:持久化
# Persistence
rdb_changes_since_last_save:0
rdb_last_save_time:1375224063
4: fork耗時
#Status
latest_fork_usec:936 上次(ci)導出rdb快照,持久(jiu)化花(hua)費(fei)微秒
注意: 如(ru)果(guo)某實例(li)有10G內容,導出需要(yao)2分鐘,
每分鐘寫入10000次(ci),導(dao)致(zhi)不斷(duan)的rdb導(dao)出,磁盤始(shi)處于高IO狀態(tai).
5: 慢日志
config get/set slowlog-log-slower-than
CONFIG get/SET slowlog-max-len
slowlog get N 獲取慢(man)日(ri)志
運(yun)行時更改master-slave
修(xiu)改一臺slave(設(she)為A)為new master
1) 命令該服務不做其他redis服務的(de)slave
命令(ling): slaveof no one
2) 修(xiu)改(gai)其readonly為yes
其他(ta)的slave再指向new master A
1) 命令(ling)該服(fu)務為(wei)new master A的slave
命令格式 slaveof IP port
監控工具 sentinel
Sentinel不斷與(yu)master通(tong)信,獲取(qu)master的slave信息.
監聽master與slave的狀態
如(ru)果某slave失效,直接通知(zhi)master去除該(gai)slave.
如果master失(shi)效,,是按照slave優先(xian)級(可配置(zhi)), 選(xuan)取1個(ge)slave做(zuo) new master
,把其他slave--> new master
疑問: sentinel與master通信,如果某次因為master IO操作頻(pin)繁,導致超時(shi),
此時(shi),認為master失效,很(hen)武斷.
解(jie)決: sentnel允許多個(ge)實例(li)看(kan)守1個(ge)master, 當N臺(N可(ke)設置)sentinel都認為master失(shi)效(xiao),才正式失(shi)效(xiao).
Sentinel選(xuan)項配置
port 26379 # 端口
sentinel monitor mymaster 127.0.0.1 6379 2 ,
給主機起的名(ming)字(不重(zhong)即可),
當2個(ge)sentinel實例都(dou)認為master失效(xiao)(xiao)時,正式失效(xiao)(xiao)
sentinel down-after-milliseconds mymaster 30000 多少毫(hao)秒(miao)后連接不到master認(ren)為斷開
sentinel can-failover mymaster yes #是否允許sentinel修改slave->master. 如為no,則只能監控,無權修改./
sentinel parallel-syncs mymaster 1 , 一(yi)次(ci)性修(xiu)改幾個slave指向新(xin)的new master.
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh ,# 在(zai)重新配(pei)置new master,new slave過程,可以觸發的腳本
