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

总是听说很多javaweb系统用redis或memcache做缓存,具体怎么操作的

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

我来回答

3个回答

懂视网 时间: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和redis,而不是自己在程序里开个hashmap,是因为这块区域可以共享且容易管理,在集群环境下更方便使用。

有些做法是直接将数据序列化后存在redis的string或是memcached中,也有些其他做法是利用redis特有的数据结构存储一些关系,例如用sorted set存排行榜,string用来计数,set做一些倒排索引、用户好友关系之类的。我觉得这些都可以称之为缓存。

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

redis是一个内存数据库(它的数据存储在内存中,一段时间之后会自动读入硬盘),和关系型数据库(MySQL,oracle)有很大的不同,但它也是一个数据库,它需要一套自己的操作API。既然是缓存,那么你就需要把那些经常需要读取的数据放到redis中就OK,具体怎么操作?不就是去学习怎么连接redis,然后用redis的操作API做增删改查吗。。。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
企业培训学到了什么 培训感悟简短 有关培训的感悟 通过培训学到什么 培训你学到了什么 领导问培训学到什么怎么回复 Linux系统安装FTP服务器 Linux系统的网络文件共享 建筑的七盏明灯的内容简介 面向对象设计七大原则 简单说 交互设计七大定律 梦见过世的婆婆将厕所封住不给我用? 纯公积金贷款面签后多久能过户? 梦到不会走路的婆婆在我家厨房扫地是什么意思? 公积金贷款申请额度下来以后多久办理过户 中华魂——祖国在我心中怎么写?哭,帮帮我 公积金贷款下来多少天过户 你好,我的是二手房公积金贷款,上个星期资料都交到银行了,什么时候可以去过户 梦见己死的婆婆在帮我扫地结果全是一层厚厚的灰尘? 联合国教科文组织把每年4月23日确定为“世界读书日”,为了响应这一号召... 梦到前男友的妈妈扫厕所 梦到已故奶奶打扫厕所 在windows下用qt写的程序的中文注释在Ubuntu下qt creator显示乱码 2009年4月23日,第十四个“世界读书日”如约而至。为庆祝这一文化节日... 公积金中心审核贷款金额通过后,一般是多长时间,就可以和卖家过户了吗? 梦见死去的婆婆在家扫地 公积金贷款后过户需要多长时间 富有时代气息的小学英语材料 父母们该不该让自己的孩子做课外习题 Linux Qt Creator GCC Socket传送中文乱码 中学生该不该看课外书辩论会正方资料。急啊啊啊啊啊啊啊 梦见在厕所里遇见前婆婆唠叨? 公积金二手房贷款审批通过后什么时候办理过户手续 梦到一直在给婆婆家打扫卫生做家务 总是梦见前婆婆又在一起住 人是梦见死了婆婆带她去厕所拉屎 太空沙平时不玩的时候要密封保存吗? 大家好:椒麻鸡用什么鸡;煮多久 椒麻鸡怎么做的? 红外光谱仪测试样品准备要求是什么? 能看透物体的透视镜是什么? 色散型红外分光光度计的参比和试样室总放在单色器后面,为什么 黄花菜、香菜怎么长期贮存? 泡发的黄花菜怎样保存 黄花菜怎么保存最好有能有效保持其营养价值? 求助,CAD如何批量删除同图层相同符号 cad中0图层里面几千个相同的图形的一部分怎么一次性删除 斯德林保湿紧致面霜多少钱一瓶 CAD如何删除重复的图形或线条? 怎么一次性删除CAD图形中相同的项。比如,一次性删除建筑设计图中的指示尺寸的红线。 CAD里怎样删除同一位置的重复图形?