1、定义:
缓存就是在内存中存储的数据备份,当数据没有发生本质变化的时候,我们避免数据的查询操作直接连接数据库,而是去从内存中读取数据,这样就大大降低了数据库的读写次数(这时读取IO的事件的次数就减少),而且从内存中读取数据的速度要比从数据库查询要快很多。
2、缓存的形成
页面缓存 (smarty静态化技术),php中有静态化的技术
页面缓存经常用在CMS内容管理系统界面。
数据缓存:经常会用在页面的具体数据里面。
3、memcached:并发量比redis还高,单进程多线程的的技术
①、协议简单,基于libevent事件处理,内置内存存储方式,memcached不互相通信的分布式。各个memcached不会互相通信以共享信息,分布策略由客户端实现。不会对数据进行持久化,重启memcached,重启操作系统会导致系统全部数据消失。
②、Memcached常见的应用场景是存储一些读取频繁但更新较少的数据,如静态网页,系统配置及规则数据,活跃用户的基本数据和个性化定制数据,准实时统计信息等。
缺点:在数据更改的时候有可能数据不准确,出现原子性问题,因为它是多线程的,导致上下文的时间片切换比较频繁而导致效率比较低下,还会引发线程的安全性的问题。在php中用的比较多。
4、Redis
①、由于Redis是单线程的不会存在线程的安全性的问题,而且不会导致太多的时间片切换而导致效率降低。redis直接操作内存的
②、Redis是一个key-value存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string、list、set、zset(有序集合)和hash。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序和算法。
③、与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件(RDB和AOF两种方式),并且在此基础上实现了master-slave(主从)同步,机器重启后能通过持久化数据自动重建内存,使用Redis作为Cache时机器宕机后热点数据不会丢失(这就是持久化的意义)。
④、Redis丰富的数据结构也使其拥有更加丰富的应用场景。Redis的命令都是原子性的,可以简单地利用INCR和DECR实现计数功能。使用list可以实现获取最近N个数的操作。sort set支持对数据排序,可以应用在排行榜中。set集合可以应用到数据排重。Redis还支持过期时间设置,可以应用到需要设定精确过期时间的应用。只要可以使用Redis支持的数据结构表示的场景,就可以使用Redis进行存储。
⑤、redis用的是非阻塞io,就是NIO,里面使用了多路复用的技术,它里面利用的是linux系统中的epoll的模型,所以它的速度很快,它不会像io一样会去阻塞,它所有的阻塞只会阻塞到轮询上面,而不会阻塞到存储的上面。所以redis很受欢迎。
⑥、原子性:如果用redis做一个分布式锁的情况下,这里不需要对redis加锁,因为操作本来是原子的,因为是单线程。