关于memcached的疑惑,请各位指点一下

天行流沙 2014-03-05 10:41:41
最近在了解memcached,通过查询网上的资料,对memcached有了个大概的了解。

但是有一点我很疑惑:网上很多文章都说“更新操作时,先更新数据库中的数据,再更新memcached中的相关数据”,这里的相关数据如何确定呢?

打个比方:

key1和key2中的数据都包含数据库中某表的id2和id3两条记录,现在在业务系统中对id2那条数据做了更新操作,那么如何更新id2的“相关数据”呢?

因为,根据我的理解,memcached中的key/value是一个整体,如果我们要更新id2,实际上需要替换key1和key2的value值。但是我们如何知道哪个key里面包含id2这条数据呢?

还是说,memcached本身对于实时性要求较高(或者更新频繁的)数据不太适用呢?

请不吝赐教,先谢谢了!
...全文
474 11 打赏 收藏 举报
写回复
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
宁波朱超 2014-03-10
  • 打赏
  • 举报
回复
引用 7 楼 wangch_sk 的回复:
[quote=引用 6 楼 zhuchao_ko 的回复:] [quote=引用 2 楼 wangch_sk 的回复:] [quote=引用 1 楼 zhuchao_ko 的回复:] replace
谢谢你的回答,能不能说的详细些?应该replace哪个key呢,在更新的时候我只知道我需要更新id2这条数据,但是不知道key1和key2里面包含这条数据吧?[/quote] replace("主键KEY",对应的记录数据); 不过我不建议把这些数据全部丢MEM里 我觉得用到什么就丢什么 并且设置一个过期时间。[/quote] 谢谢回答。请看这种情况 比如:查询北京市朝阳区35岁还没结婚的人(这里查到的应该是多条记录),加上这个查询访问非常频繁,那把查询结果保存到memcached中,应该是add(key1,数据集)。这里的key1和某条具体的数据库记录应该没有关系。如果我现在修改了某个35岁还没结婚的人的信息,那mem中的数据需要更新吧,这时我如何知道要更新key1呢?(因为添加的时候key1是和整个数据集关联的)。 请先不考虑过期时间问题,注意本问题问的是“当我更新数据库记录时,就想更新mem中的数据,大家在用的时候用什么方式来确定需要更新哪些key的值”,如果只能通过过期时间来让历史数据过期,那是不是说“memcached本身对于实时性要求较高(或者更新频繁的)数据不太适用呢?”[/quote] 修改 添加 删除 用主库 查询使用从库 主库一台 从库N台 进行读写分离 你要查就去从库去查 主库向从库同步数据。
天行流沙 2014-03-07
  • 打赏
  • 举报
回复
感谢【yunfeifan】的回答,你的回答最切合我的问题!也感谢各位老师的回答。 key的规则可以是任意的,因为key的定义就是为了方便业务,现在由于有这个疑问,所以key不知道怎么定。 请各位老师在回答问题之前仔细看看我的问题,如果还不明白,那我再简单描述一下: 1、在实际运用中,memcached中一个key是不是对应一条数据库记录? 各位老师只要回答“是”或者“不是”;如果“是”,那就不存在下面的问题了,如果“不是”看问题2 2、memcached中一个key对应的是和业务相关的数据集,那修改了数据集中的某条记录,如何来确定应该更新哪个key的value? 在所有问题中就【yunfeifan】给了一个解决方案:维护key和数据的映射关系,但是:假设根据这个映射关系找到了key,又该如何更新呢? 因为key/value是我们在第一次查询的时候加进去的,那我们在更新完之后需要执行哪个查询逻辑将更新后的数据查出来,然后replace呢? 是不是还得维护一个key到函数的映射关系呢? 数据集:包含一条或多条数据库记录的集合。 这个疑惑如果不揭开,对memcached的印象就是不适合实时更新的数据。希望各位老师能够解惑,先谢谢了
yunfeifan 2014-03-07
  • 打赏
  • 举报
回复
你的问题是key1和id123对应不起来啊,你的这个key是用什么规则定义的呢? 你最好有个key和id的mapping对关系才可以,缓存只是为了减少查询数据库,你也可以实现 key1=id1,只不过用php逻辑来实现你要的结果。
天行流沙 2014-03-06
  • 打赏
  • 举报
回复
各位老湿能指点一下吗?
天行流沙 2014-03-06
  • 打赏
  • 举报
回复
引用 6 楼 zhuchao_ko 的回复:
[quote=引用 2 楼 wangch_sk 的回复:] [quote=引用 1 楼 zhuchao_ko 的回复:] replace
谢谢你的回答,能不能说的详细些?应该replace哪个key呢,在更新的时候我只知道我需要更新id2这条数据,但是不知道key1和key2里面包含这条数据吧?[/quote] replace("主键KEY",对应的记录数据); 不过我不建议把这些数据全部丢MEM里 我觉得用到什么就丢什么 并且设置一个过期时间。[/quote] 谢谢回答! 你的意思是mem中存的实际上是和数据库中对应的一条条记录是吗? 我的理解应不是,因为这样就没有意义了,因为实际业务中大部分查的都是结果集,而不是只查一条记录。用mem的目的就是为了快速得到数据。
天行流沙 2014-03-06
  • 打赏
  • 举报
回复
引用 6 楼 zhuchao_ko 的回复:
[quote=引用 2 楼 wangch_sk 的回复:] [quote=引用 1 楼 zhuchao_ko 的回复:] replace
谢谢你的回答,能不能说的详细些?应该replace哪个key呢,在更新的时候我只知道我需要更新id2这条数据,但是不知道key1和key2里面包含这条数据吧?[/quote] replace("主键KEY",对应的记录数据); 不过我不建议把这些数据全部丢MEM里 我觉得用到什么就丢什么 并且设置一个过期时间。[/quote] 谢谢回答。请看这种情况 比如:查询北京市朝阳区35岁还没结婚的人(这里查到的应该是多条记录),加上这个查询访问非常频繁,那把查询结果保存到memcached中,应该是add(key1,数据集)。这里的key1和某条具体的数据库记录应该没有关系。如果我现在修改了某个35岁还没结婚的人的信息,那mem中的数据需要更新吧,这时我如何知道要更新key1呢?(因为添加的时候key1是和整个数据集关联的)。 请先不考虑过期时间问题,注意本问题问的是“当我更新数据库记录时,就想更新mem中的数据,大家在用的时候用什么方式来确定需要更新哪些key的值”,如果只能通过过期时间来让历史数据过期,那是不是说“memcached本身对于实时性要求较高(或者更新频繁的)数据不太适用呢?”
宁波朱超 2014-03-06
  • 打赏
  • 举报
回复
引用 2 楼 wangch_sk 的回复:
[quote=引用 1 楼 zhuchao_ko 的回复:] replace
谢谢你的回答,能不能说的详细些?应该replace哪个key呢,在更新的时候我只知道我需要更新id2这条数据,但是不知道key1和key2里面包含这条数据吧?[/quote] replace("主键KEY",对应的记录数据); 不过我不建议把这些数据全部丢MEM里 我觉得用到什么就丢什么 并且设置一个过期时间。
天行流沙 2014-03-05
  • 打赏
  • 举报
回复
引用 3 楼 jcgh1985 的回复:
不知道你是怎么用的 我是这样用的 打个简单的比方 KEY 对应一个VALUE 这个value 是一个对象 比如 KEY=userId VALUE=username,trueName,email 等等~~数据库更新这个用户的trueName后 整对象读出来更新到缓存的userId中, so "先更新数据库中的数据,再更新memcached中的相关数据" 明白了吧?
谢谢你的回答。但是你举得例子比较特殊,key对应得是一条数据库记录,key就是取的userid,这样更新的时候确实好改。 但是就像我原问题里面图所示,可能是这样的key=key1 value=[{userid1,username1},{userid2,username2},{userid3,username3}],现在修改了userid2对应的数据,该如更新呢? 因为我的理解是,memcached中缓存的不应该是一条一条的数据库记录,而应该是和业务相关的数据(可能一个key里面包含一条或多条数据库记录)。不知道能不能再给我解释一下,不慎感激!
白s菜 2014-03-05
  • 打赏
  • 举报
回复
不知道你是怎么用的 我是这样用的 打个简单的比方 KEY 对应一个VALUE 这个value 是一个对象 比如 KEY=userId VALUE=username,trueName,email 等等~~数据库更新这个用户的trueName后 整对象读出来更新到缓存的userId中, so "先更新数据库中的数据,再更新memcached中的相关数据" 明白了吧?
天行流沙 2014-03-05
  • 打赏
  • 举报
回复
引用 1 楼 zhuchao_ko 的回复:
replace
谢谢你的回答,能不能说的详细些?应该replace哪个key呢,在更新的时候我只知道我需要更新id2这条数据,但是不知道key1和key2里面包含这条数据吧?
宁波朱超 2014-03-05
  • 打赏
  • 举报
回复
replace
相关推荐
发帖
高性能WEB开发

2.5w+

社区成员

高性能WEB开发
社区管理员
  • 高性能WEB开发社区
加入社区
帖子事件
创建了帖子
2014-03-05 10:41
社区公告
暂无公告