• 当项目中使用到缓存,我们是选择 Redis 还是 Memcached ,为什么?


    举一些场景:

    一、比如实现一个简单的日志收集功能或发送大量短信、邮件的功能,实现方式是先将数据收集到队列中,然后有一个定时任务去消耗队列,处理该做的事情。

    直接使用 Redis 的 lpush,rpop 或 rpush,lpop。

    //进队列
    $redis->lpush(key, value);
    
    //出队列
    $redis->rpop(key);

    Memcached 没有这种数据结构。

    二、比如我们要存储用户信息,ID、姓名、电话、年龄、身高 ,怎么存储?

    方案一:key => value

    key = user_data_用户ID

    value = json_encode(用户数据)

    查询时,先取出key,然后进行json_decode解析。

    方案二:hash

    key = user_data_用户ID

    hashKey = 姓名,value = xx

    hashKey = 电话,value = xx

    hashKey = 年龄,value = xx

    hashKey = 身高,value = xx

    查询时,取出key即可。

    //新增
    $redis->hSet(key, hashKey, value);
    $redis->hSet(key, hashKey, value);
    $redis->hSet(key, hashKey, value);
    
    //编辑
    $redis->hSet(key, hashKey, value);
    
    //查询
    $redis->hGetAll(key); //查询所有属性
    $redis->hGet(key, hashKey); //查询某个属性

    方案二 优于 方案一。

    三、比如社交项目类似于新浪微博,个人中心的关注列表和粉丝列表,双向关注列表,还有热门微博,还有消息订阅 等等。

    以上都用 Redis 提供的相关数据结构即可。

    四、Memcached 只存储在内存中,而 Redis 既可以存储在内存中,也可以持久化到磁盘上。

    如果需求中的数据需要持久化,请选择 Redis 。

    个人在工作中没有用到 Memcached ,通过查询资料得到 Memcached 内存分配时优于 Redis。

    Memcached 默认使用 Slab Allocation 机制管理内存,按照预先规定的大小,将分配的内存分割成特定长度的块以存储相应长度的key-value数据记录,以完全解决内存碎片问题。

    如何保证,缓存与数据库的数据一致性?

    新增数据:先新增到数据库,再新增到缓存。

    编辑数据:先删除缓存数据,再修改数据库中数据,再新增到缓存。

    删除数据:先删除缓存数据,再删除数据库中数据。

    查询数据:先查询缓存数据,没有,再查询数据库,再新增到缓存。

    强一致性是很难保证的,比如事务一致性,时间点一致性,最终一致性等。

  • 相关阅读:
    去掉安装程序被挂起,要重新启动电脑
    为什么要关闭数据库连接,可以不关闭吗?
    读取Excel异常定义了过多字段的解决方法
    关于打开ILDASM的方法
    SQL Server数据类型
    C++的MFC,与C#的.NET
    javascript数据类型
    日志记录组件[Log4net]详细介绍
    Xml的读取
    yield让代码更加简洁
  • 原文地址:https://www.cnblogs.com/flzs/p/12205733.html
Copyright © 2020-2023  润新知