键值数据库Redis——Windows环境下载安装+命令行基本操作+Java操纵Redis

文章目录

  • 前言
  • 一、下载与安装(Windows环境)
    • ** 检查数据库连接状态 **
    • ** 查看Redis数据库信息 **
  • 二、Redis五种数据结构与基本操作
    • 获取所有的key——keys *
    • 清空所有的key——flushall
    • 2.1 字符串操作
    • 2.2 散列操作
    • 2.3 列表操作
    • 2.4 集合操作
    • 2.5 位图操作
  • 三、Java操纵Redis
    • ** Jedis **
    • 3.1 字符串操作
      • 3.1.1 获取Redis连接
      • 3.1.2 赋值与取值
      • 3.1.3 截取与追加
      • 3.1.4 设置过期时间
    • 3.2 散列操作
      • 3.2.1 赋值与取值
      • 3.2.2 递增递减操作
      • 3.2.3 获取所有键和值
    • 3.3 列表操作
      • 3.3.1 存取数据
      • 3.3.2 获取指定位置元素
      • 3.3.3 删除指定元素
    • 3.4 集合操作
      • 3.4.1 存取数据
      • 3.4.2 集合运算
  • 四、完整代码
    • 4.1 工具类——RedisUtil
    • 4.2 测试类——RedisUtilTest


前言

善始者繁多,克终者盖寡。

按照存储类型进行划分,Redis属于键值数据库的一种,其他常见的数据库如下图所示。Redis是基于内存的数据库,所有在数据读写方面它比mysql、mongodb等数据库要快,当数据库中数据量足够巨大时,系统的性能也会受到影响,所以通常情况下Redis数据库中的键都会有一个过期时间(Time To Live),与之相对的为了让数据更长久的保存下来,Redis需要进行数据持久化操作,具体来说有RDB和AOF两种方式,RDB是Redis默认持久化方式,可以理解为定期持久化,AOF类似于实时持久化。因为Redis数据库的数据读写速度快,所有它常常被用在缓存、计数器(秒杀功能)、消息队列上。
在这里插入图片描述

一、下载与安装(Windows环境)

Windows环境下下载Redis主要有两种渠道:官方下载和社区下载。推荐使用社区下载!!!

Redis官方发布的Linux和其他平台的Redis最新版本为7.2,但是!Windows版本还停留在3.x版本,据说官方已不再更新和维护Windows版本,也就是从官方渠道只能下载3.x的Windos版Redis。

第三方开发团队提供了更新的Windows版Redis,目前最新版本为5.0.14.1。

Windows版的Redis文件结构非常简单,将压缩包解压后可得到下图文件。

在这里插入图片描述

各程序功能描述如下图所示。使用Redis的第一步操作时启动Redis服务器,第二步是启动Redis客户端(默认地址和端口为127.0.0.1:6379)

在这里插入图片描述

** 检查数据库连接状态 **

Redis服务器启动成功后会显示Reids版本、端口号、进程号、Redis配置文件地址等信息。
在这里插入图片描述

使用“ping”指令可以检查当前客户端与服务器连接情况,返回“PONG”时表明连接没有问题。

ping

在这里插入图片描述

** 查看Redis数据库信息 **

使用“info”指令可以查看当前Redis数据库服务器、客户端、内存使用情况、持久化等信息。

在这里插入图片描述

二、Redis五种数据结构与基本操作

获取所有的key——keys *

keys *
通过该指令可以用来验证指令和操作是否生效。

清空所有的key——flushall

flushall
通过该指令可以清空内存中所有的key。

2.1 字符串操作

  1. 赋值与取值
    set key value [NX/UX]
    get key [NX/UX]
    NX:不覆盖,不存在就自动创建
    XX:覆盖已存在,不存在时不会自动创建

  2. 取值后赋值
    getset key value
    该指令会返回原来key的值。

  3. 批量赋值和取值
    mset key1 value1 key2 value2 key3 value3…
    mget key1 key2 key3

  4. 判断字段是否存在
    exists key

  5. 递增/递减
    incr/decr key
    该指令使用默认步长(1或-1)进行递增和递减
    incrby/decrby key increment/decrement
    该指令可指定步长

  6. 获取字符串
    strlen key
    该指令返回字符串长度。
    getrange key start end
    该指令获取指定范围的字符,可以将end设置为-1,表示获取字符串第start个到最后一个字符。
    setrange key start end
    该指令用于覆盖原来的字符串,从指定位置开始覆盖
    append key value

  7. 删除字段
    del key1 key2 key3…

2.2 散列操作

可以使用散列存储对象。

  1. 赋值与取值
    hset key field value
    hget key field
    hsetNX:不覆盖,不存在就自动创建
    hgetXX:覆盖,不存在不会自动创建
    可以将key理解为对象的名字,例如car,将field理解为对象的属性,例如price、type。
  2. 批量赋值和取值
    hmest key field1 value1 field2 value2
    hmget key field1 field2
    hgetall key
    该指令获取指定散列的所有信息,包括field和value。
    hkeys key
    该指令获取指定散列的所有field,返回的是一个集合(因为field不能重复)。
    hvals key
    该指令获取指定散列的所有field,返回的是一个列表(value可以重复)。
  3. 判断字段是否存在
    hexists key field
  4. 递增/递减
    hincrby key field increment/decrement
    hincrbyfloat key field increment/decrement
    递增递减操作都可以使用递增命令实现(递减就是加上一个负数),在散列中需要指定递增递减的步长。
  5. 获取长度
    hstrlen key field
    该指令返回指定散列某个field的值的长度,例如car的price是500,则返回3。
    hlen key
    该指令返回指定散列field的个数,例如car有price、color、type、city四个field,则返回4。
  6. 删除字段
    hdel key field

2.3 列表操作

Redis中的列表类似于数据结构中的双向链表实现的队列,既可以从两端取元素又可以从两端存元素,并且每个元素还有索引(序号),大大加快了获取指定索引元素的速度。

  1. 添加元素
    lpush/rpush key value1 value2 value3
    lpush表示从依次向左侧添加元素;rpush表示依次向右侧添加元素,序号是从左往右排序的。
  2. 设置指定位置元素
    lset key index value
  3. 弹出元素
    lpop/rpop key
    lpop表示从左侧弹出元素;rpop表示从右侧弹出元素。
    rpoplpush key1 key2
    该指令表示将右侧弹出元素并添加到左侧,返回被弹出的元素。
  4. 获取列表长度
    llen key
  5. 获取指定位置的元素
    lindex key index
    lrange key 0 -1
    该指令表示获取列表所有的元素,-1表示列表的最后一个元素。

2.4 集合操作

  1. 添加元素
    sadd key value1 value2 value3
    集合中不会存在相同元素。
  2. 删除/移动元素
    srem key value1 value2 value3
    smove key1 key2 value1 value2 value3
    该指令表示将集合key1中的value移动到集合key2中。
  3. 获取集合中元素个数
    smembers key
    scard key
  4. 判断元素是否在集合中
    sismember key value
  5. 集合运算
    sinter key1 key2 key3 ##交集
    sunion key1 key2 key3 ##并集
    sdiff key1 key2 key3 ##差集
    sinterstore/sunionstore/sdiffstore store key1 key2 key3
    该指令表示将key1、key2、key3集合的交、并、差操作结果存储在集合store中。

2.5 位图操作

位图是Redis中特别有意思的一种数据结构,它使用二进制数表示数据,常常用于签到次数、点击次数等应用场景中。下图显示了“A”与“a”两个字符的unicode编码和十进制数,接下来在Redis客户端中进行验证。

在这里插入图片描述
在这里插入图片描述

依次取出key1的前8位数值,发现前8位数值与对应unicode编码相同。

在这里插入图片描述

接着将key1的第3位值由0改为1(系统返回值为该位置原来的值),再取出key1,发现key1由“A”变成了“a”。

在这里插入图片描述

  1. 赋值和取值
    setbit key index value
    getbit key index
  2. 位元操作
    bitcount key start end
    该指令统计字符串被设置为1的bit数。
    bitpos key value start end
    该指令获取第一个为0或1的bit位。
    bitop and/or/xor destkey key1 key2
    bitop not key
    上述两条指令表示与、或、异或、非位运算。

三、Java操纵Redis

** Jedis **

Jedis是Java开发中使用最广泛的Redis客户端库之一,它封装了大多数Redis的操作指令,让Java与Redis的交互变得容易。后续操作均借助Jedis完成。

3.1 字符串操作

3.1.1 获取Redis连接

    public static Jedis getRedisConnection(){Jedis jedis = new Jedis("localhost",6379);return jedis;}

3.1.2 赋值与取值

    public static void setAndGet(){Jedis connection = new Jedis("localhost",6379);connection.set("hello", "redis");System.out.println(connection.get("hello"));String oldValue = connection.getSet("hello", "jedis");System.out.println(oldValue);System.out.println(connection.get("hello"));connection.close();}

3.1.3 截取与追加

    //截取字符串public static void subString(){Jedis connection = new Jedis("localhost", 6379);connection.set("hello", "redis");System.out.println(connection.strlen("hello"));System.out.println(connection.getrange("hello", 1, 3));connection.close();}//向末尾添加字符串public static void appendString(){Jedis connection = new Jedis("localhost", 6379);connection.set("hello", "redis");System.out.println(connection.append("hello", " 123"));System.out.println(connection.get("hello"));connection.close();}

3.1.4 设置过期时间

如前言中所述,Redis是一款基于内存的数据库,当数据量足够庞大时必然影响系统的运行速度,所有为“键”设置过期时间(Time To Live)十分有必要。

    //设置键的过期时间public static void setExpire(){Jedis connection = new Jedis("localhost", 6379);connection.set("hello", "redis");//expire中传入的时间单位为“秒”connection.expire("hello", 1);try {//Thread中传入的时间单位是“毫秒”Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(connection.get("hello"));/*用于显示键的过期时间-1表示键存在但未设置过期时间,意味着永久存在-2表示键不存在整数n表示当前键剩余过期时间*/System.out.println(connection.ttl("hello"));connection.close();}

3.2 散列操作

3.2.1 赋值与取值

    public static void setAndGetHash(){Jedis connection = new Jedis("localhost", 6379);connection.hset("car", "color", "white");HashMap<String, String> carMap = new HashMap<>();carMap.put("brand", "BMW");carMap.put("price", "500");connection.hmset("car", carMap);System.out.println(connection.hgetAll("car"));connection.close();}

3.2.2 递增递减操作

    public static void incrementDecrement(){Jedis connection = new Jedis("localhost", 6379);System.out.println(connection.hgetAll("car"));connection.hincrBy("car", "price", 500);System.out.println(connection.hgetAll("car"));connection.close();}

3.2.3 获取所有键和值

    //获取所有的键和值public static void getAllKeysAndValues(){Jedis connection = new Jedis("localhost", 6379);Set<String> keys = connection.hkeys("car");for (String key : keys) {System.out.println(key);}List<String> values = connection.hvals("car");for (String value : values) {System.out.println(value);}connection.close();}

3.3 列表操作

3.3.1 存取数据

    //列表操作之存取数据public static void listPushAndPop(){Jedis connection = new Jedis("localhost", 6379);connection.lpush("fruit","apple","banana");connection.rpush("fruit", "orange","grape", "pear");//获取列表fruit的长度并输出其中的内容while (connection.llen("fruit") > 0){System.out.println(connection.lpop("fruit"));}connection.close();}

3.3.2 获取指定位置元素

    //获取列表中指定位置的元素public static void getListIndex(){Jedis connection = new Jedis("localhost", 6379);connection.rpush("fruit", "apple","banana","orange","grape","pear");System.out.println(connection.lindex("fruit", 1));//此处分隔表示和后面结果相区分System.out.println("*************");List<String> fruits = connection.lrange("fruit", 2, 4);for (String fruit : fruits) {System.out.println(fruit);}connection.close();}

3.3.3 删除指定元素

    //删除列表中指定元素public static void removeListValue(){Jedis connection = new Jedis("localhost", 6379);connection.lpush("list","a","b","c","a","a","d");//从左往右删除列表中的两个aconnection.lrem("list", 2, "a");//通常情况下-1表示数据结构的最后一个元素List<String> list = connection.lrange("list", 0, -1);for (String s : list) {System.out.println(s);}connection.close();}

3.4 集合操作

3.4.1 存取数据

    //集合操作之存取数据public static void addAndRemoveValue(){Jedis connection = new Jedis("localhost", 6379);connection.sadd("set","a","b","c","a","a","d");System.out.println("删除前的元素:");Set<String> set = connection.smembers("set");for (String s : set) {System.out.println(s);}System.out.println("删除后的元素");connection.srem("set", "a");set = connection.smembers("set");for (String s : set) {System.out.println(s);}connection.close();}

3.4.2 集合运算

    //集合的运算public static void setOperation(){Jedis connection = new Jedis("localhost", 6379);//删除redis所有的键值对connection.flushAll();connection.sadd("fruit", "apple","tomato");connection.sadd("vegetable", "tomato","potato", "carrot");//求集合的交集Set<String> sinter = connection.sinter("fruit", "vegetable");System.out.println("交集是:");for (String s:sinter){System.out.println(s);}//求集合的并集Set<String> sunion = connection.sunion("fruit", "vegetable");System.out.println("\n并集是:");for (String s:sunion){System.out.println(s);}//求集合的差集fruit减去vegetableSet<String> sdiff = connection.sdiff("fruit", "vegetable");System.out.println("\n差集是:");for (String s:sdiff){System.out.println(s);}connection.close();}

四、完整代码

4.1 工具类——RedisUtil

import redis.clients.jedis.Jedis;import java.util.HashMap;
import java.util.List;
import java.util.Set;public class RedisUtil {public static void main(String[] args) {}public static Jedis getRedisConnection(){Jedis jedis = new Jedis("localhost",6379);return jedis;}//设置、获取字符串的键值public static void setAndGet(){Jedis connection = new Jedis("localhost",6379);connection.set("hello", "redis");System.out.println(connection.get("hello"));String oldValue = connection.getSet("hello", "jedis");System.out.println(oldValue);System.out.println(connection.get("hello"));connection.close();}//截取字符串public static void subString(){Jedis connection = new Jedis("localhost", 6379);connection.set("hello", "redis");System.out.println(connection.strlen("hello"));System.out.println(connection.getrange("hello", 1, 3));connection.close();}//向末尾添加字符串public static void appendString(){Jedis connection = new Jedis("localhost", 6379);connection.set("hello", "redis");System.out.println(connection.append("hello", " 123"));System.out.println(connection.get("hello"));connection.close();}//设置键的过期时间public static void setExpire(){Jedis connection = new Jedis("localhost", 6379);connection.set("hello", "redis");connection.expire("hello", 1);try {Thread.sleep(2000);} catch (InterruptedException e) {throw new RuntimeException(e);}System.out.println(connection.get("hello"));/*用于显示键的过期时间-1表示键存在但未设置过期时间,意味着永久存在-2表示键不存在整数n表示当前键剩余过期时间*/System.out.println(connection.ttl("hello"));connection.close();}//散列的赋值与取值public static void setAndGetHash(){Jedis connection = new Jedis("localhost", 6379);connection.hset("car", "color", "white");HashMap<String, String> carMap = new HashMap<>();carMap.put("brand", "BMW");carMap.put("price", "500");connection.hmset("car", carMap);System.out.println(connection.hgetAll("car"));connection.close();}//递增递减操作public static void incrementDecrement(){Jedis connection = new Jedis("localhost", 6379);System.out.println(connection.hgetAll("car"));connection.hincrBy("car", "price", 500);System.out.println(connection.hgetAll("car"));connection.close();}//获取所有的键和值public static void getAllKeysAndValues(){Jedis connection = new Jedis("localhost", 6379);Set<String> keys = connection.hkeys("car");for (String key : keys) {System.out.println(key);}List<String> values = connection.hvals("car");for (String value : values) {System.out.println(value);}connection.close();}//列表操作之存取数据public static void listPushAndPop(){Jedis connection = new Jedis("localhost", 6379);connection.lpush("fruit","apple","banana");connection.rpush("fruit", "orange","grape", "pear");//获取列表fruit的长度并输出其中的内容while (connection.llen("fruit") > 0){System.out.println(connection.lpop("fruit"));}connection.close();}//获取列表中指定位置的元素public static void getListIndex(){Jedis connection = new Jedis("localhost", 6379);connection.rpush("fruit", "apple","banana","orange","grape","pear");System.out.println(connection.lindex("fruit", 1));//此处分隔表示和后面结果相区分System.out.println("*************");List<String> fruits = connection.lrange("fruit", 2, 4);for (String fruit : fruits) {System.out.println(fruit);}connection.close();}//删除列表中指定元素public static void removeListValue(){Jedis connection = new Jedis("localhost", 6379);connection.lpush("list","a","b","c","a","a","d");//从左往右删除列表中的两个aconnection.lrem("list", 2, "a");//通常情况下-1表示数据结构的最后一个元素List<String> list = connection.lrange("list", 0, -1);for (String s : list) {System.out.println(s);}connection.close();}//集合操作之存取数据public static void addAndRemoveValue(){Jedis connection = new Jedis("localhost", 6379);connection.sadd("set","a","b","c","a","a","d");System.out.println("删除前的元素:");Set<String> set = connection.smembers("set");for (String s : set) {System.out.println(s);}System.out.println("删除后的元素");connection.srem("set", "a");set = connection.smembers("set");for (String s : set) {System.out.println(s);}connection.close();}//集合的运算public static void setOperation(){Jedis connection = new Jedis("localhost", 6379);//删除redis所有的键值对connection.flushAll();connection.sadd("fruit", "apple","tomato");connection.sadd("vegetable", "tomato","potato", "carrot");//求集合的交集Set<String> sinter = connection.sinter("fruit", "vegetable");System.out.println("交集是:");for (String s:sinter){System.out.println(s);}//求集合的并集Set<String> sunion = connection.sunion("fruit", "vegetable");System.out.println("\n并集是:");for (String s:sunion){System.out.println(s);}//求集合的差集fruit减去vegetableSet<String> sdiff = connection.sdiff("fruit", "vegetable");System.out.println("\n差集是:");for (String s:sdiff){System.out.println(s);}connection.close();}
}

4.2 测试类——RedisUtilTest

测试工具为Junit5,开发环境为IDEA,在Eclipse中测试方法必须以test开头,此处与IDEA有所区别。

import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;import static org.junit.jupiter.api.Assertions.*;class RedisUtilTest {@Testvoid getRedisConnection() {Jedis connection = RedisUtil.getRedisConnection();System.out.println(connection);connection.close();}@Testvoid setAndGet() {RedisUtil.setAndGet();}@Testvoid subString() {RedisUtil.subString();}@Testvoid appendString() {RedisUtil.appendString();}@Testvoid setExpire() {RedisUtil.setExpire();}@Testvoid setAndGetHash() {RedisUtil.setAndGetHash();}@Testvoid incrementDecrement() {RedisUtil.incrementDecrement();}@Testvoid getAllKeysAndValues() {RedisUtil.getAllKeysAndValues();}@Testvoid listPushAndPop() {RedisUtil.listPushAndPop();}@Testvoid getListIndex() {RedisUtil.getListIndex();}@Testvoid removeListValue() {RedisUtil.removeListValue();}@Testvoid addAndRemoveValue() {RedisUtil.addAndRemoveValue();}@Testvoid setOperation() {RedisUtil.setOperation();}
}

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

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

相关文章

小核引导RTOS---RISC-V C906

文章目录 参考日志编译框架目标fip 启动流程fip文件组成BL2程序 总结思考备注 参考 参考1. How does FSBL load the FreeRTOS on the small core and execute it?参考2. Duo now supports big and little cores?Come and play!Milk-V Duo, start&#xff01;参考3. 使用uboo…

【Mybatis】Mybatis 二级缓存全详解教程

【Mybatis-Plus】Mybatis-Plus 二级缓存全详解 一&#xff0c;Mybatis-Plus介绍 MyBatis-Plus&#xff08;简称MP&#xff09;是一个基于 MyBatis 的增强工具&#xff0c;它简化了 MyBatis 的开发&#xff0c;并且提供了许多便利的功能&#xff0c;帮助开发者更高效地进行持久…

数字电路基础(Digital Circuit Basis )

目录 一、什么是数字电路&#xff1f; &#xff08;Digital Circuit &#xff09; 1.概念 2.分类 3.优点 4.数电与模电的区别 二、数制 (十进制&#xff1a;Decimal) 1.概述 2.进位制 3.基数 4.位权 5.二进制的算术运算 三、编码 (二进制&#xff1a;Binary ) 1.什…

JAVA8新特性

JAVA8新特性 1、函数式编程 主要关注对数据进行了什么操作 1.1 优点 代码简洁 容易理解 易于“并发编程” 2、lamada表达式 (参数列表)->{代码}未使用 new Thread(new Runnable() {Overridepublic void run() {System.out.println(123123123);}}).start(); 使用…

CSS常见样式

字体相关的样式 <style>div{/* 斜体 */font-style: italic;/* 加粗 100-900*/font-weight: 900;/* 字体大小 */font-size: 20px;/* 声明字体格式 */font-family: "微软雅黑";}</style> div内部文字垂直居中 只需要将行高设为其height的大小即可。 div{…

B2985A是德科技B2985A静电计

181/2461/8938产品概述&#xff1a; B2985A 静电计/高阻表具有 0.01 fA&#xff08;0.01 x 10-15 A&#xff09;的分辨率&#xff0c;可帮助您信心十足地测量小电流和最高可达 10 PΩ&#xff08;10 x 1015 Ω&#xff09;的大电阻。 它拥有 4.3 英寸 LCD 彩色液晶屏并配有图形…

WebGL异步绘制多点

异步绘制线段 1.先画一个点 2.一秒钟后&#xff0c;在左下角画一个点 3.两秒钟后&#xff0c;我再画一条线段 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"…

redis的简单操作

redis中string的操作 安装 下载可视化软件&#xff1a;https://gitee.com/qishibo/AnotherRedisDesktopManager/releases。 Mac安装redis&#xff1a; brew install redisWindows安装redis: 安装包下载地址&#xff1a;https://github.com/tporadowski/redis/releases 1.…

C++:类和对象(上)

1.类的引入 C语言结构体中只能定义变量&#xff0c;在C中&#xff0c;结构体内不仅可以定义变量&#xff0c;也可以定义函数&#xff0c;同时C引入class关键字来也能实现这一作用&#xff0c;C更喜欢用class class/struct Stack {int * _array;size_t _capacity;size_t _size…

3.5、文本显示(Text/Span)

创建文本 Text 可通过以下两种方式来创建: string 字符串 效果图 Text(我是一段文本)引用 Resource 资源 资源引用类型可以通过 $r 创建 Resource 类型对象,文件位置为 /resources/base/element/string.json。 引用的资源位于:src/main/resources/base/element/string…

海外仓订单管理存在哪些问题?利用位像素海外仓系统能提升订单管理效率吗?

随着跨境电商业务的蓬勃发展&#xff0c;海外仓的订单量日益攀升&#xff0c;在海外仓的运作中&#xff0c;订单管理是一项看似简单实则复杂繁琐的任务。 然而&#xff0c;大批量订单的涌入&#xff0c;让其管理背后隐藏的问题也随机出现。让我们一起来看看有哪些问题吧&#…

一二三应用开发平台使用手册——系统管理-组织机构-使用说明

概述 平台文档是平台的重要组成部分&#xff0c;这块容易被忽视或不被重视。即使一个平台或系统架构优秀、设计合理、代码优雅&#xff0c;但文档缺失&#xff0c;对于平台的使用方而言&#xff0c;熟悉成本高、难度大。不可避免存在疑问&#xff0c;需要动手尝试验证或翻看源…

(表征学习论文阅读)A Simple Framework for Contrastive Learning of Visual Representations

Chen T, Kornblith S, Norouzi M, et al. A simple framework for contrastive learning of visual representations[C]//International conference on machine learning. PMLR, 2020: 1597-1607. 1. 前言 本文作者为了了解对比学习是如何学习到有效的表征&#xff0c;对本文所…

LeetCode题练习与总结:螺旋矩阵Ⅱ--59

一、题目描述 给你一个正整数 n &#xff0c;生成一个包含 1 到 n^2 所有元素&#xff0c;且元素按顺时针顺序螺旋排列的 n x n 正方形矩阵 matrix 。 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;[[1,2,3],[8,9,4],[7,6,5]]示例 2&#xff1a; 输入&#xff1…

VMware启动显示“打开虚拟机时出错: 获取该虚拟机的所有权失败”

提示框&#xff08;忘截图了&#xff09;里提示目录C:\Users\mosep\Documents\Virtual Machines\VM-Win10 x64\中的某个文件&#xff08;在我这里好像是VM-Win10 x64.vmx&#xff0c;VM-Win10 x64是我给虚拟机取的名字&#xff09;在被使用中。 找到这个目录&#xff0c;删除.…

【面试题】如何在亿级别用户中检查用户名是否存在?

前言 不知道大家有没有留意过&#xff0c;在使用一些app或者网站注册的时候&#xff0c;提示你用户名已经被占用了&#xff0c;比如我们熟知的《英雄联盟》有些人不知道取啥名字&#xff0c;干脆就叫“不知道取啥名”。 但是有这样困惑的可不止他一个&#xff0c;于是就出现了“…

如何从应用商店Microsoft Store免费下载安装HEVC视频扩展插件

在电脑上打开一张HEIC类型的图片提示缺少HEVC解码器&#xff0c;无法打开查看&#xff0c;现象如下&#xff1a; 这种情况一般会提示我们需要下载安装HEVC解码器&#xff0c;点击“立即下载并安装”会跳转到应用商店&#xff0c;但是我们发现需要付费7元才能下载安装 免费安装…

6. Z 字形变换(Java)

目录 题目描述&#xff1a;输入&#xff1a;输出&#xff1a;代码实现&#xff1a; 题目描述&#xff1a; 将一个给定字符串 s 根据给定的行数 numRows &#xff0c;以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时&#xff0c;排列如…

mac | Windows 本地部署 Seata2.0.0,Nacos 作为配置中心、注册中心,MySQL 存储信息

1、本人环境介绍 系统 macOS sonama 14.1.1 MySQL 8.2.0 &#xff08;官方默认是5.7版本&#xff09; Seata 2.0.0 Nacos 2.2.3 2、下载&数据库初始化 默认你已经有 Nacos、MySQL&#xff0c;如果没有 Nacos 请参考我的文章 &#xff1a; Docker 部署 Nacos&#xff08;单机…

订阅edk2社区邮件列表

给社区发邮件步骤 UEFI订阅邮件列表 开发者订阅邮箱 develedk2.groups.io | Home 点击Join This Group&#xff0c;按照步骤填写自己邮箱地址&#xff08;该地址是edk2,发送邮件到该邮箱的地址&#xff09; 自己邮箱确认就可以自动收到邮件了 比如&#xff1a;