redis/memcache

作者: Neuliudapeng
发布时间:2015-07-14 17:15:31

内存数据库

就是将数据放在内存中进行直接操作的数据库;

特点:

--数据缓存、并行操作

--高性能、高速的内存读写速度

--多位主拷贝、辅助主数据库

--数据存在内存中,易丢失


内存数据库产品

商业(通用级内存数据库)

--Oracle Timesten

--Altbase

--eXtremDb

开源(分布式缓存系统,KEY/VALUE操作)

--Mecache,Memcachedb(新浪)

--Redis

--Dbcached(Memcached+持久化存储管理)

--Tbstore(淘宝实现的高性能、分布式的基于Berkerley DB缓存系统)

其他:

--内存表

传统数据库提供的内存表,如:sqlite,mysql临时表和内存表

Memcache是什么?Memcache常见操作命令?Memcache分布式?Memcache单点问题?

一、

Memcache作为一个高性能的分布式内存对象缓存系统,通过在内存维护一个统一的巨大的hash表,存储数据,使用key/value的形式,存取速度非常快;

Memcache是项目,memcached是运行的程序名称。

二、

使用方式:可以通过telnet;各种语言的api:java/c++/php/c#/python/ruby/lua等。

常用命令操作:

command <key> <flag><exprtime> <bytes>\r\n <values>\r\n

--key:客户端需要保存的数据key;

--flags:16位的无符号整数,客户端可将此标志用特舒用途;

--exprtie:过期时间,0表示永不国企

--bytes:需要存储的字节数,不包括"\r\n"

--values:存储的数据

command包括:

-set:存数据,key不存在则添加;存在则更新

-add:存在则不处理,不存在添加

-replace:存在则替换

-get:获取数据

-delete:删除

三、服务器端无分布式,只管处理数据。

通过客户端进行分布式,通过某种分布式算法(读/写的分布式算法相同)。

四、单点故障

1.通过magent缓存代理,可防止单点现象。缓存代理服务器可以连接多台memcached机器,可以将每台memcached机器进行数据同步。如果其中一台缓存服务器down机,系统仍可继续工作;

-client+magent+memcached

2.repcached补丁,可实现memcached的数据复制,构建主/从数据库,目前只支持到memcache1-2.8。repcached是一个单master/slave的方案,master/slave都可读写,可互相同步。如果master坏掉,slave侦测到连接断了,会自动listen成为master;而如果slave坏掉,master也会侦测到连接断开,会更新listen等待新的Slave加入。

redis/memcace功能比较:

1.数据类型:Memcache类型单一;Redis有string,list,set,有序集合和HASH;

2.数据大小:Memcache单数据大小不能超过1M;Redis:string上限是1G,列表最大个数是2的32次方

3.过期策略:Redis/Memcache均支持;但是redis需要先set,然后在用expire命令设置,所以是两次操作,多义词网络传输。

4.分布式:Memcache由客户端实现伪分布式;Redis:有客户端支持;

5.单点容错:Memcache可用magent做一主多从;Redis支持:Master-Slave,一主一从或一主多从;

6.持久化:Memcache不支持;Redis支持持久化。两种持久化的方式。

并发操作控制:

一、Memcache在1.2.4版本增加了CAS(Check and Set)协议,处理同一个item被多个线程更改过程的并发问题:

--每个key关联一个版本号,客户端读key时,版本值也返回给客户端。当多个客户端更新key的值时,会判断提交的版本值是否与server上的版本值一致,一致则更新成功,否则不成功。

--两种情况下这个版本数值会增加1:1.新增一个key-value时;2.对某个已存key对应的value值更新成功;

二、Redis服务器端由于是单线程的,所有客户端发送的命令在服务器端都是串行执行,所以不存在并发控制的问题。

性能问题:

多种观点:

--Redis读写内存比Memcache快

--Memcache读写内存比Redis快

--Memcache读写内存比redis快,但是Redis整体性能优于Memcache

不必过多关心性能,二者的性能都非常高。在存储小数据上,Redis性能比Memcache高。而在100K以上的数据中,Memcache性能优于Redis。无论使用哪一个,每秒处理请求的次数,都不会成为瓶颈。

在选择上,性能不是主要考虑因素,更多的是要考虑存储的数据需求。

没有最终的结论,到底哪个更快。主要是跟业务相结合。

问题:

在大并发的场合,当cache失效时,大量并发同时取不到cache时,会同一时间去访问DB并设置cache,特别当DB的操作比较费时时,给系统造成很大的压力。

可以将将第一个访问key或者设置key的操作,设置锁,然后操作完成后,将value写到内存中,而且其他线程的操作,由于设置了锁,无法对其进行操作;在第一个线程获取完数据后,value已经在内存中,所以其他线程可以直接获取到数据,而不需要去访问db。降低后端的压力。


1.memcahce对于变量的自增操作时,需要在使用前先判断变量是否存在;而redis使用时,如果变量不存在,则默认为初始值为0.


协议;

libevent处理网络连接;

服务器互相不通信的分布式:分布式的实现完全取决于客户端;

内置内存存储方式;

版权声明:本文为博主原创文章,未经博主允许不得转载。

标签: Cache EMC Redis
来源:http://blog.csdn.net/Neuliudapeng/article/details/11867101

推荐: