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)
- "subscribe"
- "fm5200"
- "message"
- "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