redis之進階

redis之進階

redis介紹

redis的功能特性

1,高速讀寫
2,數據類型豐富
3,支持持久化
4,多種內存分配及回收策略
5,支持事務
6,消息隊列、redis用的多的仍是發佈-訂閱模式
7,支持高可用
8,支持分佈式分片集羣

linux操做系統是怎麼分配內存的?mysql

把內存分爲三大塊
    PSS
    page cache
    anno page:程序之間進行交互的時候。。。。#匿名頁

linux操做系統以page進行分配內存,page大小默認4kb
slab allocator 內存頁的劃分

怎麼保證使用連續的內存linux

slab allocator

redis的優點

一、redis在單用戶(單線程)多併發讀寫的性能高
二、在多用戶(多線程)少讀寫時memache更優
三、redis是一個單核的管理機制,生產中通常是,單機多實例的框架

redis的使用

下載
安裝
解壓 tar -zxvf redis-3.2.6.tar.gz 
cd redis-2.6.0
make #編譯安裝
yum install gcc*


cd /application/redis-3.2.6/src
./redis-server & #啓動redis服務端 ,&後臺運行,否則一直佔用端口
ps -ef |grep redis #查看是否啓動
./redis-cli  #鏈接服務器

使用redis

 
set foo bar
get fooredis

基本的配置文件
vim /etc/redis.conf  #去編輯redis.conf文件

#添加配置
daemonize  yes
port 6379
dbfilename dump.rdb
dir "/application/data/6379" 
logfile /var/log/redis.log
######
mkdir -p /application/data/6379
ps -ef |grep redis
./redis-server /etc/redis.conf 
/application/redis-3.2.6/src/redis-server /etc/redis.conf


#爲了避免用每次都切進去,在環境變量裏面設置一下
cd /root 
vim .bash_profile 
PATh 添加 :/application/redis-3.2.6/src
:wq保存

配置生效
source .bash_profile
redis-cli 

配置完成以後,能夠直接在命令行調用redis命令
例如:
redis-cli shutdown
或者
redis-server /etc/redis.conf



#安全控制(也在配置文件裏面設置)
bind 10.0.0.200   #綁定ip10字段
requirepass root  #沒有用戶只有密碼,密碼爲root
redis-cli 
shutdown
redis-server /etc/redis.conf
設置完成以後須要換種方式打開:
redis-cli -h 10.0.0.200 -a root 


#改完配置文件每次都須要重啓,不用每次都重啓,在線變動配置:
獲取當前配置
CONFIG GET *
變動運行配置
CONFIG  SET loglevel 'notice'
修改密碼
CONFIG SET requirepass  "123"
CONFIG GET requirepass

在線修改的配置,下次登陸生效,可是重啓以後配置會丟失

#Python連接redis 
import redis 
....

redis的數據持久化

RDB持久化:快照,只記錄一個時刻內存數據狀態(快照記錄某一時刻的數據)
AOF持久化:只追加日誌文件的方式,記錄了redis裏面全部的修改命令

RDB記錄某一時刻的,還能夠用作備份
AOF比較安全,可是比較囉嗦,每次都把全部的搜保存下來了


#若是配置持久化功能
方式一:
RDB 持久化配置:仍是修改配置文件
dbfilename dump.rbd 
dir '/application/data/6379'
save 900 1  900秒內有一個更改
save 300 10  300秒內有10個更改
save 60 10000  60秒內有10000個更改


#也能夠設置配置作持久化
方式二:
set foo bar 
save 或者 bgsave  #手工觸發持久化


#配置擴展
    stop-writes-on-bgsave-error yes
    rdbcompression yes
    rdbchecksum yes

#AOF 配置
appendonly yes 
applendfsync every

redis數據類型

計數器
incr fensi ##你點擊一下增長一下,刷點擊量
   incrby fensi 10000
   DECR fensi #遞減
   DECRBY fensi 20  
set foo bar 
set foo ex 10


hset stu(表) id(列) 100
hmset stu id 100 name  zhangsna 



lpush pengyouquan 'today is nice day'
lpush pengyouquan 'today is bad day'
lpush pengyouquan 'today is a day'
lpop pengyouquan  #刪除最後一條
lrange pengyouquan 0 -1 #查看全部

有序集合:像是排行榜

發佈訂閱模式

發佈訂閱模式(中間橋樑:頻道):朋友圈是很好的證實。先關注你就能看到
開兩個端口 
PUBLISH weibo hello 先訂閱某個頻道
SUBSCRIBE weibo  訂閱weibo一個頻道,subscribe 

PSUBSCRIBE * 一次性訂閱多個頻道(廣告類)
PSUBSCRIBE it.* 一次性訂閱多個和it相關的頻道
退出就取消訂閱了

redis的事物管理

redis使用multi開啓事物
    discard  撤銷
    exec 退出
    redis 中的鎖機制
        mysql的悲觀鎖:我在作操做的時候,你別和我搶,
        redis的樂觀鎖:查看一下,

redis的一些管理命令

Info
Clinet list 客戶端鏈接的情況以及對系統的使用狀況
Client kill ip:port
config get *
CONFIG RESETSTAT 重置統計
CONFIG GET/SET 動態修改
Dbsize
FLUSHALL 清空全部數據
select 1
FLUSHDB 清空當前庫
MONITOR 監控實時指令

主從複製

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
假如說你訪問redis呢,訪問不了呢,數據查看不了了,怎麼辦?    
咱們要作到一個恢復的功能,因此就有了主從複製的功能
假如說一個機器廢了,還有另外一個機器能提供數據
至少要有兩臺服務器
主從複製的兩種功能
一、能夠實現故障的轉移 failover
二、能夠分擔多節點的壓力 blance
底層原理依賴於
同步傳輸rbd存儲的機制
怎麼搭建主從?
準備2臺或以上的redis實例
一、多配置文件(端口、數據路徑、日誌路徑、pid)
端口、:6380(主),6381(從)
數據路徑:
/application/data/6380
/application/data/6381
日誌路徑
/var/log/redis6380.log
/var/log/redis6381.log
pid :記錄一個程序進程號的id
/application/data/6380/redis.pid
/application/data/6381/redis.pid
二、主從複製的配置過程
一、建立目錄
mkdir -p /application/data/6380
mkdir -p /application/data/6381
二、配置文件準備
vim /application/data/6380/redis.conf
port 6380
daemonize yes
pidfile /application/data/6380/redis.pid
logfile "/var/log/redis6380.log"
dbfilename dump.rdb
dir /application/data/6380

vim /application/data/6381/redis.conf
port 6381
daemonize yes
pidfile /application/data/6381/redis.pid
logfile "/var/log/redis6381.log"
dbfilename dump.rdb
dir /application/data/6381
三、啓動兩個實例
redis-server /application/data/6380/redis.conf
redis-server /application/data/6381/redis.conf

四、構建主從
redis-cli -p 6381
slaveof 127.0.0.1 6380
五、驗證主從
登陸主庫:
redis-cli -p 6380

set foo bar
登陸主庫:
redis-cli -p 6381
get

六、主從複製狀態查看。
role
info replication

七、主從複製,手工切換
slaveof no one

傳統主從的缺陷
一、沒有自動監控機制
二、沒有自動切換的功能
三、對於應用不透明

sentinel 功能
一、自動監控redis全部節點狀態
二、發現主庫故障,自動選主切換
三、自動通知應用端


準備,1主2從結構比較合適。
添加6382節點:
mkdir -p /application/data/6382

vim /application/data/6382/redis.conf

port 6382
daemonize yes
pidfile /application/data/6382/redis.pid
logfile "/var/log/redis6382.log"
dbfilename dump.rdb
dir /application/data/6382

redis-server /application/data/6382/redis.conf


redis-cli -p 6382

slaveof 127.0.0.1 6380




sentinel配置

mkdir -p /application/data/26380

vim /application/data/26380/sentinel.conf
port 26380
dir "/application/data/26380"
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 60000
sentinel config-epoch mymaster 0
啓動
redis-sentinel /application/data/26380/sentinel.conf

Python sentinel

1
2
3
4
5
6
7
8
9
10
11
>>> from redis.sentinel import Sentinel 
>>> sentinel = Sentinel([('127.0.0.1', 26380)], socket_timeout=0.1)
>>> sentinel.discover_master('mymaster')
('127.0.0.1', 6379)
>>> sentinel.discover_slaves('mymaster')
[('127.0.0.1', 6380)]
>>> 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')
'bar'
相關文章
相關標籤/搜索