中文字幕精品亚洲无线码二区,国产黄a三级三级三级看三级,亚洲七七久久桃花影院,丰满少妇被猛烈进入,国产小视频在线观看网站

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列表                 &nbsp; &nbsp;         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相加 &nbsp; , 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理解為&nbsp; $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) &nbsp; // 返回(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&gt; 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 &nbsp; // 如(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 &nbsp;  // 導出的(de)rdb文件是否壓縮

Rdbchecksum   yes //  導入rbd恢復時數據時,要(yao)不要(yao)檢驗rdb的完整性

dbfilename dump.rdb  //導出(chu)來的rdb文件名

dir ./  //rdb的(de)放置路徑

 

 

 

Aof 的配置

appendonly no # 是否打(da)開 aof日志功能(neng)

 

appendfsync always &nbsp; # 每1個命令,都立即同步(bu)到aof. 安全,速度慢

appendfsync everysec # 折(zhe)衷方案,每秒寫(xie)1次

appendfsync no    &nbsp; # 寫入(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&nbsp;      后臺保存rdb快(kuai)照

SAVE       &nbsp; 保存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&nbsp; 多少毫(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過程,可以觸發的腳本

posted @ 2018-12-04 22:11  掃地僧2015  閱讀(301)  評論(0)    收藏  舉報