redis基礎學習
阿新 • • 發佈:2018-11-11
redis
redis的意思是Remote Dictionary Server。是一個典型的key-value的資料庫。redis經常會被拿來跟memcached作比較,但是他們之間最大區別就是memcached是記憶體中的快取,並不能持久化,而redis可以做持久化的。而且redis效能高 – 能支援超過 100K+ 每秒的讀寫頻率。並且支援的資料型別十分豐富。列表,字典,hash,集合,點陣圖。 redis的整個執行在記憶體中,但是會按照約定的方式將內容存進磁碟中。 redis是單程序單執行緒的。就像是和nginx一樣。redis十分強大,1百萬的小鍵值,大約會使用100M的記憶體。在常見的伺服器上,大體上可承受50w的併發每秒。 資料庫現主要分為3類: 1.RDBMS關係型資料庫:MySQL,Oracle,MariaDB,SQL Server。 2.NOSQL非關係型資料庫:LevelDB,Memcached,MongoDB(文件資料),Redis(其實memcached並不能完全稱為NoSQL,因為memcached不存到磁碟)
在NOSQL中,kv的NoSQL:Redis,Tair 文件的NoSQL:MongoDB
與memcached的不同
memcached是多執行緒的,redis是單執行緒的。 memcached儲存不持久,redis是支援持久儲存。持久化
剛剛提到了redis的持久化,redis的持久化有兩種方式,分別是snapshotting(快照)、AOF(Append Only File)的方式。 Snapshotting: 資料是非同步傳輸從記憶體到磁碟。 AOF: 將每一次的寫操作寫到現有的檔案後面。Redis的元件
redis-server redis的伺服器端 redis-cli redis的客戶端 redis-benchmark redis的壓測工具 redis-check-dump & redis-check-aof 檢測redis的持久化功能的。安裝Redis
redis的官方站點是redis.io(io好像是英屬印度洋領地)。目前的最新版本是3.2.8,進去直接下載就好了。點選Download,下載tar包。 或者執行命令
[[email protected] Downloads]# curl -O http://download.redis.io/releases/redis-3.2.8.tar.gz
因為現在出現的redis版本是為了支援centos的systemctl啟動指令碼的,也就是說,作業系統必須是centos7及以上的版本,
解壓,並直接make再make install。redis依賴於一個jemolloc,是一個記憶體分配器。
tar -xf redis-3.2.8.tar.gz -C /usr/local/
cd /usr/local/redis-3.2.8/
make
make install
/usr/local/redis-3.2.8/utils/install_server.sh
redis的配置檔案
[[email protected] redis]# pwd
/etc/redis
[[email protected] redis]# ls
6379.conf
redis的配置檔案內容
bind 127.0.0.1 ::1 192.168.217.17 #繫結的IP
unixsocket /tmp/redis.sock #unixsock檔案的位置
unixsocketperm 700 #unixsock的許可權。如果通過unixsock去啟動就不需要網路埠的那些tcp過程了。
save <seconds> <changes> 快照持久化的方式(snapshoting)
save 900 1 #如果900s內,有1個鍵發生了變化,會趕緊做一次快照。(效率非常低)
save "" #取消snapshoting格式的持久化。
slaveof <masterip> <masterport> 主從複製
slave-read-only yes #slave的只讀
appendonly no #啟用aof持久化功能
appendfilename "appendonly.aof"
redis的客戶端命令
redis-cli[[email protected] init.d]# redis-cli
127.0.0.1:6379>
幫助資訊
127.0.0.1:6379> help
redis-cli 3.2.5
To get help about Redis commands type:
"help @<group>" to get a list of commands in <group>
"help <command>" for help on <command>
"help <tab>" to get a list of possible help topics
"quit" to exit
To set redis-cli perferences:
":set hints" enable online hints
":set nohints" disable online hints
Set your preferences in ~/.redisclirc
使用select 1,去啟用第一個資料庫,而最多是16個。(或者說是名稱空間) 使用 help去獲得set的幫助。
127.0.0.1:6379[1]> help set
SET key value [EX seconds] [PX milliseconds] [NX|XX]
summary: Set the string value of a key
since: 1.0.0
group: string
set去設定一個鍵值對。get去獲取鍵值對。
127.0.0.1:6379> set name redhat
OK
127.0.0.1:6379> get name
"redhat"
127.0.0.1:6379> set name centos
OK
127.0.0.1:6379> get name
"centos"
實現數字的自增和自減。
127.0.0.1:6379> set count 0
OK
127.0.0.1:6379> incr count
(integer) 1
127.0.0.1:6379> incr count
(integer) 2
127.0.0.1:6379> incr count
(integer) 3
127.0.0.1:6379> incr count
(integer) 4
127.0.0.1:6379> incr count
(integer) 5
127.0.0.1:6379> decr count
(integer) 4
127.0.0.1:6379> decr count
(integer) 3
其中set命令中,最後面跟著的nx和xx。
127.0.0.1:6379> set key value [EX seconds] [PX milliseconds] [NX|XX]
nx是鍵不存在,才對鍵進行設定操作 xx是鍵存在,才對鍵進行操作設定 ex 加個秒數,是多長時間後這個鍵過期
不僅是string字串, 還有list,set,sorted set(有序集合),hash。
list的操作。 l開頭代表從左側發起操作,r開頭代表從右側發起操作。如lpush,rpush lpop 彈出,lindex 獲得key的值
127.0.0.1:6379> lpush list 1
(integer) 1
127.0.0.1:6379> lindex list 0
"1"
set的操作 sadd 新增一個key scard 獲得key的內容
redis 的認證方法
在redis 的配置檔案中的SECURITY段下加上requirepass 密碼。就需要登入認證了。 在redis 的客戶端去認證。[[email protected] redis]# redis-cli
127.0.0.1:6379> get 1
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH redis
OK
127.0.0.1:6379>
清空資料庫
flushdb 清空庫 flushall 清空所有庫redis的事務
redis是通過將一個client的所有請求連續的執行,而中間不插入其他的client的命令,來保證事務性的。 僅僅是實現了將多個請求打包成一個,序列執行。 通過multi,exec,watch等命令實現事務性。 演示一下過程。[[email protected] redis]# redis-cli
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set host1 centos
QUEUED
127.0.0.1:6379> get host1
QUEUED
127.0.0.1:6379> set host2 redhat
QUEUED
127.0.0.1:6379> get host2
QUEUED
127.0.0.1:6379> exec
1) OK
2) "centos"
3) OK
4) "redhat"
其中multi開啟事務,開啟事務後,其中的操作都不能立馬完成,而是放到佇列裡,exec就是提交事務,所有的命令會被立馬執行。 watch:樂觀鎖,在exec命令執行之前,用於監視指定數量鍵,如果監視中的某任意鍵被修改,則伺服器拒絕執行事務。 在第一終端開啟一個redis客戶端1。 此時的host1是openSUSE
127.0.0.1:6379> get host1
"opensuse"
監控host1,並開啟事務
127.0.0.1:6379> watch host1
OK
127.0.0.1:6379> multi
OK
這時第二個終端打開了,修改了host1
127.0.0.1:6379> set host1 redhat
OK
127.0.0.1:6379> get host1
"redhat"
第一個終端提交事務就是失敗的。
127.0.0.1:6379> watch host1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> exec
(nil)
127.0.0.1:6379>
這就是事務的監控特性。但是redis不支援回滾操作。
redis 的主從複製
雖然redis的讀取速度是非常快的。但是redis和MySQL一樣是有主從複製的,redis的為了解決讀壓力,也有主從結構,其中有一主多從,和級聯結構。 複製分為全量同步和增量同步。 全量同步 1).從伺服器連線主伺服器,傳送SYNC命令 2).主伺服器接收到SYNC後,開始執行bgsave命令生成rdb檔案並使用緩衝區記錄此後執行的所有寫命令。 3).主伺服器bgsave完成,向所有的從伺服器傳送快照檔案,並在傳送期間繼續記錄被執行的寫命令。 4).從伺服器收到快照檔案後丟棄所有的舊資料,載入收到的快照。 5).主伺服器快照發送完畢後開始向從伺服器傳送接收緩衝區的寫命令。 6).從伺服器完成對快照的載入,開始接收命令請求,並執行來自主伺服器的緩衝區的寫命令。增量同步 1).主伺服器每執行一條寫命令就會向從伺服器傳送相同的寫命令。從伺服器接收命令並且執行。
配置主從複製 node1主伺服器 192.168.217.17 node2從伺服器 192.168.217.16
從伺服器的操作。 [[email protected] ~]# vim /etc/redis/6379.conf
slaveof 192.168.217.17 6379
觀察主伺服器的狀態。
[[email protected] ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.217.16,port=6379,state=online,offset=71,lag=1
master_repl_offset:71
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:2
repl_backlog_histlen:70
127.0.0.1:6379>
觀察從伺服器的狀態。
[[email protected] ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.217.17
master_port:6379
master_link_status:up
master_last_io_seconds_ago:3
master_sync_in_progress:0
slave_repl_offset:99
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0
127.0.0.1:6379>
健康檢查,slave按照repl-ping-slave-period的間隔(預設是10秒),向master傳送ping。 在slave上可以看到,slave在傳送PING。
127.0.0.1:6379> MONITOR
OK
1491651464.592468 [0 192.168.217.17:6379] "PING"
1491651474.721863 [0 192.168.217.17:6379] "PING"
1491651485.674035 [0 192.168.217.17:6379] "PING"
redis的HA管理工具。
redis-sentinel能監視同期
的狀態,發現master down的時候,會進行failover,劃分slave升級為master時,
啟動後會自
動更新sentinel設定的檔案。發生failover時。會自動更改sentinel和redis的設定檔案。sentinel去監視整個主從複製叢集架構,若發現主節點掛了,sentinel之間會商量確定。並且去挑選新的主節點。實現故障轉移。
(1)伺服器自身初始化,執行redis-server的專用於sentinel
配置的環境。
master: 192.168.217.17 slave1: 192.168.217.16 slave2: 192.168.217.15
進入解壓後的原始碼包中,複製一個sentinel的模板出來。
[[email protected] redis-3.2.5]# cp sentinel.conf /etc/redis/
[[email protected] redis-3.2.5]# pwd
/usr/local/redis-3.2.5
master上的配置。編輯/etc/redis/sentinel.conf
daemmonize yes sentinel monitor mymaster 192.168.217.17 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
第二行的其中最後一個2 代表的是法定票數,票數達到2,就認為掛掉這個事件成立。 第三行5s連不上就認為其離線。 第四行剛設為新主時,允許幾個人連線 第五行故障轉移的超時時長
概念: 主觀下線:一個sentinel例項判斷出某節點下線 客觀下線:多個sentinel節點協商後判斷出節點下線
啟動sentinel [[email protected] redis]# redis-sentinel /etc/redis/sentinel.conf --sentinel
連線並觀察
[[email protected] redis]# redis-cli -p 26379
127.0.0.1:26379> INFO sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=192.168.217.17:6379,slaves=2,sentinels=1
127.0.0.1:26379>
確認master的資訊。sentinel masters
127.0.0.1:26379> sentinel masters
1) 1) "name"
2) "mymaster"
3) "ip"
4) "192.168.217.17"
5) "port"
6) "6379"
7) "runid"
...
確認兩個slave的狀態 sentinel slaves mymasters
127.0.0.1:26379> sentinel slaves mymaster
1) 1) "name"
2) "192.168.217.16:6379"
3) "ip"
4) "192.168.217.16"
...
2) 1) "name"
2) "192.168.217.15:6379"
3) "ip"
4) "192.168.217.15"
...
sentinel哨兵放在主節點上就好,也可以專門是幾臺主機去監控整個叢集。
[[email protected] redis-3.2.5]# redis-server /etc/redis/sentinel.conf --sentinel
檢視程序
[[email protected] ~]# ps aux |grep redis
root 1324 0.1 0.4 133524 2352 ? Ssl 01:31 0:02 /usr/local/bin/redis-server *:6379
root 1354 0.3 0.4 133528 2236 ? Ssl 01:57 0:00 redis-server *:26379 [sentinel]
停止master。
127.0.0.1:26379> SHUTDOWN
not connected>
主從切換