Redis和memoryCache选型
1.简介
1.1 Redis简介
Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) 与范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询。 Redis 内置了 复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的 磁盘持久化(persistence), 并通过 Redis哨兵(Sentinel)和自动 分区(Cluster)提供高可用性(high availability)。
1.2 memCached简介
Memcached是一个内存中的键值存储(以BSD license授权协议发布),可用于存储来自数据库调用结果,API调用结果或页面呈现结果的任意小数据块(字符串,对象)。
Memcached形式简单但功能强大。其简单的设计可促进快速部署,易于开发,并解决了大型数据缓存面临的许多问题。它的API适用于大多数流行语言。
PS:翻译的不是很好
2.Redis
2.1 Redis怎么实现多种数据结构存储
(1)存储字符串:采用字符数组的形式,并支持动态扩展,len大于1MB是两倍扩展空间,大于1MB时+1MB,可以减少分配次数,提升追加效率,高效计算长度。
(2)存储列表:采用quickList存储,quicklist是双向链表,插入删除效率高,但是查询效率低,是所有链表的通病,不过访问两端的元素时间复杂度仅为O(1),所以仅操作端点元素效率还是很高。它的每个节点就是一个zipList,可配置压缩
(3)存储散列:hash底层的数据结构有两种:ziplist,hashtable。一般键的个数小于配置值(512)且值的小于64,会采用ziplist,超过配置的会切换成hashtable,但是切换比较损耗性能,应该尽量避免,而且hashtable会消耗更多的内存空间。
(4)存储集合:集合分为有序集合和无序集合,有序集合的值被称为分值,(分值可以重复,成员却不能重复),且必须为浮点数,它是redis里面唯一一个既可以根据成员访问元素,又可以根据分值访问成员。也具有两种存储形式:ziplist形式以及skiplist与dict结合的形式
2.2 Redis特点
(1)支持持久化:提供两种持久化选项,一种是每隔一段时间将数据导入到磁盘(快照模式),另一种是追加命令到日志中(AOF模式)
(2)支持数据备份
(3)支持事务,redis的操作都是原子性的,且支持几个操作合并后原子性执行
(4)支持publish和subscribe,下发通知,key过期等机制
(5)redis有多种集群方案(redis-cluster是三个里性能最强大的 因为他使用去中心化的思想 使用hash slot方式 将16348个hash slot 覆盖到所有节点上 对于存储的每个key值 使用CRC16(KEY)&16348=slot 得到他对应的hash slot 并在访问key时就去找他的hash slot在哪一个节点上 然后由当前访问节点从实际被分配了这个hash slot的节点去取数据 节点之间使用轻量协议通信 减少带宽占用 性能很高 自动实现负载均衡与高可用 自动实现failover )
2.3 击穿和雪崩
(1)击穿:例如用户产生大量请求,请求的数据在redis中不存在,那么数据请求就会流向数据库,数据库压力瞬间增加。
(2)雪崩:当redis中大量的键值同一时间过期,这个时候如果有请求过来,那么就会将请求流向数据库了,同样会压垮数据库。
2.4 其他
(1)Master最好不要开启内存快照和AOF,因为内存快照会影响整体影响性能,而AOF会影响系统重启的速度
(2)主从复制可以采用单向链表的方式,M->S1->S2->S3。
(3)redis在内存使用到一定阈值之后会将部分value存储到硬盘中,提升IO请求的并发,可以提升这部分的性能
2.5 应用
(1)秒杀活动:redis采用的是缓存,读写速度快;使用redis列表的原子特性,即使多个用户同时到达,也会依次执行,这样就防止超卖多卖现象的产生了
3.memcached
3.1 memcached支持数据结构
支持简单数据对象
3.2 memcached特点
(1)它的过期策略是懒汉式的,要在每次获取的时候才去判断他是否过期,过期就清除,然后可以用于存放新的数据
(2)它采用块式存储,最小单位1MB,可以防止内存碎片,而且它采用的是预申请的形式,相较于动态内存分配,这种方式可以提升使用时的性能,但是它在内存利用率上会有一点浪费,很明显的用空间换时间。
(3)Memcached是一种无阻塞的socket通信方式服务,基于libevent库,由于无阻塞通信,对内存读写速度非常之快,Memcache是以守护进程方式运行于一个或多个服务中,随时会接收客户端的连接和操作。
(4)它支持分布式部署,但memcache集群的各个服务端之间是互不通信的,所以它的分布式实现需要依赖客户端实现
(5)Memcached是多线程的,非阻塞IO复用的网络模型,使用时需要锁,锁会带来性能损耗,但其采用的是多核方式,可以提升数据存储的性能
3.3 同样也存在雪崩和击穿的问题
4.两者差异
(1)redis支持大value存储和多种形式的数据结构,而memCached只能存简单数据结构
(2)redis支持简单事务,可以保证一串命令的原子性
(3)memcache文档支持没有redis好
(4)Memcached提供了cas命令,可以保证多个并发访问操作同一份数据的一致性问题。
(5)redis支持持久化,而memcache在断电之后将丢失数据
(6)redis集群方案多,而memcache集群上不如redis,memcache集群多靠客户端来实现
网友评论