標籤:串連池 磁碟 php return pip nsa file __name__ 接收
非關係型資料庫和關係型資料庫的差別:
非關係型資料庫的優勢:
效能NOSQL是基於索引值對的,可以想象成表中的主鍵和值的對應關係,而且不需要經過SQL層的解析,所以效能非常高。
可擴充性同樣也是因為基於索引值對,資料之間沒有耦合性,所以非常容易水平擴充。
關係型資料庫的優勢:
複雜查詢可以用SQL語句方便的在一個表以及多個表之間做非常複雜的資料查詢。
事務支援使得對於安全效能很高的資料訪問要求得以實現。對於這兩類資料庫,對方的優勢就是自己的弱勢,反之亦然。但是近年來這兩種資料庫都在向著另外一個方向進化。
例如:NOSQL資料庫慢慢開始具備SQL資料庫的一些複雜查詢功能的雛形,比如Couchbase的index以及MONGO的複雜查詢。對於事務的支援也可以用一些系統級的原子操作來實現例如樂觀鎖之類的方法來曲線救國。
SQL資料庫也開始慢慢進化,比如HandlerSocker技術的實現,可以在MYSQL上實現對於SQL層的穿透,用NOSQL的方式訪問資料庫,效能可以上可以達到甚至超越NOSQL資料庫。可擴充性上例如Percona Server,可以實現無中心化的叢集。雖然這兩極都因為各自的弱勢而開始進化出另一極的一些特性,但是這些特性的增加也會消弱其本來具備的優勢,比如Couchbase上的index的增加會逐步降低資料庫的讀寫效能。
redis的概念:
redis是一個key-value儲存系統。
和Memcached類似,它支援儲存的value類型相對更多,包括string(字串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(雜湊類型)。
這些資料類型都支援push/pop、add/remove及取交集並集和差集及更豐富的操作,而且這些操作都是原子性的。
在此基礎上,redis支援各種不同方式的排序。與memcached一樣,為了保證效率,資料都是緩衝在記憶體中。區別的是redis會周期性的把更新的資料寫入磁碟或者把修改操作寫入追加的記錄檔案,並且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高效能的key-value資料庫。
redis的出現,很大程度補償了memcached這類key/value儲存的不足,在部 分場合可以對關聯式資料庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等用戶端,使用很方便。
Redis支援主從同步。資料可以從主伺服器向任意數量的從伺服器上同步,從伺服器可以是關聯其他從伺服器的主伺服器。
這使得Redis可執行單層樹複製。存檔可以有意無意的對資料進行寫操作。由於完全實現了發布/訂閱機制,使得從資料庫在任何地方同步樹時,可訂閱一個頻道並接收主伺服器完整的訊息發布記錄。同步對讀取操作的可擴充性和資料冗餘很有協助。
Redis的安裝:
redis中文網: http://www.redis.net.cn/
[[email protected] opt]# wget http://download.redis.io/releases/redis-3.0.6.tar.gz[[email protected] opt]# tar zxvf redis-3.0.6.tar.gz -C /usr/local/src/[[email protected] opt]# cd !$cd /usr/local/src/[[email protected] src]# lspip-1.3.1.tar.gz Python-2.7.14 redis-3.0.6[[email protected] src]# cd redis-3.0.6/[[email protected] redis-3.0.6]# ls00-RELEASENOTES CONTRIBUTING deps Makefile README runtest runtest-sentinel src utilsBUGS COPYING INSTALL MANIFESTO redis.conf runtest-cluster sentinel.conf tests[[email protected] redis-3.0.6]# makecd src && make all...[[email protected] redis-3.0.6]# src/redis-server &[1] 50007[[email protected] redis-3.0.6]# 50007:C 28 Nov 08:53:03.999 # Warning: no config file specified, using the default config. In order to specify a config file use src/redis-server /path/to/redis.conf50007:M 28 Nov 08:53:04.000 * Increased maximum number of open files to 10032 (it was originally set to 1024).50007:M 28 Nov 08:53:04.001 # Creating Server TCP listening socket *:6379: bind: Address already in use[1]+ Exit 1 src/redis-server[[email protected] redis-3.0.6]# ps aux|grep redisroot 8345 0.1 0.4 143920 8004 ? Sl Nov27 1:43 ./src/redis-server *:6379root 50009 0.0 0.0 103320 884 pts/1 S+ 08:53 0:00 grep redis[[email protected] redis-3.0.6]# netstat -nlp|grep redistcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 8345/./src/redis-se tcp 0 0 :::6379 :::* LISTEN 8345/./src/redis-se [[email protected] redis-3.0.6]#
python 操作redis
安裝redis模組
[[email protected] redis-3.0.6]# pip install redisCollecting redis Using cached redis-2.10.6-py2.py3-none-any.whlInstalling collected packages: redisSuccessfully installed redis-2.10.6
redis.Redis 串連資料庫
set()方法 :寫入一條資料
get(key) 方法: 擷取key 對應的值
key() 方法: 擷取所有的key
import redis as redisredis_info = { ‘host‘:‘11.11.11.11‘, ‘port‘:6379}r = redis.Redis(**redis_info) # 建立redis 串連r.set(‘name‘,‘lijunjiang‘) # r.set() 寫入一條資料 redis經key-value形式儲存r.get(‘name‘) # r.get(key-name) 擷取key-name 對應的值print(r.key()) # r.key 擷取所有的鍵########C:\Python27\python.exe D:/Python/redis/redis_Redis.pylijunjiang[‘name‘]Process finished with exit code 0
redis.ConnectionPool() 方法: 管理對一個redis server的所有串連 ,可以避免每次建主、釋放串連的開銷
預設,每個Redis執行個體都會維護一個自己的串連池。可以直接建立一個串連池,然後作為參數Redis,這樣就可以實現多個Redis執行個體共用一個串連池
import redis as redisredis_info = { ‘host‘:‘11.11.11.11‘, ‘port‘:6379}pool = redis.ConnectionPool(**redis_info) # 建立一個redis 串連池r = redis.Redis(connection_pool=pool) # 從串連池裡擷取串連r.set(‘age‘,15)print(r.get(‘age‘))print(r.keys())#######C:\Python27\python.exe D:/Python/redis/redis_Redis.py15[‘age‘, ‘name‘]Process finished with exit code 0
redis 管道
redis-py預設在執行每次請求都會建立(串連池申請串連)和斷開(歸還串連池)一次串連操作,如果想要在一次請求中指定多個命令,則可以使用pipline實現一次請求指定多個命令,並且預設情況下一次pipline 是原子性操作
redis是一個cs模式的tcp server,使用和http類似的請求響應協議。一個client可以通過一個socket串連發起多個請求命令。每個請求命令發出後client通常會阻塞並等待redis服務處理,redis處理完後請求命令後會將結果通過響應報文返回給client
#!/usr/bin/env python# -*- coding:utf-8 -*-# @Time : 2017/11/28 22:48# @Author : lijunjiang# @File : redis-pipeline.pyimport datetimeimport redisredis_info = { ‘host‘: ‘11.11.11.11‘, ‘port‘: 6379}def conncet_redis(): pool = redis.ConnectionPool(**redis_info) try: r = redis.Redis(connection_pool=pool) except Exception as err: raise err return rdef withpipe(r): # r = conncet_redis() pipe = r.pipeline(transaction=True) for i in xrange(1,1000): key = "test1" + str(i) value = "value"+str(i) pipe.set(key, value) pipe.execute()def withoutpipe(r): # r = conncet_redis() for i in xrange(1,1000): key = "test1" + str(i) value = "value"+str(i) r.set(key, value)def time(fun): r = conncet_redis() start = datetime.datetime.now() fun(r) end = datetime.datetime.now() run_time = (end-start).microseconds return run_timeif __name__ == ‘__main__‘: # r1 = conncet_redis() # r2 = conncet_redis() withpipe_time = time(withpipe) withoutpipe_time = time(withoutpipe) print("withpipe run time:{0}".format(withpipe_time)) print("withoutpipe run time: {0}".format(withoutpipe_time))###################C:\Python27\python.exe D:/Python/redis/redis-pipeline.pywithpipe run time:19000withoutpipe run time: 203000Process finished with exit code 0
python Nosql-redis 串連、管道