Redis 簡介
Memcached:
優點:高性能讀寫、單一數據類型、支持客戶端式分布式集群、一致性hash
多核結構、多線程讀寫性能高。
缺點:無持久化、節點故障可能出現緩存穿透、分布式需要客戶端實現、跨機房數據同步困難、架構擴容復雜度高
Redis:
優點:高性能讀寫、多數據類型支持、數據持久化、高可用架構、支持自定義虛擬內存、支持分布式分片集群、單線程讀寫性能極高
缺點:多線程讀寫較Memcached慢
Redis 安裝和基本配置
1.安裝教程
下載:
wget http://download.redis.io/releases/redis-3.2.10.tar.gz
解壓:
tar xzf redis-3.2.10.tar.gz
mv redis-3.2.10 redis
安裝:
cd redis
make
啟動:
src/redis-server &
2.配置文件
vi /etc/redis.conf
是否后台運行:
daemonize yes
默認端口:
port 6379
日志文件位置
logfile /var/log/redis.log
RDB持久化數據文件:
dbfilename dump.rdb
持久化文件的位置:
dir /data/redis
3.安全配置
Bind
指定IP進行監聽 bind 10.0.0.129(本地) 127.0.0.1
禁止protected-mode
protected-mode yes/no (保護模式,是否只允許本地訪問)
增加requirepass {password}
requirepass root
4.配置完成后需要重啟Redis
127.0.0.1:6379> shutdown
/application/redis/src/redis-server /etc/redis.conf
/application/redis/src/redis-cli -h 10.0.0.129 -a 123456 -p 6379
5.在線修改配置
獲取當前配置
CONFIG GET *
變更運行配置
CONFIG SET requirepass 123456
Redis 持久化
RDB持久化
基於時間點快照的方式,復用方式進行數據持久化
比較常用的方式,效率較高,安全性相對較低
在 /etc/redis.conf中添加以下內容
dbfilename dump.rdb
dir /data/redis
save 900 1
save 300 10
save 60 10000
分別表示:
rdb文件名
rdb的放置路徑
900秒(15分鍾)內有1個更改
300秒(5分鍾)內有10個更改
60秒內有10000個更改
當達到以上定義的配置時間時,就將內存數據持久化到磁盤。
AOF持久化
只追加的方式記錄所有redis中執行過的修改類命令
效率相對較低,安全性較高
appendonly yes
appendfsync always或者everysec或者no
分別表示:
是否打開aof日志功能
每1個命令,都立即同步到aof
Redis 開發/管理實戰
數據類型
String/Hash/List/Set/Sorted set
增刪改查操作:自己查文檔
全局key操作
KEYS * 查看KEY支持通配符
DEL 刪除給定的一個或多個key
EXISTS 檢查是否存在
RENAME 變更KEY名
TYPE 返回鍵所存儲值的類型
EXPIRE\ PEXPIRE 以秒\毫秒設定生存時間
TTL\ PTTL 以秒\毫秒為單位返回生存時間
PERSIST 取消生存實現設置
消息模式
1.隊列模式(queuing)
2.發布-訂閱模式(publish-subscribe)
PUBLISH channel msg
將信息 message 發送到指定的頻道 channel
SUBSCRIBE channel [channel ...]
訂閱頻道,可以同時訂閱多個頻道
PSUBSCRIBE pattern [pattern ...]
訂閱一個或多個符合給定模式的頻道,每個模式以 * 作為匹配符,比如 it* 匹配所 有以 it 開頭的頻道( it.news 、 it.blog 、 it.tweets 等等), news.* 匹配所有 以 news. 開頭的頻道( news.it 、 news.global.today 等等),諸如此類
PUNSUBSCRIBE [pattern [pattern ...]]
退訂指定的規則, 如果沒有參數則會退訂所有規則
PUBSUB sub command [argument [argument ...]]
查看訂閱與發布系統狀態
注意:使用發布訂閱模式實現的消息隊列,當有客戶端訂閱channel后只能收到后續發布到該頻道的消息,之前發送的不會緩存,必須Provider和Consumer同時在線。
事務
DISCARD
取消事務,放棄執行事務塊內的所有命令。
EXEC
執行所有事務塊內的命令。
MULTI
標記一個事務塊的開始。
UNWATCH
取消 WATCH 命令對所有 key 的監視。
WATCH key [key ...]
監視一個(或多個) key ,如果在事務執行之前這個(或這些) key 被其他命令所改動,那么事務將被打斷。
---------------------
具體的命令---- watch命令
例:
redis 127.0.0.1:6379> watch ticket
OK
redis 127.0.0.1:6379> multi
OK
redis 127.0.0.1:6379> decr ticket
QUEUED
redis 127.0.0.1:6379> decrby money 100
QUEUED
//現在已經對ticket進行了監控,另外一個窗口將ticket改動了
另一個窗口:> decr ticket
redis 127.0.0.1:6379> exec
(nil) // 返回nil,說明監視的ticket已經改動了,事務就取消了.隊列就不執行了。
redis 127.0.0.1:6379>mget ticket money
"0"
"200"
watch key1 key2 ... keyN
作用:監聽key1 key2..keyN有沒有變化,如果任意一個有變, 則事務取消
unwatch
作用: 取消所有watch監聽
服務器管理命令
Info
Clinet list
Client kill ip:port
config get *
CONFIG RESETSTAT 重置統計
CONFIG GET/SET 動態修改
Dbsize
FLUSHALL 清空所有數據
select 1
FLUSHDB 清空當前庫
MONITOR 監控實時指令
SHUTDOWN 關閉服務器
save將當前數據保存
SLAVEOF host port 主從配置
SLAVEOF NO ONE
SYNC 主從同步
ROLE返回主從角色
Redis 高可用及集群技術
主從復制
1.環境配置
准備兩個或兩個以上redis實例
mkdir -p /data/6380/
mkdir -p /data/6381/
mkdir -p /data/6382/
-------------
/data/6380/redis.conf
/data/6381/redis.conf
/data/6382/redis.conf
三套配置文件示例:
vim /data/6380/redis.conf
----------------
bind 127.0.0.1 10.0.0.200
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
slowlog-log-slower-than 10000
slowlog-max-len 128
protected-mode no
6381/6382文件配置同上
啟動:
/application/redis/src/redis-server /data/6380/redis.conf
/application/redis/src/redis-server /data/6381/redis.conf
/application/redis/src/redis-server /data/6382/redis.conf
查看啟動狀態
netstat -lnp|grep 638
主節點:6380
從節點:6381、6382
開啟主從:
6381/6382命令行:
redis-cli -p 6381
SLAVEOF 127.0.0.1 6380
redis-cli -p 6382
SLAVEOF 127.0.0.1 6380
主從復制狀態監控:info replication
主從切換:slaveof no one
2.配置sentinel 哨兵
mkdir /data/26380
cp /application/redis/src/redis-sentinel /data/26380
cd /data/26380
./redis-sentinel ./sentinel.conf
vim sentinel.conf
port 26380
dir "/tmp"
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 5000
sentinel config-epoch mymaster 0
啟動
./redis-sentinel ./sentinel.conf
3.python連接 redis-sentinel集群
1、安裝python3.5
tar xf Python-3.5.2.tar.xz
cd Python-3.5.2
./configure
make && make install
2、安裝redis的python驅動
unzip redis-py-master.zip
cd redis-py-master
python3 setup.py install
3、python3連接redis sentinel集群
連接之前必須先啟動哨兵 切記切記
cd /data/26380
./redis-sentinel ./sentinel.conf
python3
>>>from redis.sentinel import Sentinel
>>>sentinel = Sentinel([('localhost', 26380)], socket_timeout=0.1)
>>>sentinel.discover_master('mymaster')
>>>sentinel.discover_slaves('mymaster')
>>>master = sentinel.master_for('mymaster', socket_timeout=0.1)
>>>slave = sentinel.slave_for('mymaster', socket_timeout=0.1)
>>>master.set('foo', 'bar')
>>>slave.get('foo')
4.redis cluser集群組件安裝
EPEL源安裝ruby支持
yum install ruby rubygems -y
使用國內源
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources --remove http://rubygems.org/
gem sources -l
gem install redis -v 3.3.3
--------------------
0、集群節點准備,創建節點目錄:
mkdir -p /data/7000
mkdir -p /data/7001
mkdir -p /data/7002
mkdir -p /data/7003
mkdir -p /data/7004
mkdir -p /data/7005
1、配置文件添加:
-------------------------
vim /data/7000/redis.conf
port 7000
daemonize yes
pidfile /data/7000/redis.pid
logfile "/var/log/redis7000.log"
dbfilename dump.rdb
dir /data/7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
7001/7002/7003/7004/7005節點配置同上
-------------------------------
2、啟動所有節點
/application/redis/src/redis-server /data/7000/redis.conf
/application/redis/src/redis-server /data/7001/redis.conf
/application/redis/src/redis-server /data/7002/redis.conf
/application/redis/src/redis-server /data/7003/redis.conf
/application/redis/src/redis-server /data/7004/redis.conf
/application/redis/src/redis-server /data/7005/redis.conf
ps -ef |grep 700
-------------------------
3、集群創建
/application/redis/src/redis-trib.rb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 \
127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
---------------------
4、集群狀態查看
/application/redis/src/redis-cli -p 7000 cluster nodes | grep master
/application/redis/src/redis-cli -p 7000 cluster nodes | grep slave
Redis 多API開發實踐
Python 連接 redis cluster
(1) redis-py並沒有提供redis-cluster的支持,去github找了一下,有個叫redis-py-cluster的源碼,
但是和redis-py不是一個作者,地址為:https://github.com/Grokzen/redis-py-cluster
watch,star,fork還算可以。
(2) 安裝
unzip redis-py-cluster-unstable.zip
cd redis-py-cluster-unstable
python3 setup.py install
(3) 使用
>>> from rediscluster import StrictRedisCluster
>>> startup_nodes = [{"host": "127.0.0.1", "port": "7000"}]
>>> # Note: decode_responses must be set to True when used with python3
>>> rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
>>> rc.set("foo", "bar")
>>> print(rc.get("foo"))