举一些场景:
一, 比如实现一个简单的日志收集功能或发送大量短信, 邮件的功能, 实现方式是先将数据收集到队列中, 然后有一个定时任务去消耗队列, 处理该做的事情.
直接使用 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 数据记录, 以完全解决内存碎片问题.
如何保证, 缓存与数据库的数据一致性?
新增数据: 先新增到数据库, 再新增到缓存.
编辑数据: 先删除缓存数据, 再修改数据库中数据, 再新增到缓存.
删除数据: 先删除缓存数据, 再删除数据库中数据.
查询数据: 先查询缓存数据, 没有, 再查询数据库, 再新增到缓存.
强一致性是很难保证的, 比如事务一致性, 时间点一致性, 最终一致性等.
来源: http://www.bubuko.com/infodetail-3384898.html