redis结构设计及针对msyql相关查询实现考虑

来源:互联网 发布:软件项目 编辑:程序博客网 时间:2024/05/02 04:20

针对项目需求,以下主要针对对象及相关操作进行分析。

Ø 对象存储:

redis对象存储有三种方案,考虑到操作的便利及存储效率,项目采用序列化存储和hash存储。

       进行hash存储时,首先需对对象进行拆分为field-value形式,利用对象属性作为fileld,value作为对象属性值。查询时首先获得field-value键值对,再进行对象组装。参见redisService接口hmset、hgetAll方法

       序列化存储较为便利,只需对对象进行序列化,获取时进行反序列化即可,但无法操作对象属性。参见redisService接口set/getObject方法。

对象存储key值的定义,一般情况下采用id作为唯一识别,如Talk:2577,若该对象经常根据其中一属性进行操作,可采取以下方法:

l 进行额外数据定义,建立id与此属性的映射

l 结合mysql,通过mysql获取id列表,之后根据id查询缓存

key-value存储不能提供如sql那样复杂的查询,Redis基本只能提供简单的查询,上述操作远不能满足系统对于数据的操作,对于mysql的联合查询等复杂操作,需要在redis中维护另外的数据映射,这些都需要在进行操作前事先考虑并设计好。如获取用户最近评论,则对talk相关属性建立另外映射。

Ø  对象更新:

针对对象的不同存储类型具有不同的更新方法:

Hash存储:利用keyfield(对象属性)进行修改。若未提供对象id,则需先获取id,进而进行修改

序列化存储:根据id获取对象,修改完再进行存储。

Ø  查询

存储对象时一般采用对象类型及id作为key值,查询时需通过id才能获取数据。以下针对数据相关查询进行说明(对象存储采用Talk:1形式):

l  FindById:根据id查询

解决方案:可直接查询

l  findAll:查询所有对象

解决方案:利用key值为Talk:*查询即可

l  FindbyProperty根据单个属性查询

解决方案:方法一,id与属性映射,进而获取对象。方法二,结合mysql

l  findByExample根据多个属性查询

解决方案:方法一:每个属性做映射,进而求结果交集。方法二,结合mysql获取id,进而获取对象

l  Criteria或DetachedCriteria查询以及联合查询等复杂查询

解决方案:方法一,事先设计好相关数据映射存储。方法二,结合mysql