??前言
??各位小伙伴們,新文章它來了?。?!
最近在探索阿里云產品的時候,偶然得知阿里云開發(fā)者社區(qū)有很多可以實踐上手的活動,自己也就抱著好奇的心態(tài)去看了看,剛好有個活動是有關于Redis的,之前在了解后端的時候就經常聽到很多有關Redis的介紹,所以突然之間對這個活動也來了興趣,就抱著試試看的心態(tài)參加了阿里云開發(fā)者社區(qū)的訓練營——從入門到高階,7天玩轉Redis、Tair訓練營。哈哈,雖然我也是小白,對于云原生方面的知識也不了解,但是,有機會去上手實踐總歸是好的,所以呢,本篇文章就跟著博主的節(jié)奏,在了解云數據庫和Redis知識的基礎上,帶著大家一起學習有關于云原生方面的知識,在開拓自己知識層面的同時,根據自己探索的學習經驗,為大家提供一些有幫助的知識。
??什么是Redis?
Redis(Remote Dictionary Server ),即遠程字典服務,是一個開源的使用ANSI C語言編寫、支持網絡、可基于內存亦可持久化的日志型、Key-Value數據庫,并提供多種語言的API。redis是一個key-value
存儲系統(tǒng)。和Memcached類似,它支持存儲的value類型相對更多,包括string(字符串)、list(鏈表)、set(集合)、zset(sorted set --有序集合)和hash(哈希類型)。這些數據類型都支持push/pop、add/remove
及取交集并集和差集及更豐富的操作,而且這些操作都是原子性的。在此基礎上,redis支持各種不同方式的排序。與memcached一樣,為了保證效率,數據都是緩存在內存中。區(qū)別的是redis會周期性的把更新的數據寫入磁盤或者把修改操作寫入追加的記錄文件,并且在此基礎上實現了master-slave(主從)同步。
Redis 是一個高性能的key-value
數據庫。 redis的出現,很大程度補償了memcached這類key/value存儲的不足,在部 分場合可以對關系數據庫起到很好的補充作用。它提供了Java,C/C++,C#,PHP,JavaScript,Perl,Object-C,Python,Ruby,Erlang等客戶端,使用很方便。
Redis支持主從同步。數據可以從主服務器向任意數量的從服務器上同步,從服務器可以是關聯(lián)其他從服務器的主服務器。這使得Redis可執(zhí)行單層樹復制。存盤可以有意無意的對數據進行寫操作。由于完全實現了發(fā)布/訂閱機制,使得從數據庫在任何地方同步樹時,可訂閱一個頻道并接收主服務器完整的消息發(fā)布記錄。同步對讀取操作的可擴展性和數據冗余很有幫助。
??什么是云原生內存數據庫?
云原生數據庫指的是基于云架構的云數據庫,是一種云原生數據基礎設施;是一種完全利用公有云優(yōu)勢的數據庫服務;其本身匹配云環(huán)境和分布式事務,一般提供計算存儲分離和日志即數據能力,其核心是存儲與計算分離。具有彈性伸縮能力、無服務器(Serverless)、高性能、高可擴展、一致性、容錯、易于管理和多云支持等特性。云原生數據庫(Cloud-NativeDatabase) 概念源于國外,隨之受到國內廠商的關注,適用于軟件工程、計算機、云計算等領域。
?特點
-
專庫專用,性能發(fā)揮極致
傳統(tǒng)數據庫的數據類型單一、這導致了性能/功能受限,無法為應用提供合適的性價比與極致性能,云原生數據庫理念“專門構建”合適來解決這些需求,用戶可以在云上快速部署(或維護)不同類型數據庫,每個應用場景使用合適的數據庫,發(fā)揮其性能,功能優(yōu)勢。 -
無服務器,敏捷創(chuàng)新
無服務器Serverless是一項僅在公有云上可以發(fā)揮最大優(yōu)勢的技術能力,利用無服務器架構和公有云的資源池,云原生數據庫可以做到按需擴展,并按實際使用資源付費,達到高性價比。 -
全球架構,一鍵部署
云原生數據庫可以全球部署,實現異地災備和全球客戶體驗一致的目標,進而保證業(yè)務拓展到全球,不同區(qū)域的客戶可以享受到同樣的數據訪問體驗,解決數據庫全球擴展問題,在業(yè)務快速發(fā)展階段,可以有效幫助底層數據架構的擴展。 -
數據聯(lián)動,廣泛集成
云原生數據庫深度融合智能湖倉架構,客戶可以方便地跨關系型數據庫、非關系型數據庫、對象存儲、大數據系統(tǒng)實現聯(lián)合數據查詢和加工,這樣就可以讓數據庫中的數據方便地應用于機器學習和大數據中,面向新的數據驅動的創(chuàng)新需求。 -
日志即數據,減少了網絡和IO代價(適合于云上部署)。
-
存儲和計算相分離,計算節(jié)點上的數據來自網絡中任意節(jié)點,使得資源調度更靈活。
-
彈性計算,根據使用量,占用計算資源。
-
支持在線擴容,不需要終止服務,即可擴展存儲資源。
-
讀寫分離,支持一寫多讀,讀服務可擴展性強。
??阿里云原生內存數據庫Tair
??簡介
云原生內存數據庫Tair是阿里云自研數據庫,兼容Redis的同時提供更多數據結構和企業(yè)級能力,包括全球多活、任意時間點恢復和透明加密等。支持多種存儲介質和不同場景性價比需求:內存型支持超高吞吐,性能為Redis三倍;持久內存型成本降低30%,支持數據實時持久化;支持向量檢索能力。
Tair在完全兼容Redis的基礎上,提供了豐富的數據模型和企業(yè)級能力來幫助客戶構建實時在線場景。同時,Tair與新型存儲介質——持久內存的高效結合,相比內存,成本降低30%以上,并能做到數據持久化和提供近似于內存的性能。目前,Tair已廣泛應用于政務、金融、制造、醫(yī)療和泛互聯(lián)網等各行業(yè)客戶,滿足客戶的高速查詢和計算場景。
?功能特性
-
支持標準、集群、讀寫分離架構,均提供主備雙節(jié)點,支持多可用區(qū),支持自動容災切換。
-
支持無感擴縮容,解決Redis擴縮容遷移數據慢、穩(wěn)定性差等痛點問題,滿足隨時彈性資源伸縮需求。
-
支持RDB與AOF持久化,支持按備份集恢復,同時也支持數據閃回,可將實例恢復至7天內任一時間點。
-
支持半同步數據持久化策略,對實例進行更新操作時,實例會在主、備節(jié)點均記錄日志后再返回結果給客戶端,提高數據可靠性。
-
在網絡、存儲、備份、容災等方面,提供攻擊防護、訪問控制、TLS(Transport Layer Security)加密等功能來保障數據安全。
-
提供CPU使用率、連接數、磁盤空間利用率等實時實例監(jiān)控信息,并提供自動報警功能,幫助您隨時了解實例動態(tài)。
-
提供Tair擴展數據結構,從多方面擴展Tair的適用性,降低業(yè)務的開發(fā)難度,提高業(yè)務整體性能。
- 在String、Hash和Zset數據結構的基礎上,自研TairString、TairHash和TairZset增強型數據結構,提供分布式鎖、數據生命周期和并發(fā)控制等功能特性。
- 自研TairGIS、TairCpc和TairRoaring數據結構,全面支撐地理位置服務、大數據分析計算、位圖計算服務模塊開發(fā)。
- 支持TairDoc、TairSearch、TairTs和TairBloom數據結構,兼容Redis Stack相關數據結構,同時優(yōu)化更多特性,提供更高效的運算服務。
-
支持全球多活實例,通過專屬同步通道保持實時、高效的數據同步。
-
支持緩存熱點數據,通過高效的排序和統(tǒng)計算法識別出實例中存在的熱點Key,并緩存在代理節(jié)點(Proxy)中,減少客戶端與實例后端數據分片的交互,在不新增額外節(jié)點的情況下,提高了熱點Key的讀性能。
-
快速修復缺陷與迭代版本。
???應用場景
視頻直播類應用(數據庫性能高拓展)
視頻直播類節(jié)目中會大量出現流量突發(fā)場景,云原生內存數據庫Tair集群版輕松突破Redis自身單線程瓶頸,QPS最高達到百萬級,滿足低時延、高并發(fā)的業(yè)務要求。
游戲分服類應用(滿足分服、滾服彈性拓展)
游戲公司為了快速搶占市場,需要快速的開發(fā)出新產品吸引玩家,云原生內存數據庫Tair能減少系統(tǒng)開發(fā)復雜度,業(yè)務爆發(fā)時可輕松彈性擴容,滿足高性能業(yè)務要求。
電商行業(yè)類應用(大數據處理無縫對接)
電商行業(yè)中如大型促銷秒殺系統(tǒng)或者帶有計數系統(tǒng)的庫存系統(tǒng),系統(tǒng)整體訪問壓力巨大,云原生內存數據庫Tair可輕松承載讀壓力,提供數據持久化。
互聯(lián)網類應用(緩存適配場景)
網站類應用場景中,網站讀寫壓力較大,且要求控制成本,云原生內存數據庫Tair單節(jié)點版滿足純緩存場景,提供高QPS性能,數據持久化到底層RDS能力。
??上手案例
?? 基于Redis實現在線游戲積分排行榜
排行榜功能在實際的開發(fā)場景中也十分常見,同時也進一步提高了用戶體驗,用戶之間交互,充分展示用戶排行信息等。 在阿里云開發(fā)者中心訓練營的學習中,有一個基于Redis實現在線游戲積分排行榜的實驗,在這個實驗中,小伙伴們可以充分體驗到免費的云資源,同時也能進一步了解云數據庫以及實現基于Redis實現在線游戲積分排行榜的開發(fā),讓小白也能體驗在阿里云原生內存數據庫Tair上基于Redis實現在線游戲積分排行榜的小案例,在操作的過程中,也能更清楚的了解到有關Redis和云數據庫Tair的有關知識,值得小伙伴們去學習。
??實驗地址:基于Redis實現在線游戲積分排行榜
首先需要創(chuàng)建一個云服務器(ECS)實例,當然,也可以選擇在本地開發(fā),然后連接云數據庫,兩者操作大同小異,我是在阿里云實驗室完成的,??好處就是同時可以免費體驗一個云服務器(ECS)和一個云數據庫(Tair)
。
選擇在阿里云實驗室進行實踐操作,有公共資源體驗、開通免費試用、個人賬戶資源三種實驗資源方式。小伙伴們可自行選擇,每種方式的差異都有相應的說明介紹,當然,假若已經購買云服務器和云數據庫的小伙伴,也可以用自己的資源進行開發(fā)。
選擇相應的實驗資源,就可以開始創(chuàng)建實例啦。在實例創(chuàng)建過程中,??因為是使用云服務器(ECS)訪問Redis實例,所以要選擇與ECS相同的VPC
。云服務器(ECS)鏡像類型選擇公共鏡像,版本可以選擇CentOS 7或CentOS 8;規(guī)格的話選擇基礎一點的就可以了,因為也只是用來做測試體驗開發(fā),沒必要配置的很高;密碼選擇自定義,實例名稱也自己自定義就可以了。
配置完成后,就可以在控制臺看到自己的實例
完成云服務器(ECS)實例的創(chuàng)建之后,接下來就要購買創(chuàng)建云數據庫Redis實例,在基礎配置頁面,參考下圖配置Redis的基礎配置,未提及的配置保持默認選項,然后單擊立即購買
創(chuàng)建完成后,可返回云數據庫redis控制臺,切換到已開通實例的地域查看。
準備工作完成之后,就可以遠程登錄實例進行開發(fā)了。首先,我們要在云服務器(ECS)上搭建一個Java開發(fā)環(huán)境,包括OpenJDK 1.8和Maven 3.6.3,并配置阿里云鏡像倉庫。 登錄實例我選擇的是在阿里云控制臺點擊遠程連接,默認采用Workbench的方式連接到云服務器,當然,遠程連接的方式不止這一種,小伙伴們也可以自行選擇連接方式。
選擇WorkBench遠程連接方式連接服務器:
登錄遠程服務器實例
出現這個界面時,表示連接成功,當然,小伙伴們也可以選擇其他遠程連接方式。
接下來,我們就開始搭建開發(fā)環(huán)境了,首先需要安裝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的可執(zhí)行文件目錄加入到系統(tǒng)環(huán)境變量中,并使用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編輯器,添加阿里云鏡像倉庫配置如下圖所示。
完成上述配置之后,就可以進入代碼開發(fā)了,首先需要進入到工作空間
mkdir -p demo/src/main/java/test/ && cd demo
使用vim創(chuàng)建并編輯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密碼為自己創(chuàng)建云數據庫Redis時輸入的密碼。
在這里需要注意,首先需要在Redis實例控制臺添加服務器的IP白名單,不過Redis實例在創(chuàng)建后默認IP白名單設置為0.0.0.0/0
(??代表允許所有地址訪問
)
完成上述操作后,按下ESC
鍵退出編輯模式,進入命令模式輸入命令:wq
,保存并退出vim。
創(chuàng)建pom.xml
配置文件,使用vim創(chuàng)建并編輯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
?代碼執(zhí)行效果
??參考資料
1.百度百科——云原生數據庫
2.墨天輪百科——云原生數據庫
3.阿里云原生內存數據庫Tair產品文檔
??總結
以上就是我在阿里云開發(fā)者社區(qū)訓練營所學習到的云數據庫方面的知識,值得一提的是,對于新手或者小白來說,官方的產品文檔和相關問題解答都很全面,學習起來也很輕松,上手實踐操作也很方便。其次,通過這次學習,充分展示了redis的功能強大??梢曰趓edis豐富的數據結構完成很多現實場景下的業(yè)務功能的實現,同時也能提升小伙伴對于云原生相關技術的學習興趣,希望通過這次的學習積累和總結,對大家有幫助,博主也是云原生小白,正在努力學習中?。。?/strong>
??覺得不錯的話記得點贊收藏呀??!??文章來源:http://www.zghlxwxcb.cn/news/detail-542664.html
??別忘了給我關注~~??文章來源地址http://www.zghlxwxcb.cn/news/detail-542664.html
到了這里,關于輕松學習阿里云原生內存數據庫Tair的文章就介紹完了。如果您還想了解更多內容,請在右上角搜索TOY模板網以前的文章或繼續(xù)瀏覽下面的相關文章,希望大家以后多多支持TOY模板網!