👻前言
最近在探索阿里云产品的时候,偶然得知阿里云开发者社区有很多可以实践上手的活动,自己也就抱着好奇的心态去看了看,刚好有个活动是有关于Redis的,之前在了解后端的时候就经常听到很多有关Redis的介绍,所以突然之间对这个活动也来了兴趣,就抱着试试看的心态参加了阿里云开发者社区的训练营“从入门到高阶,7天玩转Redis、Tair训练营”。哈哈,虽然我也是小白,对于云原生方面的知识也不了解,但是,有机会去上手实践总归是好的,所以呢,本篇文章就跟着博主的节奏,在了解云数据库和Redis知识的基础上,带着大家一起学习有关于云原生方面的知识,在开拓自己知识层面的同时,根据自己探索的学习经验,为大家提供一些有帮助的知识。
☁️什么是Redis?
Redis(Remote Dictionary Server ),即远程字典服务,是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。redis是一个key-value
存储系统。和Memcached类似,它支持存储的value类型相对更多,包括string(字符串)、list(链表)、set(集合)、zset(sorted set --有序集合)和hash(哈希类型)。这些数据类型都支持push/pop、add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的。在此基础上,redis支持各种不同方式的排序。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
Redis 是一个高性能的key-value
数据库。 redis的出现,很大程度补偿了memcached这类key/value存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客户端,使用很方便。
Redis支持主从同步。数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器。这使得Redis可执行单层树复制。存盘可以有意无意的对数据进行写操作。由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录。同步对读取操作的可扩展性和数据冗余很有帮助。
☁️什么是云原生内存数据库?
云原生数据库指的是基于云架构的云数据库,是一种云原生数据基础设施;是一种完全利用公有云优势的数据库服务;其本身匹配云环境和分布式事务,一般提供计算存储分离和日志即数据能力,其核心是存储与计算分离。具有弹性伸缩能力、无服务器(Serverless)、高性能、高可扩展、一致性、容错、易于管理和多云支持等特性。云原生数据库(Cloud-NativeDatabase)概念源于国外,随之受到国内厂商的关注,适用于软件工程、计算机、云计算等领域。
✨特点
- 专库专用,性能发挥极致
传统数据库的数据类型单一、这导致了性能/功能受限,无法为应用提供合适的性价比与极致性能,云原生数据库理念“专门构建”合适来解决这些需求,用户可以在云上快速部署(或维护)不同类型数据库,每个应用场景使用合适的数据库,发挥其性能,功能优势。
- 无服务器,敏捷创新
无服务器Serverless是一项仅在公有云上可以发挥最大优势的技术能力,利用无服务器架构和公有云的资源池,云原生数据库可以做到按需扩展,并按实际使用资源付费,达到高性价比。
- 全球架构,一键部署
云原生数据库可以全球部署,实现异地灾备和全球客户体验一致的目标,进而保证业务拓展到全球,不同区域的客户可以享受到同样的数据访问体验,解决数据库全球扩展问题,在业务快速发展阶段,可以有效帮助底层数据架构的扩展。
- 数据联动,广泛集成
云原生数据库深度融合智能湖仓架构,客户可以方便地跨关系型数据库、非关系型数据库、对象存储、大数据系统实现联合数据查询和加工,这样就可以让数据库中的数据方便地应用于机器学习和大数据中,面向新的数据驱动的创新需求。
日志即数据,减少了网络和IO代价(适合于云上部署)。
存储和计算相分离,计算节点上的数据来自网络中任意节点,使得资源调度更灵活。
弹性计算,根据使用量,占用计算资源。
支持在线扩容,不需要终止服务,即可扩展存储资源。
读写分离,支持一写多读,读服务可扩展性强。
🚀阿里云原生内存数据库Tair
🌟简介
云原生内存数据库Tair是阿里云自研数据库,兼容Redis的同时提供更多数据结构和企业级能力,包括全球多活、任意时间点恢复和透明加密等。支持多种存储介质和不同场景性价比需求:内存型支持超高吞吐,性能为Redis三倍;持久内存型成本降低30%,支持数据实时持久化;支持向量检索能力。
Tair在完全兼容Redis的基础上,提供了丰富的数据模型和企业级能力来帮助客户构建实时在线场景。同时,Tair与新型存储介质——持久内存的高效结合,相比内存,成本降低30%以上,并能做到数据持久化和提供近似于内存的性能。目前,Tair已广泛应用于政务、金融、制造、医疗和泛互联网等各行业客户,满足客户的高速查询和计算场景。
🎯功能特性
支持标准、集群、读写分离架构,均提供主备双节点,支持多可用区,支持自动容灾切换。
支持无感扩缩容,解决Redis扩缩容迁移数据慢、稳定性差等痛点问题,满足随时弹性资源伸缩需求。
支持RDB与AOF持久化,支持按备份集恢复,同时也支持数据闪回,可将实例恢复至7天内任一时间点。
支持半同步数据持久化策略,对实例进行更新操作时,实例会在主、备节点均记录日志后再返回结果给客户端,提高数据可靠性。
在网络、存储、备份、容灾等方面,提供攻击防护、访问控制、TLS(Transport Layer Security)加密等功能来保障数据安全。
提供CPU使用率、连接数、磁盘空间利用率等实时实例监控信息,并提供自动报警功能,帮助您随时了解实例动态。
提供Tair扩展数据结构,从多方面扩展Tair的适用性,降低业务的开发难度,提高业务整体性能。
- 在String、Hash和Zset数据结构的基础上,自研TairString、TairHash和TairZset增强型数据结构,提供分布式锁、数据生命周期和并发控制等功能特性。
- 自研TairGIS、TairCpc和TairRoaring数据结构,全面支撑地理位置服务、大数据分析计算、位图计算服务模块开发。
- 支持TairDoc、TairSearch、TairTs和TairBloom数据结构,兼容Redis Stack相关数据结构,同时优化更多特性,提供更高效的运算服务。
支持全球多活实例,通过专属同步通道保持实时、高效的数据同步。
支持缓存热点数据,通过高效的排序和统计算法识别出实例中存在的热点Key,并缓存在代理节点(Proxy)中,减少客户端与实例后端数据分片的交互,在不新增额外节点的情况下,提高了热点Key的读性能。
快速修复缺陷与迭代版本。
🗺️应用场景
视频直播类应用(数据库性能高拓展)
视频直播类节目中会大量出现流量突发场景,云原生内存数据库Tair集群版轻松突破Redis自身单线程瓶颈,QPS最高达到百万级,满足低时延、高并发的业务要求。
游戏分服类应用(满足分服、滚服弹性拓展)
游戏公司为了快速抢占市场,需要快速的开发出新产品吸引玩家,云原生内存数据库Tair能减少系统开发复杂度,业务爆发时可轻松弹性扩容,满足高性能业务要求。
电商行业类应用(大数据处理无缝对接)
电商行业中如大型促销秒杀系统或者带有计数系统的库存系统,系统整体访问压力巨大,云原生内存数据库Tair可轻松承载读压力,提供数据持久化。
互联网类应用(缓存适配场景)
网站类应用场景中,网站读写压力较大,且要求控制成本,云原生内存数据库Tair单节点版满足纯缓存场景,提供高QPS性能,数据持久化到底层RDS能力。
✍️上手案例
👻基于Redis实现在线游戏积分排行榜
排行榜功能在实际的开发场景中也十分常见,同时也进一步提高了用户体验,用户之间交互,充分展示用户排行信息等。在阿里云开发者中心训练营的学习中,有一个基于Redis实现在线游戏积分排行榜的实验,在这个实验中,小伙伴们可以充分体验到免费的云资源,同时也能进一步了解云数据库以及实现基于Redis实现在线游戏积分排行榜的开发,让小白也能体验在阿里云原生内存数据库Tair上基于Redis实现在线游戏积分排行榜的小案例,在操作的过程中,也能更清楚的了解到有关Redis和云数据库Tair的有关知识,值得小伙伴们去学习。
实验地址:基于Redis实现在线游戏积分排行榜
首先需要创建一个云服务器(ECS)实例,当然,也可以选择在本地开发,然后连接云数据库,两者操作大同小异,我是在阿里云实验室完成的,好处就是同时可以免费体验一个云服务器(ECS)和一个云数据库(Tair)。
选择在阿里云实验室进行实践操作,有公共资源体验、开通免费试用、个人账户资源三种实验资源方式。小伙伴们可自行选择,每种方式的差异都有相应的说明介绍,当然,假若已经购买云服务器和云数据库的小伙伴,也可以用自己的资源进行开发。
选择相应的实验资源,就可以开始创建实例啦。在实例创建过程中,因为是使用云服务器(ECS)访问Redis实例,所以要选择与ECS相同的VPC。云服务器(ECS)镜像类型选择公共镜像,版本可以选择CentOS 7或CentOS 8;规格的话选择基础一点的就可以了,因为也只是用来做测试体验开发,没必要配置的很高;密码选择自定义,实例名称也自己自定义就可以了。
配置完成后,就可以在控制台看到自己的实例
完成云服务器(ECS)实例的创建之后,接下来就要购买创建云数据库Redis实例,在基础配置页面,参考下图配置Redis的基础配置,未提及的配置保持默认选项,然后单击立即购买
创建完成后,可返回云数据库redis控制台,切换到已开通实例的地域查看。
准备工作完成之后,就可以远程登录实例进行开发了。首先,我们要在云服务器(ECS)上搭建一个Java开发环境,包括OpenJDK 1.8和Maven 3.6.3,并配置阿里云镜像仓库。登录实例我选择的是在阿里云控制台点击远程连接,默认采用Workbench的方式连接到云服务器,当然,远程连接的方式不止这一种,小伙伴们也可以自行选择连接方式。
选择WorkBench远程连接方式连接服务器:
登录远程服务器实例:
出现这个界面时,表示连接成功,当然,如果小伙伴们选择其他远程连接方式。
接下来,我们就开始搭建开发环境了,首先需要安装OpenJDK 1.8。
yum -y install java-1.8.0-openjdk-devel.x86_64
完成OpenJDK 1.8安装后,接着下载Maven安装包。
wget --no-check-certificate https://mirrors.tuna.tsinghua.edu.cn/apache/maven/maven-3/3.8.8/binaries/apache-maven-3.8.8-bin.tar.gz
然后将将下载的安装包解压到/usr/local/
目录,并将安装目录重命名。
tar -zxvf apache-maven-3.8.8-bin.tar.gz -C /usr/local/ && mv /usr/local/apache-maven-3.8.8/ /usr/local/maven
将Maven的可执行文件目录加入到系统环境变量中,并使用source
命令使/etc/profile
文件中的内容立即生效。
echo "export PATH=$PATH:/usr/local/maven/bin" >> /etc/profile
source /etc/profile
打开镜像仓库配置文件,添加阿里云镜像仓库配置, 使用vim打开镜像仓库配置文件。
vim /usr/local/maven/conf/settings.xml
进入vim编辑器页面后输入:/mirrors
并回车,搜索并跳转到<mirrors>
标签的位置,按下n
键跳转到第二个没有被注释的标签位置, 按下o
键,另起一行进行编辑,粘贴以下内容。
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
按下ECS
退编辑模式,输入:wq
保存并退出vim编辑器,添加阿里云镜像仓库配置如下图所示。
完成上述配置之后,就可以进入代码开发了,首先需要进入到工作空间
mkdir -p demo/src/main/java/test/ && cd demo
使用vim创建并编辑GameRankSample.java
文件
vim src/main/java/test/GameRankSample.java
进入到vim编辑界面后,输入:set paste
回车后,按下i
键进入vim的粘贴插入模式,完成排行榜功能的编写
package test;
import java.util.ArrayList;
import java.util.List;
import java.util.Set;
import java.util.UUID;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Tuple;
public class GameRankSample {
static int TOTAL_SIZE = 20;
public static void main(String[] args)
{
//Redis数据库连接地址
String host = "xxxxxxxxxx.m.cnhz1.kvstore.aliyuncs.com";
//连接密码
String password = "password";
int port = 6379;
Jedis jedis = new Jedis(host, port);
try {
String authString = jedis.auth(password);
if (!authString.equals("OK"))
{
System.err.println("AUTH Failed: " + authString);
return;
}
//Key(键)
String key = "游戏名:奔跑吧,阿里!";
//清除可能的已有数据
jedis.del(key);
//模拟生成若干个游戏玩家
List<String> playerList = new ArrayList<String>();
for (int i = 0; i < TOTAL_SIZE; ++i)
{
//随机生成每个玩家的ID
playerList.add(UUID.randomUUID().toString());
}
System.out.println("输入所有玩家 ");
//记录每个玩家的得分
for (int i = 0; i < playerList.size(); i++)
{
//随机生成数字,模拟玩家的游戏得分
int score = (int)(Math.random()*5000);
String member = playerList.get(i);
System.out.println("玩家ID:" + member + ", 玩家得分: " + score);
//将玩家的ID和得分,都加到对应key的SortedSet中去
jedis.zadd(key, score, member);
}
//输出打印全部玩家排行榜
System.out.println();
System.out.println(" "+key);
System.out.println(" 全部玩家排行榜 ");
//从对应key的SortedSet中获取已经排好序的玩家列表
Set<Tuple> scoreList = jedis.zrevrangeWithScores(key, 0, -1);
for (Tuple item : scoreList) {
System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue());
}
//输出打印Top5玩家排行榜
System.out.println();
System.out.println(" "+key);
System.out.println(" Top 玩家");
scoreList = jedis.zrevrangeWithScores(key, 0, 4);
for (Tuple item : scoreList) {
System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue());
}
//输出打印特定玩家列表
System.out.println();
System.out.println(" "+key);
System.out.println(" 积分在1000至2000的玩家");
//从对应key的SortedSet中获取已经积分在1000至2000的玩家列表
scoreList = jedis.zrangeByScoreWithScores(key, 1000, 2000);
for (Tuple item : scoreList) {
System.out.println("玩家ID:"+item.getElement()+", 玩家得分:"+Double.valueOf(item.getScore()).intValue());
}
} catch (Exception e) {
e.printStackTrace();
}finally{
jedis.quit();
jedis.close();
}
}
}
添加完成后,按下ESC
键退出粘贴插入模式,然后输入:set nopaste
回车后,按下i
键进入vim的普通插入模式,将代码中host
和password
参数的值替换为Redis内网地址
和Redis密码
。Redis密码为自己创建云数据库Redis时输入的密码。
在这里需要注意,首先需要在Redis实例控制台添加服务器的IP白名单,不过Redis实例在创建后默认IP白名单设置为0.0.0.0/0(代表允许所有地址访问)
完成上述操作后,按下ESC
键退出编辑模式,进入命令模式输入命令:wq
,保存并退出vim。
创建pom.xml
配置文件,使用vim创建并编辑pom.xml
文件。
vim pom.xml
按下i
键进入vim的编辑模式,新增pom.xml
文件内容
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>test</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.9.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<artifactId>maven-assembly-plugin</artifactId>
<configuration>
<appendAssemblyId>false</appendAssemblyId>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<archive>
<manifest>
<!--jar入口类,格式Package.ClassName -->
<mainClass>test.GameRankSample</mainClass>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>assembly</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
添加完成后,按下ESC
键退出编辑模式,进入命令模式输入命令:wq
,保存并退出vim。
最后,编写完代码后,打包并运行代码
mvn clean package assembly:single -DskipTests
java -classpath target/demo-0.0.1-SNAPSHOT.jar test.GameRankSample
代码执行效果:
📖参考资料
💻总结
以上就是我在阿里云开发者社区训练营所学习到的云数据库方面的知识,值得一提的是,对于新手或者小白来说,官方的产品文档和相关问题解答都很全面,学习起来也很轻松,上手实践操作也很方便。其次,通过这次学习,充分展示了redis的功能强大。可以基于redis丰富的数据结构完成很多现实场景下的业务功能的实现,同时也能提升小伙伴对于云原生相关技术的学习兴趣,希望通过这次的学习积累和总结,对大家有帮助,博主也是云原生小白,正在努力学习中!!!
🎨觉得不错的话记得点赞收藏呀!!🎨
😀别忘了给我关注~~😀