问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

spring mvc 用memcached做缓存

发布网友 发布时间:2022-04-07 20:34

我来回答

2个回答

懂视网 时间:2022-04-08 00:56


 最近研究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")


本文出自 “自动运维” 博客,请务必保留此出处http://whf191.blog.51cto.com/5763502/1657032

memcached做数据库缓存

标签:memcached做数据库缓存

热心网友 时间:2022-04-07 22:04

首先可以在多台服务器装memcached,启动时分别指定容量和端口
访问时采用集群方式访问,只需要spring配置文件里面配置即可
value可以放任何对象,包括集合
每个键值的生命周期可以在放入时独立设置
类库可以用spymemcached

数据更新方式可以在后台的定时任务中执行

下面是spring mvc中配置:
<bean id="memcachedClient" class="net.spy.memcached.spring.MemcachedClientFactoryBean">
<property name="servers" value="服务器A:端口,服务器B:端口,服务器C:端口" />
<property name="protocol" value="BINARY" />
<property name="transcoder">
<bean class="net.spy.memcached.transcoders.SerializingTranscoder">
<property name="compressionThreshold" value="1024" />
</bean>
</property>
<property name="opTimeout" value="2000" />
<property name="timeoutExceptionThreshold" value="1998" />
<property name="locatorType" value="CONSISTENT" />
<property name="hashAlg">
<value type="net.spy.memcached.DefaultHashAlgorithm">KETAMA_HASH</value>
</property>
<property name="failureMode" value="Redistribute" />
<property name="useNagleAlgorithm" value="false" />
</bean>
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 推荐几本有趣、不无聊的极品小说像《吞噬星空》《通天大圣》《仙葫》不要那种YY 还有刚看就知道结果的 普通话很“另类”,听着很别扭的是中国哪两个省? 另类的中国历史的txt全集下载地址 喜欢比较另类的中国摇滚乐队如 西游,教父,二手玫瑰,希望大家能给我提供点类似的乐队及歌曲链接 请教各位大虾国内最另类,最具有杀伤力的营销策划公司是哪家? 商场如战场,市场只相信强者,这是我们老板 冷冻牛肉卷能直接炒吗 中国极品小吃排行榜,总有一样戳中你心扉,特别是最后一种 在中国比较另类奇葩的职业是? 微信怎么边看文章边聊天 中国是不是另类的国家? 关于微信公众平台的及时聊天ASP.NET 中国有些什么达人的特技是比较另类的。。谢谢啦 知道NBA联盟里谁纹有中国字的纹身? 七年级必刷题和王朝霞哪个好 2013石家庄市第一学期期末考试试卷七年级数学(王朝霞)的答案 微信公众号里面的小黄鸡自动聊天功能是如何实现的? 2016数学王朝霞期末真题精编安濮专版七年级下册答案,急! 中国是不是很另类的国家? 微信公众号怎么设置一点击就自己一直在聊天列表第一个 2018年王朝霞,安徽各地期末试卷惊险,七年级人教版,英语答案。 随身wifi网速被偷怎样测 360随身wifi网速怎么测算? 我的世界连接服务器一直显示正在连接服务器中每个服务器都这样 我的世界怎么开服务器,就是远程的也可以联机的。说详细点! 寻带雪字的名字,要4个字的 谁能教我我的世界怎么加入服务器 我的世界不能连接至服务器 我的世界无法连接服务器 名字雪字怎么自我介绍 我的世界一直正在连接服务器,怎么办 带雪字的两字名字 华为畅享20plus荣耀9XPro高端大气上档次? 皓齿美白有哪些优缺点?不知道上海哪家口腔医院比较好,望推荐一下! 皓齿美白效果好吗,对牙齿有影响吗 牙齿很黄 洗牙也没有用,皓齿美白效果怎么样? 有没有什么好看的青春校园小说。我要的是女追男的!而且男主角要内种很冷,女主角很可爱的!!!跪求~ 求关于女追男的青春校园小说 皓齿美白对牙龈有伤害吗?西安画美牙齿美白大概要多少钱? 你使用过 Memcache 缓存吗?如果使用过,能够简单的描述一下它的工作原理吗? 求问为什么皓齿美白可以取代传统牙齿美白?