内存数据库
就是将数据放在内存中进行直接操作的数据库;
特点:
--数据缓存、并行操作
--高性能、高速的内存读写速度
--多位主拷贝、辅助主数据库
--数据存在内存中,易丢失
内存数据库产品
商业(通用级内存数据库)
--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处理网络连接;
服务器互相不通信的分布式:分布式的实现完全取决于客户端;
内置内存存储方式;