redis是什麼:php
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.mysql
redis是開源,BSD許可,高級的key-value存儲系統.git
能夠用來存儲字符串,哈希結構,鏈表,集合,所以,經常使用來提供數據結構服務.github
redis和memcached相比,的獨特之處:redis
1: redis能夠用來作存儲(storge), 而memccached是用來作緩存(cache)sql
這個特色主要由於其有」持久化」的功能.數據庫
2: 存儲的數據有」結構」,對於memcached來講,存儲的數據,只有1種類型--」字符串」,緩存
而redis則能夠存儲字符串,鏈表,哈希結構,集合,有序集合.安全
Redis下載安裝:服務器
下載源碼包:wget http://download.redis.io/releases/redis-3.2.8.tar.gz
解壓:tar zxvf redis-3.2.8.tar.gz
不用config,直接Make
安裝到指定目錄:好比/usr/local/redis
make PREFIX=/usr/local/redis install
注: PREFIX要大寫
make install以後,獲得以下幾個文件
redis-benchmark 性能測試工具
redis-check-aof 日誌文件檢測工(好比斷電形成日誌損壞,能夠檢測並修復)
redis-check-dump 快照文件檢測工具,效果類上
redis-cli 客戶端
redis-server 服務端
複製配置文件
Cp /usr/local/src/redis-3.2.8/redis.conf /usr/local/redis
啓動與鏈接
/usr/local/redis/bin/redis-server ./usr/local/redis.conf
客戶端鏈接redis:
鏈接: 用redis-cli
#/usr/local/redis/bin/redis-cli [-h localhost -p 6379 ] 指定主機或端口
讓redis之後臺進程的形式運行
編輯conf配置文件,修改以下內容;
daemonize yes
Redis事物處理:
Redis與 mysql事務的對比
|
Mysql |
Redis |
開啓 |
start transaction |
multi |
語句 |
普通sql |
普通命令 |
失敗 |
rollback 回滾 |
discard 取消 |
成功 |
commit |
exec |
注: rollback與discard 的區別
若是已經成功執行了2條語句, 第3條語句出錯.
Rollback後,前2條的語句影響消失.
Discard只是結束本次事務,前2條語句形成的影響仍然還在
Redis的事務中,啓用的是樂觀鎖,只負責監測key沒有被改動.
具體的命令---- watch命令
Watch可監視多個變量,若是其中之一發生改變,則事物回滾
若是exec返回nil,說明監視的ticket已經改變了,事務就取消了.
unwatch 取消全部watch監聽
Redis持久化配置
Redis的持久化有2種方式 1快照 2是日誌
Rdb快照的配置選項
save 900 1 // 900內,有1條寫入,則產生快照
save 300 1000 // 若是300秒內有1000次寫入,則產生快照
save 60 10000 // 若是60秒內有10000次寫入,則產生快照
(這3個選項都屏蔽,則rdb禁用)
stop-writes-on-bgsave-error yes // 後臺備份進程出錯時,主進程停不中止寫入?
rdbcompression yes // 導出的rdb文件是否壓縮
Rdbchecksum yes // 導入rbd恢復時數據時,要不要檢驗rdb的完整性
dbfilename dump.rdb //導出來的rdb文件名
dir ./ //rdb的放置路徑
Aof 的配置
appendonly no # 是否打開 aof日誌功能
appendfsync always # 每1個命令,都當即同步到aof. 安全,速度慢
appendfsync everysec # 折衷方案,每秒寫1次
appendfsync no # 寫入工做交給操做系統,由操做系統判斷緩衝區大小,統一寫入到aof. 同步頻率低,速度快,
no-appendfsync-on-rewrite yes: # 正在導出rdb快照的過程當中,要不要中止同步aof
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重寫時的大小,增加率100%時,重寫
auto-aof-rewrite-min-size 64mb #aof文件,至少超過64M時,重寫
注意:redis優先使用aof恢復數據
恢復時rdb比aof快,由於其是數據的內存映射,直接載入到內存,而aof是命令,須要逐條執行
Redis服務端經常使用命令:
time ,顯示服務器時間 , 時間戳(秒), 微秒數
dbsize // 當前數據庫的key的數量
select 2 切換數據庫
bgrewriteaof 後臺進程重寫AOF
bgsave 後臺保存rdb快照
save 保存rdb快照
lastsave 上次保存時間
Flushall 清空全部庫全部鍵
Flushdb 清空當前庫全部鍵
Shutdown [save/nosave] 關閉redis服務
若是不當心運行了flushall, 當即 shutdown nosave ,關閉服務器
而後 手工編輯aof文件, 去掉文件中的 「flushall 」相關行, 而後開啓服務器,就能夠導入回原來數據.
Slowlog 顯示慢查詢
由slowlog-log-slower-than 10000 ,來指定,(單位是微秒)
slowlog-max-len 128 ,來作限制服務器儲存多少條慢查詢的記錄
Redis運維時須要注意的參數
1: 內存
# Memory
used_memory:859192 數據結構的空間
used_memory_rss:7634944 實佔空間
mem_fragmentation_ratio:8.89 前2者的比例,1.N爲佳,若是此值過大,說明redis的內存的碎片化嚴重,能夠導出再導入一次.
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 上次導出rdb快照,持久化花費微秒
注意: 若是某實例有10G內容,導出須要2分鐘,
每分鐘寫入10000次,致使不斷的rdb導出,磁盤始處於高IO狀態.
5: 慢日誌
config get/set slowlog-log-slower-than
CONFIG get/SET slowlog-max-len
slowlog get N 獲取慢日誌
運行時更改master-slave
修改一臺slave(設爲A)爲new master
1) 命令該服務不作其餘redis服務的slave
命令: slaveof no one
2) 修改其slave-read-only爲no
其餘的slave再指向new master A
1) 命令該服務爲new master A的slave
命令格式 slaveof IP port
Slaveof master-Host port , 把當前實例設爲master的slave
主從配置:slaveof <masterip> <masterport>
同時修改port
監控工具 sentinel
Sentinel不斷與master通訊,獲取master的slave信息.
監聽master與slave的狀態
若是某slave失效,直接通知master去除該slave.
若是master失效,,是按照slave優先級(可配置), 選取1個slave作 new master,把其餘slave--> new master
疑問: sentinel與master通訊,若是某次由於master IO操做頻繁,致使超時,此時,認爲master失效,很武斷.
解決: sentnel容許多個實例看守1個master, 當N臺(N可設置)sentinel都認爲master失效,才正式失效.
Sentinel選項配置
port 26379 # 端口
sentinel monitor mymaster 127.0.0.1 6379 2 ,給主機起的名字(不重便可),當2個sentinel實例都認爲master失效時,正式失效
sentinel down-after-milliseconds mymaster 30000 多少毫秒後鏈接不到master認爲斷開
sentinel can-failover mymaster yes #是否容許sentinel修改slave->master. 如爲no,則只能監控,無權修改./
sentinel parallel-syncs mymaster 1 , 一次性修改幾個slave指向新的new master.
sentinel client-reconfig-script mymaster /var/redis/reconfig.sh ,# 在從新配置new master,new slave過程,能夠觸發的腳本
php-redis擴展編譯
1: 到pecl.php.net 搜索redis
2: 下載stable版(穩定版)擴展
3: 解壓,
4: 執行/php/path/bin/phpize (做用是檢測PHP的內核版本,併爲擴展生成相應的編譯配置)
5: configure --with-php-config=/php/path/bin/php-config
6: make && make install
引入編譯出的redis.so插件
1: 編輯php.ini
2: 添加extension=/alidata/server/php/lib/php/extensions/no-debug-non-zts-20100525/redis.so
redis插件的使用
https://github.com/phpredis/phpredis
// get instance
$redis = new Redis();
// connect to redis server
$redis->open('localhost',6380);
$redis->set('user:userid:9:username','wangwu');