Redis环境搭建和代码测试及与GIS结合的GEO数据类型预研
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/
1.背景
1.1传统MySQL+ Memcached架构遇到的问题
MySQL本身是适合进行海量数据存储的,通过Memcached将热点数据加载到cache从而加速访问,很多公司目前都采用这样的架构,但随着业务数据量和访问量的持续增长,我们遇到了很多问题:
a.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。
b.Memcached与MySQL数据库数据一致性问题。
c.Memcached数据命中率低或宕机,大量访问直接穿透到DB,MySQL无法支撑。
d.跨机房cache同步问题。
为解决以上问题,我们开始选择用Redis来替代Memcached。
1.2Redis简介
Redis是一种典型的NoSQL数据库服务器,它可以作为服务程序独立运行于自己的服务器主机。在很多时候,人们只是将Redis视为Key/Value数据库服务器,但是在目前的版本中,Redis除了Key/Value之外还支持List、Hash、Set和Ordered Set等数据结构,因此它的用途也更为宽泛。Redis的License是Apache License,就目前而言,它是完全免费。
我们经常会将memcached(数据缓存服务器)与Redis来进行对比,因为他们在使用方式上比较相似,而且也均是免费,均使用了内存来进行数据缓存。但是它们之间的最大区别在于memcached只是提供了数据缓存服务,一旦服务器宕机,之前在内存中缓存的数据也将全部消失, memcached没有提供任何形式的数据持久化功能,而Redis则提供了这样的功能。第二,Redis提供了更为丰富的数据存储结构,如Hash和Set等。
项目中经常在如下几个场景中使用Redis:Session共享,数据采集统计等。
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/
如果您觉得本文确实帮助了您,可以微信扫一扫,进行小额的打赏和鼓励,谢谢 ^_^
Redis环境搭建和代码测试及与GIS结合的GEO数据类型预研的更多相关文章
- Eclipse+Java+OpenCV246环境搭建和代码测试
1.首先下载OpenCV2.4.6,下载的时候,选择windows版的.然后安装 2.其实安装的过程就是解压的过程,并没有什么安装向导之类的,安装完成后,我们最关心的是这个目录:opencv\buil ...
- kafka环境搭建及librdkafka测试
kafka环境搭建及librdkafka测试 (2016-04-05 10:18:25) 一.kafka环境搭建(转自http://kafka.apache.org/documentation.h ...
- redis环境搭建及一主二从三哨兵模式配置
一.单机redis环境搭建 1.安装: OS:linux redhat6.5 下载redis 官网下载链接:https://redis.io/download 把安装包上传到服务器,进行解压 [roo ...
- 商城05——首页轮播图显示实现&Redis环境搭建&Redis实现缓存
1. 课程计划 1.首页轮播图的展示 2.首页大广告展示流程图 3.Redis的常用命令 4.Redis的服务器搭建 (集群的搭建) 5.向业务逻辑中添加缓存 6.Jedis的使用(redis的客 ...
- Redis环境搭建(Linux)
1.简介 redis是一个开源的key-value数据库.它又经常被认为是一个数据结构服务器.因为它的value不仅包括基本的string类型还有 list,set ,sorted set ...
- 一.redis 环境搭建
1.简介 redis是一个开源的key-value数据库.它又经常被认为是一个数据结构服务器.因为它的value不仅包括基本的string类型还有 list,set ,sorted set ...
- Redis环境搭建(MacOS)
Redis是一个开源的key-value类型的存储系统,大部分数据存在于内存中,所有读写速度十分快.其支持的存储value数据类型有多种,如:strings.hashes.lists.sets.sor ...
- Redis环境搭建
一.准备的安装包 windows虚拟机软件:VMware Workstation Pro 12 linux安装文件:CentOS-7-x86_64-Minimal-1511.iso 远程登录软件:pu ...
- 浅谈基于Linux的Redis环境搭建
本篇文章主要讲解基于Linux环境的Redis服务搭建,Redis服务配置.客户端访问和防火强配置等技术,适合具有一定Linux基础和Redis基础的读者阅读. 一 Redis服务搭建 1.在根路径 ...
随机推荐
- ASP.NET WebApi OWIN 实现 OAuth 2.0(自定义获取 Token)
相关文章:ASP.NET WebApi OWIN 实现 OAuth 2.0 之前的项目实现,Token 放在请求头的 Headers 里面,类似于这样: Accept: application/jso ...
- XML如何添加注释?
注释以 <!-- 开始并以 --> 结束, 例如 <!--注释内容-->. 注释可以出现在文档序言中,包括文档类型定义 (DTD):文档之后:或文本内容中. 注释不能出现在属性 ...
- leetcode-比特位计数
一.题目描述 给定一个非负整数 num.对于 0 ≤ i ≤ num 范围中的每个数字 i ,计算其二进制数中的 1 的数目并将它们作为数组返回. 示例 1: 输入: 2 输出: [0,1,1] 示例 ...
- 选择 25k 的 996 还是 18k 的 965
阅读本文大概需要 3.7 分钟. 文中部分内容来源:http://h5ip.cn/hSDk 最近的 996.ICU 话题持续在火爆,一般热点新闻的热度持续时间为一星期,这次是程序们的集体发声导致,戳中 ...
- 《关于长沙.NET技术社区未来发展规划》问卷调查结果公布
那些开发者们对于社区的美好期待 2月,长沙.net 技术社区自从把群拉起来开始,做了一次比较正式.题目为<关于长沙.NET技术社区未来发展规划>的问卷调查,在问卷调查中,溪源写道: 随着互 ...
- 客户端通过Feign发起请求 服务端通过request取 json对象
@RestController @RequestMapping(value = "test") public class TestServer { @RequestMapping( ...
- C# 《编写高质量代码改善建议》整理&笔记 --(一)基本语言篇
题记:这是自己的观后感,工作两年了,本来打算好好学习设计模式,或者作为客户端深入了解GPU编程的,但是突然发现还有这么一本书. <编写高质量代码改善建议>,感觉这正是自己需要的. 我是做 ...
- redis 系列21 复制Replication (上)
一. 概述 使用和配置主从复制非常简单,每次当 slave 和 master 之间的连接断开时, slave 会自动重连到 master 上,并且无论这期间 master 发生了什么, slave ...
- 爬虫入门(四)——Scrapy框架入门:使用Scrapy框架爬取全书网小说数据
为了入门scrapy框架,昨天写了一个爬取静态小说网站的小程序 下面我们尝试爬取全书网中网游动漫类小说的书籍信息. 一.准备阶段 明确一下爬虫页面分析的思路: 对于书籍列表页:我们需要知道打开单本书籍 ...
- Python的协程
什么是协程 协程又叫做微线程,它是在单一线程内通过不断切换执行的.协程的切换不是上下文的切换也就是说不是CPU的执行任务的切换,比如CPU执行一会线程1,然后再执行一会线程2,在多核CPU上,Pyth ...