存储

  |  手机版

收藏网站

投稿QQ:1745232315

IT专家网,汇聚专业声音 解析IT潮流 IT专家网,汇聚专业声音 解析IT潮流

网络

专家视点在现场环球瞭望
IT专家网 > 存储

Redis存储Key的一种设计实现方式:模式匹配

作者:51CTO出处:论坛2018-07-18 10:46

  一、前言

  Redis是Key-Value数据库,存储的时候需要一个唯一的Key值,查询的时候根据根据key值进行查询,但是Redis毕竟只是key-value存储,所以有很多局限性。例如:

  (1)无法实现多条件组合的查询,如:

  硬要实现的话需要多条命令并计算并集或交集。

  (2)模糊查询中文比较费劲;

  因此,如何设计一个合适的Key来优化我们的查询操作,是一个比较有意义的事情。

  对于Key的设计网上有很多资料,但对我来说,都太过于凌乱,并没有找到一个合适的方案。下边,和大家一起学习一种较为简单的模式匹配方式的Key值设计方法。

  下边的学习,主要介绍项目中使用的方式,有兴趣的同学可以clone代码一起学习,仓库地址:

  https://git.oschina.net/xuliugen/redis-demo.git

  二、项目结构

  SSM框架(Spring+Spring MVC+MyBatis),除了实现了对Redis的存储,还通过注解的方式实现了数据库的读写分离功能,实现了Spring对数据库和Redis的事务管理,JSR303校验,以及简单的领域驱动DDD思想项目。

  (1)项目结构:

  (2)数据库脚本:

  (3)Spring配置文件位置:

  其中,db-redis.xml文件中,如下代码表示开启Redis事务:

  (4)Redis和MyBatis代码位置:

  三、Key值设计

  上述,大致看了依托的项目结构,还没有开始Redis Key值得设计,因此可以跳过,下边主要学习一下,如何设计一种Key实现模式匹配查询方式。

  (1)情景假设

  有实体对象SecurityUserDTO,如下:

  这里假设用户对象最常用的查询条件是:用户名(userName)和单位类型(unitType),因此,对于数据库设计的时候,我们应该对这两个属性加上索引(题外话,完全和Key的设计无关!只是在于点一下这种最常见的数据库加索引的方式)。

  数据库做了索引,那我,我们将数据存储到Redis中的时候,如何在把他取出来那?

  (2)首先,看一下最终存放在Redis中的数据格式:

  其中:

  SU1_县级单位_wangwu_0000000035

  可以分为四个部分:

  1、简化的实体对象名称,就是SecurityUserDTO的简写,为了缩短Key的长度;

  2、unitType的值,第一个查询条件;

  3、userName的值,第二个查询条件;

  4、ID的值,十位数值,前边不足十位补0;

  (3)如何拼接,核心代码如下:

  assembleRedisKeyPrefix()方法:

  assemberIdForKey()方法:

  到这里,基本已经知道了大致拼接的过程,因此存放到Redis的数据是如下格式:

  注:可以SecurityUserController#addUser(SecurityUserDTO userDTO)方法测试效果。

  (4)如何查询:

  查询的话可以参考SecurityUserController#listByCondition()方法:

  查询的时候,也是需要根据查询条件构造Key值,然后读取数据。

  如果,查询条件都有的话,构造的Key值如下:

  如果,查询条件只有一个的话,构造的Key值如下:

  (5)修改数据和删除数据:

  因为ID在拼接的时候肯定是唯一的,因此,删除的直接拼接为如下形式即可:

  四、总结

  拼接Key的方式很简单,以常用的查询条件属性作为拼接Key的依据,当然还可以通过其他的方式,但最主要的是如何去实践。

相关文章

关键词:Redis存储Key的实现方法,存储方法,Redis存储Key

责任编辑:林音子

网警备案