由SQL数据库转换Redis的实例

深圳市的士查询软件(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/

时间: 2024-11-01 08:11:41

由SQL数据库转换Redis的实例的相关文章

Zend Studio 8 SQL数据库资源管理器使用实例教程

在接连介绍Zend Studio7入门使用教程,Zend Studio8中文汉化,Zend Studio调试等教程后,继续Zend Studio教程之旅.这次介绍Zend Studio8 SQL数据库资源管理器的使用方法.Zend Studio作为一个强大的PHP开发工具,提供了强大的数据库源管理和SQL语句操作功能,方便我们在PHP网站开发中集中管理数据库,因此学会使用Zend Studio管理.开发.调试数据库的方法对于PHP开发非常有帮助.某种程度上Zend Studio也可以替代一些SQ

sql 数据库备案与还原实例(1/3)

--利用T-SQL语句,实现数据库的备份与还原的功能 -- --体现了SQL Server中的四个知识点: -- --1. 获取SQL Server服务器上的默认目录 -- --2. 备份SQL语句的使用 -- --3. 恢复SQL语句的使用,同时考虑了强制恢复时关闭其他用户进程的处理 -- --4. 作业创建SQL语句的使用   /*1.--得到数据库的文件目录 @dbname 指定要取得目录的数据库名 如果指定的数据不存在,返回安装SQL时设置的默认数据目录 如果指定NULL,则返回默认的S

Sql server2008的数据库转换成SQL2005数据库

最近在帮一个Q友改网站的时候,我本地备份的数据库是SQL08的,而他的.NET服务器上装的是SQL Server05的,所以要把我备份的数据库转换为05的.过程如下:首先进入SQL Server Management Studio,登录服务器然后 1 如果你要转换的数据库在"对象资源管理器"中,那么右键点击将要转换的数据库(如图中的dy14数据库) 2 如果你要转换的数据库不在"对象资源管理器中",那么如下图操作: 3 完成后,在弹出的"脚本向导"

asp.net连接sql数据库实例基础教程

asp.net|基础教程|教程|sql数据库 以下代码演示了如何使用asp.net连接sql server2000数据库并操作的代码实例, 和asp.net初学者分享一下. asp.net基础教程,连接SQL Server2000数据库实例代码分析: 以下为代码内容:<%@ Import Namespace="System.Data" %> <%@ Import NameSpace="System.Data.SqlClient" %> <

系统-sql server转换成access数据库

问题描述 sql server转换成access数据库 如果我有一个系统是java语言和sql server数据库,想转换成access数据库,怎么办 解决方案 把sqlserver数据库转成sql,在access里执行是一种办法,也可以参考这个 尝试将sqlserver 中数据导入到access中http://77857.blog.51cto.com/67857/161106/ 解决方案二: 1.换数据库挺麻烦的,先要转数据库结构,然后还要导数据. 2.原先的java连sql server要改

转换数据库-数据库:Oracle数据库转换成SQL server数据库

问题描述 数据库:Oracle数据库转换成SQL server数据库 把oracle数据库转换成SQL server数据库(2008 r2)版本的,数据迁移,大概百万条数据,有什么好的办法或者是执行语句嘛: 解决方案 我只知道可以把脚本倒出来 然后在sql中执行 解决方案二: http://wenku.baidu.com/link?url=TA7z0XmVyfKHyTQqiPwE6gAdkKbFG7ngBBL75mvjbRbAGFVElPyxOLFSvNT4YskRl8KLdeVdOlHc8a6

SQL数据库实例名称找不到或远程连接失败并显示错误error40的原因及解决办法_MsSql

分享由字符"\"转义引起的SQL数据库实例名称找不到或远程连接失败并显示错误error40的解决办法: 一.问题介绍 很久没有用c#去连数据库程序了,不过在网上找了一些资料,基本上还是写出来了,但是调试初步完成的程序时候,却发现在con.open()这个方法总是出错,说找不到数据库实例名称,或者远程连接失败,显示的错误是error40. 错误如下:   二.环境介绍 1.我的数据库是sqlserver2008,使用的开发环境是vs2013,.net4.0 2.我的数据库安装采用的命名实

php将access数据库转换到mysql数据库的方法_php技巧

本文实例讲述了php将access数据库转换到mysql数据库的方法.分享给大家供大家参考.具体分析如下: 本人采集来的数据是ACCESS的,但我的程序是mysql的,故写了一个程序,程序三步走,分享一下,喜欢操作数据库的朋友应该都会用到的. 1.连接mysql,代码如下: 复制代码 代码如下: $dbhost="localhost:3307";//服务器  $db="dataname";//数据库  $dbuser="root";//用户名 

SQL数据库与oracle数据库镜像有什么不同对比_数据库其它

Oracle数据库与MSSQL数据操作上有很大的不同,但是,在镜像操作方面有类比的地方.这篇文章关于MSSQL数据库镜像在Oracle数据库中是如何实现的,它们之间存在哪些差异呢. 首先,微软SQL数据库中的镜像数据库类似于Oracle数据库中的备用数据库.我说的只是类似,确切的说,我们需要考虑不同数据库在自己体系中的差异.MSSQL作为一个实例来操作,一个实例包含几个数据库,你首先要登录一个实例,然后选择哪个数据库作用于该实例.而在Oracle数据库中,简单模式(忽略RAC)就只有一个数据库与