轻松学习阿里云原生内存数据库Tair

news2024/11/16 12:02:20

📖轻松学习阿里云原生内存数据库Tair

    • 🚀前言
    • ☁️什么是Redis?
    • ☁️什么是云原生内存数据库?
      • ✨特点
    • 🚀阿里云原生内存数据库Tair
      • 👻简介
      • ✨功能特性
      • 🗺️应用场景
    • ✍️上手案例
      • 🎯 基于Redis实现在线游戏积分排行榜
    • 📖参考资料
    • 💻总结

🚀前言

😊各位小伙伴们,新文章它来了!!!

最近在探索阿里云产品的时候,偶然得知阿里云开发者社区有很多可以实践上手的活动,自己也就抱着好奇的心态去看了看,刚好有个活动是有关于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的普通插入模式,将代码中hostpassword参数的值替换为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

代码执行效果
在这里插入图片描述



📖参考资料

1.百度百科——云原生数据库

2.墨天轮百科——云原生数据库

3.阿里云原生内存数据库Tair产品文档



💻总结

以上就是我在阿里云开发者社区训练营所学习到的云数据库方面的知识,值得一提的是,对于新手或者小白来说,官方的产品文档和相关问题解答都很全面,学习起来也很轻松,上手实践操作也很方便。其次,通过这次学习,充分展示了redis的功能强大。可以基于redis丰富的数据结构完成很多现实场景下的业务功能的实现,同时也能提升小伙伴对于云原生相关技术的学习兴趣,希望通过这次的学习积累和总结,对大家有帮助,博主也是云原生小白,正在努力学习中!!!


🎨觉得不错的话记得点赞收藏呀!!🎨

😀别忘了给我关注~~😀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PCB笔记(PCB设计流程)

双层PCB设计流程&#xff08;以AD10为例&#xff09; 1. Preferences常规设置2. 画好原理图后3.编译工程&#xff0c;看是否有错4.然后执行更新到PCB5. 布线前常规规则设置6. 布局之后开始布线7.布线结束之后&#xff0c;开始铺铜8. 创建铜皮之前调丝印&#xff0c;将所有丝印调…

力扣 -- 剑指 Offer II 091. 粉刷房子

题目链接&#xff1a;剑指 Offer II 091. 粉刷房子 - 力扣&#xff08;LeetCode&#xff09; 下面是用动态规划的思想解决这道题的过程&#xff0c;相信各位小伙伴都能看懂并且掌握这道经典的动规题目滴。 参考代码&#xff1a; class Solution { public:int minCost(vector…

MIT 6.S081 教材第八章内容 -- ext3 -- 05

MIT 6.S081 教材第八章内容 -- ext3 -- 05 引言为什么需要日志系统XV6 File system logging回顾ext3 file system log formatext3如何提升性能ext3文件系统调用格式ext3 transaction commit步骤ext3 file system恢复过程为什么新transaction需要等前一个transaction中系统调用执…

FFMPEG 编译流程(极客版)

前言 依葫芦画瓢 全程30分钟从零完成ffmpeg编译&#xff0c;主打的就是一个极客 编译环境 OS 要求&#xff1a;Ubuntu 20.04 LTS VMware新建虚拟机 NDK 要求&#xff1a;android-ndk-r20b FFmpeg 功能模块&#xff1a; libavformat:多媒体文件或协议的封装和解封装库&a…

DynaSLAM代码详解(5) — Tracking.cc跟踪线程

目录 5.1 DynaSLAM中Tracking线程简介 5 .2 RGBD模式下跟踪流程 5.3 DynaSLAM的低成本跟踪 (1) Tracking::LightTrack() 低成本跟踪函数 (2) Tracking::LightTrackWithMotionModel() 低成本的恒速模型跟踪流程 5.4 DynaSLAM的正常跟踪 文章着重将与ORB-SLAM2不同的地方&a…

智能工厂:智能制造数字化转型解决方案

数字化已经成为制造业发展的必由之路。要提高生产效率和管理水平&#xff0c;就需要提高对生产运维各环节的数据采集、处理和利用效率。当前工厂的数据采集仍存在诸多不足&#xff0c;可以利用具有多种设备接入能力、通信协议转换能力、数据通信能力、控制维护能力的工业智能网…

UE5《Electric Dreams》项目PCG技术解析 之 PCGCustomNodes详解(一)

《Electric Dreams》项目中提供了一些自定义节点和子图&#xff08;文件位置:“/Content/PCG/Assets/PCGCustomNodes”&#xff09;&#xff0c;这些节点和子图在《Electric Dreams》被广泛使用&#xff0c;对于理解《Electric Dreams》非常重要&#xff0c;而且它们可以直接移…

Qt的对话框与窗口--多文档界面MDI(Multi-document Interface))

多文档界面MDI MDI应用程序就是在主窗口里创建多个同类型的MDI子窗口&#xff0c;这些MDI子窗口在主窗口里显示&#xff0c;并共享主窗口上的工具栏和菜单等操作功能&#xff0c;主窗口上的操作都针对当前活动的MDI子窗口进行。 设计MDI应用程序需要在主窗口工作区放置一个QMdi…

MySQL:我的从库竟是我自己!?

本文将通过复制场景下的异常分析&#xff0c;介绍手工搭建MySQL主从复制时需要注意的关键细节。 作者&#xff1a;秦福朗 爱可生 DBA 团队成员&#xff0c;负责项目日常问题处理及公司平台问题排查。热爱互联网&#xff0c;会摄影、懂厨艺&#xff0c;不会厨艺的 DBA 不是好司机…

多行文本转成一行的实现方法

哈喽大家好&#xff0c;我是咸鱼 不知道你们有没有遇到过下面的情况&#xff0c;以我为例 有时候我会收到批量操作服务器的需求&#xff0c;且我会拿到一个服务器 ip 列表&#xff0c;它是一个多行的形式&#xff0c;如下所示 # ip 列表 192.168.0.1 192.168.0.2 192.168.0.…

原油天然气的区别和用途

原油天然气在市场交易中都是重要的交易产品&#xff0c;经常有小伙伴在后台咨询Forexclub&#xff0c;原油天然气的区别和用途&#xff0c;今天这篇文章就和小伙伴一起交流研究。 其实在Forexclub看来原油和天然气的提取方法、来源和用途几乎相同&#xff0c;只是在适用范围和运…

推荐系统构建

从0到1打造推荐系统工程实战_推荐系统_Jay Wu_InfoQ写作社区

并行程序设计 pthread

配置环境 pthread是c的扩展库&#xff0c;需要配置环境&#xff0c;不过vscode的mingw里面本来就有&#xff0c;谢谢呢^_^ cd “d:\sylvia\文件夹等等等” ; if ($?) { g helloworld.cpp -o helloworld } ; //编译 if ($?) { .\helloworld 线程数} //运行 常用变量声明及函…

三雄极光“设计有光·亚洲设计师迪拜对话”逐光之旅圆满收官

7月8日&#xff0c;三雄极光照明学院“设计有光亚洲设计师迪拜对话”游学旅程圆满收官。过去两周内&#xff0c;此次活动备受关注&#xff0c;设计大咖纷纷为此次迪拜游学一带一路逐光之旅打call。出发前&#xff0c;启动礼于三雄极光总部隆重举行&#xff0c;总裁张宇涛出席并…

F - Desktop Rearrangement

大意: 给你一个桌面状态,每次俩种操作桌面可以表示为一个大小为nm的矩形矩阵&#xff0c;由字符.&#xff08;桌面上的空单元格&#xff09;和*&#xff08;一个图标&#xff09;组成。 操作: 输入<x,y>表示改变其状态的单元格的位置&#xff08;如果该单元格以前包含…

如何在.NET 自动安装包项目(Visual Studio Installer Projects)中设置安装包自动安装 .NET Framework环境

如何在.NET 自动安装包项目(Visual Studio Installer Projects)中设置安装包自动安装 .NET Framework环境 前言 ​ Microsoft Visual Studio Installer Projects是一组用于创建安装程序的工具&#xff0c;它是Microsoft Visual Studio的扩展。这些工具允许开发人员在Visual St…

Java开发基础系列(二):数据类型

&#x1f60a; 作者&#xff1a; 一恍过去 &#x1f496; 主页&#xff1a; https://blog.csdn.net/zhuocailing3390 &#x1f38a; 社区&#xff1a; Java技术栈交流 &#x1f389; 主题&#xff1a; Java开发基础系列(二):数据类型 ⏱️ 创作时间&#xff1a; 2023年07月…

生产消费者模型

生产消费者模型概念 生产消费者模型实际上就是通过一个容器&#xff0c;将生产者和消费者之间的强耦合问题解决掉。 没有使用生产者消费者模型时&#xff0c;生产者和消费者之间直接相互联通&#xff0c;两者之间强耦合&#xff0c;若是一方更换&#xff0c;那另一方也需要随之…

在 Jetpack Compose 中使用 ViewPager

简介 Jetpack Compose 是一个现代化的&#xff0c;声明式的 UI 工具包&#xff0c;让我们可以更方便地构建原生 Android UI。在本篇文章中&#xff0c;我们将会讨论如何在 Jetpack Compose 中使用 ViewPager。 什么是 ViewPager? ViewPager 是一个提供左右滑动切换视图的 U…

DynaSLAM代码详解(2) — Mask RCNN物体检测框架

目录 2.1 前言 2.2 Mask R-CNN优点 2.3 Mask R-CNN框架解析 (1) Mask R-CNN算法步骤 (2) Faster-R-CNN (3) FCN (4) ROIPooling和ROIAlign的分析与比较 (5) Mask R-CNN损失 参考链接&#xff1a; &#xff08;1&#xff09;Mask R-CNN网络详解_fcn太阳花的小绿豆_太…