memcached做数据库缓存

  1. 安装篇请参考http://my.oschina.net/flynewton/blog/9694
  2. Python-memcached的基本使用参考http://my.oschina.net/flynewton/blog/10660

最近研究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.数据有改变则在更新数据库的同时更新memcache
2.数据有改变则数据库有一个字段来标识更新时间,例如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")
时间: 2024-08-28 00:14:49

memcached做数据库缓存的相关文章

高性能Web服务器Nginx的配置与部署研究(12)应用模块之Memcached做文件缓存时压缩引起的问题

在上一篇文章中,提到的Nginx的Memcached模块应用场景,主要是作为文件缓存.然后就发现了一个问题,当以字节数组方式缓存较大的文件时,缓存数据会被压缩,从而在读取的时候出现问题. (本文欢迎转载,尊重他人劳动,转载请注明出处:http://blog.csdn.net/poechant/article/details/7177603) 解决方法很简单,就是在MemcachedClient端设置压缩的阈值.如果你使用的是net.spy.memcached的API,则可以如下设置: int E

redis 做数据库缓存 php实现

<?php /*数据库的表 ( 'usr_id', 'name', 'face_score', 'usr_sex', 'usr_headimgurl' */ $redis = new Redis(); $redis->connect('127.0.0.1',6379); $usr_id ='2007'; //方法例一 //构造一个json字符串,存入redis,再读出来, 这里的key是 'mykey' . $usr_id 拼成一个字符串 $ret; $redis->set('mykey

用memcached做实时分页缓存

用memcached做分页缓存,可能很多人会觉得麻烦而不用.因为在增加.修改.删除的过程中,你不知道会影响到哪些数据,而如果把所有分页相关的数据缓存都删除并重新生成一遍,实现又很麻烦,甚至不可行,所以干脆就用mysql直接分页,简单方便,但是这样性能却也下降了. 本章就讲一个简单的实现用memcached做分页缓存的方法. 首 先假使我们有一个文章页需要做分页显示,分页类型有按分类分页,按最新分页,按热点分页,按自定义方式分页,等等.这就出现了一个比较棘手的问题,我们对 数据的更新影响到哪些分页

PHP用memcached做实时分页

用memcached做分页缓存,可能很多人会觉得麻烦而不用.因为在增加.修改.删除的过程中,你不知道会影响到哪些数据,而如果把所有分页相关的数据缓存都删除并重新生成一遍,实现又很麻烦,甚至不可行,所以干脆就用mysql直接分页,简单方便,但是这样性能却也下降了. 本章就讲一个简单的实现用memcached做分页缓存的方法.首先假使我们有一个文章页需要做分页显示,分页类型有按分类分页,按最新分页,按热点分页,按自定义方式分页,等等.这就出现了一个比较棘手的问题,我们对数据的更新影响到哪些分页我们是

PHP Memcached 实现简单数据库缓存

Memcache常用方法 Memcache::add — 添加一个值,如果已经存在,则返回false Memcache::addServer — 添加一个可供使用的服务器地址 Memcache::close — 关闭一个Memcache对象 Memcache::connect — 创建一个Memcache对象 Memcache::debug — 控制调试功能 Memcache::decrement — 对保存的某个key中的值进行减法操作 Memcache::delete — 删除一个key值

Memcached数据库缓存

Memcached 一.Memcached简介 Memcached是一个开源的,支持高性能,高并发的分布式内存缓存系统,由C语言编写,总共2000多行代码.从软件名称上看,前3个字符"Mem"就是内存的意思,而接下来的后面5个字符"cache"就是缓存的意思,最后一个字符d,是daemon的意思,代表是服务器端守护进程模式服务. Memcached服务分为服务器端和客户端两部分,其中,服务器端软件的名字形如Memcached-1.4.24.tar.gz,客户端软件的

利用memcached做缓存服务器,为后端tomcat服务器做会话保持,利用httpd的jk模块模块做负载均衡

前端使用httpd作为反代负载均衡至后端tomcat主机:tomcat可用memcached当做会话服务器保存会话: 实验环境:物理机win7,虚拟机centos7 node1:172.18.11.111 TomcatA node2:172.18.11.112 TomcatB node3:172.18.11.113 调度器httpd 安装tomcat 分别在node1和node2安装tomcat: ]# yum -y install java-1.7.0-openjdk java-1.7.0-o

Spring整合Redis做数据缓存(Windows环境)

当我们一个项目的数据量很大的时候,就需要做一些缓存机制来减轻数据库的压力,提升应用程序的性能,对于java项目来说,最常用的缓存组件有Redis.Ehcache和Memcached. Ehcache是用java开发的缓存组件,和java结合良好,直接在jvm虚拟机中运行,不需要额外安装什么东西,效率也很高:但是由于和java结合的太紧密了,导致缓存共享麻烦,分布式集群应用不方便,所以比较适合单个部署的应用. Redis需要额外单独安装,是通过socket访问到缓存服务,效率比Ehcache低,但

两大数据库缓存系统实现对比

和redis,作为近些年最常用的缓存服务器,相信大家对它们再熟悉不过了.前两年还在学校时,我曾经读过它们的主要源码,如今写篇笔记从个人角度简单对比一下它们的实现方式,权当做复习,有理解错误之处,欢迎指正. 两大数据库缓存系统实现对比两大数据库缓存系统实现对比一. 综述读一个软件的源码,首先要弄懂软件是用作干什么的,那memcached和redis是干啥的?众所周知,数据一般会放在数据库中,但是查询数据会相对比较慢,特别是用户很多时,频繁的查询,需要耗费大量的时间.怎么办呢?数据放在哪里查询快?那