当前位置: 首页 > news >正文

【Redis】分布式锁基本理论与简单实现

目录

  • 分布式锁
    • 解释
    • 作用
    • 特性
    • 实现方式
      • MySQL、Redis、Zookeeper三种方式对比
    • 原理
  • reids分布式锁原理
    • 目的
    • 容错
    • redis简单分布式锁实现
      • 锁接口
      • 实现类
      • 下单场景的实现
      • 容错场景1
        • 解决思路
        • 优化代码
      • 容错场景2
        • Lua脚本
          • Redis利用Lua脚本解决多条命令原子性问题
        • 释放锁的业务流程
          • Lua脚本来表示
        • 优化代码
  • 总结

分布式锁

解释

  • 分布式锁是一种用于协调分布式系统中多个节点对共享资源进行访问的机制。
  • 在分布式系统中,多个节点可能同时竞争同一个资源,并且可能同时进行修改操作,这就会导致数据的不一致性和并发冲突的问题。
  • 为了解决这个问题,引入了分布式锁机制。

作用

  • 分布式锁可以确保在同一时刻只有一个节点能够对共享资源进行访问操作,其他节点需要等待该节点释放锁之后才能进行操作。
  • 分布式锁可以通过网络通信来实现,常见的实现方式有基于数据库的锁、基于缓存的锁、基于ZooKeeper的锁等。
  • 使用场景:分布式任务调度、分布式缓存、分布式事务等场景

特性

  1. 互斥性: 同一时刻只有一个节点能够获取到锁,其他节点需要等待。
  2. 可重入性: 同一个节点在获取到锁之后可以再次获取锁而不会被阻塞。
  3. 容错性: 锁的释放需要能够容忍节点的故障,确保锁能够被正常释放。
  4. 高性能: 分布式锁的实现需要保证高性能,避免成为系统的瓶颈。

实现方式

  1. 基于数据库:使用关系型数据库或者其他支持事务的数据库来实现分布式锁。可以通过在数据库中创建一个带有唯一索引的表或者行来确保只有一个进程能够成功获取锁。
  2. 基于文件系统:使用共享的文件系统来实现分布式锁。可以通过创建一个特定的文件来表示锁的状态,进程需要先创建文件或者尝试获得文件的独占写锁来获取锁。
  3. 基于ZooKeeper:使用ZooKeeper来实现分布式锁。可以通过在ZooKeeper中创建一个临时节点来表示锁的状态,只有创建成功的进程才能获取锁。
  4. 基于Redis:使用Redis的原子操作来实现分布式锁。可以通过在Redis中设置一个带有过期时间的键来表示锁的状态,只有成功设置锁的进程才能获取锁。

MySQL、Redis、Zookeeper三种方式对比

 MySQLRedisZookeeper
互斥利用MySQL本身的互斥锁的机制利用redis中setnx的互斥命令利用节点的唯一性和有序性来实现互斥
高可用
高性能一般一般
安全性断开连接,自动释放锁利用锁超时时间。到期自动释放临时节点,断开连接自动释放

原理

在这里插入图片描述

reids分布式锁原理

Redis分布式锁的原理基于Redis的单线程特性以及原子操作的特点。具体原理如下:

  1. 获取锁:当一个节点要获取分布式锁时,它会向Redis发送一个SETNX命令,将一个特定的键值对设置到Redis中。如果该键不存在,节点成功获取锁,并将该键值对设置为锁的持有者标识。如果该键已经存在,表示锁已经被其他节点持有,节点获取锁失败。

  2. 释放锁:当一个节点要释放分布式锁时,它会向Redis发送一个DEL命令,将该键值对从Redis中删除。只有持有锁的节点才能成功释放锁。

目的

  • 这样的实现基于Redis的SETNX命令的原子性保证,SETNX命令的语义是
    • 当键不存在时,设置键值对并返回1;
    • 当键已存在时,不设置值并返回0。
  • 通过SETNX命令的原子性,可以保证同一时刻只有一个节点能够成功获取锁。

容错

  • 为了防止分布式锁的死锁问题,可以为获取锁的操作设置一个过期时间。
  • 节点在获取锁的同时,可以为该键设置一个带有过期时间的键值对,确保即使节点在获取锁之后发生故障,如果过期时间到了,Redis也会自动释放该锁。
  • 为了提高分布式锁的可用性和容错性,还需要引入一些额外的机制,例如设置一个超时时间,避免长时间持有锁导致的问题。
  • 还可以使用分布式锁的续约机制,即在获取锁之后,定期向Redis发送续约命令,更新锁的过期时间,确保节点在持有锁的期间不会被自动释放。
    在这里插入图片描述

redis简单分布式锁实现

锁接口

public interface ILock {/*** 非阻塞方式,尝试获取锁* @param timeoutSec 锁持有的超时时间,过期后自动释放* @return true代表获取锁成功; false代表获取锁失败*/boolean tryLock(long timeoutSec);/*** 释放锁,有加锁就要有释放锁*/void unlock();
}

实现类

public class SimpleRedisLock implements ILock {// 业务名称private String name;private StringRedisTemplate stringRedisTemplate;// 通过构造方法将name和stringRedisTemplate传入public SimpleRedisLock(String name, StringRedisTemplate stringRedisTemplate) {this.name = name;this.stringRedisTemplate = stringRedisTemplate;}private static final String KEY_PREFIX = "lock:";@Overridepublic boolean tryLock(long timeoutSec) {// 获取线程标识long threadId = Thread.currentThread().getId();// 获取锁Boolean success = stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX + name, threadId + "", timeoutSec, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);}@Overridepublic void unlock() {//通过del删除锁stringRedisTemplate.delete(KEY_PREFIX + name);}
}

下单场景的实现

// 使用Redis分布式锁
// 创建锁对象
SimpleRedisLock lock = new SimpleRedisLock("order:" + userId, stringRedisTemplate);
// 获取锁对象
boolean isLock = lock.tryLock(5);
// 加锁失败
if (!isLock) {return Result.fail("不允许重复下单");
}
try {// 获取代理对象(事务)IVoucherOrderService proxy = (IVoucherOrderService) AopContext.currentProxy();return proxy.createVoucherOrder(voucherId);
} finally {// 释放锁lock.unlock();
}

容错场景1

  1. 线程1先获取锁后,由于业务阻塞还没执行完成,线程1的锁超时后自动释放
  2. 线程2在线程1的锁超时自动释放后,进行加锁成功
  3. 正好线程1将业务接着执行完后,需要释放锁,此时释放的就是线程2的锁,造成了误删问题
  4. 误删后,线程3又加锁成功,此时,线程2和线程3就出现了并发执行业务,造成并发安全问题

在这里插入图片描述

解决思路
  • 在获取锁时:存入线程标识,比如可以用UUID这类的唯一序列
  • 在释放锁时:先获取锁中的线程标识,判断是否与当前线程标识一致
    • 如果一致则释放锁
    • 如果不一致则不释放锁
  • 不要直接将线程id作为线程标识,因为不同JVM中的线程id可能一样,所以可以用 线程id+UUID 作为线程标识
    在这里插入图片描述
优化代码
public class SimpleRedisLock implements ILock {// 业务名称private String name;private StringRedisTemplate stringRedisTemplate;// 通过构造方法将name和stringRedisTemplate传入public SimpleRedisLock(String name, StringRedisTemplate stringRedisTemplate) {this.name = name;this.stringRedisTemplate = stringRedisTemplate;}private static final String KEY_PREFIX = "lock:";private static final String ID_PREFIX = UUID.randomUUID().toString(true) + "-";@Overridepublic boolean tryLock(long timeoutSec) {// 获取线程标识String threadId = ID_PREFIX + Thread.currentThread().getId();// 获取锁Boolean success = stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX + name, threadId, timeoutSec, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);}@Overridepublic void unlock() {// 获取线程标识String threadId = ID_PREFIX + Thread.currentThread().getId();// 获取锁中的标识String id = stringRedisTemplate.opsForValue().get(KEY_PREFIX + name);// 判断标识是否一致if(threadId.equals(id)) {// 释放锁stringRedisTemplate.delete(KEY_PREFIX + name);}}
}

容错场景2

  1. 线程1执行完业务后,准备释放锁
  2. 先判断完锁一致后,正准备释放时,发生了阻塞(例如:GC时所有线程会阻塞),恰好线程1在阻塞期间,锁超时被释放
  3. 线程2获取锁成功,此时线程1被唤醒后,继续释放锁,由于之前判断过锁的标识,所以直接释放锁,但是此时的锁是线程2的
  4. 线程3又加锁成功,此时,线程2和线程3就出现了并发执行业务,造成并发安全问题
    在这里插入图片描述
Lua脚本
  • Lua脚本是一种轻量级的编程语言,用于嵌入式系统和游戏开发中。其设计目标是为了简单、可扩展和快速。
  • Lua脚本具有简洁的语法和功能强大的特性,包括动态类型、自动内存管理和高阶函数支持。它可以被嵌入到其他程序中,以提供脚本化的功能。由于其轻量级和高性能的特点,Lua脚本被广泛应用于游戏脚本、应用程序的扩展和配置文件等方面。
  • Lua脚本可以通过与其他编程语言的接口交互,例如C、C++和Java,使开发人员可以在应用程序中使用Lua脚本来实现灵活的功能和逻辑。此外,Lua还具有丰富的标准库和大量的第三方库,使开发人员能够快速开发出各种类型的应用程序。
Redis利用Lua脚本解决多条命令原子性问题
  • Redis提供了Lua脚本功能,在一个脚本中编写多条Redis命令,确保多条命令执行时的原子性

    # 执行Redis命令
    redis.call('命令名称', 'key', '其他参数', ...)
    
  • 例如,我们要先执行set name zhangsan,再执行get name,则脚本如下:

    # 先执行 set name zhangsan
    redis.call('set', 'name', 'zhangsan')
    # 再执行 get name
    local name = redis.call('get', 'name')
    # 返回
    return name
    
  • 写好脚本以后,需要用Redis命令来调用脚本,例如,我们要执行 redis.call(‘set’, ‘name’, ‘jack’) 这个脚本,语法如下:

    • 双引号内表示脚本内容
    • 最后的0表示脚本需要的key类型的参数个数
      EVAL "return redis.call('set','name','zhangsan')" 0
      
  • 如果脚本中的key、value不想写死,可以作为参数传递。key类型参数会放入KEYS数组,其它参数会放入ARGV数组,在脚本中可以从KEYS和ARGV数组获取这些参数:

    • name传给KEYS[1]
    • zhangsan传给ARGV[1]
      EVAL "return redis.call('set',KEYS[1],ARGV[1])" 1 name zhangsan
      
释放锁的业务流程
  1. 获取锁中的线程标识
  2. 判断是否与指定的标识(当前线程标识)一致
    • 如果一致则释放锁(删除)
    • 如果不一致则什么都不做
Lua脚本来表示
-- 这里的 KEYS[1] 就是锁的key,这里的ARGV[1] 就是当前线程标识
-- 获取锁中的标识,判断是否与当前线程标识一致
if (redis.call('GET', KEYS[1]) == ARGV[1]) then-- 一致,则删除锁return redis.call('DEL', KEYS[1])
end
-- 不一致,则直接返回
return 0
优化代码
  • 基于Lua脚本实现分布式锁的释放锁逻辑
  • RedisTemplate调用Lua脚本的API如下:
    在这里插入图片描述
public class SimpleRedisLock implements ILock {// 业务名称private String name;private StringRedisTemplate stringRedisTemplate;// 通过构造方法将name和stringRedisTemplate传入public SimpleRedisLock(String name, StringRedisTemplate stringRedisTemplate) {this.name = name;this.stringRedisTemplate = stringRedisTemplate;}private static final String KEY_PREFIX = "lock:";private static final String ID_PREFIX = UUID.randomUUID().toString(true) + "-";// 加载Lua脚本private static final DefaultRedisScript<Long> UNLOCK_SCRIPT;static {UNLOCK_SCRIPT = new DefaultRedisScript<>();//将编写的Lua脚本放在resources目录下,比如名称为:unlock.luaUNLOCK_SCRIPT.setLocation(new ClassPathResource("unlock.lua"));UNLOCK_SCRIPT.setResultType(Long.class);}@Overridepublic boolean tryLock(long timeoutSec) {// 获取线程标识String threadId = ID_PREFIX + Thread.currentThread().getId();// 获取锁Boolean success = stringRedisTemplate.opsForValue().setIfAbsent(KEY_PREFIX + name, threadId, timeoutSec, TimeUnit.SECONDS);return Boolean.TRUE.equals(success);}@Overridepublic void unlockL() {// 调用Lua脚本stringRedisTemplate.execute(UNLOCK_SCRIPT,Collections.singletonList(KEY_PREFIX + name),ID_PREFIX + Thread.currentThread().getId());}

总结

  • Redis的分布式锁实现其实就是利用setnx/setex获取锁,并设置过期时间,保存线程标识

  • 释放锁时先判断线程标识是否与自己一致,一致则删除锁

  • Redis的分布式的优点:

    • 利用setnx满足互斥性
    • 利用setex保证故障时锁依然能释放,避免死锁,提高安全性
    • 利用Redis集群保证高可用和高并发特性

相关文章:

【Redis】分布式锁基本理论与简单实现

目录 分布式锁解释作用特性实现方式MySQL、Redis、Zookeeper三种方式对比 原理 reids分布式锁原理目的容错redis简单分布式锁实现锁接口实现类下单场景的实现容错场景1解决思路优化代码 容错场景2Lua脚本Redis利用Lua脚本解决多条命令原子性问题 释放锁的业务流程Lua脚本来表示…...

Web开发技术大作业(HTML\CSS\PHP\MYSQL\JS)

从6月13日到6月15日&#xff0c;经过一系列的操作&#xff0c;终于把老师布置的大作业写完了&#xff0c;虽然有很多水分&#xff0c;很多东西都是为了应付&#xff08;特别是最后做的那几个网页&#xff09;&#xff0c;真的是惨不忍睹&#xff0c;不过既然花时间写了&#xf…...

【全开源】沃德会务会议管理系统(FastAdmin+ThinkPHP+Uniapp)

沃德会务会议管理系统一款基于FastAdminThinkPHPUniapp开发的会议管理系统&#xff0c;对会议流程、开支、数量、标准、供应商提供一种标准化的管理方法。以达到量化成本节约&#xff0c;风险缓解和服务质量提升的目的。适用于大型论坛、峰会、学术会议、政府大会、合作伙伴大会…...

尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】

视频地址&#xff1a;一套上手ClickHouse-OLAP分析引擎&#xff0c;囊括Prometheus与Grafana_哔哩哔哩_bilibili 01_尚硅谷大数据技术之ClickHouse入门V1.0 尚硅谷大数据技术ClickHouse教程-笔记01【ClickHouse单机安装、数据类型】尚硅谷大数据技术ClickHouse教程-笔记02【表引…...

生产管理系统看板,在自动化设备领域的创新应用

在自动化设备领域&#xff0c;生产管理系统看板的创新应用是一项引人注目的技术进步。以广州某自动化设备有限公司为例&#xff0c;他们是一家涂装工程设备制造企业&#xff0c;将讯鹏生产管理系统电子看板成功应用于全自动立式静电喷粉线、卧式静电喷粉线、氟碳喷涂生产线等领…...

分享一个图片转换工具XnConvert

目录 stablediffusion3 生成图片效果图图片转换工具XnConvertpixzip stablediffusion3 生成图片效果图 今天在使用stablediffusion3时&#xff0c;尝试生成了几张Java的图片&#xff0c;发现确实很好看&#xff0c;文生图的效果超出我的预期&#xff0c;忍不住想要给自己的csd…...

Nginx后端超时504重复请求

在一次业务中客户端请求osb平台再经过nginx转发后端&#xff0c;开发反馈请求次数大于1导致问题&#xff0c;经排查客户端请求一次&#xff0c;osb平台设置超时为30s&#xff0c;nginx配置等待上游服务器响应时最多等待30秒 部分配置文件 upstream xx {server 10.6.6.1:8080 w…...

环境配置04:Pytorch下载安装

说明&#xff1a; 显存大于4G的建议使用GPU版本的pytorch&#xff0c;低于4G建议使用CPU版本pytorch&#xff0c;直接使用命令安装对应版本即可 GPU版本的pytorch的使用需要显卡支持&#xff0c;需要先安装CUDA&#xff0c;即需要完成以下安装 1.查看已安装CUDA版本 GPU对应…...

【杂记-浅谈私有地址】

私有地址 一、私有IP地址概述1、私有IP地址的实用性2、私有IP地址的局限性 二、私有IP地址范围1、A类私有地址2、B类私有地址3、C类私有地址 三、私有IP地址与公网IP地址的区别 一、私有IP地址概述 私有IP地址是互联网工程任务组&#xff08;IETF&#xff09;为组织机构内部使…...

Java基础学习-数组

目录 数组定义 注意点&#xff1a; 地址值是数组在内存中实际存储的地址。 案例遍历&#xff1a;遍历数组得到每一个元素&#xff0c;求数组里面所有数据和 案例&#xff1a;定义数组&#xff0c;遍历能被3整除的数字 案例&#xff1a;遍历一个数组&#xff0c;奇数将当前…...

爬虫 pandas Linux Flume Pig填空题

目录 试卷&#xff1a;Python网络数据处理 答案 试卷&#xff1a;Pandas基础操作 答案 试卷&#xff1a;Linux基础指令 答案 试卷&#xff1a;Apache Flume基础指令 答案 试卷&#xff1a;Apache Pig基础指令 答案&#xff1a; Hadoop题 答案 试卷&#xff1a;Pyth…...

Spring框架中哪些地方使用了反射

Spring框架中哪些地方使用了反射&#xff1f; 1. 依赖注入&#xff1a;Spring 使用反射机制获取对象并进行属性注入&#xff0c;从而实现依赖注入。 2. AOP&#xff1a;Spring AOP 使用 JDK 动态代理或者 CGLIB 字节码增强技术来实现 AOP 的切面逻辑&#xff0c;这其中就包含…...

难辨真假的Midjourney案例(附提示词):适合练手

人物 时尚女孩 Street style fashion photo, full-body shot of a young Chinese woman with long curly black hair, walking confidently with a crowd of people down a sidewalk in Hong Kong, wearing a emerald green Gucci maxi dress & gold jewelry, sunset lig…...

数据库讲解---(数据库保护)【上】

一.事务 1.1事务的概念【重要】 事务&#xff1a;“将一组数据库操作打包起来形成一个逻辑独立的单元&#xff0c;这个工作单元不可分割&#xff0c;其中包含的数据要么全部都发生&#xff0c;要么全部都不发生”。 在SQL中&#xff0c;界定事务的语句有三条&#xff1a; B…...

【Android】【Compose】Compose的简单介绍

前言 Jetpack Compose 是谷歌推出的用于构建现代化 Android 应用界面的工具包。它采用了声明式的方式来定义用户界面&#xff0c;与传统的 XML 布局和视图层次结构相比&#xff0c;Compose 提供了更直观、更简洁的方式来创建和管理界面组件。 需求配置 Android 版本要求 An…...

对接钉钉Stream模式考勤打卡相关事件的指南

钉钉之前的accessToken是公司级别的&#xff0c;现在的accessToken是基于应用的&#xff0c;接口的权限也是基于应用的。所以第一步是在钉钉开放平台&#xff08;https://open-dev.dingtalk.com/&#xff09;创建一个应用。 创建好应用之后&#xff0c;因为我们后续还需要调用钉…...

CRMEB PRO企业微信通讯录配置

企业微信通讯录配置 登录企业微信管理后台 企业微信 1、点击【管理工具】找到【通讯录同步】点击进入 2、点击【开启API接口同步】 进入设置【通讯录同步】页面后&#xff0c;权限一栏&#xff0c;勾选【API编辑通讯录】勾选【开启手动编辑】&#xff1b; 3、点击下图箭头所…...

直播新篇章 | 金仓数据库“零距离”探索与知识挑战双重奏

KING大咖成就计划 全新进阶&#xff01;&#xff01;&#xff01;携手知识竞答挑战赛震撼来袭~为您带来一场别开生面的金仓数据库探索之旅与知识竞答盛宴&#xff01; 直 播 活 动 01 大咖引领&#xff0c;KING BASE产品“零距离”体验 您是否对金仓数据库充满好奇&#x1f9d0…...

List的介绍

1. 什么是List List是一个接口&#xff0c;继承自Collection。 Collection也是一个接口&#xff0c;该接口中规范了后序容器中常用的一些方法。 Iterable也是一个接口&#xff0c;表示实现该接口的类是可以逐个元素进行遍历。 2. 常见接口介绍 List中提供了好的方法&#x…...

Uniapp获取具体地理位置

使用uniapp自带uni.getLocation获取当前定位经纬度 再调用高德逆地理编码API&#xff0c;查到具体位置信息 https://restapi.amap.com/v3/geocode/regeo?location${longitude},${latitude}&key${key}&extensionsall 但是个人申请的key&#xff0c;有配额限制 最多每…...

Kafka基础教程

Kafka基础教程 资料来源&#xff1a;Apache Kafka - Introduction (tutorialspoint.com) Apache Kafka起源于LinkedIn&#xff0c;后来在2011年成为一个开源Apache项目&#xff0c;然后在2012年成为一流的Apache项目。Kafka是用Scala和Java编写的。Apache Kafka是基于发布-订…...

视频智能分析平台智能边缘分析一体机安防监控平台打手机检测算法工作原理介绍

智能边缘分析一体机的打手机检测算法是一种集成了计算机视觉和人工智能技术的先进算法&#xff0c;专门用于实时监测和识别监控画面中的打手机行为。以下是关于该算法的详细介绍&#xff1a; 工作原理 1、视频流获取&#xff1a; 智能边缘分析一体机首先通过连接的视频监控设…...

辅助构造函数相关学习以及php实现

https://mp.weixin.qq.com/s/J9hgLTxYi7ZJdFVG2VszQg 对这个文章进行摘要生成 ### 总体概要 文章阐述了在对象创建过程中&#xff0c;辅助构造函数&#xff08;或称为“多个”构造函数&#xff09;的重要性&#xff0c;它们为代码增加了功能性逻辑&#xff0c;并允许根据需求调…...

Linux中nginx.conf如何配置【搬代码】

Nginx 是一个独立的软件。 它是一款高性能的 Web 服务器、反向代理服务器和负载均衡器等&#xff0c;具有强大的功能和广泛的应用场景。它通常需要单独进行安装和配置来发挥其作用。 下载网址&#xff1a;http://nginx.org/en/download.html nginx.conf写法&#xff1a; #配置…...

Django REST framework序列化器详解:普通序列化器与模型序列化器的选择与运用

系列文章目录 Django入门全攻略&#xff1a;从零搭建你的第一个Web项目Django ORM入门指南&#xff1a;从概念到实践&#xff0c;掌握模型创建、迁移与视图操作Django ORM实战&#xff1a;模型字段与元选项配置&#xff0c;以及链式过滤与QF查询详解Django ORM深度游&#xff…...

红队内网攻防渗透:内网渗透之内网对抗:隧道技术篇防火墙组策略ICMPDNSSMB协议出网判断C2上线解决方案

红队内网攻防渗透 1. 内网隧道技术1.1 学隧道前先搞清楚的知识1.2 常用的隧道技术1.3 判断协议出网的命令1.4 C2上线-开防火墙入站只80&出站只放ICMP1.4.1 icmp隧道上线CS后门1.4.1 icmp隧道上线MSF后门1.5 C2上线-开防火墙入站只80&出站只放DNS1.5.1 DNS隧道上线CS后门…...

【Autoware】Autoware.universe安装过程与问题记录

&#x1f60f;★,:.☆(&#xffe3;▽&#xffe3;)/$:.★ &#x1f60f; 这篇文章主要介绍Autoware.universe安装过程与问题记录。 无专精则不能成&#xff0c;无涉猎则不能通。——梁启超 欢迎来到我的博客&#xff0c;一起学习&#xff0c;共同进步。 喜欢的朋友可以关注一下…...

JavaScript的学习之旅之基本数据类型

目录 一、字面量&#xff08;常量&#xff09;和变量 二、标识符 三、数据类型 1.String类型 2.Number类型 四、布尔值类型 五、Null和Undefined类型 一、字面量&#xff08;常量&#xff09;和变量 字面量&#xff1a;不可变的数据&#xff0c;一般位于等式的右边 变量&…...

oracle开放某些视图给特定用户,查询报视图不存在问题

以sysdba身份登录到Oracle数据库。 创建新用户。例如&#xff0c;创建一个名为new_user的用户&#xff0c;密码为password&#xff1a; CREATE USER new_user IDENTIFIED BY password;为新用户分配表空间和临时表空间。例如&#xff0c;将表空间users和临时表空间temp分配给新…...

es 更新索引mapping和setting

1.关闭索引 curl -X POST "localhost:9200/your_index_name/_close"2.修改setting 配置 无法更新一些默认数据,按照需求构建&#xff0c;我这边是构建增加了分词器 "settings": {"index": {"creation_date": "1718850346547…...

生产企业网站模板/关键词推广是什么

小编典典 你实际上是将两种不同的东西混合在一起。 使用dir()&#xff0c;vars()或inspect模块来得到你所感兴趣的是&#xff08;我用__builtins__作为一个例子&#xff0c;你可以使用任何对象&#xff0c;而不是&#xff09;。 >>> l dir(__builtins__) >>>…...

人才网网站开发手册/如何制作自己的网址

微软小娜&#xff08;Cortana&#xff09; ios版 第一部分&#xff1a;测评 1、首次体验 界面内容很多&#xff0c;地图 新闻 美食 电影 天气等 连车辆限号都有&#xff0c;感觉很强大。视觉上感觉很舒适&#xff0c;背景颜色也有多种颜色可供选择。功能也很多&#xff0c;提醒…...

手机网页无法访问如何解决/重庆 seo

今天在写一个给第三方同步数据的接口时遇到一个这种情况&#xff0c;我有一大坨数据&#xff0c;但是第三方只需要其中的几个而已&#xff0c;不及思索的就开始foreach$ret array();foreach ($needParams as $pk) {if (isset($params[$pk])) {$ret[$pk] $params[$pk];}}由于还…...

中天建设有限公司官方网站/企业管理咨询培训

Spring MVC 通过 HandlerExceptionResolver 处理程序 的异常&#xff0c;包括 Handler 映射、数据绑定以及目标方法执行 时发生的异常。 SpringMVC 提供的 HandlerExceptionResolver 的实现类...

香港公司注册处官方网站/太原网站推广公司

有人的地方&#xff0c;就有江湖。人往往是最难揣摩的。如果有一面神奇的魔镜能看出一个人的内心&#xff0c;世界会不会变得更加美好呢&#xff1f;Linux 的世界里&#xff0c;file 就是这样一面魔镜&#xff0c;它可以看到每个文件的内心。file 命令可以识别出文件的类型和编…...

做啤酒纸箱包装的网站/太原seo关键词排名优化

原创链接如下&#xff1a; ​​​​​​http://www.yuanxiangzhixin.com/?p5...