1. 程式人生 > >三十七、python學習之Redis資料庫

三十七、python學習之Redis資料庫

一、簡介

1.Nosql:

1.1.什麼是Nosql:

一類新出現的資料庫(not only sql),他的特點:

  • (1)不支援 SQL語法。
  • (2)儲存結構跟傳統的關係型資料庫的那種關係表完全不同,nosql中儲存的資料都是鍵值對的形式。
  • (3)Nosql的世界中沒有一種通用的語言,每種Nosql資料庫都有自己的api和語法,以及擅長的業務場景。
  • (4)Nosql中的產品相當多:
    • Mongodb
    • Redis
    • Hbase hadoop
    • Cassandra hadoop

1.2.Nosql與mysql的比較:

  使用場景不同:sql資料庫適用於關係特別複雜的資料場景,nosql反之。
"事務"特性的支援:sql對事務的支援非常完善,而nosql基本不支援事務。
兩者在不斷的取長補短,呈現融合趨勢。

1.3.Redis簡介:

  Redis是一個開源的使用ANSI C語言編寫的,支援網路,可基於記憶體亦可持久化的日誌型,key-value資料庫,並提供多種語言的API。
Redis是Nosql技術陣營中的醫院,他通過多種鍵值資料型別來適應不同場景下的儲存需求,藉助一些高層的介面使用其可以勝任,如快取、佇列系統的不同角色。

1.4Redis特性:
Redis與其他key-value的產品具有以下三個特點:

  • Redis支援資料的持久化,可以將記憶體中的資料儲存在磁碟中,重啟時可以再次載入進行使用。
  • Redis不僅僅支援簡單的key-value型別的資料,同時還支援list,set,zset,hash等資料結構的儲存。
  • Redis支援資料備份,即master-slave(主-從)模式的資料備份。

1.5.Redis優勢:

  • 效能極高: Redis能讀的速度110000次/秒,寫的速度81000次/秒。
    豐富的資料型別: Redis支援二進位制案例的string,list,hashes,sets以及ordered sets資料型別的操作。
  • 原子: Redis的所有操作都是原子性的,同時Redis還支援對幾個操作完全合併後的原子性執行。
  • 豐富的特性:Redis還支援publish/subscribe,通知,key過期等特性。

1.6.應用場景:

用來做快取(ehcache/memcache): redis的所有資料是存放在記憶體中的(記憶體資料庫)
可以在某些特定應用場景下替代傳統資料庫,如社交應用
在一些大型的系統中,巧妙的實現一些特定的功能:session共享,購物車
只要你有豐富的想象力,redis可以給你無限的驚喜…

1.7.推薦閱讀:

redis官方網站
redis中文官網

二、安裝

2.1.下載:

當前redis最新版是4.0,是一個測試版本,穩定版是3.2
當前ubuntu虛擬機器中已經安裝好redis的,以下步驟跳過,最新穩定版下載連結:
http://download.redis.io/releases/redis-3.2.8.tar.gz

  • step1下載:
wget http://download.redis.io/releases/redis-3.2.8.tar.gz
  • step2解壓:
tar -zxvf redis-3.2.8.tar.gz
  • step3:複製,放到 usr/local目錄下
sudo cp -r ./redis-* /usr/local/redis/
  • step4:進入redis目錄
cd /usr/local/redis/
  • step5:生成
sudo make
  • step6:測試(這段執行時間會比較長)
sudo make test
  • step7:安裝:將redis的命令安裝/usr/local/bin/目錄下
sudo make install
  • step8: 安裝完成後,我們進入目錄/usr/local/bin/中檢視
cd /usr/local/bin
ls -all

常用命令:

redis-server: redis伺服器
redis-cli: redis命令列客戶端
redis-benchmark: redis效能測試工具
redis-check-aof: AOF檔案修復工具
redis-check-rdb: RDB檔案檢索工具

  • step9: 配置檔案,移動到/etc/目錄下
    配置檔案目錄為/usr/local/redis/redis.conf
sudo cp /usr/local/redis/redis.conf /etc/redis/

三、配置

3.1 配置資訊:

路徑/etc/redis/redis.conf
檢視:sudo cat /etc/redis/redis.conf

3.2核心配置選項:

繫結ip:如果需要遠端訪問,可將此行註釋,或繫結一個新的ip
bind 127.0.0.1
埠,預設6379
port 6379
是否以守護程序執行:
如果以守護程序執行,則不會在命令列中阻塞,類似於服務’
如果以非守護程序執行,則當前終端被阻塞
設定為yes表示守護程序,設定no表示非守護程序
推薦設定為yes
daemonize yes
資料檔案:
dbfilename dump.rdb
資料檔案儲存路徑:
dir /var/lib/redis/
日誌檔案:
logfile /var/log/redis/redis-server.log
資料庫,預設16個
database 16
主從複製.類似雙機備份:
slaveof

3.3.參考文件:

redis配置資訊:https://blog.csdn.net/ljphilp/article/details/52934933

四、伺服器和客戶端:

4.1.伺服器端:

伺服器端的命令為:

redis-server

檢視幫助文件:

redis-server --help

推薦是引用服務的方式管理redis

啟動:

sudo service redis start

停止:

sudo service redis stop

重啟:

sudo service restart

個人習慣:

  • 檢視redis服務程序:
ps -ef|grep redis
  • 殺死redis伺服器:
sudo kill -9 pid
  • 指定載入的配置檔案(如果改變了redis的路徑,必須使用這個命令啟動載入配置檔案):
sudo redis-server /etc/redis/redis.conf

4.2.客戶端:

  • 客戶端連線命令:
redis-cli
  • 可以使用help幫助文件:
redis-cli --help
  • 連線redis(預設ip和埠):
redis-cli
  • 執行測試命令:
ping

在這裡插入圖片描述

  • 切換資料庫:
    資料庫沒有名稱,預設有16個,預設是第0個:
select n

在這裡插入圖片描述

五、資料結構:

redis是key-value的資料結構,每一條資料都對應一個鍵值。
鍵的型別是字串,且不能重複
值得型別分為5種:

  • 字串string
  • 雜湊hash:鍵值對中,一個key, 在value中儲存在儲存多個鍵值對
  • 列表list
  • 集合set
  • 有序集合zset

在這裡插入圖片描述

六、字元資料型別的操作:

中文命令文件
Redis命令參考文件

1.string型別:

字串型別是Redis中最為基礎的資料儲存型別,它在Redis中是二進位制安全的,這就意味著該型別可以接受任何格式的資料,如jpeg影象或json物件的描述資訊等。在Redis中字串型別的Value最多可以容納的資料長度是512M。

1.1.儲存:

如果設定的鍵不存在則為新增,如果設定的鍵已經存在則為修改

1.1.1設定鍵值:

set key value

例如:設定鍵為name,值為iycast的資料:

set name itcast

在這裡插入圖片描述

1.1.2設定鍵值以及過期時間,以秒為單位:

setex key seconds valu

例:設定鍵aa,值為bb,過期時間為10

setex aa 10 bb

1.1.3設定多個鍵值

mset key1 value1 key2 vlaue2 …

例如:設定a1值為python,a2值為java,a3值為c
在這裡插入圖片描述

1.1.4追加值

append key value

例如:往a1的值後面追加一個哈哈
在這裡插入圖片描述

1.2 獲取:

1.2.1 獲取:根據鍵獲取值.如果不存在此鍵返回nil

get key
例如:
在這裡插入圖片描述

1.2.2 獲取多個鍵的多個值

mget key1 key2 …

例如:
在這裡插入圖片描述

3 鍵命令:

3.1 查詢建:引數支援正則表示式:

keys pattern
例1:查詢所有鍵:

keys *

在這裡插入圖片描述
例2:檢視名稱中包含a的鍵

keys 'a*'

分別是:以a開頭, 以a結尾, 包含a
在這裡插入圖片描述

232 判斷鍵是否存在,如果存在返回1, 不存在返回0:

exists key

在這裡插入圖片描述
3.3 檢視鍵對應值得型別:

type key

3.4 刪除鍵及對應的值:

del key1 key2 …

例如:刪除a2,a3

del a2 a3

在這裡插入圖片描述

3.5 設定過期時間,以秒為單位

如果沒有指定過期時間則一直存在,直到使用del一出

expire key seconds

例如:設定鍵a1的過期時間為三秒

expire a1 3

3.6 檢視過期剩餘時間,以秒為單位,不過期則為-1:

ttl key

在這裡插入圖片描述

七、redis資料型別_hash:

1…hash型別:

hash用於儲存物件,物件的結構為屬性、值
值得型別為string

2.增加,修改:

2.1設定單個屬性:

hset key field value

例如:設定user的屬性name的值為itheima

hset user name itheima

在這裡插入圖片描述
提示:
  Redis被設定為儲存資料庫快照,但它目前不能持久化到硬碟.用來修改集合資料的命令不能用。
原因:
  強制關閉Redis快照導致不能持久化的解決方案:
執行config set stop-writes-on9bgsave-error no 命令後,關閉配置項stop-writes-on9bgsave-error解決該問題。
2.2 設定多個屬性:

hmset key field1 value1 field2 value2 …

例如:設定鍵u2的屬性name為itcast,屬性age為11

hmset u2 name itcast age 11

在這裡插入圖片描述

3.獲取:

3.1 獲取指定件的所有屬性:

hkeys key

例如:獲取u2的所有屬性

hkeys u2

在這裡插入圖片描述

3.2獲取一個屬性的值:

hget key field

例如:獲取u2中的name的值
在這裡插入圖片描述

3.3 獲取多個屬性的值:

hmget key field1 field2…

例如:獲取u2的name和age

hmget u2 name aged

在這裡插入圖片描述

3.4獲取所有的屬性值:

hvals key

獲取所有u2所有屬性的值

hvals u2

在這裡插入圖片描述

4.刪除:

4.1 刪除整個hash鍵及值,使用del key

4.2 刪除屬性,屬性對應的值會被一起刪除:

hdel key field1 field2 …

例如:刪除u2的屬性age

hdel u2 age

在這裡插入圖片描述

七、redis資料型別_list:

1.list型別:

列表的元素為string
按照插入順序排序

2.增加:

2.1在左側插入資料

lpush key value1 value2 …

例如:從鍵a1的列表左側加入資料a,b,c:

lpush aa a b c

在這裡插入圖片描述

2.2 在右側插入資料:

rpush key value1 value2 …

例如:從鍵aa的列表右側插入資料,x,y,z

rpush aa x y z

在這裡插入圖片描述

2.3在指定元素的前或後插入資料:

linsert key before/after 現有元素 新元素

例:在鍵aa的列表中元素b前加入一個元素3

linsert aa before b 3

在這裡插入圖片描述

3. 獲取:

3.1返回了表裡指定範圍內的元素:

start、stop為元素的下標索引
索引從左往右,第一個元素為0
索引可以為負數,表示從尾部開始

lrange key start stop

例4:獲取鍵aa列表內的所有元素:

lrange aa 0 -1

在這裡插入圖片描述

4.設定指定索引位置的元素值:

4.1索引從左側開始,第一個元素為0

索引可以為負數,表示尾部開始,如-1表示最後一個元素

lset key index value

例如:修改鍵aa的列表中下標為2的元素的值為p

iset aa 2 p

在這裡插入圖片描述
5.刪除:
5.1刪除指定元素:
將列表中前count次出現的值為value的元素移除

count>0:從頭開始刪
count<0:從尾開始刪
count=0:刪除所有

例如:向列表bb中加入元素a,b,b,a,a,b

lpush bb a b b a a b

從列表bb右側開始刪除兩個b

lrem bb -2 b

檢視列表bb中的所有元素

lrange bb 0 -1

在這裡插入圖片描述

八、redis資料型別_set型別:

1.set型別:

無需集合
元素為string型別
元素具有唯一性,不重複
說明:對於集合沒有修改操作

2.增加:

2.1新增元素:

sadd key member1 member2 …

例如:向cc集合中新增元素’zhangsan’ ‘lisi’ ‘wangwu’

sadd cc 'zhangsan' 'lisi' 'wangwu'

3.獲取:

3.1返回所有元素

smembers key

例如:獲取cc集合中的所有元素

smembers cc

在這裡插入圖片描述

4.刪除:

4.1刪除指定元素:

srem key member1 member2 …

例如:刪除cc集合中的’wangwu’

srem cc 'wangwu'

在這裡插入圖片描述

八、redis資料型別_zset型別:

1.zset型別:

  • sorted set,有序集合
  • 元素為string型別
  • 元素具有唯一性,不重複
  • 每一個元素都會關聯一個double型別的score,表示權重,通過權重將元素從小到大排序

說明:沒有修改操作

2.增加:

zadd key score1 member1 score2 member2 …

例如:向鍵dd的集合中新增元素’lisi’ ‘zhaoliu’ ‘zhangsan’ ‘wangwu’,權重分別為4,5,6,3

zadd dd  4 'lisi' 5 'zhaoliu' 6 'zhangsan' 3 'wangwu'

在這裡插入圖片描述

3.獲取:

3.1獲取:

  • 返回指定範圍內的元素
  • strat,stop為元素的下標索引
  • 索引從左側開始,第一個索引為0
  • 索引可以是負數,表示從尾部開始計數

zrange key start stop

例如:獲取鍵dd集合中的所有元素

zrange dd 0 -1

在這裡插入圖片描述

3.2 返回score值在min和max之間的成員

zrangebyscore key min max

例如:獲取鍵dd集合中權值在5和6之間的成員

zrangebyscore dd 5 6

在這裡插入圖片描述

3.3返回成員mamber的score的值

zscore key member

例如:獲取鍵dd中集合元素’zhangsan’的權重

zscore dd 'zhangsan'

在這裡插入圖片描述

4.刪除:

4.1刪除指定元素:

zrem key member1 member2 …

例如:刪除集合’dd’集合中元素’zhangsan’

zrem dd 'zhangsan'

4.2刪除權重在指定範圍內的元素:

zrembyscore key min max

例如:在鍵dd集合中刪除權值在5和6之間的元素

zrembyscore dd 5 6

九、redis_python和redis互動:

1.安裝:

安裝Redis的3中方式https://github.com/andymccurdy/redis-py
第一種:進入虛擬環境,聯網安裝redis

pip install redis

第二種: 進入虛擬環境.聯網安裝redis

easy_install redis

第三種:到中文官網-客戶端下載redis包的原始碼,使用原始碼安裝:

wget https://github.com/andymccurdy/redis-py/archive/master.zip
unzip master.zip
cd redis-py-master
sudo python setup.py install

2.呼叫模組:

2.1 引入模組

from redis import *

這個模組中提供了StrictRedis物件(Strict嚴格),用於連線redis伺服器,並按照不同型別提供不同的方法,進行互動操作。

十、StrictRedis物件方法:

1.建立連線:

通過init建立物件,指定引數host,port與指定的伺服器和埠連線,host預設為localhost,port預設為6379,db預設為0:

sr = StrictRedis(host = 'localhost', port = 6379, db = 0)

簡寫為:

sr = StrictRedis()

根據不同的型別,擁有不同的例項方法,與前面學習redis方法對應,方法需要的引數與命令的引數一致。

2.String:

  • set
  • setex
  • mset
  • append
  • get
  • mget
  • key

3. keys:

  • exists
  • type
  • delete
  • expire
  • getrange
  • ttl

4. hash

  • hset
  • hmset
  • hkey
  • hget
  • hmget
  • hvals
  • hdel

5. list:

  • lpush
  • rpush
  • linsert
  • lrange
  • lset
  • lrem

6. set:

  • sadd
  • smembers
  • srem

7.zset:

  • zadd
  • zrange
  • zrangebyscore
  • zscore
  • zrem
  • zremrangebyscore

8. redis.py參考文件:

http://python.jobbole.com/87305

9.python實現redis互動:

#-*-coding:utf-8-*-
from redis import StrictRedis

def main():
    # 建立一個StrictRedis物件,連結redis資料庫
    try:
        sr = StrictRedis() 
        
        # 新增一個key為name,value為itcast
        res = sr.set('name', 'itcast')
        print(res)

        #獲取name
        gg = sr.get('name')
        print(gg)

        # 修改name的值為itheima
        res = sr.set("itheima")
        print(res)

        # 刪除name及對應的值,可以刪除多個鍵值
        res = sr.delete('name') # 返回的是被操作的個數
        print(res)

        # 使用鍵命令獲取所有的鍵值
        res = sr.keys()
        print(res)  # 返回的是一個列表

    except Exception as e:
        print(e)

if __name__ == '__main__':
    main()

10.Flask使用Redis儲存session:

# 導包
from flask import Flask, session
from redis import StrictRedis
# 使用flask_session的擴充套件包
from flask_session import Session

app = Flask(__name__)

# 設定配置屬性
app.config['SECRET_KEY'] = "FDKHJFDBVJLDKJBFGGFSVLFKVB"
# 使用session累的配置資訊
app.config['SESSION_TYPE'] = "redis"
app.config['SESSION_REDIS'] = StrictRedis(host="127.0.0.1", port=6379)
app.config['SESSION_USE_SIGNER'] = True
# 設定Flask預設的config配置物件中的session有效期(單位:秒)
app.config['PERMANENT_SESSION_LIFETIME'] = 3600

#   使用Session類和程式例項進行關聯
Session(app)

@app.route("/")
def index():
    session["itcast"] = "20181024"
    return "hello worls"

if __name__ == '__main__':
    app.run(debug=True)

十一、Redis主從概念:

1.主從概念:

  一個master可以擁有多個slave, 一個slave又可以擁有多個slave, 如此下去, 形成一個強大的多級伺服器叢集架構。
  master用來寫資料, slave用來讀資料,經統計, 網站的讀寫比率是10:1。
  通過主從配置可以實現讀寫分離。
在這裡插入圖片描述
master和slave都是一個redis例項(redis服務)

2.主從配置:

### 2.1 配置主:
檢視當前主機的ip地址:

ifconfig

在這裡插入圖片描述
修改redis’的配置檔案:

sudo vi /etc/redis/redis.conf
bind 192.168.63.130

儲存 -->退出
重啟redis服務

sudo service redis stop
redis-server /etc/redis/redis.conf

2.2 配置從(本機):

複製/etc/redis/redis.conf檔案

sudo cp redis.conf ./slave.conf

修改redis/slave.conf檔案

sudo vi slave.conf

編輯內容:

bind 192.168.63.130	# 繫結本機的ip地址
slaveof 162.168.63.130 6379	# 主服務的ip和port
port 6378	# 啟動一個與主服務不同的埠

啟動服務:

sudo redis-server /etc/redis/slave.conf

檢視主從關係:

redis-cli -h 192.168.63.130 info Replication

在這裡插入圖片描述

3.資料操作:

在master和slave分別執行info命令,檢視輸出資訊,進入主客戶端:

redis-cli -h 192.168.63.130 -p 6379

進入從客戶端:

redis-cli -h 192.168.63.130 -p 6378

在master上寫資料

set name itcast

在這裡插入圖片描述
在slave上讀資料:

get name

在這裡插入圖片描述

但是不能再slave上寫資料,slave是隻讀的

十二、redis_叢集概念:

1.為什麼要有叢集:

資料訪問量過大時的伺服器負擔,提高效能

2.叢集的概念:

集運是一組相互獨立的,通過高速網路互連的計算機,他們構成了一個組,並以單一系統的模式加以管理。一個客戶與叢集相互作用時,叢集像是一個獨立的伺服器。叢集配置是用於提高可用性和可縮放性的。
當請求到來首先由負載均衡伺服器處理,把請求轉發到另外的一臺伺服器上。

3.redis叢集:

3.1 分類:

軟體層面:
只有一臺電腦,在這臺電腦上啟動多個redis服務。
硬體層面:
存在多臺實體機,每臺電腦上啟動一個redis服務或者多個redis服務。

十三、搭建叢集:

1.參考閱讀:

redis叢集搭建: http://www.cnblogs.com/wuxl360/p/5920330.html
[python]搭建redis叢集 http://blog.5ibc.net/p/51020.html

2.步驟:(例如在192.168.63.130)

2.1在conf目錄下建立7000.conf,編輯內容如下:

port 7000
bind 172.168.62.130
daemonize yes        # 作為守護程序,在後臺執行
pidfile 7000.pid        # 程序的id寫到7000.pid檔案中
cluster-enable yes    # 這個可以作為叢集的節點
cluster-config-file 7000_node.conf        # 叢集的節點的配置檔案
cluster-node-timeout 15000        # 叢集節點的超時時間
appendonly yes        # 微端新增

在config目錄下建立7001.config,編輯內容如下:

port 7001
bind 172.168.62.130
daemonize yes
pidfile 7001.pid
cluster-enable yes
cluster-config-file 7001_node.conf
cluster-node-timeout 15000
appendonly yes

在config目錄下建立7002.config,編輯內容如下:

port 7002
bind 172.168.62.130
daemonize yes
pidfile 7002.pid
cluster-enable yes
cluster-config-file 7002_node.conf
cluster-node-timeout 15000
appendonly yes

這三個檔案區別在於port、pidfile、cluster-config-file這三個檔案

2.2 使用配置檔案啟動redis伺服器

redis-server 7000.conf
redis-server 7001.conf
redis-server 7002.conf

2.3 在另一臺電腦(172.168.179.142)上的conf目錄下建立7003.conf,編輯內容如下:

port 7003
bind 172.168.179.142
daemonize yes        # 作為守護程序,在後臺執行
pidfile 7003.pid        # 程序的id寫到7003.pid檔案中
cluster-enable yes    # 這個可以作為叢集的節點
cluster-config-file 7003_node.conf        # 叢集的節點的配置檔案
cluster-node-timeout 15000        # 叢集節點的超時時間
appendonly yes        # 微端新增

在config目錄下建立7001.config,編輯內容如下:

port 7004
bind 172.168.179.142
daemonize yes
pidfile 7004.pid
cluster-enable yes
cluster-config-file 7004_node.conf
cluster-node-timeout 15000
appendonly yes

在config目錄下建立7002.config,編輯內容如下:

port 7005
bind 172.168.179.142
daemonize yes
pidfile 7005.pid
cluster-enable yes
cluster-config-file 7005_node.conf
cluster-node-timeout 15000
appendonly yes

這三個檔案區別在於port、pidfile、cluster-config-file這三個檔案.

2.4 使用配置檔案啟動redis伺服器

redis-server 7003.conf
redis-server 7004.conf
redis-server 7005.conf

3.建立叢集:

### 3.1 redis的安裝包中包含了redis-trib.rb, 用於建立叢集

3.2 接下來在第一臺機器(192.168.63.130)上操作:

將命令複製,這樣可以在任何目錄下執行:

sudo cp /usr/share/doc/redis-tools/examples/redis-trib.rb /ur/local/bin

因為redis的這個命令使用ruby開發的,所以安裝ruby環境

sudo apt-get install ruby

顯示提示資訊輸入y,按回車繼續安裝:
在這裡插入圖片描述

3.3 執行如下命令建立叢集:

redis-trib.rb create --replicas 1 172.168.62.130:7000 172.168.62.130:7001 172.168.62.130:7002 172.168.179.142:7003 172.168.179.142:7004 172.168.179.142:7005

(這個命令是:每個節點配置一個從屬服務,將以上地址配置成一個叢集,這樣一個主服務配備一個從服務,一共隨機形成3個節點)
執行上面命令在某些情況下會報錯,主要原因是由於安裝的ruby不是最新版本
天朝的防火牆導致無法下載最新版本,所以需要設定一下gem的源
解決辦法如下:

  • 先檢視自己的gem源是什麼地址
gem source -l	# 如果是https://rubygems.org/需要換源
  • 更新命令
gem source --add https://gems.ruby-china.org/ --remove https://rubygems.org/
  • 通過gem安裝redis的相關依賴
sudo gem install redis
  • 然後重新執行命令"建立叢集"

4.資料驗證:

4.1 根據例子可以看出.

當前搭建的主伺服器為7001,7000,7003,對應的從伺服器7004,7005,7002
在172.168.62.130機器上連線7002,加引數-c表示連線到叢集

redis-cli -h 172.168.62.130 -c -p 7002

寫入資料:

set name itcast

自動跳轉到7003伺服器,並寫入資料
在這裡插入圖片描述