您的位置:首页 > 数据库 > Memcache

Redis 与 Memcached 区别:

2019-07-23 22:02 537 查看
版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。 本文链接:https://blog.csdn.net/sofeld/article/details/97039027

Redis 与 Memcached 区别:

两者都是非关系型数据库。主要有以下不同:

数据类型:

Memcached 仅支持字符串类型。
redis 支持:String,List,set,zset,hash 可以灵活的解决问题。

数据持久化:

Memcached 不支持持久化。
Redis 采用两种持久化策略:RDB 快照和 AOF 日志。

分布式:

Mencached 不支持分布式,只能在客户端使用一致性 hash 来实现分布式存储,这种方式在存储和查询时都需要在客户端先计算一次数据所在的节点。
redis cluster 实现了分布式的支持。

内存管理机制:

redis 中,并不是所有数据都一直存储在内存中,可以将一些很久没用的 value 交换到磁盘,而 memcached 数据则候会一直在内存中。
memcached 将内存分割成特定的块进行存储,以完全解决内存碎片化的问题,但是这种方式使得内存利用率不高,如块大小 128bytes,只存储了 100bytes 的数据,那么剩下的 28bytes 就浪费掉了。

键的过期时间:

redis 可以为每个键设置过期时间,当键过期时,自动删除该键。
对于散列表这种容器,只能为整个键设置过期时间 (整个散列表),而不是为键里面的单个元素设置过期时间。

设置键的生存时间:

expire: 指定秒
pexpire: 指定毫秒

127.0.0.1:6379> set key hello
OK
127.0.0.1:6379> expire key 1
(integer) 1
127.0.0.1:6379> get key
(nil)
127.0.0.1:6379> hset hashkey key1 1
(integer) 0
127.0.0.1:6379> hget hashkey key1
"1"
127.0.0.1:6379> expire hashkey 1
(integer) 1
127.0.0.1:6379> hget hashkey key1
(nil)
127.0.0.1:6379> zadd zset 0 key1 1 key2
(integer) 0
127.0.0.1:6379> zrange zset 0 -1
1) "key1"
2) "key3"
3) "key2"
127.0.0.1:6379> expire zset 1
(integer) 1
127.0.0.1:6379> zrange zset 0 -1
(empty list or set)

设置过期时间:过期时间是一个 unix 时间戳
expireat: 秒精度
pexpireat:毫秒精度

过期键的删除策略:

定时删除:

在设置键的过期时间的同时,创建一个定时器,让定时器在键过期时间来临时,立即执行对键的删除操作。

优点:对内存是友好的,可以保证过期键会尽可能快被删除,并释放过期键所占用的内存。
缺点:对 CPU 不友好,在过期键较多的情况下,删除键的操作会占用相当一部分的 CPU 时间,在内存不紧张但 CPU 紧张的情况下,将 cpu 时间用在删除与当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。
此外,定时器需要使用 redis 服务器的时间事件,时间事件的实现方式为无序链表,查找一个事件的事件复杂度为 O (N),因此创建大量的定时器不现实。

惰性删除:

仅在程序取出键时才进行过期检查

优点: CPU 友好,不会花费额外的时间。
缺点:对内存不友好,会造成内存泄漏。

定期删除:

每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少对 CPU 时间的影响。

原文:https://www.geek-share.com/detail/2774786247.html

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: