主要内容:
一、开源Redis使用
二、云Redis开通到设置
三、春运迁徙页面开发
一、开源Redis使用
1)开源Redis体验
通过访问https://try.redis.io/可以在线执⾏Redis命令,体验Redis。也可以在Redis官⽹每个命令⽂档⻚⾯https://redis.io/commands/set在线执⾏Redis命令。
演示部分:
打开https://try.redis.io网站,可以看到最底下Terminal,执行“help” 查看有什么命令,再输入“set key value”、“get key”获取KEY、也可以执行list “lpush lish a b c d e ”lpush 5个元素,通过“lpop list”拿出元素。
也可以在Redis官⽹每个命令⽂档⻚⾯https://redis.io/commands/set。 在Redis官方文档中,每一个命令的页面,除了它的参数返回值含义之外,还有Examples部分,也可以在此执行Redis命令。比如“get mykey”,可以得到“hello”,输入“get mykey world”将“mykey”进行更改,再次获取。也是一种体验Redis的方式。
2)从源码编译启动Redis
从源码编译启动Redis,有两种方式:
·第一种是:直接从GitHub网站上拉下源码直接编译。
Redis GitHub : https://github.com/redis/redis,下载源码并进行编译。Linux&MacOS平台均可用这种方法:
$ git clone https://github.com/redis/redis.git
$ make -j
$ ./src/redis-server
$ ./src/redis-cli // 在另⼀个终端连接。
·第二种是:下载已经编译好的二进制文件。windows平台可以下载相应的二进制文件进行启动。
演示部分:
用“git clone”命令将Redis克隆到本地,克隆完成后,到Redis目录下执行“make -j”命令,即可开始启动编译。编译完成之后,可以看到“src”目录下会出现“redis-server”以及“redis-cli”的二进制文件,直接启动“redis-server”,发现日志如下图所示:
显示Redis启动在“6379”是默认port,此时已经准备好开始接收连接了,此时直接启动客户端程序,默认连接也是连接到“6379”端口,执行“ping”命令,发现Redis可以正常服务,写入数据进行测试(输入set key value),同样可以设置key (输入get key),也可以获取key (输入lpush list a b c d e ),从尾部拿出刚才的一个元素 (输入lpop list),也可以持续的去拿出其他的元素(即续输入多个lpop list)。
3)使⽤客户端程序连接Redis
当写程序时需要选择客户端程序,Redis客户端程序生态非常的繁荣,有各种各样的语言,可参考:https://redis.io/clients。常⻅的如:
• Java: Jedis, Lettuce, Redisson;
• C/C++: hiredis, redis-plus-plus;
• Python: redis-py;
• Go: Redigo;
接下来以Jedis为例进行演示:
• 第一步:引入Jedis Pom依赖;
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
• 第二步:初始化并调⽤API;
Jedis jedis = new Jedis("127.0.0.1", 6379);
System.out.println("ping redis: " + jedis.ping());
jedis.set("key", "value");
System.out.println(jedis.get("key"));
上面4行代码分别有如下含义:
第一行new Jedis默认连接了本地的6379端口;第二行:ping redis,检查是否可以联通;第三行set了一个key;第四行获取了key。
• 第三步:阿⾥云官⽅JedisPool连接池优化,因为Jedis基于连接池管理连接,连接池的设置对性能影响非常重要。阿里云官方网站上,列出了推荐的JedisPool连接池优化方案,https://help.aliyun.com/document_detail/98726.html。
演示部分:
首先pom程序中需要引入Jedis依赖,接下来有一个实例连接Redis,并且进行插入数据,因为刚才已经启动了Jedis,只需要运行程序即可,可以发现Redis返回了pong,并且返回了value。除过 Java程序之外,大家也可以选择其他的客户端进行相应的连接。
4)开源Redis参数设置
上述Redis启动,没有通过指定任何参数的方式,都是用默认参数,其实有Redis.conf里面包含很多种参数。(/src/redis-server redis.conf // 通过指定参数的⽅式启动。)
下面重点介绍如下几个:
1.bind {default: bind 127.0.0.1}:
这个参数会控制,是否允许远程主机来连接本地的服务。如果Redis是作为服务提供给业务方使用,业务运行机器和Redis可能不在同一个机器,因此可以通过此选项来控制,是否允许Redis进行远程连接,如果将此选项注释掉,那么即表示允许远程客户端连接我们的Redis。
2. appendonly {default no everysec}
Redis有两种持久化方式RDB与AOF,RDB会将数据保存在磁盘上;AOF会将操作保存在磁盘上,即每次操作时往磁盘上写入命令,可以控制多少时间往磁盘上写一次(刷一次盘)。
appendonly选项可以控制是否打开AOF,如果设置为yes,代表打开AOF。 AOF的刷新策略也有很多种,比如是每秒刷新还是始终刷新,通常我们会选择每秒刷新的方式,即appendfsync的参数设置为everysec。
除此之外,还有protected-mode {default: yes};save {default 3600 1 300 100 60 10000}等等。如果选择云Redis,这些参数我们会为大家设置好。
二、云Redis开通及设置
云Redis开通及设置包括以下几个部分:
1)购买实例;
2)设置⽩名单;
3)连接实例;
4)账号管理;
5)监控与⽇志。
1)购买实例
首先打开阿里云的网站,到redis的产品下,点击立即购买,关于redis的选型以及购买页面的详细参数,因为演示需要Tair GIS,因此这里需要购买一个企业版的实例,选择性能增强型的标准版,2g的格式。
如下图所示,支付完成之后,到控制台,可以看到实例是在创建中的状态,创建完成之后,再进行接下来的演示。
实例创建完成运行,如果要连接一个云redis实例,从本地连接,需要开通公网访问的地址,为实例设置一个密码,密码设置成功之后,就可以在本地来连接实例。
我们通过redis客户端来指定地址,以及指定它的端口为6379,指定实例可以连接,用密码进行连接,返回没有设置白名单,发生错误,因为IP是不合法的。
2)设置白名单
下图所示,设置白名单,默认的白名单是127.0.0.1及它不允许除本机之外其余的地址访问,修改将新的IP添加到白名单中。
3)连接实例
添加完成之后再次回到链接,再次进行链接,发现实例已经可以正常连接,执行命令来进行测试,实例可以正常执行命令。
性能监控,阿里云redis提供非常丰富的性能监控的指标,可以看到 CPU利用率,内存使用的情况,内存的利用率,以及Qps和连接数等详细信息,
除此之外,也可以为实例设置报警,当实例出现业务出现高峰的时候,如果阿里云redis性能不足,可以通过报警及时通知到业务方。
阿里云redis也支持设置 redis的多种参数,可以随意调控自己想要设置的参数。
4)账号管理
在账号管理中,阿里云redis可以添加和创建多个账号以及子账号,以APP来测试一个创建一个只读或者有读写权限的账号。
如下图所示,账号可用之后,用APP1进行连接,首先连接成功redis,接着用APP1用户:密码,是一个可读可写的,因此可以获取刚才的key,也可以将其删掉,返回成功。
5)监控与日志
备份恢复和数据恢复功能,备份恢复可以让数据在合适的时间进行备份,也可以将数据按照任意时间点进行恢复,在CloudDBA,可以看到整个数据库的实时性,包括实例的命中率,CPU的利用率等实时性能。
三、春运迁徙页面开发
(一)页面数据结构原理
上图为一个页面实例,其中信息采用的结构原理如下:
1. 用户信息存储采用Hash结构。
2. 地理位置信息判断采用Tair性能增强型结构TairGis,因为Redis原生的GEO不具有点与面关系判断的功能,无法实现此功能。主要用到的API为GIS.CONTAINS,用户判断用户的坐标与在哪个省中; GIS.INTERSECTS,判断用户是否经过热门春运地域。
3. 本地简报(新闻通知)功能采用Redis原生结构Stream,给用户推送实时消息。主要用到的API有两个:一是XADD用来添加消息,二是 XREVRANGE用来遍历返回消息。
4. 迁⼊迁出排名采用Redis原生结构Sorted Set,因为其本身按照score排序,因此极大的简化了开发逻辑,可以直接按照顺序返回。主要用到的API有两个:一是ZADD用来添加省份及对应的热力值,二是ZREVRANGE用来按照倒序返回信息。
声明:此页面不会实际获取用户地理位置信息,页面数据为测试数据,只做演示使用。
(二)功能演示与代码详解
config:负责初始化redisTemplate
controller:项目的http请求路由
model:项目中定义的class
repo:封装具体Redis的操作
(二)TairGis - 轨迹漫游查询
l 通过TairGis,我们可以实现以下功能:
1)典型的判断“线”和“面”的关系
漫游查询:根据一段行程轨迹判断路过 哪些地方(如省、市、县等)
2)场景:判断一个人是否经过疫区,电子围栏,红绿码。
下面为大家进行代码演示。
可以看到,config是初始化了一个RedisTemp,在这里要注意设置它Servializer序列化类的方法。Controller包括热门迁出区域的管理,消息和位置的Controller,还有热力值的排名。
接下来启动这个项目,首先将实例地址填到配置application.properties中,填入实例的密码后就可以启动整个Spring工程。
启动之后,由于是一个新的实例,因此并没有测试数据,需要插入一些测试数据。这里有一个InsertDataController,当PUT请求过来后,它就会往里插入一些数据,其中包括User的信息,Position经纬度的坐标,经过路径的线段,还会插入省份地区,例如北京、河南、安徽和浙江等经纬度所组成的区域,还有消息的情况(如新闻),也会插入省的排名值等。
如上图所示,我们插入数据。完成之后,可以连接到Redis上查看,这时候用keys遍历,可以看到插入四个key:USER、NEWS、CHINA、RANK。
输入type USER,发现它是一个Hash数据结构,hgetall USER拿到它的信息,包含用户ID、名字与迁徙位置。
接下来我们回到前端。
可以看到,刚才插入的数据已经被获取。这块可以详细给大家解释一下,它所在的位置是如何被获取到的。
在用户的信息中可以看到它的Position坐标为(120.032698 30.285296),通过坐标反查系统查询这个坐标在中国的位置,查询结果为浙江杭州,表示用户坐标是在浙江杭州。
我们的数据库信息中有一个Key是China,它的Type是TairGis,可以gis.getall.CHINA来看一下 China。
可以看到CHINA包含的坐标非常多和大,其中包含浙江的坐标,它的坐标是一个多边形,而杭州的点包含在多边形浙江中,因此我们把它的省份就判断成了浙江,这是TairGis的点和面之间关系判断的功能。
目前页面显示用户没有经热门春运区域,我们可以查看它经过了哪些区域。我们拿到用户的经过坐标线段,用一个坐标画图工具在线画图,可以看到,他春运的路线是从北京出发,途径安徽再到浙江。
如果我们将浙江添加为热门区域,此时再刷新页面,热门区域判断已经由“否”变为“是”。
因此,只要我们设定好热门区域,只要用户春运路线与标记区域有交集,则系统会自动判断用户经过热门春运区域。
在这里,除了用于春运场景,在日常场景中也能通过这种方法判断用户轨迹是否经过疫区,从而生成红色或者绿色健康码。除此之外,还可以用于无人机禁飞区域判断等需要地理区域判断的场景。
第三个功能点为新闻通知,它是用Redis的Stream的结构生成,这里可以进行测试,我们添加一个新的消息“This is a test message 4”。
存入新消息之后刷新页面,可以看到该消息已经出现在新闻通知的第一条消息上。
迁入迁出地的热力值排名采用Redis原生结构Sorted Set完成。当我们插入一条数据之后它会自动排名,整个页面的热力值数据来源于百度迁徙。
声明:以上操作不会实际获取用户地理位置信息,页面数据为测试数据,只做演示使用。