【linux】redis

安裝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槽的範圍是016383。
槽是集羣內數據管理和遷移的基本單位。採用大範圍的槽的主要目的是爲了方便數據的拆分和集羣的擴展,
每個節點負責一定數量的槽。

搭建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"
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章