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

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

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

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

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

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

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

上一篇:Redis实战应用:获取key值、批量获取key值、获取hashkey值、批量获取hashkey值等


下一篇:关于包含简单幂函数和简单正余弦函数的导函数的求解和优化问题