由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
相关文章
|
15天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
52 10
|
15天前
|
SQL 算法 数据库
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
【SQL server】玩转SQL server数据库:第三章 关系数据库标准语言SQL(二)数据查询
88 6
|
2天前
|
SQL Java 数据库连接
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
Java从入门到精通:2.3.2数据库编程——了解SQL语言,编写基本查询语句
|
3天前
|
关系型数据库 MySQL 数据库
一台MySQL数据库启动多个实例
一台MySQL数据库启动多个实例
|
3天前
|
存储 SQL 数据库
数据库库表结构设计:原理、实例与最佳实践
数据库库表结构设计:原理、实例与最佳实践
18 0
|
4天前
|
SQL XML 数据库
sql导入数据库命令
在SQL Server中,数据库导入可通过多种方式实现:1) 使用SSMS的“导入数据”向导从各种源(如Excel、CSV)导入;2) BULK INSERT语句适用于导入文本文件;3) bcp命令行工具进行批量数据交换;4) OPENROWSET函数直接从外部数据源(如Excel)插入数据。在操作前,请记得备份数据库,并可能需对数据进行预处理以符合SQL Server要求。注意不同方法可能依版本和配置而异。
|
7天前
|
NoSQL MongoDB Redis
Python与NoSQL数据库(MongoDB、Redis等)面试问答
【4月更文挑战第16天】本文探讨了Python与NoSQL数据库(如MongoDB、Redis)在面试中的常见问题,包括连接与操作数据库、错误处理、高级特性和缓存策略。重点介绍了使用`pymongo`和`redis`库进行CRUD操作、异常捕获以及数据一致性管理。通过理解这些问题、易错点及避免策略,并结合代码示例,开发者能在面试中展现其技术实力和实践经验。
129 8
Python与NoSQL数据库(MongoDB、Redis等)面试问答
|
7天前
|
存储 运维 NoSQL
通过OOS实现定时备份Redis实例转储到OSS
基于阿里云 Redis 备份功能,现结合 OOS 推出自动转储至 OSS 的新方案,解决了数据安全风险、运维繁琐、成本增加和效率低下等问题。新方案亮点包括: 1. 数据安全性提高:备份文件自动上传至OSS,利用OSS的数据冗余存储,保证数据在硬件故障时的持久性和可用性。 2. 完全自动化:设置好定时规则后,备份和转储过程无需人工干预。 3. 多实例多地域集中管理:支持一次选择多个实例和跨区域备份,简化管理。 4. 灵活的备份策略和成本控制:自定义备份频率,并通过OSS生命周期管理策略控制成本。 5. 监控和告警:集成OSS和云监控,实时掌握备份状态,及时处理异常。
132 0
|
11天前
|
SQL 数据库
数据库SQL语言实战(二)
数据库SQL语言实战(二)
|
11天前
|
SQL 关系型数据库 数据库
【后端面经】【数据库与MySQL】SQL优化:如何发现SQL中的问题?
【4月更文挑战第12天】数据库优化涉及硬件升级、操作系统调整、服务器/引擎优化和SQL优化。SQL优化目标是减少磁盘IO和内存/CPU消耗。`EXPLAIN`命令用于检查SQL执行计划,关注`type`、`possible_keys`、`key`、`rows`和`filtered`字段。设计索引时考虑外键、频繁出现在`where`、`order by`和关联查询中的列,以及区分度高的列。大数据表改结构需谨慎,可能需要停机、低峰期变更或新建表。面试中应准备SQL优化案例,如覆盖索引、优化`order by`、`count`和索引提示。优化分页查询时避免大偏移量,可利用上一批的最大ID进行限制。
38 3

热门文章

最新文章