目录
参考:Javaguide 4
Redis 和 Memcached 的区别和共同点
现在公司⼀般都是⽤
Redis
来实现缓存,⽽且
Redis
⾃身也越来越强⼤了!不过,了解
Redis
和
Memcached
的区别和共同点,有助于我们在做相应的技术选型的时候,能够做到有理有据!
共同点 :
1.
都是基于内存的数据库,⼀般都⽤来当做缓存使⽤。
2.
都有过期策略。
3.
两者的性能都⾮常⾼。
区别 :
1.
Redis
⽀持更丰富的数据类型
(⽀持更复杂的应⽤场景)
。
Redis
不仅仅⽀持简单的
k/v
类
型的数据,同时还提供
list
,
set
,
zset
,
hash
等数据结构的存储。
Memcached
只⽀持最简
单的
k/v
数据类型。
2.
Redis
⽀持数据的持久化
,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进
⾏使⽤
,
⽽
Memecache
把数据全部存在内存之中。
3.
Redis
有灾难恢复机制
。
因为可以把缓存中的数据持久化到磁盘上。
4.
Redis
在服务器内存使⽤完之后,可以将不⽤的数据放到磁盘上。但是,
Memcached
在服
务器内存使⽤完之后,就会直接报异常。
5.
Memcached
没有原⽣的集群模式,需要依靠客户端来实现往集群中分⽚写⼊数据;但是
Redis
⽬前是原⽣⽀持
cluster
模式的
.
6.
Memcached
是多线程,⾮阻塞
IO
复⽤的⽹络模型;
Redis
使⽤
单线程的多路 IO 复⽤模
型
。
(
Redis 6.0
引⼊了多线程
IO
)
7.
Memcached
过期数据的删除策略只⽤了惰性删除,⽽
Redis
同时使⽤了惰性删除与定期删删除
缓存设置过期时间
注意:
Redis
中除了字符串类型有⾃⼰独有设置过期时间的命令
setex
外,其他⽅法都需要依靠
expire
命令来设置过期时间 。另外,
persist
命令可以移除⼀个键的过期时间:
过期时间除了有助于缓解内存的消耗,还有什么其他⽤么?
很多时候,我们的业务场景就是需要某个数据只在某⼀时间段内存在,⽐如我们的短信验证码可
能只在
1
分钟内有效,⽤户登录的
token
可能只在
1
天内有效。
如果使⽤传统的数据库来处理的话,⼀般都是⾃⼰判断过期,这样更麻烦并且性能要差很多。
过期的数据的删除策略
1.
惰性删除
:只会在取出
key
的时候才对数据进⾏过期检查。这样对
CPU
最友好,但是可能会
造成太多过期
key
没有被删除。
2.
定期删除
: 每隔⼀段时间抽取⼀批
key
执⾏删除过期
key
操作。并且,
Redis
底层会通过限
制删除操作执⾏的时⻓和频率来减少删除操作对
CPU
时间的影响。
定期删除对内存更加友好,惰性删除对
CPU
更加友好。两者各有千秋,所以
Redis
采⽤的是
定期
删除+惰性/懒汉式删除 。
Redis 内存淘汰机制
Redis
提供
8
种数据淘汰策略
两种LRU 不同是删除数据的集合不同 第一种是已设置过期时间的数据集
第二种是当前的键空间,包含所有的键。
两种LFU的区别和LRU一样。
1.
volatile-lru
(
least recently used
)
:从已设置过期时间的数据集(
server.db[i].expires
)
中挑选最近最少使⽤的数据淘汰
2.
volatile-ttl
:从已设置过期时间的数据集(
server.db[i].expires
)中挑选将要过期的数据淘汰
3.
volatile-random
:从已设置过期时间的数据集(
server.db[i].expires
)中任意选择数据淘汰
4. allkeys-lru(least recently used):当内存不⾜以容纳新写⼊数据时,在键空间中,移除
最近最少使⽤的 key(这个是最常⽤的)
5.
allkeys-random
:从数据集(
server.db[i].dict
)中任意选择数据淘汰
6.
no-eviction
:禁⽌驱逐数据,也就是说当内存不⾜以容纳新写⼊数据时,新写⼊操作会报
错。
7.
volatile-lfu
(
least frequently used
)
:从已设置过期时间的数据集
(server.db[i].expires)
中
挑选最不经常使⽤的数据淘汰
8.
allkeys-lfu
(
least frequently used
)
:当内存不⾜以容纳新写⼊数据时,在键空间中,移
除最不经常使⽤的
key