memcached mysql缓存_memcached做数据库缓存
最近研究memcache小有成果,把經驗分享出來。
白話:很早就聽說memcache了,一直沒搞懂,后來又看到redis很火,可以用來做緩存,研究了半天也沒搞懂咋個做緩存,后來也不糾結了,繼續學習python,當對python基礎有一定掌握后,漸漸明白如何用redis或memcache做數據庫的緩存。原理很簡單,memcache和redis都是在內存開辟一堆空間,用鍵-》值來保存數據,在python稱作字典,具體流程如此圖
當用戶第一次通過web應用程序,去讀取數據庫,返回數據值的時候,web應用服務器會做兩個動作,第一個動作,返回給用戶,第二個動作會寫入memcache,當第二個用戶去訪問相同的數據時,程序代碼前添加if判斷語句,如果memcache有需要的數據,直接從memcache取。
可能表達的還不夠清楚,我們通過代碼來測試下。我用的環境是python+django
----查詢代碼def?sql(request):
#連接memcache
mc?=?memcache.Client(['127.0.0.1:1111'])
#用sql查詢語句作為memcahe的鍵
key2?=?'select?*?from?zuoze'
key2?=?md5(key2)
#數據庫查詢zuoze表的數據
sql1?=?"select?*?from?zuoze"
#判斷sql鍵有沒有在memcache,就從mysql取數據,并寫入memcache
if?not?mc.get(key2):
#import?MySQLdb
#連接mysql數據庫
db?=?MySQLdb.connect('127.0.0.1','admin','wanwan','T')
cursor?=?db.cursor()
cursor.execute(sql1)
#綁定sql數據到變量results
results?=?cursor.fetchall()
#同時把sql查詢數據,寫入memcache
mc.set(key2,results)
print?"go?mysql!!"
db.close()
return?render_to_response("sql.html",{'results':results})
#直接從memcache取數據
else:
results?=?mc.get(key2)
print?"go?memcache!!!"
return?render_to_response("sql.html",{'results':results})
----更新緩存的兩種辦法,轉至論壇高手的回答:
{常規做法有兩種:1.數據有改變則在更新數據庫的同時更新memcache2.數據有改變則數據庫有一個字段來標識更新時間,例如update_time。當有查詢時候,把memcache里的update_time與數據庫的update_time比較。如果發生變化則更新memcache超期時間設置,應根據數據訪問的頻繁度和內存大小來權衡一下。memcache內存申請后,映像中不會被釋放。它是通過?如果有一部分數據超時,則新寫入的數據覆蓋超時數據來完成重復使用的。那么理論上來講,內存使用情況是數據被memcache占用最多的那一刻!}
---實驗用的第一種。def?upsql(request):
if?request.method?==?'POST':
xing?=?request.POST.get('xing',None)
name?=?request.POST.get('name',None)
mail?=?request.POST.get('email',None)
shuji_id?=?request.POST.get('mail',None)
db?=?MySQLdb.connect('127.0.0.1','admin','wanwan','T')
cursor?=?db.cursor()
sql?=?"insert?into?zuoze(id,xing,name,email,shuji_id)?values?('','%s','%s','%s','%s')"?%?(xing,name,mail,shuji_id)
cursor.execute(sql)
db.commit()
#插入數據或更新數據后,重新更新memcache數據
mc?=?memcache.Client(['127.0.0.1:1111'])
key2?=?'select?*?from?zuoze'
key3?=?md5(key2)
cursor.execute(key2)
results?=?cursor.fetchall()
mc.set(key3,results)
db.close()
return?HttpResponse('ok!')
return?render_to_response("upsql.html")
總結
以上是生活随笔為你收集整理的memcached mysql缓存_memcached做数据库缓存的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 柯南第 26 部剧场版《名侦探柯南:黑铁
- 下一篇: 双十二即将到来 这几款华为智能手表可提前