安裝redis
方式一
通過yum工具安裝redis
yum install redis -y
方式二
編譯安裝redis
下載redis安裝包
wget http://download.redis.io/releases/redis-4.0.10.tar.gz
解壓縮redis安裝包
tar -zxvf redis-4.0.10.tar.gz
進入到解壓後的文件夾目錄中進行編譯
make && make install
編輯redis的配置文件redis.conf,讓其支持更安全的啓動方式‘
requirepass 123456#打開redis密碼的參數
protected-mode yes #開啓安全模式
bind 0.0.0.0 #修改redis的默認綁定地址
port 6800 #修改redis的默認啓動端口
過濾出非空行,註釋行的內容,重定向寫入到一個文件中
grep -v "^$" redis.conf |grep -v "^#" > new_redis.conf
在新配置文件結尾加上後臺啓動參數
daemonize yes
啓動redis服務端
啓動時指定加載寫好的配置文件
redis-server new_redis.conf
驗證redis是否啓動
ps -ef|grep redis
指定密碼登錄redis
redis-cli -p 6800
測試
127.0.0.1:6800> ping
(error) NOAUTH Authentication required.
127.0.0.1:6800> auth 123456
OK
127.0.0.1:6800> ping
PONG
基礎命令
keys * 查看所有key
type key 查看key類型
expire key seconds 過期時間
ttl key 查看key過期剩餘時間,-2表示key已經不存在了
persist 取消key的過期時間,-1表示key存在,沒有過期時間
exists key 判斷key存在 存在返回1 否則0
del keys 刪除key 可以刪除多個
dbsize 計算key的數量
config get requirepass 查看redis是否設置密碼
config set requirepass “xx” 爲redis設置密碼
redis的五大數據類型
字符串(strings)
set 設置key
>set v1 a
get 獲取key
>get v1
append 追加string
>append v1 b
mset 設置多個鍵值對
>mset v2 a v3 b
mget 獲取多個鍵值對
>mget v1 v2 v3
del 刪除key
>del v1
incr 遞增+1
>set v4 =1
>incr v4
decr 遞減-1
>decr v4
列表(lists)
lpush 從列表左邊插
>lpush v1 1 2
rpush 從列表右邊插
>rpush v1 3 4
lrange 獲取一定長度的元素
>lrange v1 0 -1
ltrim 截取一定長度列表
>ltrim v1 0 -1
lpop 刪除最左邊一個元素
>lpop v1
rpop 刪除最右邊一個元素
>rpop v1
lpushx/rpushx key存在則添加值,不存在不處理
集合(sets)
sadd/srem 添加/刪除 元素
>sadd v1 1 2 3 4
>sadd v2 3 4 5 6
sismember 判斷是否爲set的一個元素
>sismember v1 2
smembers 返回集合所有的成員
sdiff 返回一個集合和其他集合的差異
>sdiff v1 v2
sinter 返回幾個集合的交集
>sinter v1 v2
sunion 返回幾個集合的並集
>sunion v1 v2
有序集合(sorted sets)
zadd/zrem 添加/刪除
>zadd v1 10 a
>zadd v1 10 b
zrange 從小到大查看
>zrange v1 0 -1
zrevrange 從大到小查看
>zrevrange v1 0 -1
散列(hashes)
hset 設置散列值
>hset v1 age 10
>hset v1 sex 0
hget 獲取散列值
>hget v1 age
hmset 設置多對散列值
>hmset v2 age 15 sex 1
hmget 獲取多對散列值
>hmget v2 age sex
hsetnx 如果散列已經存在,則不設置(防止覆蓋ke
hkeys 返回所有keys
>hkeys v2
hvals 返回所有values
>hvals v2
hlen 返回散列包含域(field)的數量
>hlen v2
hdel 刪除散列指定的域(field)
>hdel v2 name age
hexists 判斷是否存在
>hexists v2 name
發佈訂閱
Redis 通過 PUBLISH(發佈者)、 SUBSCRIBE (訂閱者)等命令實現了訂閱與發佈模式。發佈者在指定頻道發佈消息,訂閱者通過訂閱這個頻道來獲取消息。一個發佈者可以對應多個訂閱者
#發佈者
>publish pd1 abc
>publish pd2 123
#訂閱者1
>subscribe pd1 pd2
>pd1
>abc
>pd2
>123
#訂閱者2
>subscribe pd2
>pd2
>123
模糊匹配頻道
#發佈者
>publish pd1 abc
>publish pd2 123
#訂閱者
>psubscribe pd*
>abc
>123
持久化存儲
Redis是一種內存型數據庫,一旦服務器進程退出,數據庫的數據就會丟失,爲了解決這個問題,Redis提供了兩種持久化的方案,將內存中的數據保存到磁盤中,避免數據的丟失。
RDB持久化
redis提供了RDB持久化的功能,這個功能可以將redis在內存中的的狀態保存到硬盤中,它可以手動執行。也可以再redis.conf中配置,定期執行。
RDB持久化產生的RDB文件是一個經過壓縮的二進制文件,這個文件被保存在硬盤中,redis可以通過這個文件還原數據庫當時的狀態。
使用rdb持久化
1.準備配置文件
touch rdbredis.conf
寫入以下內容
daemonize yes #後臺運行
port 6379 #指定端口
logfile /data/6379/redis.log #指定日誌路徑
dir /data/6379 #redis的數據文件,會存放在這裏
dbfilename dbmp.rdb #開啓rdb持久化,指定持久化文件名
bind 0.0.0.0
save 900 1 #定義觸發rdb持久化的時間機制,也可以手動使用save進行持久化
save 300 10
save 60 10000
2.創建數據文件夾
mkdir -p /data/6379
3.指定rdb文件啓動redis
redis-server rdbredis.conf
AOF持久化
記錄服務器執行的所有變更操作命令(例如set del等),並在服務器啓動時,通過重新執行這些命令來還原數據集。AOF 文件中的命令全部以redis協議的格式保存,新命令追加到文件末尾。
優點:最大程序保證數據不丟
缺點:日誌記錄非常大
使用aof持久化
1.準備配置文件
touch aofredis.conf
寫入以下內容
daemonize yes #後臺運行
port 6379 # 指定端口
logfile /data/6379/redis.log # 指定日誌路徑
dir /data/6379 #redis的數據文件,會存放在這裏
appendonly yes #開啓aof的倆參數
appendfsync everysec #aof的持久化機制
# 參數
#always 總是修改類的操作
#everysec 每秒做一次持久化
#no 依賴於系統自帶的緩存大小機制
2.創建數據文件夾
mkdir -p /data/6379
3.指定aof文件啓動redis
redis-server aofredis.conf
RDB切換AOF
在redis4.0中,通過config set命令,達到不重啓redis服務,從RDB持久化切換爲AOF。在進行切換之前注意文件的備份。
config set appendonly yes # #開啓AOF功能
config set save "" #關閉RDB功能
此時RDB已經正確切換AOF,但它是臨時生效,注意還得修改redis.conf添加AOF設置,不然重啓後,通過config set的配置將丟失
主從複製
redis的主從複製基於redis的多實例完成,基於不同的端口,運行獨立的數據庫
主庫具有讀寫的權限,從庫只有讀的權限
使用主從複製
1.準備三個庫的配置文件
主庫配置文件 masterreids.conf
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
從庫1配置文件 slaveredis1.conf
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
從庫2配置文件 slaveredis2.conf
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no
2.創建三個數據庫的數據文件夾
mkdir -p /data/{6380,6381,6382}
3.分別啓動三個數據庫實例
redis-server masterredis.conf
redis-server slaveredis1.conf
redis-server slaveredis2.conf
4.使用命令建立主從複製關係
redis-cli -p 6381 slaveof 127.0.0.1 6380
redis-cli -p 6382 slaveof 127.0.0.1 6380
5.查看庫信息
redis-cli -p 6380 info replication
redis-cli -p 6381 info replication
redis-cli -p 6382 info replication
主庫:
# Replication
role:master # 身份
connected_slaves:2 # 兩個連接者
slave0:ip=127.0.0.1,port=6381,state=online,offset=14,lag=0
slave1:ip=127.0.0.1,port=6382,state=online,offset=14,lag=1
從庫:
role:slave # 身份
master_host:127.0.0.1
master_port:6380
master_link_status:up # 連接狀態
6.當主庫由於某種原因掛掉後,手動將從庫切換爲主庫,繼續主從複製
# 剔除自己的從庫身份
127.0.0.1:6381> slaveof no one
7.再次啓動一個新的從庫,以6381爲主庫即可
補充:除了通過指令建立主庫和從庫的關係外還可以在配置文件中直接指定爲從庫
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
slaveof 127.0.0.1 6380 # 指定爲從庫
哨兵配置
Redis-Sentinel是redis官方推薦的高可用性解決方案,當用redis作master-slave的高可用時,如果master本身宕機,redis本身或者客戶端都沒有實現主從切換的功能。而redis-sentinel就是一個獨立運行的進程,用於監控多個master-slave集羣,自動發現master宕機,進行自動切換slave > master。
sentinel主要功能
1.持續監視redis運行狀態,如果節點不可達就會對節點進行下線標識
2.如果被標識的是主節點,sentinel就會和其他的sentinel節點“協商”,如果其他節點也認爲主節點不可達,就會選舉一個sentinel節點來完成自動故障轉義
3.在master-slave進行切換後,master_redis.conf、slave_redis.conf和sentinel.conf的內容都會發生改變,即master_redis.conf中會多一行slaveof的配置,sentinel.conf的監控目標會隨之調換
使用redis哨兵
1.準備三個庫的配置文件
主庫配置文件 masterreids.conf
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380
protected-mode no
從庫1配置文件 slaveredis1.conf
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6381
protected-mode no
slaveof 127.0.0.1 6380
從庫2配置文件 slaveredis2.conf
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6382
protected-mode no
slaveof 127.0.0.1 6380
2.創建三個數據庫的數據文件夾
mkdir -p /data/{6380,6381,6382}
3.分別啓動三個數據庫實例
redis-server masterredis.conf
redis-server slaveredis1.conf
redis-server slaveredis2.conf
4.準備三個哨兵(sentinel)的配置文件,這三個配置文件,僅僅是端口的不同,默認端口是26379
sentinel1.conf
port 26379 # 端口
dir /var/redis/data/ # 數據文件
logfile "26379.log" # 日誌
sentinel monitor mymaster 127.0.0.1 6380 2
// 當前Sentinel節點監控 192.168.119.10:6380 這個主節點
// 2代表判斷主節點失敗至少需要2個Sentinel節點節點同意
// mymaster是主節點的別名
sentinel down-after-milliseconds mymaster 30000
//每個Sentinel節點都要定期PING命令來判斷Redis數據節點和其餘Sentinel節點是否可達,如果超過30000毫秒(30s)沒有回覆,則判定不可達
sentinel parallel-syncs mymaster 1
//當Sentinel節點集合對主節點故障判定達成一致時,Sentinel領導者節點會做故障轉移操作,選出新的主節點,
原來的從節點會向新的主節點發起復制操作,限制每次向新的主節點發起復制操作的從節點個數爲1
sentinel failover-timeout mymaster 180000
//故障轉移超時時間爲180000毫秒
daemonize yes
//後臺運行哨兵
替換 端口生成另外兩個配置文件
sed 's/26379/26380/g' sentinel1.conf > sentinel2.conf
sed 's/26379/26381/g' sentinel1.conf > sentinel3.conf
5.創建數據文件夾
mkdir -p /var/reids/data/
6.分別啓動三個哨兵進程
redis-sentinel sentinel1.conf
redis-sentinel sentinel2.conf
redis-sentinel sentinel3.conf
[redis-4.0.10]# ps -ef |grep redis
root 15754 1 0 Mar16 ? 00:00:40 redis-server *:6380
root 15764 1 0 Mar16 ? 00:00:39 redis-server *:6381
root 15771 1 0 Mar16 ? 00:00:39 redis-server *:6382
root 16988 1 0 16:09 ? 00:00:00 redis-sentinel *:26379 [sentinel]
root 16999 1 0 16:10 ? 00:00:00 redis-sentinel *:26380 [sentinel]
root 17004 1 0 16:10 ? 00:00:00 redis-sentinel *:26381 [sentinel]
當主庫掛掉30秒後哨兵會將其中一個從庫變爲主庫,並將這個庫的配置文件修改(刪掉slaveof 配置),然後會讓另一個從庫變爲自己的從庫。當掛掉的這個庫重啓,會在一段時間內將這個庫自動變爲從庫。
redis集羣
redis3.0集羣採用P2P模式,完全去中心化,將redis所有的key分成了16384個槽位,每個redis實例負責一部分slot,集羣中的所有信息通過節點數據交換而更新。redis實例集羣主要思想是將redis數據的key進行散列,通過hash函數特定的key會映射到指定的redis節點上
數據分佈理論
分佈式數據庫首要解決把整個數據集按照分區規則映射到多個節點的問題,即把數據集劃分到多個節點上,每個節點負責整個數據的一個子集。
順序分區
哈希分區
例如按照節點取餘的方式,分三個節點,節點取餘的優點是簡單,客戶端分片直接是哈希+取餘
1~100的數據對3取餘,可以分爲三類
- 餘數爲0
- 餘數爲1
- 餘數爲2
一致性哈希
客戶端進行分片,哈希+順時針取餘
虛擬槽分區
Redis Cluster採用虛擬槽分區
虛擬槽分區巧妙地使用了哈希空間,使用分散度良好的哈希函數把所有的數據映射到一個固定範圍內的整數集合,整數定義爲槽(slot)。
Redis Cluster槽的範圍是0 ~ 16383。
槽是集羣內數據管理和遷移的基本單位。採用大範圍的槽的主要目的是爲了方便數據的拆分和集羣的擴展,
每個節點負責一定數量的槽。
搭建redis cluster
搭建三主三從的數據庫主從集羣
1.準備6個數據庫節點(7000~7005 )各個節點僅是端口的不同
# redis-7000.conf
port 7000
daemonize yes
dir "/opt/redis/data"
logfile "7000.log"
dbfilename "dump-7000.rdb"
cluster-enabled yes #開啓集羣模式
cluster-config-file nodes-7000.conf #集羣內部的配置文件
sed 's/7000/7001/g' redis-7000.conf > redis-7001.conf
sed 's/7000/7002/g' redis-7000.conf > redis-7002.conf
sed 's/7000/7003/g' redis-7000.conf > redis-7003.conf
sed 's/7000/7005/g' redis-7000.conf > redis-7005.conf
2.分別啓動6個redis節點
redis-server redis-7000.conf
redis-server redis-7001.conf
redis-server redis-7002.conf
redis-server redis-7003.conf
redis-server redis-7004.conf
redis-server redis-7005.conf
3.配置ruby環境,一鍵創建redis機羣slot槽位分配
安裝ruby解釋器
yum install ruby -y
下載ruby操作redis的模塊
wget http://rubygems.org/downloads/redis-3.3.0.gem
gem install -l redis-3.3.0.gem
先找到ruby的絕對路徑
[opt]# find / -name redis-trib.rb
/opt/redis-4.0.10/src/redis-trib.rb
一鍵開啓redis集羣槽位分配
/opt/redis-4.0.10/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
[root@izhk773c62kz06z redis-4.0.10]# /opt/redis-4.0.10/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
>>> Creating cluster
>>> Performing hash slots allocation on 6 nodes...
Using 3 masters:
127.0.0.1:7000
127.0.0.1:7001
127.0.0.1:7002
Adding replica 127.0.0.1:7004 to 127.0.0.1:7000
Adding replica 127.0.0.1:7005 to 127.0.0.1:7001
Adding replica 127.0.0.1:7003 to 127.0.0.1:7002
>>> Trying to optimize slaves allocation for anti-affinity
[WARNING] Some slaves are in the same host as their master
M: 1b1d442426ade3249d833f910531579bf70a6209 127.0.0.1:7000
slots:0-5460 (5461 slots) master
M: 1429bfd7306b2bec90b86a5f4e3c0c4105f286fc 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
M: 285d0ad96a9de180786c3ea1b682aeeab727eb8b 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
S: 6af27019c3230081b0b492ffacb29a4548b9db58 127.0.0.1:7003
replicates 285d0ad96a9de180786c3ea1b682aeeab727eb8b
S: 29b1640bab990b358291b7e547bc6b4beefd74f4 127.0.0.1:7004
replicates 1b1d442426ade3249d833f910531579bf70a6209
S: 92b567379ee3e5c7488a2dc0a6984d4358d01e33 127.0.0.1:7005
replicates 1429bfd7306b2bec90b86a5f4e3c0c4105f286fc
Can I set the above configuration? (type 'yes' to accept): yes
>>> Nodes configuration updated
>>> Assign a different config epoch to each node
>>> Sending CLUSTER MEET messages to join the cluster
Waiting for the cluster to join..
>>> Performing Cluster Check (using node 127.0.0.1:7000)
M: 1b1d442426ade3249d833f910531579bf70a6209 127.0.0.1:7000
slots:0-5460 (5461 slots) master
1 additional replica(s)
S: 92b567379ee3e5c7488a2dc0a6984d4358d01e33 127.0.0.1:7005
slots: (0 slots) slave
replicates 1429bfd7306b2bec90b86a5f4e3c0c4105f286fc
M: 1429bfd7306b2bec90b86a5f4e3c0c4105f286fc 127.0.0.1:7001
slots:5461-10922 (5462 slots) master
1 additional replica(s)
S: 29b1640bab990b358291b7e547bc6b4beefd74f4 127.0.0.1:7004
slots: (0 slots) slave
replicates 1b1d442426ade3249d833f910531579bf70a6209
S: 6af27019c3230081b0b492ffacb29a4548b9db58 127.0.0.1:7003
slots: (0 slots) slave
replicates 285d0ad96a9de180786c3ea1b682aeeab727eb8b
M: 285d0ad96a9de180786c3ea1b682aeeab727eb8b 127.0.0.1:7002
slots:10923-16383 (5461 slots) master
1 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
4.以集羣模式登陸redis-cluster
redis-cli -p 7000 -c
5.向集羣中寫入數據,查看數據重定向
[root@izhk773c62kz06z redis-4.0.10]# redis-cli -p 7000 -c
127.0.0.1:7000> keys *
(empty list or set)
127.0.0.1:7000> set v1 1
OK
127.0.0.1:7000> set v2 2
-> Redirected to slot [13550] located at 127.0.0.1:7002
OK
127.0.0.1:7002> set v5 3
-> Redirected to slot [1033] located at 127.0.0.1:7000
OK
127.0.0.1:7000> get v5
"3"
127.0.0.1:7000> get v2
-> Redirected to slot [13550] located at 127.0.0.1:7002
"2"
127.0.0.1:7002>
django使用redis
安裝django-redis模塊
pip3 install django-redis
在settings中配置redis配置
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"CONNECTION_POOL_KWARGS": {"max_connections": 100},
"PASSWORD": "12345",
}
}
}
視圖中使用
from django_redis import get_redis_connection
conn = get_redis_connection("default")
使用redis做緩存
全站緩存
# 中間件配置
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
單視圖緩存
from django.views.decorators.cache import cache_page
@cache_page(60 * 15)
def my_view(request):
...
url緩存
from django.views.decorators.cache import cache_page
urlpatterns = [
url(r'^index/$', cache_page(60 * 15)(my_view)),
]
頁面局部緩存
{% load cache %}
{% cache 5000 緩存key %}
緩存內容
{% endcache %}
使用Redis做session
# 配置session存儲
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
SESSION_CACHE_ALIAS = "default"