Redis实战和核心原理详解(4)Redis存储Key的一种设计实现方式:模式匹配
注意:此方案仅为演示Redis 的使用,正式生产环境切勿使用!
相关文章:
Redis实战和核心原理详解(1)Centos7.0下安装Redis 5.0详细过程和使用常见问题
Redis实战和核心原理详解(2)Redis简介以及和其他缓存数据库的区别
Redis实战和核心原理详解(3)Redis常见的5种不同的数据类型详解
一、前言
Redis是Key-Value数据库,存储的时候需要一个唯一的Key值,查询的时候根据根据key值进行查询,但是Redis毕竟只是key-value存储,所以有很多局限性。例如:
(1)无法实现多条件组合的查询,如:
age > 25 AND name like 'A%'
硬要实现的话需要多条命令并计算并集或交集。
(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事务:
<property name="enableTransactionSupport" value="true"/>
(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在拼接的时候肯定是唯一的,因此,删除的直接拼接为如下形式即可:
*39
四、总结
拼接Key的方式很简单,以常用的查询条件属性作为拼接Key的依据,当然还可以通过其他的方式,但最主要的是如何去实践。上述,很简略的介绍了一下,因为对于这个项目来说,很多的细节,以博客的形式写出来确实受限,还请大家移步代码仓库地址:
https://git.oschina.net/xuliugen/redis-demo.git
有什么疑问和可以改进的地方,希望多多留言,相互学习。
【视频福利】2T免费学习视频,搜索或扫描上述二维码关注微信公众号:Java后端技术(ID: JavaITWork)回复:1024,即可免费获取!内含SSM、Spring全家桶、微服务、MySQL、MyCat、集群、分布式、中间件、Linux、网络、多线程,Jenkins、Nexus、Docker、ELK等等免费学习视频,持续更新!
Redis实战和核心原理详解(4)Redis存储Key的一种设计实现方式:模式匹配相关推荐
- Redis实战和核心原理详解(8)使用快照RDB和AOF将Redis数据持久化到硬盘中
一.前言 我们知道Redis是一款内存服务器,就算我们对自己的服务器足够的信任,不会出现任何软件或者硬件的故障,但也会有可能出现突然断电等情况,造成Redis服务器中的数据失效.因此,我们需要向传统的 ...
- 大数据是什么和大数据技术十大核心原理详解
一.数据核心原理 从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据&quo ...
- 大数据技术十大核心原理详解
一.数据核心原理--从"流程"核心转变为"数据"核心 大数据时代,计算模式也发生了转变,从"流程"核心转变为"数据"核心 ...
- Java Spring Data Redis实战与配置参数详解 application.properties...
Redis作为开源分布式高并发缓存,使用范围非常广泛,主流互联网公司几乎都在使用. Java Spring Boot 2.0实战开发Redis缓存可以参考下面的步骤,Redis安装可以直接使用Linu ...
- Java Spring Data Redis实战与配置参数详解 application.properties
Redis作为开源分布式高并发缓存,使用范围非常广泛,主流互联网公司几乎都在使用. Java Spring Boot 2.0实战开发Redis缓存可以参考下面的步骤,Redis安装可以直接使用Linu ...
- ios首次加载web_IOS_IOS中UIWebView的使用详解,一、初始化与三种加载方式
UI - phpStudy...
IOS中UIWebView的使用详解 一.初始化与三种加载方式 UIWebView继承与UIView,因此,其初始化方法和一般的view一样,通过alloc和init进行初始化,其加载数据的方式有三种 ...
- react文字滚动插件_【赠书】Preact(React)核心原理详解
豆皮粉儿们,又见面了,今天这一期,由字节跳动数据平台的"winge(宝丁)",带大家见识见识前端"轮子"之一Preact框架. 提到Preact,你肯定会先想到 ...
- react 流程图框架_【赠书】Preact(React)核心原理详解Preact(React) 核心原理解析...
豆皮粉儿们,又见面了,今天这一期,由字节跳动数据平台的"winge(宝丁)",带大家见识见识前端"轮子"之一Preact框架. 提到Preact,你肯定会先想到 ...
- Rocket快速实战与高级原理详解
ACL权限控制 可以从源码包中寻找到指定的官方文档介绍,其内容和路径如下 1.权限控制特性介绍 权限控制(ACL)主要为RocketMQ提供Topic资源级别的用户访问控制.用户在使用RocketMQ ...
最新文章
- python使用选择结构鉴别合法日期
- 微信小程序一些常见的坑
- Spring-AOP基础知识
- Linux安装和管理程序的相关知识点
- 160 - 13 badboy
- 隐藏文件或文件夹属性无法修改解决方案
- 通过交互式命令从github拉取项目模板并创建新项目
- python 2.7 input_Python2.7-fileinput
- js中判断数组中是否包含某元素的方法
- Java Spring-事务管理
- python中http_Python中的HTTP错误
- 怎么做SWOT分析模型PPT呢?
- 央视记者点赞京东物流 仓库分拣员变身时尚白领管理300个机器人
- 全球十大管理咨询公司的排名
- 恢复被文件夹病毒恶意隐藏的文件夹
- ofd转成html,基于HTML5的OFD文件在线显示的方法以及装置与流程
- 考研数学 第6讲 中值定理
- AI 机器学习实践总结
- mousemove实现图片鼠标跟随效果
- win8.1 如何查看com端口号
热门文章
- iOS13.2频繁「杀」后台,微信给出建议
- 老板叫我把几十万条Excel数据录入系统
- Android 内置可卸载应用报错
- 一周热图|辛芷蕾费德勒融情邂逅;阿迪联合贝克汉姆推跑鞋;垂直森林入选全球50座最具标志性摩天大楼...
- CMD实现给文件或者文件夹创建软链接
- java毕业设计Sketch2Mod网站Mybatis+系统+数据库+调试部署
- python数据库建表_Python3创建mysql数据表结构和插入数据
- Phoenix之协处理器
- day19总结和作业
- Android购物软件制作(毕业设计)