首先看個案例
不管是電商網站仍是支付系統,都離不開數據的存儲和增刪改查,在這種狀況下,每一次登陸、訪問等都會訪問,這樣會給數據庫形成很大的壓力,當數據庫沒法支撐太高的訪問量,輕則影響用戶體驗,重則致使數據庫宕機,網站沒法訪問。
如何解決數據庫壓力過大的問題呢?python
下面主要針對redis等nosql數據庫進行介紹。linux
對於NoSQL並無一個明確的範圍和定義,可是他們都廣泛存在下面一些共同特徵:redis
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
make
編譯過程當中會報錯。使用yum install gcc
安裝,默認會安裝gcc及對應的依賴包便可。jemalloc
memory allocator
是jemalloc
,若未安裝會出現下面報錯信息
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支持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
只有一個,第二次添加將被忽略。
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須要安裝對應的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相關內容能夠點擊查看官方文檔。