由SQL数据库转换Redis的实例

本文涉及的产品
云原生数据库 PolarDB MySQL 版,Serverless 5000PCU 100GB
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
简介:

深圳市的士查询软件(gogo查的后台服务器)
  1、现有版本总结
  热点区域信息是根据过去半年的历史数据计算得出,短期内属于固定信息,不用做任何改变。现在所用的gogo查的版本中,查询热点区域所用的API,是先在servlet中计算出用户选择区域周围的区域ID,构造出SQL查询语句,最后从postgresql中读取所需的热点区域信息。
  SQL语句如下:
Select regionno from sztable.hotregioninfo where dayofweek=’”+ dayofweek+”’ and hour = ‘”+hour+”’ and regionno in “+sBuilder.toString()+”order by amount desc limit ”+return_region_num+”;
  具体操作可在XGO API程序中看到。
  数据库中所存的热点信息,共有800多W条,在SQL查询中需要耗时至少2~3秒,查询效率低下,导致用户体验下降。故在此采用Redis解决查询较慢的问题。
  2、热点区域postgresql转Redis
  Redis数据库设计:结合原有数据以及查询需求(需要求周边区域中前N大),采用Redis中有序集合的数据结构。用“星期:时间”字符串作为key,共有(7*24=168)个;用相应区域号及在该区域成功打车的次数作为value中的memeber和score。
  将热点区域信息从postgresql中导入redis:程序代码在PostToRedis中,ToRedis为程序入口。直接运行即可将数据从postgresql中以1中设计格式导入redis。注:由于读取数据量较大,可能会导致计算机为java分配的内存空间不够用,应在运行前进行相应设置(Xms)。
  3、查询过程
  模拟用户查询操作,采用的模式为:用户提交坐标点及第几天、时间,在serrvlet中计算出坐标点所在区域号,根据半径计算出要查询的范围内所有的区域ID,并写入到Redis有序集合T1(临时,只对本次查询有效,查询结束之后即将该集合销毁)中,然后将T1与之前已经存好的168个key、value中相应时间段的集合求交集。Eg:现在为周三,上午十点钟,就与key为3:10的集合求交集,交集结果按照降序排列,将前N区域号提取出来,并根据将区域号转为坐标的算法得到输出结果。
  需要注意的是,每次查询在redis中新增加的key,在本次查询结束之后都要进行销毁或者设置存活时间,使系统能够较快的释放掉该key所占用的内存空间,减少累加查询导致过多无效key存在,一定程度上缓解服务器压力。
  热点区域查询的API,在程序包HotRegionRedis中。
  4、存在弊端
  每次查询都要向redis中写入新的数据集合,虽然redis声称每秒中可支持10W次写入操作,但在既有写又有读、高并发的情况下会导致Redis性能下降。不过在相当一段时间内,这种模式可以满足需求。
  5、建议
  建议之后将热点区域中分区方法改进,结合Geohash算法。(由于要求前N大,暂时无法避免查询操作时向Redis中写入数据)。
最新内容请见作者的GitHub页:http://qaseven.github.io/

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
4天前
|
存储 SQL 数据库
数据库sql语句-----游标和存储过程
数据库sql语句-----游标和存储过程
14 1
|
4天前
|
SQL 数据库
SQL主体内容一致,但是对于不同的数据库,对于SQL就可能有一些细节的拓展
SQL主体内容一致,但是对于不同的数据库,对于SQL就可能有一些细节的拓展
17 1
|
1天前
|
存储 缓存 NoSQL
NoSQL缓存数据库的使用场景实例和命令速查表
【5月更文挑战第8天】Redis 是一个内存数据结构服务,用 C 编写,支持五种数据结构,不仅限于键值对。它用于缓存、消息队列、订阅/发布系统等,提供持久化、主从复制和集群支持。了解其核心数据结构和应用场景是有效利用 Redis 的关键。
9 3
NoSQL缓存数据库的使用场景实例和命令速查表
|
2天前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用合集之当 SQL Server 源数据库中的数据更新后,CDC 吐出的操作(op)是怎样的
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
12 0
|
4天前
|
SQL 关系型数据库 数据管理
Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
【5月更文挑战第14天】Microsoft SQL Server 是微软公司开发的一款关系型数据库管理系统
16 2
|
4天前
|
SQL 数据库
数据库SQL语言实战(六)
本次实战的重点就在于对表格本身的一些处理,包括复制表格、修改表格结构、修改表格数据
|
4天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(五)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
|
4天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
本文的SQL语言适用的是Oracle数据库与mySQL可能存在略微不同
数据库SQL语言实战(四)(数据库系统概念第三章练习题)
|
4天前
|
SQL Oracle 关系型数据库
数据库SQL语言实战(三)
本篇文章重点在于SQL中的各种删除操作
|
4天前
|
SQL 存储 数据库连接
C#SQL Server数据库基本操作(增、删、改、查)
C#SQL Server数据库基本操作(增、删、改、查)
9 0