redis和memcache的区别

对比一下:

1、redis单线程,memcache多线程。一般每秒请求次数不会太大,选择时这个问题可忽略。

2、redis可持久化(支持master-slave主从备份),memcache数据只能放在内存。面对机器停电或重启等,redis影响不大,数据丢失较少甚至不丢失;而memcache全丢失,所以一般存在单点问题(虽然可以通过一些手段做到高可用)。

3、数据一致性:redis是单线程,所以对于一个事务按顺序执行命令即可,memcache提供CAS机制(可以先获得该key版本号,再调用client.cas(key, newValue, casValue);即可)。一般来说,数据一致性比较少出问题,但是针对多个客户端Client可能同时修改某个值时(比如一个红包被领取剩余的钱数),为了保证修改时,原来的值已经变化,这里就需要保证数据一致性。

4、存储问题,最终转化为字节存储,但redis工具包一般存储的value要转成String,而memcache有工具包直接存储Object(需要实现序列化),但最终还是要序列化成字节byte格式。

5、存储格式,redis有很多数据类型,像String、Hash、List、Set、Sorted Set。其中Hash(即类似HashMap结构存储)摒弃了像memcache的先序列化以及获取后反序列化的操作,直接针对具体某个属性修改,真方便啊\(^o^)/;Sorted Set可用来实现排序排行榜等功能。

6、redis具有“订阅-发布系统”高级功能。

 7、redis可通过下面命令修复数据,重新起服会自动更新加载。若起服错误,用diff命令比较稳健。

redis-check-aof --fix appendonly.aof

拓展,分片时,可通过范围分,也可通过一致性hash分。常见实现为1、在客户端分片。2、通过代理分片,比如Twemproxy。3、查询路由:

一致性hash:

定义:一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 {\displaystyle K/n} K/n 个关键字重新映射,其中 {\displaystyle K} K是关键字的数量, {\displaystyle n} n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。

        在一些缓存的集群扩容时,常常提到一致性hash算法,一般指以较小的改动增加一个节点。如果把hash值定位为1-232,组成一个圈,将集群的节点平均划分圈,放到相应位置,请求来的时候根据请求ip或用户信息等的定值得到hash值找到最近的节点访问(可以理解为按照二叉树规则查找)。这样的话,增加新节点,只影响了原来两个旧节点之间的一半的数据。另外,为了避免hash值集中在某个节点上,需要自己实现hash值计算,比如memcache的KETAMA_HASH。

        但是如果是web服务器负载均衡的机器扩容时,因为无会话保存,直接使用求余算法即可。另外,负载均衡有:DNS域名解析负载均衡(延迟)、数据链路层负载均衡(LVS)、IP负载均衡(SNAT)、HTTP重定向负载均衡(少见)、反向代理负载均衡(nginx)。负载均衡算法有:轮询算法、哈希算法(即一致hash)、加权算法(即加权轮询)、最小连接算法、响应速度算法、随机算法(即随机值,也可配置权重概率随机)。其中主要按请求次数、连接数、自定义配置权重来处理请求。

反向代理负载均衡:常用nginx,看到一篇安装配置步骤,有空搭一下。

猜你喜欢

转载自1181731633.iteye.com/blog/2411143