当前位置: 首页 > 科技观察

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

时间:2023-03-12 13:07:56 科技观察

1.前言Redis是一个Key-Value数据库。存储的时候,需要一个唯一的Key值。查询的时候是根据key-value,但是Redis毕竟只是key-value存储,所以有很多局限性。例如:(1)不能与多个条件组合的查询,例如:如果强制实现,则需要多个命令来计算并集或交集。(2)模糊查询中文比较费力;因此,如何设计一个合适的Key来优化我们的查询操作,是一件比较有意义的事情。Key的设计网上有很多资料,但是对我来说太乱了,一直没有找到合适的解决方案。下面我们来学习一个比较简单的模式匹配的key-value设计方法。下面研究主要介绍项目中使用的方法。有兴趣的同学可以克隆代码一起学习。仓库地址:https://git.oschina.net/xuliugen/redis-demo.git二、项目结构SSM框架(Spring+SpringMVC+MyBatis),除了实现Redis的存储外,还实现了读取-通过注解编写数据库的分离功能,实现Spring对数据库和Redis的事务管理,JSR303验证,简单的领域驱动DDD思想项目。(1)项目结构:(2)数据库脚本:(3)Spring配置文件位置:其中,db-redis.xml文件中,以下代码表示开启Redis事务:(4)Redis和MyBatis代码位置:3.Keyvalue对于上面的设计,我大致看了一下依赖它的项目结构。RedisKey的设计我还没有开始,可以略过。接下来的部分是学习如何设计一个Key实现模式匹配查询方法。(1)场景假设有一个实体对象SecurityUserDTO,如下:这里假设用户对象最常用的查询条件是:用户名(userName)和单位类型(unitType)。因此,在设计数据库的时候,我们应该对这两个属性添加索引(题外话,跟Key的设计无关!直接点击这种最常见的数据库添加索引的方式)。数据库是有索引的,那么当我们把数据存到Redis中的时候,怎么取出来呢?(2)首先看Redis最终存储的数据格式:其中:SU1_县级单位_wangwu_0000000035可以分为四部分:1.简化实体对象名是SecurityUserDTO的缩写,为了缩短长度关键;2。unitType的值,第一个查询条件;3、userName的值,第二个查询条件;4、ID的值,十位数值,不足十位前面加0;(3)如何拼接,核心代码如下:assembleRedisKeyPrefix()方法:assembleIdForKey()方法:至此,我们已经基本知道了大致的拼接过程,所以在Redis中存储的数据格式如下:注意:可以通过SecurityUserController#addUser(SecurityUserDTOuserDTO)方法测试效果。(4)如何查询:查询可以参考SecurityUserController#listByCondition()方法:查询时,也需要根据查询条件构造Key值,然后读取数据。如果有所有查询条件,则构造的Key值如下:如果只有一个查询条件,则构造的Key值如下:(5)修改数据和删除数据:因为拼接时ID必须唯一,所以,删除的直接拼接可以采用如下形式:4.总结拼接Key的方式很简单。常用的查询条件属性作为拼接Keys的依据。当然,也可以用其他的方法,但最重要的是如何练习。