1. 程式人生 > >Linux-Redis

Linux-Redis

inno python版本 sna ngs linux 順序 生存 unzip mil

redis安裝部署

下載:
wget http://download.redis.io/releases/redis-3.2.10.tar.gz

解壓:
上傳至/usr/local
tar xzf redis-3.2.10.tar.gz
mv redis-3.2.10 redis

安裝:
cd redis
make

啟動:
src/redis-server

修改環境變量:
vim /root/.bash_profile


添加以下配置:
export PATH=/server/tools/redis/src:$PATH

配置完成後應用配置
source /root/.bash_profile

關閉redis:

redis-cli shutdown

啟動redis-server

redis-server &

------------------------------
redis 配置文件的使用:

1、創建必要目錄:

mkdir -p /data/6379/

2、生成配置文件
vim /data/6379/redis.conf

daemonize yes
port 6379
logfile /var/log/redis.log
dbfilename dump.rdb
dir /data/6379

3、使用配置文件
(1)關閉原有redis
redis-cli shutdown
(2)使用配置文件啟動
redis-server /data/6379/redis.conf


4、redis安全控制
vim /data/6379/redis.conf

bind 127.0.0.1 10.0.0.7
requirepass 123


重啟redis生效
[root@python-cnb ~]# redis-cli shutdown
[root@python-cnb ~]# redis-server /data/6379/redis.conf
連接測試:
redis-cli -a 123
或者:
redis-cli
127.0.0.1:6379> auth 123


5、Redis持久化

(1)介紹
默認持久化是沒有開啟的。
(2)持久化類型
RDB
point in time snapshot

基於時間點的快照技術
優點: 持久化速度快,需要的磁盤較少
缺點:只能將數據定格在一個時間點,不能記錄數據變化過程
用處:作為備份來使用,主從復制基於RDB功能的。

AOF:
Append Only Logfile
只追加的日誌文件,保存所有鍵值對修改的變化過程
優點:記錄數據的變化過程,更加安全
缺點:持久化速度相對慢,需要更多的磁盤空間
用處:需要數據安全性和一致性要求更高業務場景,Redis分布式架構基於AOF來實現高可用。

(3)RDB持久化開啟

dbfilename dump.rdb
dir /data/6379

save 900 1
save 300 10
save 60 10000

(4)AOF持久化的開啟

appendonly yes
appendfsync always

--------------------------------------
6、Redis 數據類型

Key:Values

String
key : value

hash:
key:
{
id:value
name:value
}

list :
key:[value,value2,value]
0 1 2(-1)

set
key :{ a, b, c}
0 1 2

sortset key :{score a socre2 b}
0 1
------------------------------------------
redis key的操作

KEYS * 查看KEY支持通配符
DEL 刪除給定的一個或多個key
EXISTS 檢查是否存在
TYPE 返回鍵所存儲值的類型
EXPIRE\ PEXPIRE 以秒\毫秒設定生存時間
TTL\ PTTL 以秒\毫秒為單位返回生存時間
PERSIST 取消生存實現設置


--------------
string 類型

1、普通鍵值對
2、計數器
incr num
incrby num 10000
decr num
decrby num 5000
-------------

set mykey "test" 為鍵設置新值,並覆蓋原有值
getset mycounter 0 設置值,取值同時進行
setex mykey 10 "hello" 設置指定 Key 的過期時間為10秒,在存活時間可以獲取value
setnx mykey "hello" 若該鍵不存在,則為鍵設置新值
mset key3 "zyx" key4 "xyz" 批量設置鍵


del mykey 刪除已有鍵


append mykey "hello" 若該鍵並不存在,返回當前 Value 的長度
該鍵已經存在,返回追加後 Value的長度
incr mykey 值增加1,若該key不存在,創建key,初始值設為0,增加後結果為1
decrby mykey 5 值減少5
setrange mykey 20 dd 把第21和22個字節,替換為dd, 超過value長度,自動補0


exists mykey 判斷該鍵是否存在,存在返回 1,否則返回0
get mykey 獲取Key對應的value
strlen mykey 獲取指定 Key 的字符長度
ttl mykey 查看一下指定 Key 的剩余存活時間(秒數)
getrange mykey 1 20 獲取第2到第20個字節,若20超過value長度,則截取第2個和後面所有的
mget key3 key4 批量獲取鍵


-------------------
hash類型:

hmset stu1 id 101 name zhangsan gender male

hgetall stu1

hmget stu1 id name


hset myhash field1 "s"
若字段field1不存在,創建該鍵及與其關聯的Hashes, Hashes中,key為field1 ,並設value為s ,若存在會覆蓋原value
hsetnx myhash field1 s
若字段field1不存在,創建該鍵及與其關聯的Hashes, Hashes中,key為field1 ,並設value為s, 若字段field1存在,則無效
hmset myhash field1 "hello" field2 "world 一次性設置多個字段

hdel myhash field1 刪除 myhash 鍵中字段名為 field1 的字段
del myhash 刪除鍵

hincrby myhash field 1 給field的值加1


hget myhash field1 獲取鍵值為 myhash,字段為 field1 的值
hlen myhash 獲取myhash鍵的字段數量
hexists myhash field1 判斷 myhash 鍵中是否存在字段名為 field1 的字段
hmget myhash field1 field2 field3 一次性獲取多個字段
hgetall myhash 返回 myhash 鍵的所有字段及其值
hkeys myhash 獲取myhash 鍵中所有字段的名字
hvals myhash 獲取 myhash 鍵中所有字段的值

------------------------

List 列表


lpush mykey a b 若key不存在,創建該鍵及與其關聯的List,依次插入a ,b, 若List類型的key存在,則插入value中
lpushx mykey2 e 若key不存在,此命令無效, 若key存在,則插入value中
linsert mykey before a a1 在 a 的前面插入新元素 a1
linsert mykey after e e2 在e 的後面插入新元素 e2
rpush mykey a b 在鏈表尾部先插入b,在插入a
rpushx mykey e 若key存在,在尾部插入e, 若key不存在,則無效
rpoplpush mykey mykey2 將mykey的尾部元素彈出,再插入到mykey2 的頭部(原子性的操作)

del mykey 刪除已有鍵
lrem mykey 2 a 從頭部開始找,按先後順序,值為a的元素,刪除數量為2個,若存在第3個,則不刪除
ltrim mykey 0 2 從頭開始,索引為0,1,2的3個元素,其余全部刪除

lset mykey 1 e 從頭開始, 將索引為1的元素值,設置為新值 e,若索引越界,則返回錯誤信息
rpoplpush mykey mykey 將 mykey 中的尾部元素移到其頭部

lrange mykey 0 -1 取鏈表中的全部元素,其中0表示第一個元素,-1表示最後一個元素。
lrange mykey 0 2 從頭開始,取索引為0,1,2的元素
lrange mykey 0 0 從頭開始,取第一個元素,從第0個開始,到第0個結束
lpop mykey 獲取頭部元素,並且彈出頭部元素,出棧
lindex mykey 6 從頭開始,獲取索引為6的元素 若下標越界,則返回nil

--------------------
SortedSet(有序集合)

127.0.0.1:6379> ZREVRANGE music 0 -1 withsocres

-------------------------------
發布訂閱

發布者:PUBLISH fm1039 "hi~~"
頻道
訂閱者 :
SUBSCRIBE fm1039
PSUBSCRIBE fm1039

-=-----------------
Redis 事務

基於隊列實現的。multi觸發開啟事務,將事務中所有語句先放到隊列中,
並沒有真正執行,而是需要EXEC觸發命令運行。使用discard命令取消事務。


multi

exec

discard

--------------------
InnoDB 表鎖 行鎖

悲觀鎖

樂觀鎖

----------------------------
Redis 高可用及分布式架構


基於Sentinel的redis高可用集群


端口號規劃:
sentinel:26380
主:6380
從:6381、6382

目錄規劃:
sentinel:/data/26380
主:/data/6380
從:/data/6381 /data/6382


1、準備目錄
mkdir -p /data/638{0..2}
mkdir -p /data/26380


2、準備redis三個節點的配置文件
vim /data/6380/redis.conf

bind 127.0.0.1 10.0.0.7
port 6380
daemonize yes
pidfile /data/6380/redis.pid
loglevel notice
logfile "/data/6380/redis.log"
dbfilename dump.rdb
dir /data/6380

vim /data/6381/redis.conf

bind 127.0.0.1 10.0.0.7
port 6381
daemonize yes
pidfile /data/6381/redis.pid
loglevel notice
logfile "/data/6381/redis.log"
dbfilename dump.rdb
dir /data/6381

vim /data/6382/redis.conf

bind 127.0.0.1 10.0.0.7
port 6382
daemonize yes
pidfile /data/6382/redis.pid
loglevel notice
logfile "/data/6382/redis.log"
dbfilename dump.rdb
dir /data/6382


3、啟動三個redis節點

redis-server /data/6380/redis.conf
redis-server /data/6381/redis.conf
redis-server /data/6382/redis.conf

4、構建主從關系
redis-cli -p 6381
SLAVEOF 127.0.0.1 6380
exit

redis-cli -p 6382
SLAVEOF 127.0.0.1 6380

5、檢查主從關系

redis-cli -p 6381
info replication
exit

redis-cli -p 6382
info replication

6、sentinel構建

vim /data/26380/sentinel.conf

port 26380
dir "/tmp"
sentinel monitor mymaster 127.0.0.1 6380 1
sentinel down-after-milliseconds mymaster 60000
sentinel config-epoch mymaster 0

啟動
redis-sentinel /data/26380/sentinel.conf


---------------------------
Python 3.5在linux安裝

上傳Python-3.5.2.tar.xz軟件到 /server/tools 中

解壓 :
tar xf Python-3.5.2.tar.xz

編譯安裝
cd Python-3.5.2
./configure
make
make install


檢查python版本

python3 --version

--------------------------
安裝redis for python驅動

cd /server/tools
unzip redis-py-master.zip

cd redis-py-master
python3 setup.py install

安裝集群驅動
cd /server/tools
unzip redis-py-cluster-unstable.zip
cd redis-py-cluster-unstable
python3 setup.py install


------------------------------------------
1、python3 連接單機redis:

import redis
r = redis.StrictRedis(host=‘127.0.0.1‘, port=6379,password=‘123‘)
r.get("name")
r.set("name","123")


------------------------------------------------------------
----
sentinel模式:

>>> from redis.sentinel import Sentinel
>>> sentinel = Sentinel([(‘127.0.0.1‘, 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‘)

------------------------------------------------------------------
cluster模式
------
(1) redis-py並沒有提供redis-cluster的支持,去github找了一下,有個叫redis-py-cluster的源碼,
但是和redis-py不是一個作者,地址為:https://github.com/Grokzen/redis-py-cluster
watch,star,fork還算可以。
----
(2) 安裝
Latest stable release from pypi

$ pip install redis-py-cluster
or from source

$ python setup.py install
---
(3) 使用

>>> from rediscluster import StrictRedisCluster
>>> startup_nodes = [{"host": "127.0.0.1", "port": "7000"}]
>>> rc = StrictRedisCluster(startup_nodes=startup_nodes, decode_responses=True)
>>> rc.set("foo", "bar")
True
>>> print(rc.get("foo"))
‘bar‘

=-------------------------------------------
安裝redis cluster

EPEL源安裝ruby支持
yum install ruby rubygems -y

使用國內源
gem sources -a http://mirrors.aliyun.com/rubygems/
gem sources --remove http://rubygems.org/
gem install redis -v 3.3.3


-------------------
準備集群環境:

2、集群節點準備

mkdir /nosql/700{0..5}

vim /nosql/7000/redis.conf

port 7000
daemonize yes
pidfile /nosql/7000/redis.pid
loglevel notice
logfile "/nosql/7000/redis.log"
dbfilename dump.rdb
dir /nosql/7000
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes


vim /nosql/7001/redis.conf
port 7001
daemonize yes
pidfile /nosql/7001/redis.pid
loglevel notice
logfile "/nosql/7001/redis.log"
dbfilename dump.rdb
dir /nosql/7001
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes


vim /nosql/7002/redis.conf
port 7002
daemonize yes
pidfile /nosql/7002/redis.pid
loglevel notice
logfile "/nosql/7002/redis.log"
dbfilename dump.rdb
dir /nosql/7002
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

vim /nosql/7003/redis.conf
port 7003
daemonize yes
pidfile /nosql/7003/redis.pid
loglevel notice
logfile "/nosql/7003/redis.log"
dbfilename dump.rdb
dir /nosql/7003
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes

vim /nosql/7004/redis.conf
port 7004
daemonize yes
pidfile /nosql/7004/redis.pid
loglevel notice
logfile "/nosql/7004/redis.log"
dbfilename dump.rdb
dir /nosql/7004
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes


vim /nosql/7005/redis.conf
port 7005
daemonize yes
pidfile /nosql/7005/redis.pid
loglevel notice
logfile "/nosql/7005/redis.log"
dbfilename dump.rdb
dir /nosql/7005
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes


啟動節點:

redis-server /nosql/7000/redis.conf
redis-server /nosql/7001/redis.conf
redis-server /nosql/7002/redis.conf
redis-server /nosql/7003/redis.conf
redis-server /nosql/7004/redis.conf
redis-server /nosql/7005/redis.conf

[root@db01 ~]# ps -ef |grep redis
root 8854 1 0 03:56 ? 00:00:00 redis-server *:7000 [cluster]
root 8858 1 0 03:56 ? 00:00:00 redis-server *:7001 [cluster]
root 8860 1 0 03:56 ? 00:00:00 redis-server *:7002 [cluster]
root 8864 1 0 03:56 ? 00:00:00 redis-server *:7003 [cluster]
root 8866 1 0 03:56 ? 00:00:00 redis-server *:7004 [cluster]
root 8874 1 0 03:56 ? 00:00:00 redis-server *:7005 [cluster]


3、將節點加入集群管理

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、集群狀態查看

集群主節點狀態
redis-cli -p 7000 cluster nodes | grep master
集群從節點狀態
redis-cli -p 7000 cluster nodes | grep slave

Linux-Redis