Redis 开发实操之春运迁徙页面 | 学习笔记

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 快速学习 Redis 开发实操之春运迁徙页面

开发者学堂课程【Redis 入门及实战:Redis 开发实操之春运迁徙页面】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/777/detail/13649


Redis 开发实操之春运迁徙页面

内容介绍

一、 开源 Redis 体验

二、 云 Redis 开通到连接

三、 春运迁徙页面开发

 

本节课我们来讲 Redis 开发实操之春运迁徙页面,本节课主要分为三个部分,第一部分是开源 Redis 体验,相信通过上节课大家已经基本知道了什么是 Redis,本节课我们将要带领大家来体验 Redis,开元 Redis 体验会包括在线体验 Redis 命令以及下载编译启动 Redis。

第二部分是云开通道连接,会包括阿里云、Redis 的创建以及设置白名单,与帐号还有连接的部分。

第三部分也是本节课的重点春运迁徙页面的开发,我们会使用 spring data Redis 这个客户端来开发一个春运迁徙的页面。

其中会包括个人信息的管理、地理位置、新闻通知以及迁入迁出地排名,分别会用到 Hash、day set stream 以及企业版的数据结构 tallgis。

 

一、 开源 Redis 体验

接下来我们来看本节课的第一部分开元 Redis 的使用,接下来为大家进行演示。

1、在线体验

访问 https://try.redis.io 可以在线执行 Redis 命令,体验 Redis

也可以在Redis官网每个命令文档页面 https://redis.io/commands/set 在线执行 Redis 命令

演示操作

(1)首先打开 try.redis.io 的网站可以看到最底下有一个 terminal, 我们可以执行 redis 命令,也可以先执行 help 先查看有什么命令,set 一个 key 也可以先获取这个 key,也可以执行 1push list,我们给五个元素 a、b、c、d、e 并且从它的头部拿出元素

image.png

(2)也可以访问 redis.io/commands/set ,在 Redis 官方文档中,每一个命令的页面,除了它的参数及返回值含义之外,还会有一个 Examples 部分,在此部分也可以再次执行 Redis 命令,比如我们 get mykey,可以得到 hello,我们将 mykey 进行更改,再次获取,这也是一种体验 Redis 的方法。

image.png

2、从源码编译启动 Redis

除在线体验 Redis 之外,如果我们想要用到程序去开发,那么就需要有一个 Redis的服务,这个服务可能需要我们去编译启动一个 Redis。有两种方式,一种是我们直接 github 上去拉下源码来。编译第二部分是下载已经编译好的二进制文件。

我们接下来会为大家演示。从 github 上下载源码并进行编译的。Linux 和 Mac OS平台,Windows 平台,大家可以下载相应的二进制文件进行启动。接下来为大家进行演示。

Linux&MacOS 均可用这种方法

Windows 平台可以下载相应的二进制文件进行这种操作

https://github.com/tporadowski/redis

3、演示操作

(1)从 github 上下载源码进行编译的过程

用 get 克隆命令将 Redis 克隆到本地,克隆完成,可以到 Redis 目录下进行 make-j 命令,即可开始启动编译,编译完成后可以看到 src 目录下会出现 Redis-Server 和 Redis-Cli 二进制文件,可以直接调用启动 Redis-Server 文件,发现日制如下所示,它会告诉 Redis 启动在 6379,默认 port,准备接收链接,也可以直接启动客户端程序,默认接收链接,连接到 6379 的端口,启动 p 命令,发现 Redis可以正常服务,我们写入数据进行测试。同样可以设置 key, 获取 key, 我们可以从尾部拿出刚才的元素,也可以持续地去拿出其他的元素。这是我们第二部分的演示。

(2)使用客户端程序连接 Redis

接下来我们来看如何使用客户端程序来连接上面的过程,我们都是通过 Redis 的Cli 或者说是通过终端来连接,当我们需要写程序的时候,我们就需要选择一个客户端程序,Red is 的客户端程序生态非常的繁荣,有各种各样语言的。

Redis 客户端程序生态繁荣,可参考: https://redis io/clients

常见的如:

Java: Jedis, Lettuce, Redisson

C/C++: hiredis, redis-plus-plus

Python: redis-py

Go: Redigo

几乎可以找到任何语言的适合大家开发的口端,接下来我们以杰尼斯为例来进行演示:

(1)首先第一步我们需要引入 Jedis Pom 依赖

<dependency>

<groupId>redis. clients</groupId

<artifactId> jedis</arti factId>

</ dependency>

(2)第二部分我们初始化并调用 API,下面的四行代码分别有如下含义:有一个Jedis,我们默认去连接了本地的 6379 端口,接下来我们去 ping redis,看他是否可以连通第三行,我们 set 了一个 key。第四行我们获取了这个 key。

Jedis jedis - new Jedis("127.0.0.1", 6379)

System. out . println("ping redis: ”+ jedis.pingO)

jedis.set("key", "value")

System. out . println(jedis. get("key"))

(3)第三部分是阿里云官方的 Jedis Pool 连接池优化。因为觉得 Jedis 是一个基于连接池管理的来连接 Redis 的组件。那连接池对它的性能。是非常重要的,网站上阿里云官方的网站上,我们列出了我们推荐的绝对的连接池优化方案,大家可以作为参考。

阿里云官方 Jedis Pool 连接池优化

https://help.aliyun. com/ document detail/98726.htm

接下来为大家演示:

首先 pom 程序中需要引入 Jedis 依赖,接下来的示例连接 Redis, 进行插入数据和运行,可以发现 Redis 返回了 PONG 和 volue.

那么除了 Java 程序之外,大家也可以选择其余的客户端进行相应的连接。

4、开源 Redis 参数设置

刚才我们的 Redis 驱动都是没有通过指令,任何参数的方式都是用默认参数,但是Redis 其实有 redis.Conf 里面包含很多种参数。我们可以在目录下看到,大家可以看到 Redis 的参数非常的多,那我们需要向大家重点介绍的有如下几个。

./src/redis-server redis.conf //通过指定参数的方式启动

bind {default: bind 127.0.0.1}

protected-mode {default: yes}

save {default 3600 1 300 100 60 10000}

appendonly {default no everysec}

重点介绍:bind {default: bind 127.0.0.1} 控制是否允许远程主机来连接本地的服务,如果 redis 作为服务提供给业务方使用的,那他们的业务运行机器和我们可能不在一个运行机器,因此可以通过此选项来控制是否允许 redis 来进行远程的连接,如果将此选项注释掉,那么即表示允许远程的客户端来连接 redis。

另外比较重要的参数有 appendonly,redis 有两种持久化方式,第一种是 rdb 第二种是 aof。

Rdb 和 aof 分别表示当我们的数据写入到 redis 之后它往磁盘上表示的方式是怎样的,rdb 表示会将数据表存到磁盘上,aof 表示会将操作表保存到磁盘上,可以控制刷盘时间间隔。也就是说 aof 及我们每次操作的时候他就会往磁盘上写入我们的命令,那 aof 可以,我们可以去控制它,他多少时间去往磁盘上写一次刷一次盘,此选项 appendonly,它可以控制是否打开 aof,如果我们设置为 yes,意味着我们会打开 aof 的刷新策略也有很多种,比如说是每秒刷新,还是始终刷新,通常我们会选择每秒刷新的方式,及 appendfsync 的参数设置为 every sec。除此之外还有很多的参数,我们不在此一一为大家赘述,大家可以参考开源的 Redis 文档以及网上的配置教程来进行自己 Redis 的配置。如果大家选择云 Redis 参数,我们是会为大家设置好的。

 

二、 云 Redis 开通与设置

接下来我们来介绍课程第二部分,云 redis 的开通与设置。我会分别为大家演示从实力购买到设置白名单到连接实例,账号管理和监控与日志的查看这些部分。

1、购买实例

首先,我们打开阿里云的网站。到 redis 的产品下去,我们点击立即购买。关于redis 的选型以及购买页面的详细参数,在此不为大家赘述,因为我们的演示需要用到 tallgis,因此,我们需要购买一个企业版的实例。我们选择性能增强型的标准版选择一个两级的,支付之后我们可以到控制台。

image.png

可以看到,我们的实力目前是在创建中的状态,我们稍等一下,等他创建完成之后,我们再进行接下来的演示。

此时我们的实力已经创建完成了,实例变成运行中了,我们如果要连接一个云 redis 实例,如果想从本地来连接它,我们需要开通它的公网访问。我们开通一个公网访问的地址。

地址已经开通,我们需要为实例设置一个密码,当密码设置成功之后,我们就可以在本地来连接实例了,但此时我们还没有设置白名单,我们可以来连接一下,看一下会发生什么。我们通过 redis 客户端来指定它的地址,指定它的端口为 6379 指定。实例可以连接上,我们进行来用密码进行东西,他返回来。没有设置白名单的错误告诉我们,我们的 IP 是不合法的。那接下来我们去设置白名单。

2、设置白名单

默认的白名单是 127.0.0.1,他不允许除本机之外其余的地址访问,我们可以进行修改,我们将我们的 IP 添加到白名单中,添加完成之后,再次回到我们的链接,再重新连接,发现实例已经可以正常连接。我们执行命令来进行测试,实例可以正常执行命令。

3、监控与日志

阿里云 redis 提供非常丰富的性能监控的指标。我们可以看到 Cpu 利用率,内存使用的情况,内存的利用率。即 QPS 和连接数等详细信息。除此之外,我们也可以为我们的实例设置报警。当我们的实例出现业务出现高峰的时候,如果阿里云 redis 性能不足,那我们可以通过报警及时通知到有方,阿里云 redis 的也支持设置 redis 的多种参数,大家可以随意调控自己想要设置的参数。

4、账号管理

阿里云 redis 可以添加和创建多个账号和子账号,可以为 app1 创建一个有只读和已读的账号。当账号可用之后,我们来用 app1 进行连接,首先我们连接成功 redis,接着,我们用 app1 用户冒号他的密码,他也是一个可读可写的,因此我们可以获取刚才,可以得到的问题我们也可以将其删掉,有问题同样支持备份恢复和数据闪回的功能,备份恢复我们可以让自己的数据在合适的时间进行备份。也可以将数据按照时间点任意时间点进行恢复。在 cloudDBA 我们可以看到整个数据库的实时性的包括实例的命中率、cpu 的利用率等实时性能,云功能我们就为大家演示到此。

 

三、春运迁徙页面开发

1、页面示例

image.png

主要由姓名、地理位置、新闻通知和迁入迁出排名几部分组成

用户信息存储采用 Hash 结构

地理位置信息判断采用 Tair 性能增强型结构 TairGis, 因为 Redis 原生的 GEO 不具有点与面关系判断的功能,无法实现此功能。主要用到的 API 为 GIS CONTAINS,用户判断用户的坐标与在哪个省中: GIS INTERSECTS, 判断用户是否经过热门春运地域。

本地简报功能采用 Redis 原生结构 Stream,给用户推送实时消息。主要用到的 API有两个:一是 XADD 用来添加消息,二是 XREVRANGE 用来遍历返回消息。

迁入迁出排名采用 Reds 原生结构 Sorted Set. 因为其本身按照 score 排序,因此极大的简化了开发逻辑,可以直接按照顺序返回,主要用到的 APl 有两个: ZADD用来添加省份及对应的热力值。二是 ZREVRANGE 用来按照倒序返回结息.

2、功能演示与代码详解

这是整个的项目结构,右边是项目结构,左边是目录的解释,接下来我们为大家进行代码演示

image.png

config: 负责初始化 redis Template,让我们来操作 redis

controller: 项目的 http 请求路由

model: 项目中定义的 class

repo: 封装具体 Redis 的操作

首先我们的整个项目,这是刚才介绍的几个目录,大家可以看到,Config 实际上是我们初始化了一个 redis temple。

在这里,我们要注意一下去设置它的一些 civil 的一些方法,序列化类的方法,而controller 中是我们其中包括热门迁出迁区域的管理,然后包括消息的 controller 以及位置的肯出了和排名和我们热力值的排名,那我们为大家启动这个项目。

首先,我们将刚才自己的实例地址来填到我们的,我们的密码是 Test1234。

在 application properties 中,我们填入我们的实例的密码,然后我们就可以启动整个 spring,工程启动之后,因为我们的实例是一个新的实例,需要插入一些测试数据,我这里有一个 insert data 的一个 controller,如果说我们发 post 请求过 POS 请求过来,他就会往里面插入一些数据,其中包括一个用户的信息。他的名字是 Johnny,它的 position,有一个经纬度的坐标,然后包括它的经过的路径是一个线段。

然后也会插入一些省份,比如说北京、河南、安徽和浙江的一些省的,他们的经纬度所组成的一个区域,然后还会插入一些消息的情况。一些新闻也会插入一个几个省的一个排名值,我们现在插入数据。

插入完成之后,其实我们可以在我们的连接到我们的 redis 上去看一看。这时候我们可以用 keys 先来遍历,可以看到插入几个 key: user,还有 news,还 China,其实是我们的一些 position,我们可以看一下 hgetall,他也发现他是一个Hash 数据结构,我们可以 getall 拿回他的信息。他的他的 ID 是零,然后他的名字是 Johnny 的 position 是一个点的位置,然后它的路径是也就是他的迁徙时候,经过的路线是后面的这个点,我们现在打开前端页面来看一看。

这是一个简单的前端页面,打开之后我们可以看到,这些信息已经被获取到了我们的名字,然后所在的位置的浙江,我们可以详细为大家解释一下,他所在的位置是怎么被获取到的。

(1)如何获取地理位置

打开前端页面,首先我们在用户的信息中可以看到,发现信息已经被获取,可以用坐标反查系统查询地理位置信息,在整个数据库中有个 key 叫 China,他的 type 是一个 tallgis 的,那我们可以 gis 这个 getall 来查看 china,当然它的坐标非常的多和大,因为我们前面插入了浙江的坐标,因此它的坐标是一个多边形,也就是一个 POLYGON,杭州的这个点在这个多边形浙江中,因此我们把他的省份就判断成了浙江,这是 tallgis 的一个点和面之间关系判断的一个功能.

(2)如何判断是否经过热门区域

我们首先可以看一下它经过的区域,同样我们拿到这个用户的坐标,这是它经过的一个线段。我们把这个线段用一个画图工具,在线画图我们可以看到,我们将用户的这个线段其实进行一个导入之后,我们可以看到它的春运的路线,到底是经过了哪些地方。

我们进行导入,可以看到它的路线其实是从北京直到下来之后,到安徽,再到浙江,这是他的一个春运的路线,从北京到浙江杭州的这么一个路线,他这个路线中是否经过热门的区域,现在是否。

那是因为我们没有去设置我们的热门区域是哪,如果说我们将热门区域,这个area,我们将浙江出发,请求发一个 post,标记了一个热门区域。

image.png

之后我们再来看,现在请求已经发成功,我们再来看是否经过热门区,已经是了,

image.png

这是因为用户所经过的路径,他经过了浙江省,浙江省被我们标记为热门区域之后,他的路线与浙江省的这一个区域有交集。有交集之后,我们就将它判断为进行了热门区域。

我们除过说去判断,是否经过热门区域也可以判断,在疫情中,我们也可以通过用户轨迹来判断他是否经过疫区,如果我们将某个省标记为疫区,那如果他的路径又经过了这个因素,那我们就可以判断他的红绿码,健康码,其实就可以变成红色,在这个场景下,我们也可以用来用 tellgis 来做这个健康码的判断,也可以做无人机的飞行,禁飞区域的判断,如果无人机它的路线,他到了我们的区域中,我们也可以简单判断,包括小孩儿设置一个范围家长的电子监控来看我的小孩儿是否在我的范围中。

Tellgis 的这个场景中,在地理位置的这个系统中,功能更加强大,因此在我们的 LBS 中可以得到非常广泛的应用,这是我们为大家介绍的第二个功能点。

(3)如何产生新闻通知

新闻通知是用 redis stream 的结构,也可以在这儿来进行测试,我们添加一个新的消息,存一个 text message,我们存入条新消息之后,刷新页面。

image.png

可以看到这个 test message4 就已经出现在了我们的新闻通知的第一条消息上。

(4)迁入迁出地的排名

这个热力值其实是使用我们的 sight 完成的,那当我们插入一条数据之后,它会自动排名,不需要我们自己整个页面的这个热力值,其实我们就和这个百度迁徙的上面,左边的数据来源于左边的这些,然后要说明的是,我们的整个页面的数据都是测试数据,大家在运行这个的过程中,不会获取大家实际的数据保存 test message,刷新页面即可。

相关文章
|
1月前
|
NoSQL 算法 Redis
【Docker】(3)学习Docker中 镜像与容器数据卷、映射关系!手把手带你安装 MySql主从同步 和 Redis三主三从集群!并且进行主从切换与扩容操作,还有分析 哈希分区 等知识点!
Union文件系统(UnionFS)是一种**分层、轻量级并且高性能的文件系统**,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下(unite several directories into a single virtual filesystem) Union 文件系统是 Docker 镜像的基础。 镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
344 5
|
5月前
|
缓存 监控 NoSQL
Redis 实操要点:Java 最新技术栈的实战解析
本文介绍了基于Spring Boot 3、Redis 7和Lettuce客户端的Redis高级应用实践。内容包括:1)现代Java项目集成Redis的配置方法;2)使用Redisson实现分布式可重入锁与公平锁;3)缓存模式解决方案,包括布隆过滤器防穿透和随机过期时间防雪崩;4)Redis数据结构的高级应用,如HyperLogLog统计UV和GeoHash处理地理位置。文章提供了详细的代码示例,涵盖Redis在分布式系统中的核心应用场景,特别适合需要处理高并发、分布式锁等问题的开发场景。
393 41
|
8月前
|
缓存 NoSQL Java
基于SpringBoot的Redis开发实战教程
Redis在Spring Boot中的应用非常广泛,其高性能和灵活性使其成为构建高效分布式系统的理想选择。通过深入理解本文的内容,您可以更好地利用Redis的特性,为应用程序提供高效的缓存和消息处理能力。
762 79
|
10月前
|
缓存 NoSQL 关系型数据库
云端问道21期实操教学-应对高并发,利用云数据库 Tair(兼容 Redis®)缓存实现极速响应
本文介绍了如何通过云端问道21期实操教学,利用云数据库 Tair(兼容 Redis®)缓存实现高并发场景下的极速响应。主要内容分为四部分:方案概览、部署准备、一键部署和完成及清理。方案概览中,展示了如何使用 Redis 提升业务性能,降低响应时间;部署准备介绍了账号注册与充值步骤;一键部署详细讲解了创建 ECS、RDS 和 Redis 实例的过程;最后,通过对比测试验证了 Redis 缓存的有效性,并指导用户清理资源以避免额外费用。
227 1
|
NoSQL 数据可视化 Linux
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
本文介绍了Redis的两个可视化管理工具:付费的Redis Desktop Manager和免费的Another Redis DeskTop Manager,包括它们的下载、安装和使用方法,以及在使用Another Redis DeskTop Manager连接Redis时可能遇到的问题和解决方案。
1745 1
redis学习四、可视化操作工具链接 centos redis,付费Redis Desktop Manager和免费Another Redis DeskTop Manager下载、安装
|
NoSQL Linux Redis
Docker学习二(Centos):Docker安装并运行redis(成功运行)
这篇文章介绍了在CentOS系统上使用Docker安装并运行Redis数据库的详细步骤,包括拉取Redis镜像、创建挂载目录、下载配置文件、修改配置以及使用Docker命令运行Redis容器,并检查运行状态和使用Navicat连接Redis。
1386 3
|
存储 Prometheus NoSQL
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
大数据-44 Redis 慢查询日志 监视器 慢查询测试学习
196 3
|
NoSQL Java Redis
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
这篇文章介绍了如何使用Spring Boot整合Apache Shiro框架进行后端开发,包括认证和授权流程,并使用Redis存储Token以及MD5加密用户密码。
313 0
shiro学习四:使用springboot整合shiro,正常的企业级后端开发shiro认证鉴权流程。使用redis做token的过滤。md5做密码的加密。
|
NoSQL 关系型数据库 MySQL
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
本文全面阐述了Redis事务的特性、原理、具体命令操作,指出Redis事务具有原子性但不保证一致性、持久性和隔离性,并解释了Redis事务的适用场景和WATCH命令的乐观锁机制。
1379 0
Redis 事务特性、原理、具体命令操作全方位诠释 —— 零基础可学习
|
NoSQL API Redis
如何使用 C++ 开发 Redis 模块
如何使用 C++ 开发 Redis 模块