[尚硅谷22版shiro]学习笔记

Posted 涉洧

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[尚硅谷22版shiro]学习笔记相关的知识,希望对你有一定的参考价值。

Shiro

概述

shiro是什么

Apache Shiro 是一个功能强大且易于使用的 Java 安全(权限)框架。Shiro 可以完成:认证、授权、加密、会话管理、与 Web 集成、缓存 等。借助 Shiro 您可以快速轻松地保护任何应用程序——从最小的移动应用程序到最大的 Web 和企业应用程序。

为什么要用

自 2003 年以来,框架格局发生了相当大的变化,因此今天仍然有很多系统在使用 Shiro。这与 Shiro 的特性密不可分。

  • 易于使用:使用 Shiro 构建系统安全框架非常简单。就算第一次接触也可以快速掌握。
  • 全面:Shiro 包含系统安全框架需要的功能,满足安全需求的“一站式服务”。
  • 灵活:Shiro 可以在任何应用程序环境中工作。虽然它可以在 Web、EJB 和 IoC 环境中工作,但不需要依赖它们。Shiro 也没有强制要求任何规范,甚至没有很多依赖项。
  • 强力支持 Web:Shiro 具有出色的 Web 应用程序支持,可以基于应用程序 URL 和 Web 协议(例如 REST)创建灵活的安全策略,同时还提供一组 JSP 库来控制页面输出。
  • 兼容性强:Shiro 的设计模式使其易于与其他框架和应用程序集成。Shiro 与 Spring、Grails、Wicket、Tapestry、Mule、Apache Camel、Vaadin 等框架无缝集成。
  • 社区支持:Shiro 是 Apache 软件基金会的一个开源项目,有完备的社区支持,文档支持。如果需要,像 Katasoft 这样的商业公司也会提供专业的支持和服务。

与 SpringSecurity 的对比

  1. Spring Security 基于 Spring 开发,项目若使用 Spring 作为基础,配合 Spring Security 做权限更加方便,而 Shiro 需要和 Spring 进行整合开发;
  2. Spring Security 功能比 Shiro 更加丰富些,例如安全维护方面;
  3. Spring Security 社区资源相对比 Shiro 更加丰富;
  4. Shiro 的配置和使用比较简单,Spring Security 上手复杂些;
  5. Shiro 依赖性低,不需要任何框架和容器,可以独立运行.Spring Security 依赖 Spring 容器;
  6. shiro 不仅仅可以使用在 web 中,它可以工作在任何应用环境中。在集群会话时 Shiro 最重要的一个好处或许就是它的会话是独立于容器的。

基本功能

介绍

  1. Authentication:身份认证/登录,验证用户是不是拥有相应的身份;
  2. Authorization:授权,即权限验证,验证某个已认证的用户是否拥有某个权限;即判断用 户是否能进行什么操作,如:验证某个用户是否拥有某个角色。或者细粒度的验证某个用户 对某个资源是否具有某个权限;
  3. Session Manager:会话管理,即用户登录后就是一次会话,在没有退出之前,它的 所有 信息都在会话中;会话可以是普通 JavaSE 环境,也可以是 Web 环境的;
  4. Cryptography:加密,保护数据的安全性,如密码加密存储到数据库,而不是明文存储;
  5. Web Support:Web 支持,可以非常容易的集成到 Web 环境;
  6. Caching:缓存,比如用户登录后,其用户信息、拥有的角色/权限不必每次去查,这样可 以提高效率;
  7. Concurrency:Shiro 支持多线程应用的并发验证,即如在一个线程中开启另一个线程,能把权限自动传播过去;
  8. Testing:提供测试支持;
  9. Run As:允许一个用户假装为另一个用户(如果他们允许)的身份进行访问;
  10. Remember Me:记住我,这个是非常常见的功能,即一次登录后,下次再来的话不用登录了

原理

Shiro 架构(外部)

从外部来看 Shiro ,即从应用程序角度的来观察如何使用Shiro 完成工作

  • Shiro 架构
  • Subject:应用代码直接交互的对象是 Subject,也就是说 Shiro 的对外 API 核心 就是 Subject。Subject 代表了当前“用户”, 这个用户不一定 是一个具体的人,与当 前应用交互的任何东西都是 Subject,如网络爬虫, 机器人等;与 Subject 的所有交互 都会委托给 SecurityManager; Subject 其实是一个门面,SecurityManager 才是实际的执行者;
  • SecurityManager:安全管理器;即所有与安全有关的操作都会与 SecurityManager交互;且其管理着所有 Subject;可以看出它是 Shiro 的核心,它负责与 Shiro 的其他组件进行交互,它相当于 SpringMVC 中 DispatcherServlet 的角色
  • Realm:Shiro 从 Realm 获取安全数据(如用户、角色、权限),就是说SecurityManager 要验证用户身份,那么它需要从 Realm 获取相应的用户 进行比较以确定用户身份是否合法;也需要从 Realm 得到用户相应的角色/ 权限进行验证用户是否能进行操作;可以把 Realm 看成 DataSource

shiro架构(内部)

  • Subject:任何可以与应用交互的“用户”;
  • SecurityManager :相当于 SpringMVC 中的 DispatcherServlet;是 Shiro 的心脏; 所有具体的交互都通过 SecurityManager 进行控制;它管理着所有 Subject、且负责进 行认证、授权、会话及缓存的管理。
  • Authenticator:负责 Subject 认证,是一个扩展点,可以自定义实现;可以使用认证策略(Authentication Strategy),即什么情况下算用户认证通过了;
  • Authorizer:授权器、即访问控制器,用来决定主体是否有权限进行相应的操作;即控制着用户能访问应用中的哪些功能;
  • Realm:可以有 1 个或多个 Realm,可以认为是安全实体数据源,即用于获取安全实体的;可以是 JDBC 实现,也可以是内存实现等等;由用户提供;所以一般在应用中都需要实现自己的 Realm;
  • SessionManager:管理 Session 生命周期的组件;而 Shiro 并不仅仅可以用在 Web环境,也可以用在如普通的 JavaSE 环境
  • CacheManager:缓存控制器,来管理如用户、角色、权限等的缓存的;因为这些数据 基本上很少改变,放到缓存中后可以提高访问的性能
  • Cryptography:密码模块,Shiro 提高了一些常见的加密组件用于如密码加密/解密。

使用

环境搭建

引入依赖

<dependencies>
    <dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-core</artifactId>
        <version>1.9.0</version>
    </dependency>
    <dependency>
        <groupId>commons-logging</groupId>
        <artifactId>commons-logging</artifactId>
        <version>1.2</version>
    </dependency>
</dependencies>

ini文件

[users]
fate=zero
fuck=me

登录认证

登录认证概念

  1. 身份验证:一般需要提供如身份ID等一些标识信息来表明登录者的身份,如提供email,用户名/密码来证明。
  2. 在shiro中,用户需要提供principals(身份)和credentials(证明)给shiro,从而应用能验证用户身份:
  3. principals:身份,即主体的标识属性,可以是任何属性,如用户名、邮箱等,唯一即可。一个主体可以有多个principals,但只有一个Primary principals,一般是用户名/邮箱/手机号。
  4. credentials:证明/凭证,即只有主体知道的安全值,如密码/数字证书等。
  5. 最常见的principals和credentials组合就是用户名/密码

登录认证基本流程

  1. 收集用户身份/凭证,即如用户名/密码
  2. 调用 Subject.login 进行登录,如果失败将得到相应 的 AuthenticationException异常,根据异常提示用户 错误信息;否则登录成功
  3. 创建自定义的 Realm 类,继承 org.apache.shiro.realm.AuthenticatingRealm类,实现 doGetAuthenticationInfo() 方法

实例

四步走:

  1. 初始化获取SecurityManager
  2. 获取subject对象
  3. 创建token对象,web应用用户名密码从页面传递
  4. 完成登录
@Test
    void login()
//        1.初始化获取SecurityManager
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        SecurityUtils.setSecurityManager(securityManager);
//        2.获取subject对象
        Subject subject = SecurityUtils.getSubject();
//        3.创建token对象,web应用用户名密码从页面传递
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("fate", "zero");
//        4.完成登录
        subject.login(usernamePasswordToken);
        System.out.println(usernamePasswordToken);
    

角色,授权

授权概念

  1. 授权,也叫访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面 操作等)。在授权中需了解的几个关键对象:主体(Subject)资源(Resource)权限 (Permission)角色(Role)
  2. 主体(Subject):访问应用的用户,在 Shiro 中使用 Subject 代表该用户。用户只有授权 后才允许访问相应的资源。
  3. 资源(Resource):在应用中用户可以访问的 URL,比如访问 JSP 页面、查看/编辑 某些 数据、访问某个业务方法、打印文本等等都是资源。用户只要授权后才能访问。
  4. 权限(Permission):安全策略中的原子授权单位,通过权限我们可以表示在应用中用户 有没有操作某个资源的权力。即权限表示在应用中用户能不能访问某个资源,如:访问用 户列表页面查看/新增/修改/删除用户数据(即很多时候都是CRUD(增查改删)式权限控 制)等。权限代表了用户有没有操作某个资源的权利,即反映在某个资源上的操作允不允 许。
  5. Shiro 支持粗粒度权限(如用户模块的所有权限)和细粒度权限(操作某个用户的权限, 即实例级别的)
  6. 角色(Role)权限的集合,一般情况下会赋予用户角色而不是权限,即这样用户可以拥有 一组权限,赋予权限时比较方便。典型的如:项目经理、技术总监、CTO、开发工程师等 都是角色,不同的角色拥有一组不同的权限

授权方式

编程式:

subject.hasRole("admin")

注解式:

@RequiresRoles("admin")

JSP/GSP 标签:

<shiro:hasRole name="admin">
    
</shiro:hasRole>

授权流程

  1. 首先调用Subject.isPermitted*/hasRole*接口,其会委托给SecurityManager,而SecurityManager接着会委托给 Authorizer;
  2. Authorizer是真正的授权者,如果调用如isPermitted(“user:view”),其首先会通过PermissionResolver把字符串转换成相应的Permission实例;
  3. 在进行授权之前,其会调用相应的Realm获取Subject相应的角色/权限用于匹配传入的角色/权限;
  4. Authorizer会判断Realm的角色/权限是否和传入的匹配,如果有多个Realm,会委托给ModularRealmAuthorizer进行循环判断,如果匹配如isPermitted*/hasRole* 会返回 true,否则返回false表示授权失败

实例

    @Test
    void testLogin()
        //        1.初始化获取SecurityManager
        IniSecurityManagerFactory factory = new IniSecurityManagerFactory("classpath:shiro.ini");
        SecurityManager securityManager = factory.getInstance();
        assert securityManager != null;
        SecurityUtils.setSecurityManager(securityManager);
//        2.获取subject对象
        Subject subject = SecurityUtils.getSubject();
//        3.创建token对象,web应用用户名密码从页面传递
        UsernamePasswordToken usernamePasswordToken = new UsernamePasswordToken("fate", "zero");
//        4.完成登录
        subject.login(usernamePasswordToken);
        System.out.println(usernamePasswordToken);
        System.out.println("admin:"+subject.hasRole("admin"));
        System.out.println("root:"+subject.hasRole("root"));
        System.out.println("user:"+subject.hasRole("user"));
        System.out.println("user:add:"+subject.isPermitted("user:add"));
        System.out.println("user:update:"+subject.isPermitted("user:update"));
       
 //        无此权限直接抛出异常
        subject.checkPermission("user:update");

加密

实际系统开发中,一些敏感信息需要进行加密,比如说用户的密码。Shiro 内嵌很多 常用的加密算法,比如 MD5 加密。Shiro 可以很简单的使用信息加密。

@Test
void testMD5()
    String password = "password";
    Md5Hash md5Hash = new Md5Hash(password);
    System.out.println("md5Hash = " + md5Hash.toHex());
    Md5Hash saltMd5Hash = new Md5Hash(password, "salt");
    System.out.println("saltMd5Hash = " + saltMd5Hash);
    Md5Hash saltMd5Hash3 = new Md5Hash(password, "salt", 3);
    System.out.println("saltMd5Hash3 = " + saltMd5Hash3);
    SimpleHash simpleHash = new SimpleHash("MD5", password, "salt", 3);
    System.out.println("simpleHash = " + simpleHash);
    assert simpleHash.equals(saltMd5Hash3);

自定义登陆认证

Shiro 默认的登录认证是不带加密的,如果想要实现加密认证需要自定义登录认证, 自定义 Realm。

public class MyRealm extends AuthenticatingRealm 

    /**
     * 自定义的登录认证方法,Shiro 的  login 方法底层会调用该类的认证方法完成登录认证
     * 需要配置自定义的  realm 生效,在  ini 文件中配置,或  Springboot 中配置
     * 该方法只是获取进行对比的信息,认证逻辑还是按照  Shiro 的底层认证逻辑完成认证
     * @param token 令牌
     * @return @link AuthenticationInfo
     * @throws AuthenticationException 身份验证异常
     */
    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException 
//        1 获取身份信息
        String principal = token.getPrincipal().toString();
        System.out.println("principal = " + principal);


//        2 获取凭证信息
        String credentials = new String((char[]) token.getCredentials());
        System.out.println("credentials = " + credentials);

//        3 获取数据库中存储的用户信息
        if("fate".equals(principal)) 
            String pwd = "dda5359be921db4f73a69223ec264c11";
            return new SimpleAuthenticationInfo(
                    token.getPrincipal(),
                    pwd,
                    ByteSource.Util.bytes("salt"), principal);
        
//        4 创建封装校验逻辑对象
        return null;
    

添加配置信息,让shiro知晓你使用的是自定义的Realm

[main]
2、在shiro.ini中添加配置信息
md5CredentialsMatcher=org.apache.shiro.authc.cre 
dential.Md5CredentialsMatcher
md5CredentialsMatcher.hashIterations=3
myrealm=com.atguigu.shirotest.MyRealm
myrealm.credentialsMatcher=$md5CredentialsMatcher
securityManager.realms=$myrealm
[users]
zhangsan=7174f64b13022acd3c56e2781e098a5f,role1, 
role2
lisi=l4 
[roles]
role1=user:insert,user:select

整合springboot

框架整合

  1. 引入依赖
<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.1.RELEASE</version>
    </parent>
<dependencies>
	<dependency>
        <groupId>org.apache.shiro</groupId>
        <artifactId>shiro-spring-boot-web-starter</artifactId>
        <version>1.9.0</version>
    </dependency>
    <!--mybatis-plus-->
    <dependency>
        <groupId>com.baomidou</groupId>
        <artifactId>mybatis-plus-boot-starter</artifactId>
        <version>3.0.5</version>
    </dependency>
    <!--mysql-->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>5.1.46</version>
    </dependency>
    <dependency>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-thymeleaf</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
</dependencies>
  1. 配置文件
# mybatis配置
mybatis-plus:
  configuration:
  # 日志
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  mapper-locations: classpath:mapper/*.xml


spring:
# 数据库配置
  datasource:
    type: com.zaxxer.hikari.HikariDataSource
    driver-class-name: com.mysql.jdbc.Driver
    url: jdbc:mysql://localhost:3306/shirodb?characterEncoding=utf-8&useSSL=false
    password: password
    username: username
# json格式
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

shiro:
# 登录接口
  loginUrl: /myController/login
  1. 启动类
@SpringBootApplication
@MapperScan("com.fate.shiro.mapper")
public class ShiroApplication 
    public static void main(String[] args) 
        SpringApplication.run(ShiroApplication.class, args);
    

登录认证实现

后端接口服务实现

  1. 数据库表
create table user
(
    id   bigint auto_increment comment '编号'
        primary key,
    name varchar(30) null comment '用户名',
    pwd  varchar(50) null comment '密码',
    rid  bigint      null comment '角色编号'
)
    comment '用户表' charset = utf8;
  1. 生产实体与mapper/service

    这里我使用的是mybatisx插件一键生成

  2. 编写userservice(此处只写明impl)

    @Service
    public class UserServiceImpl extends ServiceImpl<UserMapper, User>
        implements UserService
    
        /**
         * 根据用户名得到用户信息
         *
         * @param name 名字
         * @return @link User
         */
        @Override
        public User getUserInfoByName(String name) 
            LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(User::getName,name);
            return baseMapper.selectOne(queryWrapper);
        
    
    
  3. 自定义realm

    @Component
    public class MyRealm extends AuthorizingRealm 
    
        @Autowired
        private UserService userService;
        /**
         * 自定义授权
         *
         * @param principals 权限
         * @return @link AuthorizationInfo
         */
        @Override
        protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) 
            return null;
        
    
    
        /**
         * 自定义身份验证
         *
         * @param token 令牌
         * @return @link AuthenticationInfo
         * @throws AuthenticationException 身份验证异常
         */
        @Override
        protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException 
    //        1. 获取用户身份信息
            String name = token.getPrincipal().toString();
    //        2. 调用业务层获取用户信息
            User user = userService.getUserInfoByName(name);
    //        3. 非空判断,将数据封装返回
            if (user != null) 
                return new SimpleAuthenticationInfo(
                        token.getPrincipal(),
                        user.getPwd(),
                        ByteSource.Util.bytes("salt"),
                        name
                );
            
            return null;
        
    
    
  4. 配置类

    @Slf4j
    @Configuration
    public class ShiroConfig 
        @Autowired
        private MyRealm myRealm;
    
        @Bean
        public DefaultWebSecurityManager defaultWebSecurityManager() 
    //        1. 创建DefaultWebSecurityManager对象
            DefaultWebSecurityManager defaultWebSecurityManager = new DefaultWebSecurityManager();
    //        2. 创建加密对象,配置相关属性
            HashedCredentialsMatcher matcher = new HashedCredentialsMatcher();
    //          2.1  加密
            matcher.setHashAlgorithmName("md5");
            matcher.setHashIterations(3);
    //        3. 将加密对象存储到myRealm中
            myRealm.setCredentialsMatcher(matcher);
    //        4. 将myRealm存入DefaultWebSecurityManager对象
            defaultWebSecurityManager.setRealm(myRealm);
    //        5. 返回DefaultWebSecurityManager
            log.info("DefaultWebSecurityManager 初始化成功");
            return defaultWebSecurityManager;
        
    
        @Bean
        public DefaultShiroFilterChainDefinition shiroFilterChainDefinition()
            DefaultShiroFilterChainDefinition defaultShiroFilterChainDefinition = new DefaultShiroFilterChainDefinition();
    //        无需认证
            defaultShiroFilterChainDefinition.addPathDefinition("/myController/userLogin","anon");
            defaultShiroFilterChainDefinition.addPathDefinition("/login&#

    Flink 尚硅谷学习笔记

    简介

    尚硅谷Flink(Scala版)教程丨清华硕士-武晟然老师主讲

    https://www.bilibili.com/video/BV1Qp4y1Y7YN

    官网 : http://flink.apache.org/

    目录

        P01.尚硅谷_Flink-Flink简介------------    07:56
        P02.尚硅谷_Flink-Flink应用场景----------    19:46
        P03.尚硅谷_Flink-流式处理的提出----------------    11:05
        P04.尚硅谷_Flink-流式处理的演变-------------    15:18
        P05.尚硅谷_Flink-Flink的特点------------------    16:34
        P06.尚硅谷_Flink-批处理wordcount---------------    23:59
        P07.尚硅谷_Flink-流处理wordcount-------------    20:15
        P08.尚硅谷_Flink-流处理wordcount扩展测试和说明-------------    19:15
        P09.尚硅谷_Flink-Flink集群部署----------------    26:47
        P010.尚硅谷_Flink-提交Job---------------------    22:35
        P011.尚硅谷_Flink-命令行提交Job-----------    07:31
        P012.尚硅谷_Flink-其它方式集群部署------------------    12:51
        P013.尚硅谷_Flink-运行时架构_运行时组件-----------    08:36
        P014.尚硅谷_Flink-运行时架构_作业提交流程-------------    13:23
        P015.尚硅谷_Flink-运行时架构_任务调度原理(一)_并行度和slot-------------    16:29
        P016.尚硅谷_Flink-运行时架构_任务调度原理(二)_slot共享-----------------    17:23
        P017.尚硅谷_Flink-运行时架构_任务调度原理(三)_slot共享示例-----------    06:16
        P018.尚硅谷_Flink-运行时架构_任务调度原理(四)_执行图和任务链-------------    25:36
        P019.尚硅谷_Flink-运行时架构_任务调度原理(五)_自定义任务调度规则---------    12:21
        P020.尚硅谷_Flink-流处理API_Source(一)_从集合和文件读取数据------------    16:19
        P021.尚硅谷_Flink-流处理API_Source(二)_从Kafka读取数据-------------------    21:33
        P022.尚硅谷_Flink-流处理API_Source(三)_自定义Source--------------------    24:50
        P023.尚硅谷_Flink-流处理API_Transform(一)_简单转换算子-------------------    06:50
        P024.尚硅谷_Flink-流处理API_Transform(二)_简单分组聚合------------------    19:16
        P025.尚硅谷_Flink-流处理API_Transform(三)_reduce聚合--------------------    11:22
        P026.尚硅谷_Flink-流处理API_Transform(四)_分流操作-----------------------    12:24
        P027.尚硅谷_Flink-流处理API_Transform(五)_合流操作----------------------    19:55
        P028.尚硅谷_Flink-流处理API_Flink支持的数据类型----------------------------    09:41
        P029.尚硅谷_Flink-流处理API_函数类和富函数类------------------------------    19:41
        P030.尚硅谷_Flink-流处理API_Sink(一)_文件-----------------------------    18:55
        P031.尚硅谷_Flink-流处理API_Sink(二)_Kafka--------------------------    10:45
        P032.尚硅谷_Flink-流处理API_Sink(三)_Redis--------------------------    18:30
        P033.尚硅谷_Flink-流处理API_Sink(四)_ElasticSearch-------------------    16:43
        P034.尚硅谷_Flink-流处理API_Sink(五)_MySQL----------------------------    17:48
        P035.尚硅谷_Flink-流处理API_Window API_窗口概念-----------------------    07:22
        P036.尚硅谷_Flink-流处理API_Window API_窗口类型------------------------    10:13
        P037.尚硅谷_Flink-流处理API_Window API_窗口分配器---------------------------    27:17
        P038.尚硅谷_Flink-流处理API_Window API_窗口函数及其它可选API----------------    21:00
        P039.尚硅谷_Flink-流处理API_Window API_窗口计算测试-------------------------    15:07
        P040.尚硅谷_Flink-时间语义------------------------------------------------    17:57
        P041.尚硅谷_Flink-时间语义的设置-----------------------------------------    04:33
        P042.尚硅谷_Flink-Watermark概念--------------------------------------------    19:06
        P043.尚硅谷_Flink-Watermark原理和特点--------------------------------------    15:58
        P044.尚硅谷_Flink-Watermark传递-------------------------------------------    08:09
        P045.尚硅谷_Flink-Watermark代码中引入------------------------------------    16:33
        P046.尚硅谷_Flink-自定义Watermark生成机制--------------------------------    07:10
        P047.尚硅谷_Flink-事件时间语义下的窗口测试------------------------------    16:12
        P048.尚硅谷_Flink-窗口起始点的确定-------------------------------------    09:21
        P049.尚硅谷_Flink-状态管理(一)_状态的概念-----------------------------    08:08
        P050.尚硅谷_Flink-状态管理(二)_算子状态和键控状态-----------------------    15:14
        P051.尚硅谷_Flink-状态管理(三)_状态在代码中的定义和使用------------------    27:25
        P052.尚硅谷_Flink-状态编程示例(一)-------------------------------------    17:15
        P053.尚硅谷_Flink-状态编程示例(二)-------------------------------------    17:30
        P054.尚硅谷_Flink-ProcessFuntion_基本概念和使用--------------------------    23:24
        P055.尚硅谷_Flink-ProcessFuntion_定时器应用示例----------------------------    32:50
        P056.尚硅谷_Flink-ProcessFuntion_侧输出流应用示例--------------------------    09:45
        P057.尚硅谷_Flink-状态后端-------------------------------------------------    15:36
        P058.尚硅谷_Flink-容错机制_检查点概念和原理-------------------------------    13:31
        P059.尚硅谷_Flink-容错机制_检查点算法--------------------------------------    25:46
        P060.尚硅谷_Flink-容错机制_checkpoint配置----------------------------------    26:29
        P061.尚硅谷_Flink-容错机制_重启策略配置------------------------------------    08:21
        P062.尚硅谷_Flink-保存点-------------------------------------------------    07:32
        P063.尚硅谷_Flink-状态一致性_基本概念-----------------------------------    10:46
        P064.尚硅谷_Flink-状态一致性_Flink端到端状态一致性的保证----------------    08:43
        P065.尚硅谷_Flink-状态一致性_幂等写入和事务写入-------------------------    23:35
        P066.尚硅谷_Flink-状态一致性_Flink与Kafka连接的状态一致性--------------------    18:20
        P067.尚硅谷_Flink-Table API和Flink SQL_基本概念和示例程序---------------------    22:03
        P068.尚硅谷_Flink-Table API和Flink SQL_基本程序结构--------------------------    09:22
        P069.尚硅谷_Flink-Table API和Flink SQL_表执行环境--------------------------    15:43
        P070.尚硅谷_Flink-Table API和Flink SQL_表的概念和从文件读取数据-----------------    19:14
        P071.尚硅谷_Flink-Table API和Flink SQL_从Kafka读取数据-------------------------    09:29
        P072.尚硅谷_Flink-Table API和Flink SQL_表的查询转换------------------------------    11:04
        P073.尚硅谷_Flink-Table API和Flink SQL_DataStream和表的转换-------------------    08:25
        P074.尚硅谷_Flink-Table API和Flink SQL_输出到文件-----------------------------    25:14
        P075.尚硅谷_Flink-Table API和Flink SQL_更新模式------------------------------    10:51
        P076.尚硅谷_Flink-Table API和Flink SQL_Kafka管道测试--------------------------    17:41
        P077.尚硅谷_Flink-Table API和Flink SQL_输出到ES-------------------------------    18:18
        P078.尚硅谷_Flink-Table API和Flink SQL_输出到MySQL----------------------------    08:09
        P079.尚硅谷_Flink-Table API和Flink SQL_表转换成流------------------------------    11:34
        P080.尚硅谷_Flink-Table API和Flink SQL_流处理和SQL查询的不同------------------    07:07
        P081.尚硅谷_Flink-Table API和Flink SQL_动态表和持续查询----------------------    12:24
        P082.尚硅谷_Flink-Table API和Flink SQL_持续查询示例具体过程-----------------    12:50
        P083.尚硅谷_Flink-Table API和Flink SQL_时间特性(一)_处理时间-----------------    20:16
        P084.尚硅谷_Flink-Table API和Flink SQL_时间特性(二)_事件时间------------------    14:16
        P085.尚硅谷_Flink-Table API和Flink SQL_窗口(一)_分组窗口---------------------    13:11
        P086.尚硅谷_Flink-Table API和Flink SQL_窗口(二)_分组窗口测试--------------------    18:43
        P087.尚硅谷_Flink-Table API和Flink SQL_窗口(三)_Over窗口-----------------------    11:58
        P088.尚硅谷_Flink-Table API和Flink SQL_窗口(四)_Over窗口测试------------------------    13:03
        P089.尚硅谷_Flink-Table API和Flink SQL_函数(一)_系统内置函数----------------------    11:04
        P090.尚硅谷_Flink-Table API和Flink SQL_函数(二)_UDF函数_标量函数-----------------    14:39
        P091.尚硅谷_Flink-Table API和Flink SQL_函数(三)_UDF函数_表函数---------------------    17:19
        P092.尚硅谷_Flink-Table API和Flink SQL_函数(四)_UDF函数_聚合函数----------------    26:58
        P093.尚硅谷_Flink-Table API和Flink SQL_函数(五)_UDF函数_表聚合函数-------------    27:56
        P094.尚硅谷_Flink项目-电商用户行为分析_批处理和流处理以及项目选型---------------    08:12
        P095.尚硅谷_Flink项目-电商用户行为分析_用户行为分析应用场景----------------------    15:27
        P096.尚硅谷_Flink项目-电商用户行为分析_模块设计和数据分析------------------------    09:12
        P097.尚硅谷_Flink项目-电商用户行为分析_模块需求分析_实时热门商品统计(一)--------    21:03
        P098.尚硅谷_Flink项目-电商用户行为分析_模块需求分析_实时热门商品统计(二)---------    09:07
        P099.尚硅谷_Flink项目-电商用户行为分析_模块需求分析_其它需求-------------------    10:04
        P100.尚硅谷_Flink项目-电商用户行为分析_项目框架搭建---------------------------------    10:22
        P101.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(一)_窗口聚合--------------------    27:55
        P102.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(二)_排序统计输出--------------------------    27:14
        P103.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(三)_从Kafka消费数据测试------------------    20:51
        P104.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(四)_批量消费Kafka数据测试----------------    10:03
        P105.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(五)_Table API和SQL实现-------------------    28:43
        P106.尚硅谷_Flink项目-电商用户行为分析_实时热门页面流量统计(一)_开窗聚合统计--------------------    26:06
        P107.尚硅谷_Flink项目-电商用户行为分析_实时热门页面流量统计(二)_统计结果排序输出-----------------    09:47
        P108.尚硅谷_Flink项目-电商用户行为分析_实时热门页面流量统计(三)_乱序数据的处理-------------------    21:04
        P109.尚硅谷_Flink项目-电商用户行为分析_实时热门页面流量统计(四)_保证状态更新结果正确--------------    21:41
        P110.尚硅谷_Flink项目-电商用户行为分析_PV统计(一)_基本实现---------------------------------------    20:39
        P111.尚硅谷_Flink项目-电商用户行为分析_PV统计(二)_数据并行的优化--------------------------------    19:22
        P112.尚硅谷_Flink项目-电商用户行为分析_UV统计(一)_基本实现--------------------------------------    15:28
        P113.尚硅谷_Flink项目-电商用户行为分析_UV统计(二)_布隆过滤器去重思路和程序架构-------------------    30:48
        P114.尚硅谷_Flink项目-电商用户行为分析_UV统计(三)_布隆过滤器简单实现-----------------------------    09:12
        P115.尚硅谷_Flink项目-电商用户行为分析_UV统计(四)_UV去重的布隆过滤器实现-------------------------    23:32
        P116.尚硅谷_Flink项目-电商用户行为分析_APP市场推广统计(一)_自定义数据源-------------------------    17:03
        P117.尚硅谷_Flink项目-电商用户行为分析_APP市场推广统计(二)_开窗聚合统计输出---------------------    20:44
        P118.尚硅谷_Flink项目-电商用户行为分析_广告点击量统计分析(一)_基本需求实现-----------------------    19:19
        P119.尚硅谷_Flink项目-电商用户行为分析_广告点击量统计分析(二)_刷单行为过滤思路和整体框架---------    14:28
        P120.尚硅谷_Flink项目-电商用户行为分析_广告点击量统计分析(三)_刷单行为过滤代码实现--------------    23:20
        P121.尚硅谷_Flink项目-电商用户行为分析_恶意登录检测(一)_实现思路和代码框架--------------------    18:17
        P122.尚硅谷_Flink项目-电商用户行为分析_恶意登录检测(二)_具体代码实现---------------------------    18:21
        P123.尚硅谷_Flink项目-电商用户行为分析_恶意登录检测(三)_代码改进-------------------------------    18:19
        P124.尚硅谷_Flink项目-电商用户行为分析_恶意登录检测(四)_CEP代码实现---------------------------    30:33
        P125.尚硅谷_Flink项目-电商用户行为分析_CEP简介(一)_CEP介绍及Pattern API整体概念----------------    12:24
        P126.尚硅谷_Flink项目-电商用户行为分析_CEP简介(二)_个体模式-----------------------------------    12:41
        P127.尚硅谷_Flink项目-电商用户行为分析_CEP简介(三)_模式序列-------------------------------------    10:24
        P128.尚硅谷_Flink项目-电商用户行为分析_CEP简介(四)_模式的检测和事件处理-------------------------    09:50
        P129.尚硅谷_Flink项目-电商用户行为分析_订单超时检测(一)_实现思路和程序架构--------------------    19:50
        P130.尚硅谷_Flink项目-电商用户行为分析_订单超时检测(二)_CEP具体代码实现-----------------------    17:29
        P131.尚硅谷_Flink项目-电商用户行为分析_订单超时检测(三)_流式输入数据测试--------------------    06:42
        P132.尚硅谷_Flink项目-电商用户行为分析_订单超时检测(四)_ProcessFunction代码实现-------------    32:20
        P133.尚硅谷_Flink项目-电商用户行为分析_双流实时对账(一)_需求分析和整体架构--------------    13:50
        P134.尚硅谷_Flink项目-电商用户行为分析_双流实时对账(二)_合流代码实现------------------------    22:24
        P135.尚硅谷_Flink项目-电商用户行为分析_Join API(一)_Window Join---------------------------    12:56
        P136.尚硅谷_Flink项目-电商用户行为分析_Join API(二)_Interval Join--------------------------    09:47
        P137.尚硅谷_Flink项目-电商用户行为分析_双流实时对账(三)_Join代码实现-----------------------    09:22

    详情

      P01.尚硅谷_Flink-Flink简介------------    07:56


      P02.尚硅谷_Flink-Flink应用场景----------    19:46

    处理方式:  流处理,批处理

    处理延时: 实时,离线

    传统数据处理框架基于有限数据集


        P03.尚硅谷_Flink-流式处理的提出----------------    11:05


        P04.尚硅谷_Flink-流式处理的演变-------------    15:18

    第一代流处理框架: storm  (低延时)

    第二代流处理框架: Spark  (高吞吐,正确性,微批次,秒级延时)

    第三代流处理框架:  Flink   ()


        P05.尚硅谷_Flink-Flink的特点------------------    16:34

    high:  Table  API ,

    mid:  DataStream API ,

    low:  ProcessFunction

     


        P06.尚硅谷_Flink-批处理wordcount---------------    23:59

    pom.xml

    注意视频中的   scala-maven-plugin 4.4.0 我使用的是 4.5.3

    <?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.atguigu</groupId>
        <artifactId>FlinkTutorial</artifactId>
        <version>1.0-SNAPSHOT</version>
    
    
        <dependencies>
    
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-scala_2.12</artifactId>
                <version>1.10.1</version>
            </dependency>
            <dependency>
                <groupId>org.apache.flink</groupId>
                <artifactId>flink-streaming-scala_2.12</artifactId>
                <version>1.10.1</version>
            </dependency>
    
        </dependencies>
    
        <build>
            <plugins>
                <!--将scala文件编译成class文件-->
                <plugin>
                    <groupId>net.alchim31.maven</groupId>
                    <artifactId>scala-maven-plugin</artifactId>
                    <version>4.5.3</version>
                    <executions>
                        <execution>
                            <!--声明绑定到maven的compile阶段-->
                            <goals>
                                <goal>compile</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
    
                <!--打包成jar -->
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-assembly-plugin</artifactId>
                    <version>3.3.0</version>
                    <configuration>
                        <descriptorRefs>
                            <descriptorRef>jar-with-dependencies</descriptorRef>
                        </descriptorRefs>
                    </configuration>
                    <executions>
                        <execution>
                            <id>make-assembly</id>
                            <phase>package</phase>
                            <goals>
                                <goal>single</goal>
                            </goals>
                        </execution>
                    </executions>
                </plugin>
            </plugins>
        </build>
    
    </project>

    如果无法新增scala文件,说明本机没有安装scala JDK ,IDEA 没有配置 scala 插件,请用40分钟转到本文https://blog.csdn.net/wei198621/article/details/119417753

    学习一下 安装 scala JDK 及 IDEA 插件 ,然后继续。。。

     

    //简单计数

    package com.atguigu.wc
    
    import org.apache.flink.api.scala.{DataSet, ExecutionEnvironment}
     import org.apache.flink.api.scala._
    //隐式转换
    
    /**
      * @author leowei
      * @date 2021/8/5  - 15:39   
      *
      * 批处理 wordCount
      */
    object WordCount {
    
      def main(args: Array[String]): Unit = {
        // 01 创建一个批处理的 执行环境
        val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
    
        // 02 从文件中读取数据
        val inputPath:String="C:\\\\workspace\\\\workspace_idea\\\\FlinkTutorial\\\\src\\\\main\\\\resources\\\\hello.txt";
        val inputDataSet:DataSet[String] = env.readTextFile(inputPath);
    
        //03  对数据进行转换处理统计,先分词,再按照word进行分组,最后进行聚合统计
        val resultDataSet: DataSet[(String,Int)] =inputDataSet
          .flatMap(_.split(" "))   //用空格分隔字符串
          .map((_,1))             // 将字符串转换为  String,Int 类型的二元组,_表示字符串本身
          //.groupBy(0)   //以第一个元素作为key ,进行分组
          //.sum(1)      // 对所有数据的第二个元素求和
    
        //04  打印输出
        resultDataSet.print()
    
      }
    }
    

    //分组统计

    package com.atguigu.wc
    
    import org.apache.flink.api.scala.{DataSet, ExecutionEnvironment}
     import org.apache.flink.api.scala._
    //隐式转换
    
    /**
      * @author leowei
      * @date 2021/8/5  - 15:39   
      *
      * 批处理 wordCount
      */
    object WordCount {
    
      def main(args: Array[String]): Unit = {
        // 01 创建一个批处理的 执行环境
        val env: ExecutionEnvironment = ExecutionEnvironment.getExecutionEnvironment
    
        // 02 从文件中读取数据
        val inputPath:String="C:\\\\workspace\\\\workspace_idea\\\\FlinkTutorial\\\\src\\\\main\\\\resources\\\\hello.txt";
        val inputDataSet:DataSet[String] = env.readTextFile(inputPath);
    
        //03  对数据进行转换处理统计,先分词,再按照word进行分组,最后进行聚合统计
        val resultDataSet: DataSet[(String,Int)] =inputDataSet
          .flatMap(_.split(" "))   //用空格分隔字符串
          .map((_,1))             // 将字符串转换为  String,Int 类型的二元组,_表示字符串本身
          .groupBy(0)   //以第一个元素作为key ,进行分组
          .sum(1)      // 对所有数据的第二个元素求和
    
        //04  打印输出
        resultDataSet.print()
    
      }
    }
    


        P07.尚硅谷_Flink-流处理wordcount-------------    20:15

    package com.atguigu.wc
    
    import org.apache.flink.streaming.api.scala.StreamExecutionEnvironment
    import org.apache.flink.streaming.api.scala._
    /**
      * @author leowei
      * @date 2021/8/5  - 18:48
      *
      */
    object WordCountStream {
    
      def main(args: Array[String]): Unit = {
    
        //01 创建流处理执行环境
        val env = StreamExecutionEnvironment.getExecutionEnvironment
    
        //02 接受一个socket 文本流
        val inputDataStream = env.socketTextStream("localhost", 7777)
    
        //03  进行转化处理统计
        val resultDataStream =inputDataStream
          .flatMap(_.split(" "))  // .flatMap(x=>x.split(" "))
          .filter(_.nonEmpty)
          .map((_,1))       //map(x=>x,1)
          .keyBy(0)
          .sum(1)
    
        //04 打印输出
        resultDataStream.print()
    
        //05 启动任务执行
        env.execute("word count stream ....")
    
      }
    
    }
    

    windows10上运行Linux Bash Shell

    https://www.cnblogs.com/fander/p/10551391.html

     

     

    ---------20210805


        P08.尚硅谷_Flink-流处理wordcount扩展测试和说明-------------    19:15
        P09.尚硅谷_Flink-Flink集群部署----------------    26:47
        P010.尚硅谷_Flink-提交Job---------------------    22:35
        P011.尚硅谷_Flink-命令行提交Job-----------    07:31
        P012.尚硅谷_Flink-其它方式集群部署------------------    12:51
        P013.尚硅谷_Flink-运行时架构_运行时组件-----------    08:36
        P014.尚硅谷_Flink-运行时架构_作业提交流程-------------    13:23
        P015.尚硅谷_Flink-运行时架构_任务调度原理(一)_并行度和slot-------------    16:29
        P016.尚硅谷_Flink-运行时架构_任务调度原理(二)_slot共享-----------------    17:23
        P017.尚硅谷_Flink-运行时架构_任务调度原理(三)_slot共享示例-----------    06:16
        P018.尚硅谷_Flink-运行时架构_任务调度原理(四)_执行图和任务链-------------    25:36
        P019.尚硅谷_Flink-运行时架构_任务调度原理(五)_自定义任务调度规则---------    12:21
        P020.尚硅谷_Flink-流处理API_Source(一)_从集合和文件读取数据------------    16:19
        P021.尚硅谷_Flink-流处理API_Source(二)_从Kafka读取数据-------------------    21:33
        P022.尚硅谷_Flink-流处理API_Source(三)_自定义Source--------------------    24:50
        P023.尚硅谷_Flink-流处理API_Transform(一)_简单转换算子-------------------    06:50
        P024.尚硅谷_Flink-流处理API_Transform(二)_简单分组聚合------------------    19:16
        P025.尚硅谷_Flink-流处理API_Transform(三)_reduce聚合--------------------    11:22
        P026.尚硅谷_Flink-流处理API_Transform(四)_分流操作-----------------------    12:24
        P027.尚硅谷_Flink-流处理API_Transform(五)_合流操作----------------------    19:55
        P028.尚硅谷_Flink-流处理API_Flink支持的数据类型----------------------------    09:41
        P029.尚硅谷_Flink-流处理API_函数类和富函数类------------------------------    19:41
        P030.尚硅谷_Flink-流处理API_Sink(一)_文件-----------------------------    18:55
        P031.尚硅谷_Flink-流处理API_Sink(二)_Kafka--------------------------    10:45
        P032.尚硅谷_Flink-流处理API_Sink(三)_Redis--------------------------    18:30
        P033.尚硅谷_Flink-流处理API_Sink(四)_ElasticSearch-------------------    16:43
        P034.尚硅谷_Flink-流处理API_Sink(五)_MySQL----------------------------    17:48
        P035.尚硅谷_Flink-流处理API_Window API_窗口概念-----------------------    07:22
        P036.尚硅谷_Flink-流处理API_Window API_窗口类型------------------------    10:13
        P037.尚硅谷_Flink-流处理API_Window API_窗口分配器---------------------------    27:17
        P038.尚硅谷_Flink-流处理API_Window API_窗口函数及其它可选API----------------    21:00
        P039.尚硅谷_Flink-流处理API_Window API_窗口计算测试-------------------------    15:07
        P040.尚硅谷_Flink-时间语义------------------------------------------------    17:57
        P041.尚硅谷_Flink-时间语义的设置-----------------------------------------    04:33
        P042.尚硅谷_Flink-Watermark概念--------------------------------------------    19:06
        P043.尚硅谷_Flink-Watermark原理和特点--------------------------------------    15:58
        P044.尚硅谷_Flink-Watermark传递-------------------------------------------    08:09
        P045.尚硅谷_Flink-Watermark代码中引入------------------------------------    16:33
        P046.尚硅谷_Flink-自定义Watermark生成机制--------------------------------    07:10
        P047.尚硅谷_Flink-事件时间语义下的窗口测试------------------------------    16:12
        P048.尚硅谷_Flink-窗口起始点的确定-------------------------------------    09:21
        P049.尚硅谷_Flink-状态管理(一)_状态的概念-----------------------------    08:08
        P050.尚硅谷_Flink-状态管理(二)_算子状态和键控状态-----------------------    15:14
        P051.尚硅谷_Flink-状态管理(三)_状态在代码中的定义和使用------------------    27:25
        P052.尚硅谷_Flink-状态编程示例(一)-------------------------------------    17:15
        P053.尚硅谷_Flink-状态编程示例(二)-------------------------------------    17:30
        P054.尚硅谷_Flink-ProcessFuntion_基本概念和使用--------------------------    23:24
        P055.尚硅谷_Flink-ProcessFuntion_定时器应用示例----------------------------    32:50
        P056.尚硅谷_Flink-ProcessFuntion_侧输出流应用示例--------------------------    09:45
        P057.尚硅谷_Flink-状态后端-------------------------------------------------    15:36
        P058.尚硅谷_Flink-容错机制_检查点概念和原理-------------------------------    13:31
        P059.尚硅谷_Flink-容错机制_检查点算法--------------------------------------    25:46
        P060.尚硅谷_Flink-容错机制_checkpoint配置----------------------------------    26:29
        P061.尚硅谷_Flink-容错机制_重启策略配置------------------------------------    08:21
        P062.尚硅谷_Flink-保存点-------------------------------------------------    07:32
        P063.尚硅谷_Flink-状态一致性_基本概念-----------------------------------    10:46
        P064.尚硅谷_Flink-状态一致性_Flink端到端状态一致性的保证----------------    08:43
        P065.尚硅谷_Flink-状态一致性_幂等写入和事务写入-------------------------    23:35
        P066.尚硅谷_Flink-状态一致性_Flink与Kafka连接的状态一致性--------------------    18:20
        P067.尚硅谷_Flink-Table API和Flink SQL_基本概念和示例程序---------------------    22:03
        P068.尚硅谷_Flink-Table API和Flink SQL_基本程序结构--------------------------    09:22
        P069.尚硅谷_Flink-Table API和Flink SQL_表执行环境--------------------------    15:43
        P070.尚硅谷_Flink-Table API和Flink SQL_表的概念和从文件读取数据-----------------    19:14
        P071.尚硅谷_Flink-Table API和Flink SQL_从Kafka读取数据-------------------------    09:29
        P072.尚硅谷_Flink-Table API和Flink SQL_表的查询转换------------------------------    11:04
        P073.尚硅谷_Flink-Table API和Flink SQL_DataStream和表的转换-------------------    08:25
        P074.尚硅谷_Flink-Table API和Flink SQL_输出到文件-----------------------------    25:14
        P075.尚硅谷_Flink-Table API和Flink SQL_更新模式------------------------------    10:51
        P076.尚硅谷_Flink-Table API和Flink SQL_Kafka管道测试--------------------------    17:41
        P077.尚硅谷_Flink-Table API和Flink SQL_输出到ES-------------------------------    18:18
        P078.尚硅谷_Flink-Table API和Flink SQL_输出到MySQL----------------------------    08:09
        P079.尚硅谷_Flink-Table API和Flink SQL_表转换成流------------------------------    11:34
        P080.尚硅谷_Flink-Table API和Flink SQL_流处理和SQL查询的不同------------------    07:07
        P081.尚硅谷_Flink-Table API和Flink SQL_动态表和持续查询----------------------    12:24
        P082.尚硅谷_Flink-Table API和Flink SQL_持续查询示例具体过程-----------------    12:50
        P083.尚硅谷_Flink-Table API和Flink SQL_时间特性(一)_处理时间-----------------    20:16
        P084.尚硅谷_Flink-Table API和Flink SQL_时间特性(二)_事件时间------------------    14:16
        P085.尚硅谷_Flink-Table API和Flink SQL_窗口(一)_分组窗口---------------------    13:11
        P086.尚硅谷_Flink-Table API和Flink SQL_窗口(二)_分组窗口测试--------------------    18:43
        P087.尚硅谷_Flink-Table API和Flink SQL_窗口(三)_Over窗口-----------------------    11:58
        P088.尚硅谷_Flink-Table API和Flink SQL_窗口(四)_Over窗口测试------------------------    13:03
        P089.尚硅谷_Flink-Table API和Flink SQL_函数(一)_系统内置函数----------------------    11:04
        P090.尚硅谷_Flink-Table API和Flink SQL_函数(二)_UDF函数_标量函数-----------------    14:39
        P091.尚硅谷_Flink-Table API和Flink SQL_函数(三)_UDF函数_表函数---------------------    17:19
        P092.尚硅谷_Flink-Table API和Flink SQL_函数(四)_UDF函数_聚合函数----------------    26:58
        P093.尚硅谷_Flink-Table API和Flink SQL_函数(五)_UDF函数_表聚合函数-------------    27:56
        P094.尚硅谷_Flink项目-电商用户行为分析_批处理和流处理以及项目选型---------------    08:12
        P095.尚硅谷_Flink项目-电商用户行为分析_用户行为分析应用场景----------------------    15:27
        P096.尚硅谷_Flink项目-电商用户行为分析_模块设计和数据分析------------------------    09:12
        P097.尚硅谷_Flink项目-电商用户行为分析_模块需求分析_实时热门商品统计(一)--------    21:03
        P098.尚硅谷_Flink项目-电商用户行为分析_模块需求分析_实时热门商品统计(二)---------    09:07
        P099.尚硅谷_Flink项目-电商用户行为分析_模块需求分析_其它需求-------------------    10:04
        P100.尚硅谷_Flink项目-电商用户行为分析_项目框架搭建---------------------------------    10:22
        P101.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(一)_窗口聚合--------------------    27:55
        P102.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(二)_排序统计输出--------------------------    27:14
        P103.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(三)_从Kafka消费数据测试------------------    20:51
        P104.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(四)_批量消费Kafka数据测试----------------    10:03
        P105.尚硅谷_Flink项目-电商用户行为分析_实时热门商品统计(五)_Table API和SQL实现-------------------    28:43
        P106.尚硅谷_Flink项目-电商用户行为分析_实时热门页面流量统计(一)_开窗聚合统计--------------------    26:06
        P107.尚硅谷_Flink项目-电商用户行为分析_实时热门页面流量统计(二)_统计结果排序输出-----------------    09:47
        P108.尚硅谷_Flink项目-电商用户行为分析_实时热门页面流量统计(三)_乱序数据的处理-------------------    21:04
        P109.尚硅谷_Flink项目-电商用户行为分析_实时热门页面流量统计(四)_保证状态更新结果正确--------------    21:41
        P110.尚硅谷_Flink项目-电商用户行为分析_PV统计(一)_基本实现---------------------------------------    20:39
        P111.尚硅谷_Flink项目-电商用户行为分析_PV统计(二)_数据并行的优化--------------------------------    19:22
        P112.尚硅谷_Flink项目-电商用户行为分析_UV统计(一)_基本实现--------------------------------------    15:28
        P113.尚硅谷_Flink项目-电商用户行为分析_UV统计(二)_布隆过滤器去重思路和程序架构-------------------    30:48
        P114.尚硅谷_Flink项目-电商用户行为分析_UV统计(三)_布隆过滤器简单实现-----------------------------    09:12
        P115.尚硅谷_Flink项目-电商用户行为分析_UV统计(四)_UV去重的布隆过滤器实现-------------------------    23:32
        P116.尚硅谷_Flink项目-电商用户行为分析_APP市场推广统计(一)_自定义数据源-------------------------    17:03
        P117.尚硅谷_Flink项目-电商用户行为分析_APP市场推广统计(二)_开窗聚合统计输出---------------------    20:44
        P118.尚硅谷_Flink项目-电商用户行为分析_广告点击量统计分析(一)_基本需求实现-----------------------    19:19
        P119.尚硅谷_Flink项目-电商用户行为分析_广告点击量统计分析(二)_刷单行为过滤思路和整体框架---------    14:28
        P120.尚硅谷_Flink项目-电商用户行为分析_广告点击量统计分析(三)_刷单行为过滤代码实现--------------    23:20
        P121.尚硅谷_Flink项目-电商用户行为分析_恶意登录检测(一)_实现思路和代码框架--------------------    18:17
        P122.尚硅谷_Flink项目-电商用户行为分析_恶意登录检测(二)_具体代码实现---------------------------    18:21
        P123.尚硅谷_Flink项目-电商用户行为分析_恶意登录检测(三)_代码改进-------------------------------    18:19
        P124.尚硅谷_Flink项目-电商用户行为分析_恶意登录检测(四)_CEP代码实现---------------------------    30:33
        P125.尚硅谷_Flink项目-电商用户行为分析_CEP简介(一)_CEP介绍及Pattern API整体概念----------------    12:24
        P126.尚硅谷_Flink项目-电商用户行为分析_CEP简介(二)_个体模式-----------------------------------    12:41
        P127.尚硅谷_Flink项目-电商用户行为分析_CEP简介(三)_模式序列-------------------------------------    10:24
        P128.尚硅谷_Flink项目-电商用户行为分析_CEP简介(四)_模式的检测和事件处理-------------------------    09:50
        P129.尚硅谷_Flink项目-电商用户行为分析_订单超时检测(一)_实现思路和程序架构--------------------    19:50
        P130.尚硅谷_Flink项目-电商用户行为分析_订单超时检测(二)_CEP具体代码实现-----------------------    17:29
        P131.尚硅谷_Flink项目-电商用户行为分析_订单超时检测(三)_流式输入数据测试--------------------    06:42
        P132.尚硅谷_Flink项目-电商用户行为分析_订单超时检测(四)_ProcessFunction代码实现-------------    32:20
        P133.尚硅谷_Flink项目-电商用户行为分析_双流实时对账(一)_需求分析和整体架构--------------    13:50
        P134.尚硅谷_Flink项目-电商用户行为分析_双流实时对账(二)_合流代码实现------------------------    22:24
        P135.尚硅谷_Flink项目-电商用户行为分析_Join API(一)_Window Join---------------------------    12:56
        P136.尚硅谷_Flink项目-电商用户行为分析_Join API(二)_Interval Join--------------------------    09:47
        P137.尚硅谷_Flink项目-电商用户行为分析_双流实时对账(三)_Join代码实现-----------------------    09:22

    以上是关于[尚硅谷22版shiro]学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

    尚硅谷 git 学习笔记

    尚硅谷JUC高并发编程学习笔记线程通信与集合线程安全

    尚硅谷JUC高并发编程学习笔记线程通信与集合线程安全

    尚硅谷JUC高并发编程学习笔记线程通信与集合线程安全

    学习笔记尚硅谷周阳老师的Docker教程学习笔记

    尚硅谷设计模式学习---[单例模式]