memcache,redis分布式缓存详解

本答应大家这一篇文章讲解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怎么和当前的数据库信息进行同步,实际开发中是怎么运用的?

额 这个问题需要画一张图来解释一下了 

 

下面详细讲解一下开发过程:

     1.客户端的查询语句逻辑:先查询缓存中有没有需要的数据,如果没有,就查询数据库

if(getdata())
{
showdata()
}

else { sqltodata(); showdata(); }

 2.客户端的修改操作逻辑:先修改缓存中的数据,再将update语句写入缓存redis的队列中(这样就能保证用户修改数据后能够直接看到修改的数据),

后台处理程序就会去抓取队列中的sql语句执行,这样就解决的高并发。修改的就不上代码了 。

(代码略,太简单)

3.客户端删除操作逻辑:先删除数据库,再删除缓存(这样做的优点是:确认数据库没有数据了才删除缓存,数据的准确性)。

(代码略,太简单)

 

同样分布式缓存最集群读写分离也是很方便的memcache是通过客户端配置,而redis是通过服务器端配置。

这样整个项目的CRUD都采用这样的分布式缓存,分布式缓存对数据实时性比较高的项目是怎么适合!

(注:数据库读写分离也可以解决高并发问题,但是超高并发是不行的,向双十一这种,要用到分布式缓存了

 

 

posted @ 2017-04-08 18:05  Constructor  阅读(2019)  评论(1编辑  收藏  举报