2018年3月29日 星期四

用戶端 (Redis 五)

官網連結
可以看到有非常多的用戶端,以 node.js 的 node_redis 和 java 的 jedis 2.9.0為例


※Node.js


dnf install nodejs -- 安裝 nodejs
npm install redis -- 安裝 redis

vi nodeRedis --產生並編輯一個空檔案,內容如下:

※nodeRedis

var redis = require("redis"),
client = redis.createClient();
    
client.set("xxx1", "x1");
console.log("yeah");

※必須先開啟伺服器才行



※Java


Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println(jedis.ping());
jedis.set("k4", "'");
System.out.println(jedis.get("k4"));
jedis.close();

※也有類似連線池的功能,API

JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
jedisPoolConfig.setMaxTotal(10);
try (
        JedisPool pool = new JedisPool(jedisPoolConfig, "localhost"); 
        Jedis jedis = pool.getResource();
    ) {
    jedis.set("k4", "v4");
} catch (Exception e) {
    e.printStackTrace();
}
// pool.close();
// jedis.close();

※可以看出三層關係,redis.clients.jedis.JedisPoolConfig
extends org.apache.commons.pool2.impl.GenericObjectPoolConfig
extends org.apache.commons.pool2.impl.extends BaseObjectPoolConfig

※由於 JedisPool 和 Jedis 都有繼承 AutoCloseable,所以使用 try 的圓括號會自動關閉

參考
http://webcache.googleusercontent.com/search?q=cache:sFi0y--GsrMJ:bijian1013.iteye.com/blog/2100714+&cd=1&hl=zh-TW&ct=clnk&gl=ph

安裝 (nginx 一)

官網
此篇以 1.12.2 穩定版為主

※Linux (Fedora)

※安裝

pcre  pcre-devel 正則
zlib  zlib-devel

dnf install pcre
要有 root 權限才能安裝

tar -zxvf *.tar.gz
解壓完進去目錄做三步
1../configure 會產生一個檔案和一個資料夾,Makefile 和 objs
預設會安裝到 /usr/local/nginx,想改可用 --prefix 路徑

2.make,如果有失敗要再來一次,有可能會使用到 make distclean
3.make install

※操作

安裝完後在/usr/local/nginx 有很多東西,以後都要在這操作
/usr/local/nginx/sbin/ 有 nginx
.啟動 ./nginx,啟動後,預設會在 /usr/local/nginx/sbin/logs/ 生成 nginx.pid 檔案,裡面記錄 master pid,想改可在 /usr/local/nginx/conf/nginx.conf 修改
.關閉 ./nginx -s quit,nginx.pid 會刪除

-s 後可加的指令:
stop 關閉,不會等 session 離開
quit 關閉,會等 session 離開
reload 不用重啟就可以讀到新的設定檔 nginx.conf
reopen 重新打開 log 檔

信號:

TERM、INT 相當於 -s stop
QUIT 相當於 -s quit
HUP 相當於 -s reload
USR1 相當於 -s reopen
以下兩個 -s 沒有
USR2 升級 nginx 使用
WINCH 升級後關才舊的 worker process

例:
kill -INT(TERM) master process 的pid號
kill -INT 26666
ps -aux |grep nginx 可查到 pid 號

USR1的用法:假設一直有資料寫進 access.log
如果將 access.log 改名,還是會寫入
必需使用 kill -USR1 PID號

不想看 pid 可用如下的方法
cat logs/nignx.pid 裡面已經記錄了 pid 號
所以可用 kill -USR1 `cat logs/nignx.pid`



※Windows

和 linux 很不一樣,所有的東西都在解壓後的資料夾裡

※查看 pid

滑鼠:
執行打 taskmgr (在最下面按右鍵 --> 工作管理員) --> detail

指令:
1-1.tasklist |findstr /i nginx  :/i為忽略大小寫
1-2.tasklist |find /i "nginx"
2.tskill pid號

※必需先刪除 master pid 才能刪 worker pid,否則 worker pid 會自動生成其他的 pid號,通常 master pid 的容量比較小,要正確的就看 logs\nginx.pid

※沒有 linux 的信號功能

2018年3月24日 星期六

複製、硝兵模式 Redis (四)

※複製

好幾台 redis 伺服器,有階級的關係,分成 master 和 slave,slave 下面還可以有 slave

以下創建四個伺服器,關係如下:

將 redis.conf 複製 4 個,然後修改,分別設定不同的 port
###NETWORK###
port 6379~6382

###GENERAL###
daemonize yes
pidfile /var/run/redis_6380.pid
#logfile "6380.log"


###SNAPSHOTTING###
dbfilename dump6380.rdb


port 6381 比其他 port 多做以下的設定
###REPLICATION###
slaveof 127.0.0.1 6379




1.6381 一啟動伺服器會直接是 6379 的 slave,其他必需做 slaveof 的動作才可以




2.還沒下 slaveof 之前,如果 master 已有一些資料,slaveof 之後,連 master 之前的也能取
但如果 slave 本來在 slaveof 之前已有的資料,slaveof 之後會不見,也就是會被 master 整體覆蓋


3.slave 只能讀不能寫,6380是 master,也是 slave,但 info  replication 時,還是顯示 slave,所以也不能寫

4.master 掛掉後,slave還是有值。master 回來後,一切照舊

5.slave掛掉又回來後會變成master,必需重新用 slaveof,除非有在 redis.conf 設定 (如6381)

6.slaveof no one 命令:如果 master 掛了,可以下這個指令,可以變成 master
如 6380 下這個指令會變成 master,脫離了 master,當然值還是存在
此時 6381 還是乖乖的在等 master,可以再 6381 使用 slaveof 連到新的 master (6380)
這時候 6380 有 6381 和 6382
6379 回來後(還是 master),和 6380~6382 一點關係也沒有了



※硝兵模式

master 掛了之後會自動選出新的 master,不用下 slaveof no one

需設定 sentinel.conf
格式:sentinel monitor 被監控的 master 名稱 IP port 超過多少票就是 master
sentinel monitor xxx 127.0.0.1 6379 1
xxx 掛了,誰的票超過1票,就會變成master

redis-sentinel sentinel.conf

master掛了之後,要等約 30 秒左右才會選出新的 master

舊 master 回來後,一開始是 master,過了幾秒後會變 slave

2018年3月22日 星期四

redis 設定檔、事務 Redis (三)

※redis.conf 設定檔

有神人翻譯好了
在伺服器執行期間可用
config set
config get
動態更改設定內容,但伺服器關閉並不會寫回設定檔



※事務

multi:啟動事務
exec:執行事務
discard:放棄事務
從 multi~exec 或 multi~discard 為一個事務

以下兩個命令必需在 multi 之前
watch:監視 1~多個 key,被監視的 key 若被改變,執行 exec 時不會成功
unwatch:放棄監視所有 key

※使用 SCRIPT 也能做到事務的功能,所以未來有可能會將事務移除
官網 script 連結
中文 script 連結

順利的事務:


執行 exec 不是 nil 時,就是順利的事務


放棄事務:


放棄了事務,所以 xxx 和 ooo 並沒有設定成功


編譯錯誤的事務:


編譯錯誤會整體回退,所以在這個事務裡面的操作都不會成功
fjasdf 並不是正常的命令,算編譯錯誤
又假如 set 命令的格式是 set key value,假設只有打 set key,並沒有打 value,也算是編譯錯誤


執行期錯誤的事務:


k1 並不是數字,但要到執行期才會知道,此時不會整體回退,


順利監視的事務:


如果順利,那有沒有加 watch 的結果都是一樣的


unwatch:


在 watch 之後,還沒下 multi,值就被改了(就算值改成一樣也算改),執行到 exec 時,回傳 nil,表示失敗了

此時要 unwatch 後再重新操作一次,由於已經執行過 exec,所以再操作一次時,還是要下 multi

如果再操作一次途中,值又被改了,當然也不會成功,必需一直反覆執行這個動作或放棄事務

2018年3月15日 星期四

五大類型指令 (Redis 二)

五種型態為:string、list、set、zset、hash,上一篇已經有寫 string了,這篇寫另外四種,可用type key名稱查是什麼型態


※list

可重覆的隊列


增、改:

lpush(left push):從左邊開始塞值,越先塞的會被擠到右邊,重覆下指令會 append
rpush(right push):和 lpush 一樣,差別是從右邊往左邊塞值
lpushx(exists)、rpushx:只有 key 存在才會 push 成功,也就是 key 至少要有一個元素

linsert:在指定的 value 之前或之後插入想加入的值
    linsert key名稱 [before|after] 已有的值 想插入的值:在已有的值前或後增加想插入的值,但      如果有多個已有的值,只會插入第一個
    linsert key before xxx ooo:在 xxx 前面插入 ooo

lset :覆蓋指定的index
假設有個 list 內容是 a b c d e,下 lset list 3 xxx,那 list 內容會變成 a b c xxx e



lpush示例:


rpush示例:



刪:

lrem(left remove):刪除元素
    格式:lrem key名稱 count 刪除內容
    .count > 0 從左到右刪除幾個最右邊參數的內容
    .count < 0 從右到左刪除幾個最右邊參數的內容
    .count = 0 將最右邊參數的內容全部刪除
ltrim:保留一個連續範圍,其他全部刪除,由0開始,-1表示倒數第一個,-2表示倒數第二個,依此類推


查:

llen(left length):查有幾個元素
lindex(left index):查第幾個元素的值
lrange:由0開始,-1表示倒數第一個,-2表示倒數第二個,依此類推
rlen、rrem、rindex、rrange、rtrim:哈哈哈!唬弄你的,並沒有這些命令


刪+查:

lpop:取得最左邊的值後刪除
rpop:取得最右邊的值後刪除

blpop:和 lpop 很像,當沒有值可 pop 時,會阻塞住,直到有值返回或 timeout
    blpop key… timeout 時間(秒)
brpop:blpop 的相反


刪+增:

rpoplpush:將最右邊的值彈出插入到另一個 list(自己也行),然後刪除最右邊的值








※set

裡面的成員不可重覆


增、改:

sadd:增加、附加成員


刪:

srem:刪除一到多個成員


查:

smembers:查看所有成員
sismember:給一個 value,回傳是否是裡面的成員
scard:查看有多少成員

srandmember:隨機出現一個元素
    但如果有加參數,就會顯示多少個,但不會重覆
    又如果數字超過成員的數,還是只會顯示成員的總數

差集、交集、併集

    sadd set1 a b c d e
    sadd set2 c d e f g
    sadd set3 b c d e f

.sdiff:差集,返回的是第一個 key 剩下的部分
    sdiff set1 set2,返回隨機的 a b
    sdiff set2 set1,返回隨機的 f g
    sdiff set1 set2 set3,返回 a
.sinter:交集。返回相同的部分
    sinter set1 set2,返回隨機的 c d e
    sinter set1 set2 set3,還是返回隨機的 c d e
.sunion:併集,全部成員都有,但會去掉重覆的部分
    sunion set1 set2,返回隨機的 a b c d e f g

sdiffstore、sinterstore、sunionstore,這三個都是在最後加上「store」,前面沒加 store 只是返回,加上 store 後,可以儲存在新的 set,此 key 可以不存在,存在就覆蓋
sdiffstore xxx set1 set2,將 set1 set2 的差集結果,存到 xxx 這個 key


刪+查:

spop:返回並刪除隨機一到多個數


刪+增:

smove 將 key1 裡的成類數數移動到 key2 裡的成員數值
    smove key1 key2 成員數值



※hash

Key、Value 鍵值對


增、改:

hset:塞一個鍵值對
hmset:塞多個鍵值對
hsetnx:key沒有才能塞進去
hincrby:增加整數,可為負數
hincrbyfloat:增加整數、小數,可為負數


刪:

hdel:刪除一到多個鍵


查:

hget:取一個鍵值對
hmget:取多個鍵值對
hgetall:取得 key 裡的所有鍵值對
hkeys:取得 key 裡的所有鍵
hvals:取得 key 裡的所有值
hlen:取得 key 裡有多少鍵值對
hstrlen:取得 key 裡的鍵,對應鍵的值有多長
hexists:判斷 key 裡有沒有給定的鍵


※sotedset

set 加上一個數字,可以利用此數字由小到大排序,這個數字的名字叫 score


增、改:

zadd:新增、附加一到多個成員,score 可以是負數
    xx:只能修改,注意回傳值,預設是新增成功的數量,加 ch 才看的出來
    nx:只能新增
    incr:增加 score,可以是負數
    ch:變化在返回值,不加時回傳的是新增的數量;加了是更改的數量
zincrby:增加、減少某個 key 的 score,可用小數點,但有可能不夠精確
    如果沒有 key 會自動增加 key
    如果 key 裡沒有對應的值,會新增


刪:

zrem:移除一到多個成員
zremrangebyscore:移除 score 的範圍
zremrangebyrank:移除 index 的範圍


查:

zrange[withscores]:查看元素,加上 withscores 會顯示 score
zrevrange:zrange 的倒序
zrank:給某個成員值,取得它的 index
zrevrank:zrank 的倒序
zscore:查看某個成員的 score
zcard:查看有多少成員
zcount:查看某 score 範圍的成員個數
zrangebyscore:依 score 由小到大排序
    zrangebyscore key -10 5,表示 score 從 -10 到 5
    zrangebyscore key (-10 5,表示 score 從 -10 到 5,但不包括 -10,「(」有不等於的意思
    zrangebyscore key -inf +inf,因為有時想從小到大全部列出來,不想寫範圍,可以用這個

上面的結果有一個全新的資料後,還可以再截取,使用 limit
    zrangebyscore key -10 5 limit 2 4,表示 score 從 -10 到 5 出來的結果,然後再從新的結果取index 為 2 開始的數字開始取 4 個

zrevrangebyscore:反向的 zrangebyscore

2018年3月14日 星期三

安裝、簡易設定、常用的基本指令 (Redis 一)

官網好心人翻譯官網的網站

Linux下載與安裝:


$ wget http://download.redis.io/releases/redis-4.0.8.tar.gz
$ tar -zxvf redis-4.0.8.tar.gz
$ cd redis-4.0.8
$ make

# yum install gcc --這行官網沒有,有可能在安裝時會出錯,假設是 gcc 這個程式找不到,可以用類似這樣的方法取得,gcc 是 C 語言的諞譯器

$ make distclean --此行是之前 make 失敗後,再一次 make 有可能會失敗,可加此行再 make
$ make
$ cd src
$ ./redis-server [設定檔路徑,預設為redis目錄下的 redis.conf]
$ ./redis-cli,redis用戶端
出現redis>表示成功

shutdown可關閉redis-server
exit 或 quit 可關閉redis-cli
help 查格式、簡單的說明
  .help 指令名稱,如 help set
  .help @群組名稱,如 help @list
  .打上「help空格」這五個鍵後按 tab,會有 以上兩個用法的提示,先是群組,這個版本有 14個,最後是命令和其他,有214個
ps -e |grep redis 可查看是否啟動



※Windows 下載









懶的進官網,就點我吧!
一樣有以上兩支程式,但設定檔有兩個很像,但我設背景執行都沒用,使用 windows 內鍵的 start redis-server 也只是會多出一個 cmd 而已



※不想裝環境

其實官網有提供,到下載頁的最下方,如下操作



懶的連官網,就點我吧!
可在紅框輸入指令



設定檔:


### GENERAL ###
daemonize 改為 yes 可以在背景執行,改完後,會在/var/run/redis.pid 這個檔案寫 pid
也可用 linux 內鍵的「&」,但不曉得有沒有 pid

logfile 預設沒有寫,所以是空的,加檔案名稱就會將伺服器啟動的資訊寫在裡面,當然還得看層級


dump.rdb

操作的記錄會在這裡,假設在路徑 redis-4.0.8 資料夾執行./src/redis-server,那會存在 redis-4.0.8下;又假設是在 src 資料夾執行 ./redis-server,那會存在 src 下,下次重啟 redis 時,會找當前目錄下的 dump.rdb ,如果沒有,那之前的東西就沒有保存下來了,就會是預設什麼都沒有的情形

在 redis.conf 的 ###SNAPSHOTTING###
預設有三行
save 900 1
save 300 10
save 60 10000
分別表示 900 秒(15分鐘)之內有執行1次操作以上
300秒(5分鐘)之內執行10次操作以上
60秒內執行1萬次操作以上
只要符合這樣的條件,就會自動存檔

在離開時 shutdown 也會存檔
如果在伺服器開啟的狀態下刪這個檔,用戶還是取的到,重啟伺服器才會沒有,但因為離開下 shutdown 會存檔,可以用 shutdown nosave 指令,這樣就沒有了


執行:

到src下,執行 ./redis-server ../redis.conf 啟動伺服器
./redis-cli 啟動用戶端,出現「>」提示符號,表示可以下指令了



常用的基本指令:

clear:清除螢幕
ping:測試有沒有連到伺服器,回傳 PONG
get:取得一個 key
set:設定一個 key
mget:取得多個key
mset:設定多個key
del:刪除某個 key
keys *:列出全部的key,可用「?、*」,如 a*,表示顯示 a 開頭的
dbsize:查詢當前資料庫有幾個 key
select index:選第幾個資料庫,預設是0,預設有16 個資料庫(0~15),在### GENERAL ### 有
    想知道目前第幾個庫,可看「>」前面的方括號,如果沒有方括號就是第 0 號庫
databases 可設定
flushall:清除全部資料庫的 key
flushdb:清除當前資料庫的 key
exists:回傳 1 表示存存;0 不存在
type:回傳值有 6 種,none、string、list、set、zset、hash,數字屬於 string
append:附加到原本的key後面,如果此 key 沒有,那就和 set 一樣
strlen:返回字串長度
getset:在 set 之前會先回傳舊的值,沒有舊值回傳 nil,set 還是會成功
    getset key1 xxx,假設 key1 還沒有創建,那會回傳 nil
    此時 get key1 會回傳 xxx
    getset key1 ooo,回傳 xxx,並塞新值 ooo
    再次 get key1 會回傳 ooo
setrange:將字串的第幾個字取代
    假設 key 的內容為 abcde
    setrange key 2 z
    get key 返回的是 abzde
    setrange key 2 xxx
    get key 返回的是 abxxx,並不會延長,而是將原本的 index 覆蓋
getrange:取得子字串,不會影響原來的字串
shutdown:關閉 redis 伺服器
exit:關閉redis 用戶端


※注意 key 如果已經有了會被覆蓋

※可以設定空格,但必需用成對的「"」或「'」包起來,這兩個符號不會被寫進去,可用 strlen 指令查看,但如果要輸入「"」或「'」,感覺上跳脫字元是「\」,但就是失敗
但使用 java 的 jedis 都可以寫入,但「"」使用 redis 看時是「\"」,長度是 1

中文使用 UTF-8 編碼,中文的一就是 E4B880,每兩個前面會用\x,變成 \xe4\xb8\x80





※加減

加減都只能設定成數字時才能使用
INCR:加 1
INCRBY:INCR只能加 1,這個指令可以加很多,但只能是整數;負數也行,負數變減
INCRBYFLOAT:加減整數、小數都可以
DECR:減1
DECRBY:DECR只能減 1,這個指令可以減很多,但只能是整數;負數也行,負數變加
.沒有DECRBYFLOAT,使用 INCRBYFLOAT 就無敵了



※SET參數

SET 有參數 [EX|PX] [NX|XX]
EX(expire):過了幾秒即失效,也可用 SETEX 指令
PX:過了幾毫秒即失效,也可用 PSETEX 指令
NX(not exist):如果 key 不存在才能設定,也可用 SETNX 指令
XX(exist):如果 key 存在才能設定
.NX 和 XX只能選其一
.官網的 EX 和 PX 沒有說只能選其一,但我試的結果就是會出錯,可能是版本問題吧,這裡是用4.0.8
但 EX 和 PX 可設定多個,結果是後者蓋前者
.沒有SETXX指令
.SETNX、SETEX、PSETEX 這三個命令,因為 SET 能做到相同的功能,所以未來的版本有可能會將其廢棄,最後移除


EXPIRE、PEXPIRE、PERSIST

.假如 SET 時忘記加失效時間,可用這個指令
.EXPIRE 設定的是秒;PEXPIRE 設定的是毫秒
.假設有了失效時間,但想讓它變成永久有效,可用 PERSIST 指令


TTL(time to live)、PTTL

key 的生存時間
.設定了 EX PX,可以使用這個指令看剩多少時間
.如果這個key是無時間限制的(或者說沒設定失效時間),會回傳-1,也就是永不失效
.如果沒有這個key,會回傳-2
.所以假設 set k1 v1 ex 5
get k1,隨著時間減一秒,會出現 5 4 3 2 1 0 -2
而假如有個key已經有了且沒有設定失效時間,那會回傳-1
.TTL回傳秒;PTTL 回傳的是毫秒