24 對 python-memcache 分布式散列和調用的實現
Python實戰-從菜鳥到大牛的進階之路 作者:極客學院 投票推薦 加入書簽 留言反饋
煮酒品茶:對 python-memcache 進行學習,把分布式 hash 算法加進去,不說線上自己玩玩的程序可以加到裏麵去。memcached 讀存數據就這些東西,看著補。
分布式一致性 hash 算法:memcache_ring.py
#coding:utf8import hash_ringimport memcachememcache_servers = [''127.0.0.1:11211'']weights = {''127.0.0.1:11211'':1}ring = hash_ring.hashring(memcache_servers,weights) #if value is null then get else setdef mc(key,value="null-0"): server_node = ring.get_node(key) mc = memcache.client([server_node],debug=1) if value == "null-0":return mc.get(key) else:return mc.set(key,value) </pre>
一致性 hash 讀取數據:
圖片 24.1 pic
從數據庫中讀取數據
sql:
圖片 24.2 pic
圖片 24.3 pic
可利用起來的程序,稍改動加一些 try 之類的就可以用到自己的程序玩了。else下key =str(hash(sql))可以去掉。不知道為啥不好冊。
#coding:utf8from memcache_ring import mcimport mysqldb #如果在 memcache 中就不查數據庫,不在就取出來並存一份sql = "select * from zwhset where id=100"key = str(hash(sql)) #查數據庫def select_sql(sql): conn = mysqldb.connect(host="localhost",user="root",passwd="",db="test",charset="utf8") cursor = conn.cursor cursor.execute(sql) value = cursor.fetchall #如果沒有查到數據,則原值返回 if not value:return value else:key = str(hash(sql))#把存儲的結果給調用程序return mc(key,value) #讀數據,先看 memcached裏有沒有,有就直接返回 memcached 查的值,沒有就查數據庫, #如果數據庫也返回空的話原值返回,如果有值就寫 memcached,然後把 value 返回if not mc(key): select_sql(sql)else: mc(key) </pre>
分布式一致性 hash 算法:memcache_ring.py
#coding:utf8import hash_ringimport memcachememcache_servers = [''127.0.0.1:11211'']weights = {''127.0.0.1:11211'':1}ring = hash_ring.hashring(memcache_servers,weights) #if value is null then get else setdef mc(key,value="null-0"): server_node = ring.get_node(key) mc = memcache.client([server_node],debug=1) if value == "null-0":return mc.get(key) else:return mc.set(key,value) </pre>
一致性 hash 讀取數據:
圖片 24.1 pic
從數據庫中讀取數據
sql:
圖片 24.2 pic
圖片 24.3 pic
可利用起來的程序,稍改動加一些 try 之類的就可以用到自己的程序玩了。else下key =str(hash(sql))可以去掉。不知道為啥不好冊。
#coding:utf8from memcache_ring import mcimport mysqldb #如果在 memcache 中就不查數據庫,不在就取出來並存一份sql = "select * from zwhset where id=100"key = str(hash(sql)) #查數據庫def select_sql(sql): conn = mysqldb.connect(host="localhost",user="root",passwd="",db="test",charset="utf8") cursor = conn.cursor cursor.execute(sql) value = cursor.fetchall #如果沒有查到數據,則原值返回 if not value:return value else:key = str(hash(sql))#把存儲的結果給調用程序return mc(key,value) #讀數據,先看 memcached裏有沒有,有就直接返回 memcached 查的值,沒有就查數據庫, #如果數據庫也返回空的話原值返回,如果有值就寫 memcached,然後把 value 返回if not mc(key): select_sql(sql)else: mc(key) </pre>