内容简介:一、MemcacheMemcache是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。Memcache特性:
一、Memcache
Memcache是一个高性能,分布式内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像、视频、文件以及数据库检索的结果等。简单的说就是将数据调用到内存中,然后从内存中读取,从而大大提高读取速度。
Memcache特性:
(1)使用物理内存作为缓存区,可独立运行在服务器上。每个进程最大2G,如果想缓存更多的数据,可以开辟更多的Memcache进程(不同端口)或者使用分布式Memcache进行缓存,将数据缓存到不同的物理机或者虚拟机上。
(2)使用key-value的方式来存储数据,这是一种单索引的结构化数据组织形式,可使数据项查询时间复杂度为O(1)。
(3)协议简单:基于文本行的协议,直接通过telnet在 memcached 服务器上可进行存取数据操作,简单,方便多种缓存参考此协议。
(4)基于Libevent高性能通信:Libevent是一套利用C开发的程序库,它将BSD系统的kqueue,Linux系统的epoll等事件处理功能封装成一个接口,与传统的select相比,提高了性能。
(5)内置的内存管理方式:所有数据都保存在内存中,存取数据比硬盘快,当内存满后,通过LRU算法自动删除不使用的缓存,但没有考虑数据的容灾问题,重启服务,所有数据会丢失。
(6)分布式:各个memcached服务器之间互不通信,各自独立存取数据,不共享任何信息。服务器并不具有分布式功能,分布式部署取决于Memcache客户端。
(7)缓存策略:memcached的缓存策略是LRU(最近最少使用)到期失效策略。在memcached内存储数据项时,可以指定它在缓存的失效时间,默认为永久。当memcached服务器用完分配的内时,失效的数据被首先替换,然后也是最近未使用的数据。在LRU中,memcached使用的是一种Lazy Expiration策略,自己不会监控存入的key/vlue对是否过期,而是在获取key值时查看记录的时间戳,检查key/value对空间是否过期,这样可减轻服务器的负载。
Memcache的工作流程如下:
(1)先检查客户端的请求数据是否在memcached中,如有,直接把请求数据返回,不再对数据库进行任何操作。
(2) 如果请求的数据不在memcached中,就去查数据库,把从数据库中获取的数据返回给客户端,同时把数据缓存一份到memcached中(memcached客户端不负责,需要程序实现)。
(3) 每次更新数据库的同时更新memcached中的数据,保证一致性。
(4) 当分配给memcached内存空间用完之后,会使用LRU(Least Recently Used,最近最少使用)策略加上到期失效策略,失效数据首先被替换,然后再替换掉最近未使用的数据。
二、redis
Redis常用数据类型
• String
1.常用命令:set,get,decr,incr,mget。
2.应用场景:String是最常用的一种数据类型,与Memcache的key value存储方式类似。
3.实现方式:String在 Redis 内部存储默认就是一个字符串,被redisObject所引用,当遇到incr,decr等操作时会转成数值型进行计算,此时redisObject的encoding字段为int。
• Hash
1.常用命令:hget,hset,hgetall 。
2.应用场景:以存储一个用户信息对象数据
3.实现方式:Redis Hash对应的Value,内部实际就是一个HashMap,实际这里会有2种不同实现。
(1)Hash的成员比较少时Redis为了节省内存会采用类似一维数 组的方式来紧凑存储,而不会采用真正的HashMap结构,对应的value redisObject的encoding为zipmap。
(2)当成员数量增大时会自动转成真正的HashMap,此时encoding为ht。
List
1.常用命令:lpush,rpush,lpop,rpop,lrange。
2.应用场景:Redis list的应用场景非常多,也是Redis最重要的数据结构之一,比如twitter的关注列表,粉丝列表等都可以用Redis的list结构来实现。
3.实现方式:Redis list的实现为一个双向链表,可以支持反向查找和遍历,方便操作。不过带来了部分额外的内存开销,Redis内部的很多实现,包括发送缓冲队列等也都是用的这个数据结构。
Set
1.常用命令:sadd,spop,smembers,sunion。
2.应用场景:Redis set对外提供的功能与list类似是一个列表的功能,特殊之处在于set是可以自动排重的,当你需要存储一个列表数据,又不希望出现重复数据时,set 是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。
3.实现方式:set的内部实现是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因。
Sorted set
1.常用命令:zadd、zrange、zrem、zcard。
2.使用场景:Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,可以选择sorted set数据结构,比如twitter 的public timeline可以以发表时间作为score来存储,这样获取时就是自动按时间排好序的。
3.实现方式:Redis sorted set的内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的 是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
Redis集群
(1)通过keepalived实现的高可用方案
切换流程:
- 当Master挂了后,VIP漂移到Slave;Slave 上keepalived 通知redis 执行:slaveof no one ,开始提供业务;
- 当Master起来后,VIP 地址不变,Master的keepalived 通知redis 执行slaveof slave IP host ,开始作为从同步数据;
- 依次类推。
(2)主从同时Down机情况:
• 非计划性,不做考虑,一般也不会存在这种问题
• 计划性重启,重启之前通过运维手段SAVE DUMP 主库数据;需要注意顺序:
- 关闭其中一台机器上所有redis,是得master全部切到另外一台机器(多实例部署,单机上既有主又有从的情况);并关闭机器
- 依次dump主上redis服务
- 关闭主
- 启动主,并等待数据load完毕
- 启动从
- 删除DUMP 文件(避免重启加载慢)
三、Memcache与Redis的比较
(1)数据结构:Memcache只支持key value存储方式,Redis支持更多的数据类型,比如Key value、hash、list、set、zset;
(2)多线程:Memcache支持多线程,Redis支持单线程;CPU利用方面Memcache优于Redis;
(3)持久化:Memcache不支持持久化,Redis支持持久化;
(4)内存利用率:Memcache高,Redis低(采用压缩的情况下比Memcache高);
(5)过期策略:Memcache过期后,不删除缓存,会导致下次取数据数据的问题,Redis有专门线程,清除缓存数据;
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Zen of CSS Design
Dave Shea、Molly E. Holzschlag / Peachpit Press / 2005-2-27 / USD 44.99
Proving once and for all that standards-compliant design does not equal dull design, this inspiring tome uses examples from the landmark CSS Zen Garden site as the foundation for discussions on how to......一起来看看 《The Zen of CSS Design》 这本书的介绍吧!