python第19次課

python訪問redis

首先看個案例
不管是電商網站仍是支付系統,都離不開數據的存儲和增刪改查,在這種狀況下,每一次登陸、訪問等都會訪問,這樣會給數據庫形成很大的壓力,當數據庫沒法支撐太高的訪問量,輕則影響用戶體驗,重則致使數據庫宕機,網站沒法訪問。
如何解決數據庫壓力過大的問題呢?python

  1. 優化應用程序,減小數據庫的鏈接數,儘可能使用數據庫鏈接池。
  2. 使用消息隊列,常見的有RabbitMQ,ActiveMQ,Kafka,RocketMQ等。
  3. 經過使用redis等緩存數據,分擔數據庫讀壓力,同時直接從內存讀數據速度更快。

下面主要針對redis等nosql數據庫進行介紹。linux

nosql介紹

特徵

對於NoSQL並無一個明確的範圍和定義,可是他們都廣泛存在下面一些共同特徵:redis

  1. 不須要預約義模式:不須要事先定義數據模式,預約義表結構。數據中的每條記錄均可能有不一樣的屬性和格式。當插入數據時,並不須要預先定義它們的模式。
  2. 無共享架構:相對於將全部數據存儲的存儲區域網絡中的全共享架構。NoSQL每每將數據劃分後存儲在各個本地服務器上。由於從本地磁盤讀取數據的性能每每好於經過網絡傳輸讀取數據的性能,從而提升了系統的性能。
  3. 彈性可擴展:能夠在系統運行的時候,動態增長或者刪除結點。不須要停機維護,數據能夠自動遷移。
  4. 分區:相對於將數據存放於同一個節點,NoSQL數據庫須要將數據進行分區,將記錄分散在多個節點上面。而且一般分區的同時還要作複製。這樣既提升了並行性能,又能保證沒有單點失效的問題。
  5. 異步複製:和RAID存儲系統不一樣的是,NoSQL中的複製,每每是基於日誌的異步複製。這樣,數據就能夠儘快地寫入一個節點,而不會被網絡傳輸引發遲延。缺點是並不老是能保證一致性,這樣的方式在出現故障的時候,可能會丟失少許的數據。
  6. BASE:相對於事務嚴格的ACID特性,NoSQL數據庫保證的是BASE特性。BASE是最終一致性和軟事務。
    NoSQL數據庫並無一個統一的架構,兩種NoSQL數據庫之間的不一樣,甚至遠遠超過兩種關係型數據庫的不一樣。能夠說,NoSQL各有所長,成功的NoSQL必然特別適用於某些場合或者某些應用,在這些場合中會遠遠賽過關係型數據庫和其餘的NoSQL

    經常使用的nosql數據庫

    臨時性鍵值存儲|永久性鍵值存儲|面向文檔的數據庫|面向列的數據庫
    -|:-:|:-:|:-:|
    Memcached|Tokyo Tyrant|MangoDB|Cassandra
    Redis|Flare|CouchDB|HBase
     |ROMA||HyperTable
     |Redis||

    redis安裝和配置

    安裝

    redis主要用於linux下,下面centos7下面安裝最新版本redis-4.0.9。
    1
    2
    3
    4
    5
    wget http://download.redis.io/releases/redis-4.0.9.tar.gz
    tar xzf redis-4.0.9.tar.gz
    cd redis-4.0.9/
    make
    cd src && make all

安裝過程當中報錯說明sql

  • 未安裝gcc編譯工具
    redis基於C語言編寫,須要使用gcc等編譯工具,若未安裝,在make編譯過程當中會報錯。使用yum install gcc安裝,默認會安裝gcc及對應的依賴包便可。
  • 未安裝jemalloc
    默認狀況下redis的memory allocatorjemalloc,若未安裝會出現下面報錯信息
    1
    2
    3
    4
    5
    6
    7
    zmalloc.h:50:31: fatal error: jemalloc/jemalloc.h: No such file or directory
     #include <jemalloc/jemalloc.h>
                                   ^
    compilation terminated.
    make[1]: *** [adlist.o] Error 1
    make[1]: Leaving directory `/usr/local/src/redis-4.0.9/src'
    make: *** [all] Error 2

能夠設置使用libc malloc,編譯的時候使用make MALLOC=libc便可。
具體更多內容能夠參見redis解壓目錄下的redis.MD文件中Allocator部分。mongodb

配置

redis能夠單機多實例,經過修改配置文件,不一樣實例使用不一樣的配置文件和端口號便可。
下面配置文件統一存放在conf目錄中。數據庫

1
2
3
4
5
cd /usr/local/src/   
mv redis-4.0.9 redis    #目錄重命名,取消版本信息
cd redis
mkdir conf     #新建配置文件目錄,統一存放配置文件
cp redis.conf conf/redis_6379.conf    #配置文件,以端口號命名

 

修改redis_6379.conf文件,默認該配置項爲no,修改成yes。
該參數表示是否使用守護線程的方式啓動。
當設置爲yes時,表示開啓守護進程模式。該模式下,redis在後臺運行,並將進程pid寫入至配置文件中設置的pidfile中,此時redis將一直運行,除非手動kill該進程。
當設置爲no時,當前界面將進入redis的命令行界面,ctrl+c強制退出或者關閉鏈接工具都會致使redis進程退出。centos

1
daemonize yes

 

啓動緩存

1
redis-server /usr/local/src/redis/conf/redis_6379.conf

 

確認是否啓動
經過進程確認安全

1
2
3
[root@VM_0_4_centos conf]# ps aux|grep redis
root     25841  0.0  0.1 141772  1976 ?        Ssl  23:26   0:00 redis-server 127.0.0.1:6379
root     25856  0.0  0.0 112644   964 pts/1    R+   23:26   0:00 grep --color=auto redis

 

經過端口號確認服務器

1
2
[root@VM_0_4_centos conf]# netstat -lntp |grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      25841/redis-server

 

redis數據類型

redis支持5種數據類型,分別是String(字符串)、List(列表)、Hash(字典)、Set(集合)、Sorted Set(有序集合)。
本質上來講,redis存儲的是key-value對,其中key是字符串,對應的value類型決定了redis的數據類型。

  • String(字符串)
    string是redis最基本的類型,其基本模型也是一個key對應一個value。
    string類型是二進制安全的。也就是說redis的string能夠包含任何數據。好比jpg圖片或者序列化的對象 。
    string類型是Redis最基本的數據類型,一個鍵最大能存儲512MB。

    1
    2
    3
    4
    127.0.0.1:6379> SET name "xiaohh"
    OK
    127.0.0.1:6379> GET name
    "xiaohh"
  • List(列表)
    Redis 列表是簡單的字符串列表,按照插入順序排序。你能夠添加一個元素到列表的頭部(左邊)或者尾部(右邊)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    127.0.0.1:6379> lpush xiaohh redis
    (integer) 1
    127.0.0.1:6379> lpush xiaohh mongodb
    (integer) 2
    127.0.0.1:6379> lpush xiaohh rabitmq
    (integer) 3
    127.0.0.1:6379> lrange xiaohh 0 2
    1) "rabitmq"
    2) "mongodb"
    3) "redis"
  • Hash(字典)
    Redis hash 是一個鍵值(key=>value)對集合。
    Redis hash是一個string類型的field和value的映射表,hash特別適合用於存儲對象。

    1
    2
    3
    4
    5
    6
    127.0.0.1:6379> HMSET myhash fileld1 "Hello" fileld2 "World"
    OK
    127.0.0.1:6379> HGET myhash fileld1
    "Hello"
    127.0.0.1:6379> HGET myhash fileld2
    "World"
  • Set(集合)
    Redis的Set是string類型的無序集合。
    集合是經過哈希表實現的,因此添加,刪除,查找的複雜度都是O(1)。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    27.0.0.1:6379> sadd type redis
    (integer) 1
    127.0.0.1:6379> sadd type mongodb
    (integer) 1
    127.0.0.1:6379> sadd type rabbitmq
    (integer) 1
    127.0.0.1:6379> sadd type rabbitmq
    (integer) 0
    127.0.0.1:6379> smembers type
    1) "rabbitmq"
    2) "mongodb"
    3) "redis"

因爲Set中元素具備惟一性的,因此重複添加的rabbitmq只有一個,第二次添加將被忽略。

  • Sorted Set(有序集合)
    Redis zset 和 set 同樣也是string類型元素的集合,且不容許重複的成員。
    不一樣的是每一個元素都會關聯一個double類型的分數。redis正是經過分數來爲集合中的成員進行從小到大的排序。
    zset的成員是惟一的,但分數(score)卻能夠重複。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    127.0.0.1:6379> zadd  type1 0 redis
    (integer) 1
    127.0.0.1:6379> zadd type1 3 mongodb
    (integer) 1
    127.0.0.1:6379> zadd type1 2 rabbitmq
    (integer) 1
    127.0.0.1:6379> zadd type1 2 rabbitmq
    (integer) 0
    127.0.0.1:6379> ZRANGEBYSCORE type1 0 10
    1) "redis"
    2) "rabbitmq"
    3) "mongodb"

python訪問redis

python訪問redis須要安裝對應的redis包。

1
pip install redis

 

redis鏈接池
redis-py使用connection pool來管理對一個redis server的全部鏈接,避免每次創建、釋放鏈接的開銷。
默認,每一個Redis實例都會維護一個本身的鏈接。能夠直接創建一個鏈接池,而後做爲Redis參數,這樣就能夠實現多個Redis實例共享一個鏈接池。
鏈接redis服務器
鏈接redis服務器須要提供redis服務器的地址和端口號,默認端口號爲6379。

1
2
3
4
5
6
import redis

pool = redis.ConnectionPool(host="118.24.18.158", port="6379")
r = redis.Redis(connection_pool=pool)
r.set("name", "xiaohh")
print(r.get("name"))    #輸出結果:"xiaohh"

 

經過python對redis數據庫進行操做,首先創建redis的鏈接,而後對不一樣的數據類型採用不一樣的方法進行操做。
具體操做方法下次介紹。
更多redis相關內容能夠點擊查看官方文檔

相關文章
相關標籤/搜索