设为首页 收藏本站
查看: 1498|回复: 0

[经验分享] memcache,redis分布式缓存详解

[复制链接]

尚未签到

发表于 2017-12-21 22:35:30 | 显示全部楼层 |阅读模式
  本答应大家这一篇文章讲解AutoMapper,但是为了满足旁边同事小法师的强烈要求,就先写一篇关于分布式缓存的文章吧。
  一、
  问题一:为什么要有分布式缓存?什么时候用分布式缓存?
  答:举个例子,当你的网站随着业务的扩大,访问量会很大,很有可能在同一时间有几个人,共同操作一条数据,但是数据库
  锁机制,有可能会造成死锁,简单点就是服务器卡死,宕机(cpu 100%)!先普及一下数据库锁机制:
  

select * from table1//此时会给这个表加上S锁(共享锁)  

  
update table1 set colum="somedata" //此时给table1加上X锁
  

T1:  
begin tran
  
select * from table (holdlock) (holdlock意思是加共享锁,直到事物结束才释放)
  
update table set column1='hello'
  

  
T2:
  
begin tran
  
select * from table(holdlock)
  
update table set column1='world'
  

  
假设T1和T2同时达到select,T1对table加共享锁,T2也对加共享锁,当
  
T1的select执行完,准备执行update时,根据锁机制,T1的共享锁需要升
  
级到排他锁才能执行接下来的update.在升级排他锁前,必须等table上的
  
其它共享锁释放,但因为holdlock这样的共享锁只有等事务结束后才释放,
  
所以因为T2的共享锁不释放而导致T1等(等T2释放共享锁,自己好升级成排
  
他锁),同理,也因为T1的共享锁不释放而导致T2等。死锁产生了。
  

  

  

  一个表上可以有很多个s锁,但是一个表上只会有一个X锁存在,也就是说,在Update的时候这条数据只能被一个用户使用,别人是无法查询或者修改的。
  随着访问量的增大,并发几率就会增高,所谓并发就是同意时间操作同一个数据。
  因为读取数据库是通过磁盘读取的,磁盘的读取速度和内存的读取速度是没法比的,此时就可以使用memcache或者redis来解决这个问题。
  二、memcache和redis的区别
  小僧自己认为主要区别有以下几点:
  1、最主要的就是redis支持数据持久化,mm不支持。
  2. mm是多线程的,redis是单线程运作。
  3.redis支持的数据类型比较多(队列),而mm只支持key-value.
  具体的配置信息,大家可以去别的博客拷贝,不用记,用的时候直接复制粘贴
  三、重点是redis、mm怎么和当前的数据库信息进行同步,实际开发中是怎么运用的?
  额 这个问题需要画一张图来解释一下了
   DSC0000.png
  下面详细讲解一下开发过程:
  1.客户端的查询语句逻辑:先查询缓存中有没有需要的数据,如果没有,就查询数据库
  

if(getdata())  
{
  
showdata()
  
}
else  
{
  
sqltodata();
  
showdata();
  
}
  

  2.客户端的修改操作逻辑:先修改缓存中的数据,再将update语句写入缓存redis的队列中(这样就能保证用户修改数据后能够直接看到修改的数据),
  后台处理程序就会去抓取队列中的sql语句执行,这样就解决的高并发。修改的就不上代码了 。
  (代码略,太简单)
  3.客户端删除操作逻辑:先删除数据库,再删除缓存(这样做的优点是:确认数据库没有数据了才删除缓存,数据的准确性)。
  (代码略,太简单)
  同样分布式缓存最集群读写分离也是很方便的memcache是通过客户端配置,而redis是通过服务器端配置。
  这样整个项目的CRUD都采用这样的分布式缓存,分布式缓存对数据实时性比较高的项目是怎么适合!
  (注:数据库读写分离也可以解决高并发问题,但是超高并发是不行的,向双十一这种,要用到分布式缓存了
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-426639-1-1.html 上篇帖子: linux系统下安装单台Redis 下篇帖子: 为php5.6.30安装redis扩展
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表