在web后台发开面试中,经常会被问道memcache和redis的区别和使用情况。
其中memcache和redis都是基于内存存储的缓存系统,存储形式key--value键值对的形式。
区别:
(1)都是k-v模式,但是memcache只是string字符串类型,而redis还可以是hashmap,set ,zset ,list等数据结构。
(2)redis可以实现持久化存储,memcache不能实现。
(3)底层的实现不同,与客户端的通信协议不同
针对上面的三点不同,主要介绍一下对redis的理解:
(1)redis 特殊数据结构的应用场景:
- hahsmap:可以将用户的会话session,购物车以hashmap存,提高响应的速度;
- list :可以解决数据一致问题,争抢的资源。将不同用户的对同一数据的操作,放在消息队列中,依次解决。
- set: 集合交集,例如:求公同的好友。
- zset(有序集合):计算,可以实现排行榜
- string :可以缓存页面
redis有二种持久化存储的方法:RDB和AOF
Rdb(快照方式):在一定的间隔内将数据以快照的形式存在文件中,默认的dump rdb形式,缺陷:可能宕机的时候保存的快照不是最新的;
aof:redis将每一个写命令通过write追加到文件中,当redis重启会重新执行这些写命令,在内存中重建。可能os会在内核缓存write做的修改,可能不能立即写入文件,可以修改配置文件redis.conf。缺陷:可能执行了很多无用的命令,(这个问题已经改进了)
(3)虚拟内存:
当redis的内存不足时,会将不经常用的k-v交换在虚拟swap中,并将其从内存中删除。当key不存在内存中,则需要在swap中加载相应的数据并返回。
(4)数据淘汰策略
redis有很多淘汰策略,其中LRU:表示在设置过期时间的集合中,删除一个最近没用的数据.(memcache也有淘汰机制,这里只能讲了redis)
常用命令:redis操作命令
$m=new redis();
$m->connect('ip','port');
$m->close();
$m->set('key',$value,时间 )
$m->get('key')
$m->detele('key');
$r=new redis();
$r->connect('','');
$r->persist('key');
string:
$r->set('key',$value,时间 )
$r->get('key')
$r->detele('key');
list
lpush/rpush(,)
lGet(,)
....
存在一点问题:
http://www.cnblogs.com/dasn/articles/5367436.html
http://mp.weixin.qq.com/s/SCohQdLRinZzhh_EsS2eGw?ref=myread
已经并发使用的实践,这个可以自己完成