zoukankan      html  css  js  c++  java
  • 当项目中使用到缓存,我们是选择 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数据记录,以完全解决内存碎片问题。

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

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

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

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

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

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

  • 相关阅读:
    linux 实现一列数据的求和、累积求和、及1/2求和
    linux系统中如何删除某些文件或者某一类以外的所有文件
    linux系统中查看系统内核、发行版本信息
    linux系统中如何将当前目录下的文件从大到小排序和从小到大排序
    c语言中float关键字和double关键字的区别
    linux 系统如何给软件设置环境变量
    使用detectRUNS包进行ROH检测,计算近交系数实践
    诸城模拟赛 dvd的逆序对
    codevs1316 文化之旅
    codevs2800 送外卖
  • 原文地址:https://www.cnblogs.com/flzs/p/12205733.html
Copyright © 2011-2022 走看看