elasticsearch 6.8.x 索引别名、动态索引扩展、滚动索引

news2024/9/20 1:11:02

文章目录

  • 引言
  • 索引别名(alias)
    • 创建索引别名
    • 查询索引别名
    • 删除索引别名
    • 重命名索引别名
  • 动态索引(index template,动态匹配生成索引)
    • 新建索引模板
    • 新建索引并插入数据
      • 索引sys-log-202402
      • 索引sys-log-202403
      • 索引sys-log-202404
    • 使用动态索引指定的别名查询数据
    • 别名关联索引,拒绝写入异常
  • 滚动索引(_rollover)
    • 创建符合滚动要求的索引
    • 执行一次索引滚动API
    • 插入5条测试记录,重新执行滚动API
    • 查询别名和索引绑定关系
  • 滚动索引(ilm:索引生命周期策略,自动滚动)
    • 创建自定义的ilm生命周期
    • 创建索引模板并引用自定义ilm配置
  • 参考链接

引言

最近查阅了一些资料,了解到关于es索引别名,特别在此记录一下:

  • 索引别名绑定多个索引:隐藏底层索引名,对外开放索引别名进行查询和更新操作

【elasticsearch 6.8.x 官网,关于索引别名】

  • 滚动索引(_rollover):创建的索引和索引别名自动绑定,使用别名对外查询无感知

【elasticsearch 6.8.x官网,关于索引模板创建、引用】

  • 滚动索引(ILM):按照ilm索引生命周期策略,自动换绑索引别名指向的索引,分为四个周期
    • hot:热区,高查询、高修改频词
    • warm:温区,不再更新索引,仍然提供查询服务
    • cold:冷区,索引不再更新,并且很少查询。信息仍然需要可搜索,但如果这些查询速度较慢也没关系
    • delete:不再需要索引,可以安全地删除

【elasticsearch 6.8.x 官网,关于索引生命周期支持】

索引别名(alias)

索引别名的创建时机:

  1. 在创建索引和字段关系映射的时候直接settings索引和索引别名的关系
  2. 在索引已经存在并稳定运行的情况下,通过API【PUT /_aliases】动态绑定索引,能隐藏底层索引的改变,操作对用户无感知

这里不讨论索引别名的routing filter,只讨论索引和索引别名的映射关系,以及是否是写入索引(write index)。

创建索引别名

POST /_aliases

################### 新建别名参数及备注
################### 索引名test_template-202403假设已经是存在的
{
    "actions": [
        {
            "add": {
                // 别名关联的索引名
                "index": "test_template-202403",
                // 别名
                "alias": "tmp_index_alias",
                "is_write_index": false // 默认是缺省的,如果一个别名只绑定了一个索引,那他将允许写入;如果一个别名绑定了多个索引,在不指定is_write_index: true的情况下,使用别名新增数据,会出现拒绝写入的情况
            }
        }
    ]
}

image.png

查询索引别名

GET /_aliases

image.png

删除索引别名

DELETE /_aliases

################### 

{
    "actions": [
        {
            "remove": {
                // 别名关联的索引名
                "index": "test_template-202403",
                // 别名
                "alias": "tmp_index_alias"
            }
        }
    ]
}

在这里插入图片描述

重命名索引别名

POST /_aliases

########################## 别名操作的同一个actions API里面操作是原子性的
########################## 重命名的过程就是删除原先的别名关联,新增新的关联


{
    "actions": [
        {
            "remove": {
                // 别名关联的索引名
                "index": "test_template-202403",
                // 别名
                "alias": "tmp_index_alias"
            }
        },
        {
            "add": {
                // 别名关联的索引名
                "index": "test_template-202403",
                // 别名
                "alias": "tmp_index-2_alias"
            }
        }
    ]
}

在这里插入图片描述

动态索引(index template,动态匹配生成索引)

新建索引模板

【es官网,索引模板】

# sys-log是索引模板的名称
PUT /_template/sys-log

################### 创建索引模板的参数

{
    // 使用此模板的优先级,数值越大,优先级越高,数值大的索引模板配置会覆盖优先级小的配置
    "order": 2,
    // 索引模板匹配规则:所有创建的索引都会以此模板的配置项生成索引。 sys-log*开头的索引才会使用这个模板
    "index_patterns": ["sys-log*"],
    // 设置索引别名:后续匹配到的所有索引都会使用此别名配置
    "aliases": {
        // 设置一个索引别名
        "sys-log-alias": {}
    },
    "template": {
        "settings": {
            "index": {
                // 两个分片
                "number_of_shards": "2",
                // 0个副本
                "number_of_replicas": "0",
                // 数据插入es后,过10s才能被查到
                "refresh_interval": "10s",
                // 单次最大允许的查询条数
                "max_result_window": "1000"
            }
        },
        // 配置字段映射关系、配置字段类型、配置字段指定分词器
        "mapping": {
            "_doc": {
                "properties": {
                    "id": {
                        "type": "long"
                    },
                    // 操作记录允许分词查询
                    "operation": {
                        "type": "text",
                        // 指定分词器
                        "analyzer": "ik_smart",
                    },
                    // 创建时间
                    "create_date": {
                        "type": "date"
                    }
                }
            }
        }
    }
}

新建索引并插入数据

新建的索引只需要插入数据,关系映射和配置都使用索引模板sys-log

索引sys-log-202402

POST /sys-log-202402/_doc/_bulk

=============>
{"index": {"_id": 1}}
{"id":1,"operation":"查询:/getInfo;参数a=1&b=2","create_date":"2024-02-15"}
{"index": {"_id": 2}}
{"id":2,"operation":"查询:/listPage;参数{page: 1, size: 10}","create_date":"2024-02-16"}
{"index": {"_id": 3}}
{"id":3,"operation":"新增:/addOrUpdate;","create_date":"2024-02-17"}

索引sys-log-202403

POST /sys-log-202403/_doc/_bulk

=============>
{"index": {"_id": 1}}
{"id":1,"operation":"查询:/getInfo;参数a=1&b=2","create_date":"2024-02-15"}
{"index": {"_id": 2}}
{"id":2,"operation":"查询:/listPage;参数{page: 1, size: 10}","create_date":"2024-02-16"}
{"index": {"_id": 3}}
{"id":3,"operation":"新增:/addOrUpdate;","create_date":"2024-02-17"}

索引sys-log-202404

POST /sys-log-202404/_doc/_bulk

=============>
{"index": {"_id": 1}}
{"id":1,"operation":"查询:/getInfo;参数a=1&b=2","create_date":"2024-02-15"}
{"index": {"_id": 2}}
{"id":2,"operation":"查询:/listPage;参数{page: 1, size: 10}","create_date":"2024-02-16"}
{"index": {"_id": 3}}
{"id":3,"operation":"新增:/addOrUpdate;","create_date":"2024-02-17"}

使用动态索引指定的别名查询数据

POST /sys-log-alias/_search

=============> 查询参数
{
    "query": {
        "bool": {
            "must": {
                "match": {
                    "operation": "查询"
                }
            }
        }
    },
    "highlight": {
        "fields": {
            "comment_content": {}
        },
        "number_of_fragments": 0,
        "pre_tags": [
            "<b style='color: blue'>"
        ],
        "post_tags": [
            "</b>"
        ],
        "require_field_match": false,
        "type": "plain"
    },
    "from": 0,
    "size": 10000,
    "sort": [],
    "aggs": {}
}



============================> 返回结果

{
    "took": 5,
    "timed_out": false,
    "_shards": {
        "total": 15,
        "successful": 15,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 6,
        "max_score": 0.5753642,
        "hits": [
            {
                "_index": "sys-log-202402",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.5753642,
                "_source": {
                    "id": 2,
                    "operation": "查询:/listPage;参数{page: 1, size: 10}",
                    "create_date": "2024-02-16"
                }
            },
            {
                "_index": "sys-log-202403",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.5753642,
                "_source": {
                    "id": 2,
                    "operation": "查询:/listPage;参数{page: 1, size: 10}",
                    "create_date": "2024-02-16"
                }
            },
            {
                "_index": "sys-log-202404",
                "_type": "_doc",
                "_id": "2",
                "_score": 0.5753642,
                "_source": {
                    "id": 2,
                    "operation": "查询:/listPage;参数{page: 1, size: 10}",
                    "create_date": "2024-02-16"
                }
            },
            {
                "_index": "sys-log-202402",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.5753642,
                "_source": {
                    "id": 1,
                    "operation": "查询:/getInfo;参数a=1&b=2",
                    "create_date": "2024-02-15"
                }
            },
            {
                "_index": "sys-log-202403",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.5753642,
                "_source": {
                    "id": 1,
                    "operation": "查询:/getInfo;参数a=1&b=2",
                    "create_date": "2024-02-15"
                }
            },
            {
                "_index": "sys-log-202404",
                "_type": "_doc",
                "_id": "1",
                "_score": 0.5753642,
                "_source": {
                    "id": 1,
                    "operation": "查询:/getInfo;参数a=1&b=2",
                    "create_date": "2024-02-15"
                }
            }
        ]
    }
}

通过返回结果分析:
查询结果可以看出索引别名关联的所有索引中结果全部被查询出来,如果指定索引名称查询,那么查询结果就是单独这个索引中的数据。
sys-log-alias --> sys-log-202402
sys-log-alias --> sys-log-202403
sys-log-alias --> sys-log-202404

别名关联索引,拒绝写入异常

但是有一点需要注意,如果对应索引关联的别名未指定is_write_index=true使用别名进行插入会出现拒绝写入的错误。
错误如下:

{
  "error": {
    "root_cause": [
      {
        "type": "illegal_argument_exception",
        "reason": "no write index is defined for alias [sys-log-alias]. The write index may be explicitly disabled using is_write_index=false or the alias points to multiple indices without one being designated as a write index"
      }
    ],
    "type": "illegal_argument_exception",
    "reason": "no write index is defined for alias [sys-log-alias]. The write index may be explicitly disabled using is_write_index=false or the alias points to multiple indices without one being designated as a write index"
  },
  "status": 400
}

如果想要使用别名进行关联的索引数据写入,需要将关联的索引is_write_index字段设置为true:
点击查看【重命名索引别名】

POST /_aliases

==============> 因为这个API操作的原子性,在操作的的过程中不会影响到其他
{
    "actions": [
        // 把原关联索引删除
        {
            "remove": {
                // 别名关联的索引名
                "index": "sys-log-202404",
                // 别名
                "alias": "sys-log-alias"
            }
        },
        // 建立新的别名关联索引,并设置is_write_index=true,再次使用别名进行数据写入的时候,数据就自动插入sys-log-202404索引中了
        {
            "add": {
                // 别名关联的索引名
                "index": "sys-log-202404",
                // 别名
                "alias": "sys-log-alias",
                "is_write_index": true
            }
        }
    ]
}

滚动索引(_rollover)

判断索引是否需要进行一次滚动生成时机:

  1. 每次插入数据,判断一次索引是否满足滚动条件
  2. 指定时间,判断一次索引是否满足滚动条件

【es官网,关于滚动索引】
执行POST /索引别名/_rollover手动滚动索,自动把索引别名换绑到新的索引上,查询和保存都在这一个索引上。滚动索引的名称需要符合滚动的命名规则如:时间 sys-log-20240325 数字sys-log-00001。对外仍然使用一个索引别名,通过不停地换绑索引实现滚动,对外无感知。但,缺点也非常明显,索引一旦换绑,之前的数据将会不可查,除非重新绑定到索引别名上。

关于滚动索引:
image.png
索引滚动满足滚动条件(满足之一)后会创建新索引并换绑:

image.png

创建符合滚动要求的索引

POST /log_rollover-202403-1


===========> 创建参数
{
    "settings": {
        "index": {
            "number_of_shards": "2",
            "number_of_replicas": "0"
        }
    },
    "aliases": {
        "log_rollover_alias": {}
    },
    "mapping": {
        "_doc": {
            "properties": {
                "id": {
                    "type": "long"
                },
                "create_date": {
                    "type": "date"
                },
                "content": {
                    "type": "text"
                }
            }
        }
    }
}

image.png

执行一次索引滚动API

PUT /log_rollover_alias/_rollover

====> 滚动条件判断,满足任何一个滚动条件,就创建一个新索引
{
  "conditions": {
    # 最大文档记录数,滚动
    "max_docs": 5,
    # 索引创建了7天,滚动
    "max_age": "7d",
    # 索引最大存储5gb,滚动
    "max_size": "5gb"
  }
}



===> 返回
{		
    # 索引没有滚动成功,不符合滚动条件
    "acknowledged": false,
    "shards_acknowledged": false,
    "old_index": "log_rollover-202403-1",
    # 如果滚动成功,新生成的索引名将会是log_rollover-202403-000002,别名log_rollover_alias指向
    "new_index": "log_rollover-202403-000002",
    "rolled_over": false,
    "dry_run": false,
    "conditions": {
        "[max_docs: 5]": false,
        "[max_size: 5gb]": false,
        "[max_age: 7d]": false
    }
}

在这里插入图片描述

插入5条测试记录,重新执行滚动API

重新执行滚动索引API

============>返回结果
{
    # 滚动成功
    "acknowledged": true,
    "shards_acknowledged": true,
    "old_index": "log_rollover-202403-1",
    # 别名绑定的新索引名称
    "new_index": "log_rollover-202403-000002",
    "rolled_over": true,
    "dry_run": false,
    "conditions": {
        "[max_docs: 5]": true,
        "[max_size: 5gb]": false,
        "[max_age: 7d]": false
    }
}

查询别名和索引绑定关系

GET /_aliases

=====> 返回

{
    "...": "...",
    "log_rollover-202403-000002": {
        "aliases": {
            "log_rollover_alias": {}
        }
    },
    "log_rollover-202403-1": {
        "aliases": {}
    },
    "...": "..."
}

image.png

缺点:

  1. 一旦索引发生滚动,索引别名和索引关联关系换绑,之前的索引数据将不可查。
  2. 索引滚动之后,之前的分片配置,字段关系也不会被复制过来。
  3. 不能使用索引模板(经测试索引模板中is_write_index设置为写入索引在生成动态索引的时候不会被复用),会出现错误:

Rollover alias [log_rollover-alias] can point to multiple indices, found duplicated alias [[log_rollover-alias]] in index template [log_rollover]

es官网又提供了索引生命周期管理策略,符合要求自动滚动,不再需要去手动执行

滚动索引(ilm:索引生命周期策略,自动滚动)

待测试…ILM生命周期测试滚动情况。

创建自定义的ilm生命周期

【es官网,关于创建自定义生命周期】
【es官网,关于ilm API】

PUT /_ilm/policy/my_policy

================> ilm 策略参数
{
    // 策略定义子对象
  "policy": {                       
    "phases": {
      "hot": {                      
        "actions": {
            // 滚动更新操作定义
          "rollover": {             
            "max_size": "50GB",
            "max_age": "30d" // 最大30天属于热门搜索、写入
          }
        }
      },
      "delete": {
        // 删除阶段在 90 天后开始
        "min_age": "90d",      
        // 删除操作定义     
        "actions": {
          "delete": {}              
        }
      }
    }
  }
}

image.png

创建索引模板并引用自定义ilm配置

【es官网,关于创建索引并应用ilm策略】

创建索引模板

POST /_template/log-policy

==========>
{
    // 使用此模板的优先级,数值越大,优先级越高,数值大的索引模板配置会覆盖优先级小的配置
    "order": 2,
    // 索引模板匹配规则:所有创建的索引都会以此模板的配置项生成索引。 log-policy*开头的索引才会使用这个模板
    "index_patterns": [
        "log-policy-*"
    ],
    // 设置索引别名:后续匹配到的所有索引都会使用此别名配置
    "aliases": {
        // 设置一个索引别名
        "log-policy-alias": {}
    },
    "template": {
        "settings": {
            "index": {
                // 两个分片
                "number_of_shards": "2",
                // 0个副本
                "number_of_replicas": "0",
                // 数据插入es后,过10s才能被查到
                "refresh_interval": "10s",
                // 单次最大允许的查询条数
                "max_result_window": "1000",
                "lifecycle": {
                     // 管理索引的生命周期策略的名称
                    "name": "my_policy",
                     // 用于滚动更新操作的别名,由于在策略中定义了滚动更新操作,因此需要这样做。
                    "rollover_alias": "log-policy-alias",
                }
            }
        }
    },
    // // 配置字段映射关系、配置字段类型、配置字段指定分词器
    // "mapping": {
    //     "_doc": {
    //         "properties": {
    //             "id": {
    //                 "type": "long"
    //             },
    //             // 操作记录允许分词查询
    //             "operation": {
    //                 "type": "text",
    //                 // 指定分词器
    //                 "analyzer": "ik_smart",
    //             },
    //             // 创建时间
    //             "create_date": {
    //                 "type": "date"
    //             }
    //         }
    //     }
    // }
}

创建索引

PUT /log-policy-00001

=======> 使用index template创建索引
{
  "aliases": {
    "log-policy-alias": {
      // 使用索引模板创建索引,并把当前索引指定为可写索引,一遍后面能把索引和策略正确的绑定在一切
      "is_write_index": true
    }
  }
}

查询ilm管理的索引生命周期

GET /log-policy-*/_ilm/explain


====> 返回
{
    "indices": {
        "log-policy-00001": {
            "index": "log-policy-00001",
            # 这里有问题,待测试
            "managed": false
        }
    }
}

参考链接

https://blog.csdn.net/fenglibing/article/details/92069583
https://blog.csdn.net/zqskr_/article/details/134035978
https://blog.csdn.net/Weixiaohuai/article/details/124745320
https://blog.csdn.net/qq_44849679/article/details/136330621
https://blog.csdn.net/feiying0canglang/article/details/129789161
https://zhuanlan.zhihu.com/p/137810661

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

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

相关文章

Jakarta项目介绍

概述 在升级Spring Boot到3.0版本以后&#xff0c;或升级Spring到6.0版本以上&#xff0c;会发现应用编译失败或启动失败等问题。 经过排查不难得知&#xff0c;Spring 6或Spring Boot 3&#xff08;实际上依赖于Spring 6&#xff09;不再支持javax.开头的一系列依赖包&#…

【微服务】认识Dubbo+基本环境搭建

认识Dubbo Dubbo是阿里巴巴公司开源的一个高性能、轻量级的WEB和 RPC框架&#xff0c;可以和Spring框架无缝集成。Dubbo为构建企业级微服务提供了三大核心能力&#xff1a; 服务自动注册和发现、面向接口的 远程方法调用&#xff0c; 智能容错和负载均衡官网&#xff1a;https…

初见 链表

前言 在上篇文章重温数组——顺序表 http://t.csdnimg.cn/9DH9M 后&#xff0c;本篇文章让我们认识一种新的数据结构&#xff1a;链表 认识 概念&#xff1a;链表是⼀种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现…

【JavaEE】进程是什么?

文章目录 ✍进程的概念✍进程存在的意义✍进程在计算机中的存在形式✍进程调度 ✍进程的概念 每个应⽤程序运⾏于现代操作系统之上时&#xff0c;操作系统会提供⼀种抽象&#xff0c;好像系统上只有这个程序在运⾏&#xff0c;所有的硬件资源都被这个程序在使⽤。这种假象是通…

360奇酷刷机 360刷机助手 QGDP360手机QGDP刷机

360奇酷刷机 360刷机助手 QGDP破解版360手机QGDP刷机 360手机刷机资源下载链接&#xff1a;360rom.github.io 参考&#xff1a;360手机-360刷机360刷机包twrp、root 360奇酷刷机&#xff1a;360高通驱动安装 360手机刷机驱动&#xff1b;手机内置&#xff0c;可通过USB文件传输…

修改 RabbitMQ 默认超时时间

MQ客户端正常运行&#xff0c;突然就报连接错误&#xff0c; 错误信息写的很明确&#xff0c;是客户端连接超时。 不过很疑虑&#xff0c;为什么会出现连接超时呢&#xff1f;代码没动过&#xff0c;网络也ok&#xff0c;也设置了心跳和重连机制。 最终在官网中找到了答案&am…

『笔记』可扩展架构设计之消息队列

前言 众所周知&#xff0c;开发低耦合系统是软件开发的终极目标之一。低耦合的系统更加容易扩展&#xff0c;低耦合的模块更加容易复用&#xff0c;更易于维护和管理。我们知道&#xff0c;消息队列的主要功能就是收发消息&#xff0c;但是它的作用不仅仅只是解决应用之间的通…

java一和零(力扣Leetcode474)

一和零 力扣原题 给定一个二进制字符串数组 strs 和两个整数 m 和 n&#xff0c;请你找出并返回 strs 的最大子集的长度&#xff0c;该子集中最多有 m 个 0 和 n 个 1。 示例 1&#xff1a; 输入&#xff1a;strs [“10”, “0001”, “111001”, “1”, “0”], m 5, n …

基于GA优化的CNN-LSTM-Attention的时间序列回归预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1卷积神经网络&#xff08;CNN&#xff09;在时间序列中的应用 4.2 长短时记忆网络&#xff08;LSTM&#xff09;处理序列依赖关系 4.3 注意力机制&#xff08;Attention&#xff09; 5…

基于BP神经网络的城市空气质量数据预测matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1 BP神经网络结构 4.2 神经元模型与激活函数 4.3 前向传播过程 4.4反向传播算法及其误差函数 4.5 权重更新规则 4.6 迭代训练 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软…

Qt_day4:2024/3/25

作业1&#xff1a; 完善对话框&#xff0c;点击登录对话框&#xff0c;如果账号和密码匹配&#xff0c;则弹出信息对话框&#xff0c;给出提示”登录成功“&#xff0c;提供一个Ok按钮&#xff0c;用户点击Ok后&#xff0c;关闭登录界面&#xff0c;跳转到其他界面 如果账号和…

一篇文章,告别Flutter状态管理争论,问题和解决

起因 每隔一段时间&#xff0c;都会出现一个新的状态管理框架&#xff0c;最近在YouTube上也发现了有人在推signals, 一个起源于React的状态管理框架&#xff0c;人们总是乐此不疲的发明各种好用或者为了解决特定问题而产生的方案&#xff0c;比如Bloc, 工具会推陈出新&#x…

qt table 简易封装,样式美化,以及 合并表格和颜色的区分 已解决

在需求中&#xff0c; 难免会使用 table 进行渲染窗口&#xff0c;做一个简单的封装。美化表格最终效果&#xff01;&#xff01;&#xff01; 代码部分 // 显示 20行 20列CCendDetailsInfoTableWidget* table new CCendDetailsInfoTableWidget(20,10);for (int i 0; i < …

ESCTF-逆向赛题WP

ESCTF_reverse题解 逆吧腻吧babypybabypolyreeasy_rere1你是个好孩子完结撒花 Q_W_Q 逆吧腻吧 下载副本后无壳&#xff0c;直接拖入ida分析分析函数逻辑&#xff1a;ida打开如下&#xff1a;提取出全局变量res的数据后&#xff0c;编写异或脚本进行解密&#xff1a; a[0xBF, …

enscan自动化主域名信息收集

enscan下载 Releases wgpsec/ENScan_GO (github.com) 能查的分类 实操&#xff1a; 首先打开linux 的虚拟机、 然后把下面这个粘贴到虚拟机中 解压后打开命令行 初始化 ./enscan-0.0.16-linux-amd64 -v 命令参数如下 oppo信息收集 运行下面代码时 先去配置文件把coo…

JavaEE企业开发新技术3

目录 2.11 Method的基本操作-1 文字性概念描述 代码&#xff1a; 2.12 Method的基本操作-2 2.13 Method的基本操作-3 2.14 数组的反射操作-1 文字性概念&#xff1a; 代码&#xff1a; 2.15 数组的反射操作-2 学习内容 2.11 Method的基本操作-1 文字性概念描述 Me…

io的学习4

打印流 分类&#xff1a;打印流一般是指&#xff1a;PrintStream、PrintWriter两个类 特点&#xff1a; 1.打印流只操作文件目的地&#xff0c;不操作数据源 2.特有的写出方法可以实现&#xff0c;数据原样写出 3.特有的写出方法&#xff0c;可以实现自动刷新&#xff0c;…

仅用一个月,游卡完成从MySQL到上线OceanBase的实践

编者按&#xff1a;自2023年9月起&#xff0c;游卡——国内最早卡牌游戏研发者之一&#xff0c;开始测试OceanBase&#xff0c;并在短短两个月内成功将三个核心业务应用迁移至OceanBase上。究竟是何因素促使游卡放弃游戏行业普遍采用的MySQL方案&#xff0c;转而大胆选择OceanB…

荟萃分析R Meta-Analyses 3 Effect Sizes

总结 效应量是荟萃分析的基石。为了进行荟萃分析&#xff0c;我们至少需要估计效应大小及其标准误差。 效应大小的标准误差代表研究对效应估计的精确程度。荟萃分析以更高的精度和更高的权重给出效应量&#xff0c;因为它们可以更好地估计真实效应。 我们可以在荟萃分析中使用…

一文整合工厂模式、模板模式、策略模式

为什么使用设计模式 今天终于有时间系统的整理一下这几个设计模式了&#xff0c; 这几个真是最常用的&#xff0c;用好了它们&#xff0c;你就在也不用一大堆的if else 了。能更好的处理大量的代码冗余问题。 在我们的实际开发中&#xff0c;肯定会有这样的场景&#xff1a;我…