Redis环境搭建和代码测试及与GIS结合的GEO数据类型预研

文章版权由做者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/html

1.背景

1.1传统MySQL+ Memcached架构遇到的问题

MySQL自己是适合进行海量数据存储的,经过Memcached将热点数据加载到cache从而加速访问,不少公司目前都采用这样的架构,但随着业务数据量和访问量的持续增加,咱们遇到了不少问题:java

a.MySQL须要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工做占据大量开发时间。mysql

b.Memcached与MySQL数据库数据一致性问题。git

c.Memcached数据命中率低或宕机,大量访问直接穿透到DB,MySQL没法支撑。github

d.跨机房cache同步问题。redis

为解决以上问题,咱们开始选择用Redis来替代Memcached。算法

1.2Redis简介

Redis是一种典型的NoSQL数据库服务器,它能够做为服务程序独立运行于本身的服务器主机。在不少时候,人们只是将Redis视为Key/Value数据库服务器,可是在目前的版本中,Redis除了Key/Value以外还支持List、Hash、Set和Ordered Set等数据结构,所以它的用途也更为宽泛。Redis的License是Apache License,就目前而言,它是彻底免费。sql

咱们常常会将memcached(数据缓存服务器)与Redis来进行对比,由于他们在使用方式上比较类似,并且也均是免费,均使用了内存来进行数据缓存。可是它们之间的最大区别在于memcached只是提供了数据缓存服务,一旦服务器宕机,以前在内存中缓存的数据也将所有消失, memcached没有提供任何形式的数据持久化功能,而Redis则提供了这样的功能。第二,Redis提供了更为丰富的数据存储结构,如Hash和Set等。数据库

项目中常常在以下几个场景中使用Redis:Session共享,数据采集统计等。windows

2.Redis环境搭建  

2.1下载安装

Redis对于Linux是官方支持的,安装和使用参考官网(http://redis.io/download),可是Redis官方是不支持windows的,好在 Microsoft Open Tech group 在 GitHub上开发了一个Win64的版本,项目地址是:https://github.com/MSOpenTech/redis。打开后,直接使用浏览器下载或Git克隆便可:

 

直接双击redis-server.exe即启动一个redis服务实例,可是若是想以windows服务形式运行,须要执行一下命令:

//注册至服务管理中

redis-server --service-install redis.windows.conf --loglevel verbose --service-name Redis6379

成功后,开启服务便可:

 

2.2主从配置

Redis如mysql数据库同样,能够支持主从数据库配置,并且配置方式十分简单。将原有Redis安装文件再复制一份,打开Config文件,修改对应slaveof配置便可:

 

以上面提到的指令注册服务,运行该从数据库:

2.3密码和权限配置

Redis默认是没有密码的,为了数据的安全性须要咱们本身启动权限控制和密码配置等。

2.3.1设置访问权限

打开config文件,找到bind关键字,修改其中绑定的IP便可:

 

2.3.2设置密码

一样打开config文件,找到requirepass关键字,将对应部分修改成指定密码:

 

注意,若是咱们对主数据库设定了密码,那么slave数据库上在监听主数据库的配置中也要加上对应的密码:

 

2.4Redis可视化管理工具

这里咱们使用RedisDesktopManager来管理Redis数据库。在官网上(https://redisdesktop.com/download)下载完该工具后,本地安装后链接至数据库上:

 

单击主数据库文件中的redis-cli.exe,输入测试命令:

 

在输入获取Value的命令,发现已经成功:

 

同时,在可视化工具中能看到,主从数据库中均已同步:

 

3.Java操做

3.1依赖环境

使用Java操做Redis须要jedis-2.1.0.jar,下载地址:http://files.cnblogs.com/liuling/jedis-2.1.0.jar.zip。

若是须要使用Redis链接池的话,还需commons-pool-1.5.4.jar,下载地址:http://files.cnblogs.com/liuling/commons-pool-1.5.4.jar.zip。

3.2经常使用据类型使用

Redis中能够存储各类数据类型,不一样数据类型有其使用场景,具体各数据类型的使用在操做文档中均能查找(http://redisdoc.com/index.html):

 

 这里以几个经常使用类型做为介绍。

3.2.1链接

 

3.2.2String

String是最经常使用的一种数据类型,普通的key/value存储均可以归为此类,value其实不只是String,也能够是数字:好比想知道何时封锁一个IP地址(访问超过几回)。INCRBY命令让这些变得很容易,经过原子递增保持计数。  

 

 

3.2.3List

在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表同样,咱们能够在其头部(left)和尾部(right)添加新的元素。在插入时,若是该键并不存在,Redis将为该键建立一个新的链表。与此相反,若是链表中全部的元素均被移除,那么该键也将会被从数据库中删除。List中能够包含的最大元素数量是4294967295。
从元素插入和删除的效率视角来看,若是咱们是在链表的两头插入或删除元素,这将会是很是高效的操做,即便链表中已经存储了百万条记录,该操做也能够在常量时间内完成。然而须要说明的是,若是元素插入或删除操做是做用于链表中间,那将会是很是低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。

 

3.2.4Set

在Redis中,咱们能够将Set类型看做为没有排序的字符集合,和List类型同样,咱们也能够在该类型的数据值上执行添加、删除或判断某一元素是否存在等操做。须要说明的是,这些操做的时间复杂度为O(1),即常量时间内完成次操做。Set可包含的最大元素数量是4294967295。
和List类型不一样的是,Set集合中不容许出现重复的元素,这一点和C++标准库中的set容器是彻底相同的。换句话说,若是屡次添加相同元素,Set中将仅保留该元素的一份拷贝。和List类型相比,Set类型在功能上还存在着一个很是重要的特性,即在服务器端完成多个Sets之间的聚合计算操做,如unions、intersections和differences。因为这些操做均在服务端完成,所以效率极高,并且也节省了大量的网络IO开销。

 

3.2.5Hash

咱们能够将Redis中的Hashes类型当作具备String Key和String Value的map容器。因此该类型很是适合于存储值对象的信息。如Username、Password和Age等。若是Hash中包含不多的字段,那么该类型的数据也将仅占用不多的磁盘空间。每个Hash能够存储4294967295个键值对。

 

4.redis的持久化问题

Redis提供了如下几种持久化方式:

a.RDB持久化:
该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。   
b.AOF持久化:

该机制将以日志的形式记录服务器所处理的每个写操做,在Redis服务器启动之初会读取该文件来从新构建数据库,以保证启动后数据库中的数据是完整的。

c.无持久化:

咱们能够经过配置的方式禁用Redis服务器的持久化功能,这样咱们就能够将Redis视为一个功能增强版的memcached了。

d.同时应用AOF和RDB。

5.Redis与GIS的结合:GEO数据类型

Redis3.2版本中增长了对GEO(地理位置)的支持。目前其提供了如下几种操做方式:

a.geoadd:增长某个地理位置的坐标。

b.geopos:获取某个地理位置的坐标。

c.geodist:获取两个地理位置的距离。

d.georadius:根据给定地理位置坐标获取指定范围内的地理位置集合。

e.georadiusbymember:根据给定地理位置获取指定范围内的地理位置集合。

f.geohash:获取某个地理位置的geohash值。

由于其面向的为主流互联网环境,因此其支持的地理坐标系指定为WGS84坐标系,其中的geohash编码算法与我在以前的博客中所提到的一致:WebGIS中GeoHash编码的研究和扩展(http://www.cnblogs.com/naaoveGIS/p/5164187.html)。除了咱们本身写代码完成该算法,也有已经开源封装好的源码:https://github.com/kungfoo/geohash-java。

 

                                                                      -----欢迎转载,但保留版权,请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/

                                                                          若是您以为本文确实帮助了您,能够微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^

                                                                                                                 

相关文章
相关标签/搜索