煮酒品茶:對 python-memcache 進(jìn)行學(xué)習(xí),把分布式 HASH 算法加進(jìn)去,不說線上自己玩玩的程序可以加到里面去。memcached 讀存數(shù)據(jù)就這些東西,看著補(bǔ)。
分布式一致性 HASH 算法:memcache_ring.py
#coding:utf8
import hash_ring
import memcache
memcache_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 set
def 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)
一致性 hash 讀取數(shù)據(jù):
http://wiki.jikexueyuan.com/project/python-actual-combat/images/74.jpg" alt="pic" />
從數(shù)據(jù)庫中讀取數(shù)據(jù)
sql:
http://wiki.jikexueyuan.com/project/python-actual-combat/images/75.jpg" alt="pic" />
http://wiki.jikexueyuan.com/project/python-actual-combat/images/76.jpg" alt="pic" />
可利用起來的程序,稍改動(dòng)加一些 try 之類的就可以用到自己的程序玩了。else下key =str(hash(sql))可以去掉。不知道為啥不好冊。
#coding:utf8
from memcache_ring import mc
import MySQLdb
#如果在 memcache 中就不查數(shù)據(jù)庫,不在就取出來并存一份
sql = "select * from zwhset where id=100"
key = str(hash(sql))
#查數(shù)據(jù)庫
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()
#如果沒有查到數(shù)據(jù),則原值返回
if not value:
return value
else:
key = str(hash(sql))
#把存儲(chǔ)的結(jié)果給調(diào)用程序
return mc(key,value)
#讀數(shù)據(jù),先看 memcached里有沒有,有就直接返回 memcached 查的值,沒有就查數(shù)據(jù)庫,
#如果數(shù)據(jù)庫也返回空的話原值返回,如果有值就寫 memcached,然后把 value 返回
if not mc(key):
select_sql(sql)
else:
mc(key)