天天看點

Redis學習筆記

redis安裝

# mkdir -p /data/soft

# mkdir -p /data/redis_cluster/redis_6379

# cd soft/

# wget

http://download.redis.io/releases/redis-3.2.12.tar.gz

# mkdir -p /opt/redis_cluster/redis_6379/{conf,logs,pid}

#  tar zxf redis-3.2.12.tar.gz -C /opt/redis_cluster/

# 建立軟連接配接

# ln -s redis-3.2.12 redis

[root@666 utils]# ./install_server.sh

運作這個腳本生成官方配置檔案

[root@666 conf]# pwd

/opt/redis_cluster/redis_6379/conf

[root@666 conf]# vim redis_6379.conf

### 以守護程序模式啟動

daemonize yes

### 綁定主機位址

bind 192.168.200.30

### 監聽端口

port 6379

### pid檔案和log檔案的儲存位址

pidfile /opt/redis_cluster/redis_6379/pid/redis_6379.pid

logfile /opt/redis_cluster/redis_6379/logs/redis_6379.log

### 設定資料庫數量,預設資料庫為0

databases 16

### 指定本地持久化檔案的檔案名,預設是dump.rdb

dbfilename redis_6379.rdb

### 本地資料庫的目錄

dir /opt/redis_cluster/redis_6379

密碼

requirepass 123456

redis-cli -a 123456

啟動redis

# redis-server /opt/redis_cluster/redis_6379/conf/redis_6379.conf

# redis-cli

關閉

redis-cli -h 127.0.0.1 shutdown

192.168.200.30:6379> set k1 v1

OK

192.168.200.30:6379> keys *

1) "k1"

192.168.200.30:6379> get k1

"v1"

192.168.200.30:6379>

192.168.200.30:6379> MSET k1 v1 k2 v2 k3 v3 k4 v4 k5 v5

192.168.200.30:6379> get k3

"v3"

192.168.200.30:6379> MGET k1 k2 k3 k4 k5

1) "v1"

2) "v2"

3) "v3"

4) "v4"

5) "v5"

檢視是否存在

192.168.200.30:6379> EXISTS k2

删除

192.168.200.30:6379> DEL k1

過期時間

EXPIRE K1 10

TTL k1

-1 永不過期

-2 沒有這個key

數字

解除過期時間

PERSIST k2

清單

192.168.200.30:6379> RPUSH list1 1

(integer) 1

192.168.200.30:6379> type list1

list

192.168.200.30:6379> LPUSH list1 kang

(integer) 2

清單長度

192.168.200.30:6379> LLEN list1

192.168.200.30:6379> LRANGE list1 0 -1

1) "kang"

2) "1"

192.168.200.30:6379> LRANGE list1 1 1

1) "1"

右删除

192.168.200.30:6379> RPOP list1

"1"

192.168.200.30:6379> LPUSH list1 1 2 3 4 5 6 7

(integer) 9

左删除

192.168.200.30:6379> LPOP list1

"7"

哈希

192.168.200.30:6379> HMSET student:cloud-computing name kang age 22 job it

192.168.200.30:6379> HMGET student:cloud-computing name

192.168.200.30:6379> HGETALL student:cloud-computing

1) "name"

2) "kang"

3) "age"

4) "22"

5) "job"

6) "it"

集合

192.168.200.30:6379> SADD set1 1 3 5 7 9

(integer) 5

192.168.200.30:6379> SADD set2 2 4 6 8 10

192.168.200.30:6379> SMEMBERS set1

2) "3"

3) "5"

4) "7"

5) "9"

6) "13579"

# 以前面的為标準

192.168.200.30:6379> SDIFF set1 set2

交集

192.168.200.30:6379> SINTER set1 set2

1) "2"

192.168.200.30:6379> sadd lxl pg1 baoqiang alexsbb lidao

(integer) 4

192.168.200.30:6379> sadd jn1 baoqiang qianghe hedao bingbing

并集

192.168.200.30:6379> SUNION lxl jn1

1) "qianghe"

2) "lidao"

3) "bingbing"

4) "baoqiang"

5) "hedao"

6) "alexsbb"

7) "pg1"

Redis持久化

RDB AOF

192.168.200.30:6379> BGSAVE

Background saving started

192.168.200.30:6379> quit

[root@666 redis_6379]# ll

total 28

-rw-r--r--. 1 root root 25869 Oct 19 02:24 redis_6379.rdb

[root@666 redis_6379]#

dir /data/redis_cluster/redis_6379

save 900 1

save 300 10

save 60 10000

執行shutdown預設儲存了一次

vi /opt/redis_cluster/redis_6379/conf/redis_6379.conf

#是否打開aof日志功能

appendonly yes

# 每一個都立即同步到aof

appendfsync always

#每秒寫一次

appendfsync everysec

#寫入工作交給作業系統,由作業系統判斷緩沖區大小,統一寫入到aof

appendfsync no

appendfilename "appendonly.aof"

兩個檔案都存在,aof起作用

配置檔案線上修改

CONFIG GET *

等等

SortedSet(有序集合)

應用場景:

排行榜應用,取TOP N操作

這個需求與上面需求的不同之處在于,前面操作以時間為權重,這個是以某個條件為權重,比如按頂的次數排序,

這時候就需要我們的sorted set出馬了,将你要排序的值設定成sorted set的score,将具體的資料設定成相應的value,

每次隻需要執行一條ZADD指令即可。

127.0.0.1:6379> zadd topN 0 smlt 0 fskl 0 fshkl 0 lzlsfs 0 wdhbx 0 wxg 

(integer) 6

127.0.0.1:6379> ZINCRBY topN 100000 smlt

"100000"

127.0.0.1:6379> ZINCRBY topN 10000 fskl

"10000"

127.0.0.1:6379> ZINCRBY topN 1000000 fshkl

"1000000"

127.0.0.1:6379> ZINCRBY topN 100 lzlsfs

"100"

127.0.0.1:6379> ZINCRBY topN 10 wdhbx

"10"

127.0.0.1:6379> ZINCRBY topN 100000000 wxg

"100000000"

127.0.0.1:6379> ZREVRANGE topN 0 2 

1) "wxg"

2) "fshkl"

3) "smlt"

127.0.0.1:6379> ZREVRANGE topN 0 2 withscores

2) "100000000"

3) "fshkl"

4) "1000000"

5) "smlt"

6) "100000"

127.0.0.1:6379> 

zadd myzset 2 "two" 3 "three"       添加兩個分數分别是 2 和 3 的兩個成員

zrem myzset one two                 删除多個成員變量,傳回删除的數量

zincrby myzset 2 one                将成員 one 的分數增加 2,并傳回該成員更新後的分數

查 

zrange myzset 0 -1 WITHSCORES       傳回所有成員和分數,不加WITHSCORES,隻傳回成員

zrank myzset one                    擷取成員one在Sorted-Set中的位置索引值。0表示第一個位置

zcard myzset                        擷取 myzset 鍵中成員的數量

zcount myzset 1 2                   擷取分數滿足表達式 1 <= score <= 2 的成員的數量

zscore myzset three                 擷取成員 three 的分數

zrangebyscore myzset  1 2               擷取分數滿足表達式 1 < score <= 2 的成員

#-inf 表示第一個成員,+inf最後一個成員

#limit限制關鍵字

#2  3  是索引号

zrangebyscore myzset -inf +inf limit 2 3  傳回索引是2和3的成員

zremrangebyscore myzset 1 2         删除分數 1<= score <= 2 的成員,并傳回實際删除的數量

zremrangebyrank myzset 0 1              删除位置索引滿足表達式 0 <= rank <= 1 的成員

zrevrange myzset 0 -1 WITHSCORES        按位置索引從高到低,擷取所有成員和分數

#原始成員:位置索引從小到大

      one  0  

      two  1

#執行順序:把索引反轉

      位置索引:從大到小

      one 1

      two 0

#輸出結果: two  

       one

zrevrange myzset 1 3                擷取位置索引,為1,2,3的成員

#相反的順序:從高到低的順序

zrevrangebyscore myzset 3 0             擷取分數 3>=score>=0的成員并以相反的順序輸出

zrevrangebyscore myzset 4 0 limit 1 2    擷取索引是1和2的成員,并反轉位置索引

釋出訂閱

192.168.200.30:6379> PUBLISH fm5200 hello(integer) 1192.168.200.30:6379>

192.168.200.30:6379> SUBSCRIBE fm5200Reading messages... (press Ctrl-C to quit)

  1. "subscribe"
  2. "fm5200"
  3. "message"
  4. "hello"

redis事務

redis的事務是基于隊列實作的。

mysql的事務是基于事務日志和鎖機制實作的。

redis是樂觀鎖機制。

開啟事務功能時(multi)

multi 

command1      

command2

command3

command4

exec 

discard

4條語句作為一個組,并沒有真正執行,而是被放入同一隊列中。

如果,這是執行discard,會直接丢棄隊列中所有的指令,而不是做復原。

exec

當執行exec時,對列中所有操作,要麼全成功要麼全失敗

127.0.0.1:6379> set a b

127.0.0.1:6379> MULTI

QUEUED

127.0.0.1:6379> set c d

127.0.0.1:6379> exec

1) OK

2) OK

9. redis樂觀鎖實作(模拟買票)

釋出一張票

set ticket 1

視窗1:

watch ticket

multi

set ticket 0       1---->0

視窗2:

set ticket 0 

10、 伺服器管理指令

Info

Client list

Client kill ip:port

config get *

CONFIG RESETSTAT 重置統計

CONFIG GET/SET 動态修改

Dbsize

FLUSHALL 清空所有資料 

select 1

FLUSHDB 清空目前庫

MONITOR 監控實時指令

SHUTDOWN 關閉伺服器

關閉資料庫:

redis-cli -a root shutdown

redis主從

redis(Master-Replicaset) *

原理:

1. 副本庫通過slaveof 10.0.0.51 6379指令,連接配接主庫,并發送SYNC給主庫 

2. 主庫收到SYNC,會立即觸發BGSAVE,背景儲存RDB,發送給副本庫

3. 副本庫接收後會應用RDB快照

4. 主庫會陸續将中間産生的新的操作,儲存并發送給副本庫

5. 到此,我們主複制集就正常工作了

6. 再此以後,主庫隻要發生新的操作,都會以指令傳播的形式自動發送給副本庫.

7. 所有複制相關資訊,從info資訊中都可以查到.即使重新開機任何節點,他的主從關系依然都在.

8. 如果發生主從關系斷開時,從庫資料沒有任何損壞,在下次重連之後,從庫發送PSYNC給主庫

9. 主庫隻會将從庫缺失部分的資料同步給從庫應用,達到快速恢複主從的目的

主從資料一緻性保證

min-slaves-to-write 1

min-slaves-max-lag  3

主庫是否要開啟持久化?

如果不開有可能,主庫重新開機操作,造成所有主從資料丢失!

主從複制實作

1、環境:

準備兩個或兩個以上redis執行個體

mkdir /data/638{0..2}

配置檔案示例:

cat >> /data/6380/redis.conf <<EOF

port 6380

pidfile /data/6380/redis.pid

loglevel notice

logfile "/data/6380/redis.log"

dbfilename dump.rdb

dir /data/6380

requirepass 123

masterauth 123

EOF

cat >>   /data/6381/redis.conf <<EOF

port 6381

pidfile /data/6381/redis.pid

logfile "/data/6381/redis.log"

dir /data/6381

cat >>   /data/6382/redis.conf <<EOF

port 6382

pidfile /data/6382/redis.pid

logfile "/data/6382/redis.log"

dir /data/6382

啟動:

redis-server /data/6380/redis.conf

redis-server /data/6381/redis.conf

redis-server /data/6382/redis.conf

主節點:6380

從節點:6381、6382

2、開啟主從:

6381/6382指令行:

redis-cli -p 6381 -a 123 SLAVEOF 127.0.0.1 6380

redis-cli -p 6382 -a 123 SLAVEOF 127.0.0.1 6380

3、查詢主從狀态

 redis-cli -p 6380 -a 123 info replication

 redis-cli -p 6381 -a 123 info replication

 redis-cli -p 6382 -a 123 info replication

繼續閱讀