zoukankan      html  css  js  c++  java
  • 关于缓存

    文件缓存与memcached的区别

    如果不考虑其他任何问题,只比较速度的话,那肯定是mem快,但他们各有优缺点。
    文件缓存优点:
    1、由于现在的硬盘都非常大,所有如果是大数据的时候,放硬盘里就比较合适,比如做一个cms网站,网站里有10万篇文章,生成的文件大小总数可能就会很大。
    2、数据的存放较为安全,由于是硬盘存放,所以在意外掉电的情况下,缓存文件不会丢失。
    3、易于扩展,如果硬盘不够用,可以更换大硬盘或者添加硬盘,在容量上受的限制很小。
    文件缓存缺点:
    1、高并发时,硬盘的读写性能大幅度降低。
    2、网站pv持续很高的情况下,硬盘寿命大大降低。

    memcached优点:
    1、读写性能优异,特别是高并发时和文件缓存比有明显优势。
    2、memcached组建支持集群,并且是自动管理负载均衡。
    memcached缺点:
    1、缓存空间有限:据说一台电脑的mem缓存开到2g以上会出现不稳定,数据无故丢失的现象。
    2、掉电丢失数据:由于是把数据放在内存里的,所有一旦机器掉电,数据也就全部丢失了。

    一般建议:如果是做内容缓存的话,比如把一些不经常更改的文章放在文件缓存里比较合适,而mem则适合放一些频繁更改的数据,比如可以把session数据放进mem。

    文件缓存耗IO、过期时间自行控制、不费带宽、不易采用分布式。
    cache缓存耗内存、过期时间由cache控制、稍占带宽、易采用分布式。

    在实际项目应用中,可以联合使用memcache和文件类型缓存。根据热度来把最热的数据放在内存里面。然后把一般的数据放在文件缓存中。

    读取数据时,可以按照 memcache=>file_cache=>databases
    这样的递归来处理。最大程度的利用缓存来减轻数据库的查询压力。

    另外session不能放在内存里面。可以用redis存储session.定时把内存数据刷新到硬盘。这样万一断电或者其他故障,不至于所有session都失效。

    memcache 的使用场景是:当你有大量的数据 >2G 大小,而这些数据是 有可能被很频繁的读写时,memcache可以使用集群,不但跨进程,而且跨机器。

    memcache与redis的区别与使用场景

    使用场景:

    一、如果需要缓存的数据只是key-value 这样简单的结构时,采用Memcache,足够稳定可靠。如果有持久化需求、存储、排序等一系列复制操作时,或者对数据结构和处理有高级要求的应用,选择Redis。

    二、memcache使用场景:

    1、在动态系统中减少数据库负载,提升性能,做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。它的一个总原则是将经常需要从数据库读取的数据缓存在memcached中,这些数据也分为几类:

    (1)经常被读取并且实时性要求不强可以等到自动过期的数据。例如网站首页最新文章列表、某某排行等数据。也就是虽然新数据产生了,但对用户体验不会产生任何影响的场景。这类数据就使用典型的缓存策略,设置一过合理的过期时间,当数据过期以后再从数据库中读取。当然你得制定一个缓存清除策略,便于编辑或者其它人员能马上看到效果。

    (2)经常被读取并且实时性要求强的数据。比如用户的好友列表,用户文章列表,用户阅读记录等。这类数据首先被载入到memcached中,当发生更改(添加、修改、删除)时就清除缓存。在缓存的时候,我将查询的SQL语句md5()得到它的 hash值作为key,结果数组作为值写入memcached,并且将该SQL涉及的table_name以及hash值配对存入memcached中。 当更改了这个表时,我就将与此表相配对的key的缓存全部删除。

    2、秒杀功能:一个人下单,要牵涉数据库读取,写入订单,更改库存,及事务要求, 对于传统型数据库来说,压力是巨大的。

    可以利用 memcached 的 incr/decr 功能, 在内存存储 count 库存量, 秒杀 1000 台每人抢单主要在内存操作,速度非常快,抢到 count < =1000 的号人,得一个订单号,这时再去另一个页面慢慢支付。

    三、不适用memcached的业务场景:

    1、缓存对象的大小大于1MB;

    2、key的长度大于250字符(所以我们把一些key先md5再存储);

    3、应用运行在不安全的环境中Memcached为提供任何安全策略,仅仅通过telnet就可以访问到memcached。如果应用运行在共享的系统上,需要着重考虑安全问题;

    4、业务本身需要的是持久化数据。

    四、Redis场景:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)、Pub/Sub构建实时消息系统、统计。

    区别:

    1、存储方式:Memcache把数据全部存在内存之中,断电后会挂掉,数据不能超 过内存大小。Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启时可以再次加载进行使用。(RDB快照和AOF日志两 种持久化方式)。

    2、Redis支持数据的备份,及master-slave模式的数据备份。

    3、数据支持类型:Redis在数据支持上要比Memcache多得多。

    4、使用底层模型不同:新版本的Redis直接自己构建了VM机制,因为一般的系统调用系统函数的话,会浪费一定的时间去移动和请求。

    5、 redis有一个致命缺陷 当内存满了时 dump数据cpu占用100%。

    总结:

    1、Redis使用最佳方式是全部数据in-memory。

    2、Redis更多场景是作为Memcache的替代者来使用。

    3、当需要除key/value之外的更多数据类型支持时,使用Redis更合适。

    4、当存储的数据不能被剔除时,使用Redis更合适。

    5、如果要说内存使用效率,使用简单的key-value存储的话,Memcached的内存利用率更高,而如果Redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率会高于Memcached。当然,这和你的应用场景和数据特性有关。

    1. Redis有哪些数据类型?

    String ,hash,set,zset, list

    1. Redis和memcache的区别是什么?

    从存储大小 Memcached单个key-value大小有限,一个value最大只支持1MB,key 最大250个字符,而Redis最大支持512MB

    从可靠性 Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高

    区别:

    1:memcache和redis都是将数据存储到内存中,都是内存数据库,不过memcache还可以缓存其他东西,图片视频等。

    2:存储类型不同,memcache只支持k-v结构,redis支持五种数据类似,字符串,链表,哈希,集合,有序集合。

    3:虚拟内存,当redis物理内存使用完后,可以将一些很久没有使用过的value交换到磁盘、

    4:分布式设定memcache集群,利用magenta做一主多从,redis可以做一主多从,也可以一主一从。

    5:存储数据redis持久化,memcache关机后数据消失

    6:数据恢复,memcache挂掉后,数据不可恢复,redis数据丢失后可以通过AOF日志恢复。

    7:应用场景不同,redis除啦作为数据库使用之外,还能做消息队列,数据堆栈和数据缓存等,memcache适用于缓存sql语句,数据集,用户临时性数据,延迟查询数据 session等

    1. Redis在项目中怎么用的?

    查询数据多的页面做缓存比如页面缓存首页
    //实例化redis
    $redis = new Redis();
    //连接
    $redis->connect('127.0.0.1', 6379);
    //检测是否连接成功
    echo "Server is running: " . $redis->ping();
    // 输出结果 Server is running: +PONG
    1.STring(字符串类型)
    //设置一个字符串的值
    $redis->set('cat',111);
    //获取值
    $redis->get('cat');
    //重置值
    $redis->set('cat',222);

    1. List(列表)
      //存数据到列表中
      $redis->lpush('list','html');
      $redis->lpush('list','css');
      $redis->lpush('list','js');
      //获取列表所有值
      $redis->lrange(list',0,-1);
      //从右侧加入一个
      $redis->rpush('list','php');
      //从左侧弹出一个
      $redis->lpop('list');
      //从右侧弹出一个
      $redis->rpop('list');

    3.Hash(字典)
    //设置值
    $redis->hset('hash','cat','cat');
    $redis->hset('hash','cat','cat2');
    //获取
    $redis->hget('hash','cat');
    //获取所有的key值
    $redis->hkeys('hash');
    //获取一个哈市,顺序是随机的
    $redis->hvals('hash');
    //获取hash中所有的key和value 顺序随机
    $redis->hgetall('hash');
    //获取hash中key的数量
    $redis->hlen('hash');
    //删除hash中的一个key,
    $redis->hdel('hash','cat');

    4.Set(集合)
    //添加一个元素
    $redis->sadd('set','cat');
    $redis->sadd('set','dog');
    //获取所有元素
    $redis->smembers('set');
    //删除集合中的value
    $redis->srem('set','cat');
    //判断元素是否是set成员
    $redis->sismember('set','dog');
    //查看集合成员数量
    $redis->scard('set');
    //移除并返回集合中的一个随机元素(返回被移除的元素)
    $redis->spop('set');
    5.Sorted Set(有序集合)
    $redis->zadd('set',1,'cat');
    $redis->zadd('set',2,'dog');
    //获取所有元素
    $redis->zrange('set',0,-1);
    //获取score值
    $redis->zscore('set','dog');
    //元素个数
    $redis->zcard('set');
    //删除指定成员
    $redis->zrem('set','cat');
    //返回介于min和max之间的个数
    $redis->zcount('set',1,3);
    //返回有序集合中score介于min和max之间的值
    $redis->zrangebyscore('set',1,3);

    memcache
    $mem = new Memcache();

    $mem->connect("127.0.0.1", 11211);
    //Memcache::set方法有四个参数,第一个参数是key,第二个参数是value,第三个参数可选,表示是否压缩保存,第四个参数可选,用来设置一个过期自动销毁的时间。
    $mem->set('test','123',0,60);

    //Memcache::add方法的作用和Memcache::set方法类似,区别是如果 Memcache::add方法的返回值为false,表示这个key已经存在,而Memcache::set方法则会直接覆写。

    $mem->add('test','123',0,60);

    //Memcache::get方法的作用是获取一个key值,Memcache::get方法有一个参数,表示key。

    $mem->get('test');//输出为'123'

    //Memcache::replace 方法的作用是对一个已有的key进行覆写操作,Memcache::replace方法有四个参数,作用和Memcache::set方法的相同。

    $mem->replace('test','456',0,60);

    //Memcache::delete方法的作用是删除一个key值,Memcache::delete方法有两个参数,第一个参数表示key,第二个参数可选,表示删除延迟的时间。

    $mem->delete('test',60);

    总结

    3.memcache 和redis比较

    3.1 性能方面

    由于Redis只使用单核,而Memcached可以使用多核

    所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。

    3.2 内存空间和数据量大小

    MemCached可以修改最大内存,采用LRU算法。Redis增加了VM的特性,突破了物理内存的限制。

    3.3 数据类型:操作便利上

    MemCached数据结构单一,仅用来缓存数据,而Redis支持更加丰富的数据类型,也可以在服务器端直接对数据进行丰富的操作,这样可以减少网络IO次数和数据体积。

    3.4 可靠性上:

    MemCached不支持数据持久化,断电或重启后数据消失,但其稳定性是有保证的。Redis支持数据持久化和数据恢复,允许单点故障,但是同时也会付出性能的代价。

    Memcached只是个内存缓存,对可靠性无要求;而Redis更倾向于内存数据库,因此对对可靠性方面要求比较高

    关注数据持久化和主从复制时,只有redis拥有这两个特性

    3.5 应用场景

     Memcached:动态系统中减轻数据库负载,提升性能;做缓存,适合多读少写,大数据量的情况(如人人网大量查询用户信息、好友信息、文章信息等)。
     Redis:适用于对读写效率要求都很高,数据处理业务复杂和对安全性要求较高的系统(如新浪微博的计数和微博发布部分系统,对数据安全性、读写要求都很高)。
    

    3.6 运行环境不同:
    redis目前官方只支持LINUX 上去行,从而省去了对于其它系统的支持,这样的话可以更好的把精力用于本系统 环境上的优化,虽然后来微软有一个小组为其写了补丁。但是没有放到主干上

    高山仰止,景行行止,虽不能至,心向往之。
  • 相关阅读:
    Vue3.0官方文档
    简单实现Vue的双向绑定原理
    小程序使用weapp-qrcode二维码插件,宽高自适应解决方法
    小程序判断ios还是android
    手写实现bind
    手写实现call,apply函数
    React onClick点击事件传参三种写法
    zynq 中断
    zynq_ps端点亮led灯代码
    突然发现自己的很多博客无法显示图片,人都傻了,于是就整理了一早上,全部换成了markdown格式,就好了,希望博客的时间不会对大家造成困扰!!!
  • 原文地址:https://www.cnblogs.com/yudubujue/p/13994713.html
Copyright © 2011-2022 走看看