Redis的String中key和value的最大值(512M)
memcached的key的最大长度是250个字符;Redis中的key和value都是512Mb.
最简单的就是数据类型的不同(Memcache只是简单的key-value存储)、还有存储方式(Memcache全部是在内存中,Redis部分在硬盘中,所以Memcache的存储受到了内存大小的限制,Memcache中数据超过内存的大小就会抹掉前面的数据)。
还有以下几种不同
Redis是单核,memcache可以使用多核,所以存储大数据上Memcache性能要好于Redis;
多核多线程在一定程度上性能还是高于单核单线程的操作的。
与Memcached仅支持简单的key-value结构的数据记录不同,Redis支持的数据类型要丰富得多。最为常用的数据类型主要由五种:String、Hash、List、Set和Sorted Set。Redis内部使用一个redisObject对象来表示所有的key和value。
在Memcached里,你需要将数据拿到客户端来进行类似的修改再set回去,序列化再反序列化,这大大增加了网络IO的次数和数据体积。在Redis中,这些复杂的操作通常和一般的GET/SET一样高效。所以,如果需要缓存能够支持更复杂的结构和操作,那么Redis会是不错的选择。
memcached挂掉后,数据不可恢复;
redis数据丢失后可以通过aof恢复,Redis支持数据的备份,即master-slave主从模式的数据备份。
Redis和Memcached都是将数据存放在内存中,都是内存数据库。
但是Redis 部分存储在磁盘;Memcache全部都是在内存中,断电就不可恢复,不支持持久化。
Memcached是全内存的数据缓冲系统,Redis虽然支持数据的持久化,但是全内存毕竟才是其高性能的本质。作为基于内存的存储系统来说,机器物理内存的大小就是系统能够容纳的最大数据量。如果需要处理的数据量超过了单台机器的物理内存大小,就需要构建分布式集群来扩展存储能力。
Memcached本身并不支持分布式,因此只能在客户端通过像一致性哈希这样的分布式算法来实现Memcached的分布式存储。
当客户端向Memcached集群发送数据之前,首先会通过内置的分布式算法计算出该条数据的目标节点,然后数据会直接发送到该节点上存储。当客户端查询数据时,同样要计算出查询数据所在的节点,然后直接向该节点发送查询请求以获取数据。
相较于Memcached只能采用客户端实现分布式存储,Redis更偏向于在服务器端构建分布式存储,但没有采用一致性哈希,其实是cluster集群。最新版本的Redis已经支持了分布式存储功能。**Redis Cluster是一个实现了分布式且允许单点故障的Redis高级版本,它没有中心节点,具有线性可伸缩的功能。为了保证单点故障下的数据可用性,Redis Cluster引入了Master节点和Slave节点。**在Redis Cluster中,每个Master节点都会有对应的两个用于冗余的Slave节点。这样在整个集群中,任意两个节点的宕机都不会导致数据的不可用。当Master节点退出后,集群会自动选择一个Slave节点成为新的Master节点。(具体见redis集群的几种模式)
(1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件,因为当快照比较大的时候,会阻塞主线程的工作,影响是非常大的,会间断性暂停服务。
(2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次
(3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内
(4) 尽量避免在压力很大的主库上增加从库
(5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3…
这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。
缓存:会话缓存(Session Cache)和全页缓存(FPC);
队列(list和set 有push和pop的操作)
排行榜和计数器(Set和sorted set)
发布和订阅(基于Redis的发布和订阅功能做社交网络)
redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:
volatile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰
no-enviction(驱逐):禁止驱逐数据
资料:https://blog.csdn.net/u011489043/article/details/78922390