请教大家一个Redis缓存处理机制

小灰狼 2017-01-03 11:18:15
一种数据对象(Device),可能的查询依据有:根据数据库Id查、根据序列号查

以前在程序中是放在两个 Map<Integer, Device>、Map<String, Device> 中的。虽然是两个 map,但是Map的 Value 指向的是内存中的同一个对象。

但是 Redis 似乎没有这种机制,要肿么办?
还是说,要在 redis 中建立一个 hash,用于二次、三次查找?
...全文
544 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
liufurun 2017-01-09
  • 打赏
  • 举报
回复
引用 8 楼 hemowolf 的回复:
[quote=引用 7 楼 liufurun 的回复:] 楼主,redis是个KV的存储形式,怎么能让两个key对应同一个value呢?共用一个value的时候,expire怎么办? 如果你的id和序列号是唯一的,那么可以尝试like,不过这样效率低 还有一种是把id和序列号的对应关系存起来,查两次。
Id 是唯一的,但是序列号在数据库中不一定唯一。因为设备可能从一个网点移除,然后安装到另一个网点。数据库里的处理办法是,先标记原来的那个设备为“已删除”,再创建一条新的设备数据。 当然,如果设备数据放进redis,肯定是那些状态为没有删除的数据! 现在已经实现的做法是: 建立 Key/Value = Id/Device的存储;建立 Key/Value = Sn/Id 的存储。 [/quote] 恩,这样是可以的,就是我说的把id和序列号的对应关系存起来
小灰狼 2017-01-06
  • 打赏
  • 举报
回复
引用 7 楼 liufurun 的回复:
楼主,redis是个KV的存储形式,怎么能让两个key对应同一个value呢?共用一个value的时候,expire怎么办? 如果你的id和序列号是唯一的,那么可以尝试like,不过这样效率低 还有一种是把id和序列号的对应关系存起来,查两次。
Id 是唯一的,但是序列号在数据库中不一定唯一。因为设备可能从一个网点移除,然后安装到另一个网点。数据库里的处理办法是,先标记原来的那个设备为“已删除”,再创建一条新的设备数据。 当然,如果设备数据放进redis,肯定是那些状态为没有删除的数据! 现在已经实现的做法是: 建立 Key/Value = Id/Device的存储;建立 Key/Value = Sn/Id 的存储。
十四月的清晨 2017-01-06
  • 打赏
  • 举报
回复
引用 2 楼 hemowolf 的回复:
[quote=引用 1 楼 Rainy_Ln 的回复:] 没明白啥意思,redis直接 2个key存呗
直接存两个 key 会造成内存浪费啊,如果一个对象占用的内存比较大的话,另外需要查询的可能性比较多时,内存浪费就很严重了 比如一个员工信息缓存,需要根据员工ID查、根据身份证号查、根据员工工号查…… 如果一个查询依据一个 key,则一个员工信息会在redis里有三份数据了 所以,我想: 1、建立 key/value = Id/Employee的存储 2、建立 key/value = 身份证号/Id 的存储 3、建立 key/value = 员工工号/Id 的存储 这样,当需要根据员工工号找员工时,可以先根据工号找到Id,再根据Id找Eployee,但如此一来就是进行了两次查询[/quote] 你说的方案可以,对key做缓存,2次是没办法的 另外内存数据库 多查一次key的效率 完全可以忽略 放心 对redis 做好分区就行了
boybaozi 2017-01-06
  • 打赏
  • 举报
回复
这需求换mongodb
小灰狼 2017-01-04
  • 打赏
  • 举报
回复
自己 up 一下
小灰狼 2017-01-04
  • 打赏
  • 举报
回复
没有人吗? 我觉得我的这种需求很常见啊
liufurun 2017-01-04
  • 打赏
  • 举报
回复
楼主,redis是个KV的存储形式,怎么能让两个key对应同一个value呢?共用一个value的时候,expire怎么办? 如果你的id和序列号是唯一的,那么可以尝试like,不过这样效率低 还有一种是把id和序列号的对应关系存起来,查两次。
欧美噶 2017-01-04
  • 打赏
  • 举报
回复
一般可以考虑如下方案: 第一种:你的key设计的技巧性一些,比如固定首和尾,比较容易定位 第二种:redis里面可以有group概念
Defonds 2017-01-04
  • 打赏
  • 举报
回复
不知道弄明白楼主的意图了没。 这个貌似还就得查两次。
十四月的清晨 2017-01-03
  • 打赏
  • 举报
回复
没明白啥意思,redis直接 2个key存呗
小灰狼 2017-01-03
  • 打赏
  • 举报
回复
引用 1 楼 Rainy_Ln 的回复:
没明白啥意思,redis直接 2个key存呗
直接存两个 key 会造成内存浪费啊,如果一个对象占用的内存比较大的话,另外需要查询的可能性比较多时,内存浪费就很严重了 比如一个员工信息缓存,需要根据员工ID查、根据身份证号查、根据员工工号查…… 如果一个查询依据一个 key,则一个员工信息会在redis里有三份数据了 所以,我想: 1、建立 key/value = Id/Employee的存储 2、建立 key/value = 身份证号/Id 的存储 3、建立 key/value = 员工工号/Id 的存储 这样,当需要根据员工工号找员工时,可以先根据工号找到Id,再根据Id找Eployee,但如此一来就是进行了两次查询

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧