了解Redis的朋友都知道,Redis数据库是以键值对的形式存储所有数据的,Redis还能通过自身支持的五种数据类型来更自由地存储数据,只需要用对应的命令就能以这五种数据类型的形式将数据存进Redis数据库,但是Redis里的具体实现并没有看起来这么简单,这篇文章就自顶向下地来讲讲Redis是如何存储数据的

Redis存储结构

Redis数据库中键值对数据是以下图的方式存储在Redis服务器的,具体每个结构在下面会逐一分析
redis-storage-structure

redisServer

Redis启动时会在main函数中初始化一个redisServer作为Redis服务器的实体,db数组的每一项都是redisDb结构,即Redis数据库,Redis默认是有16个数据库的

// server.h
struct redisServer {...redisDb *db;...int dbnum;                      /* Total number of configured DBs */...
}

redisDb

redisDb就是Redis的具体某个数据库,可以用SELECT命令切换当前使用的数据库,redisDb内部有两个dict结构的指针,dict用于存储数据,expires用于存储过期数据

// server.h
typedef struct redisDb {dict *dict;                 /* The keyspace for this DB */dict *expires;              /* Timeout of keys with a timeout set */...int id;                     /* Database ID */...
} redisDb;

dict

dict内部包含ht数组,存储两个dictht结构,即两个哈希表,ht[0]用于存储数据,ht[1]用于rehash,rehashidx值是用来记录扩容进度的,如果为-1则表示当前没有进行扩容,type属性为dictType结构体,里面包含计算哈希值等几个函数,所以一个Redis数据库的数据存储结构其实就是Redis实现的哈希表

dict进行rehash时会先给ht[1]的表分配内存空间,然后将ht[0]的所有数据重新计算索引值放到h[1]中,再释放ht[0]并将ht[1]的哈希表放到ht[0],再最后创建一个空的哈希表放到ht[1],而且为了减小rehash函数对服务器性能造成的影响,Redis没有一次把ht[0]的哈希表数据全部放到ht[1]中,而是渐进式地分多次把数据慢慢地放到ht[1]中

// dict.h
typedef struct dict {dictType *type;void *privdata;dictht ht[2];long rehashidx; /* rehashing not in progress if rehashidx == -1 */unsigned long iterators; /* number of iterators currently running */
} dict;

dictht

dictht内部包含哈希表结构,为一个dictEntry数组,使用链地址法解决哈希冲突,还有表的容量等信息

// dict.h
typedef struct dictht {dictEntry **table;unsigned long size;unsigned long sizemask;unsigned long used;
} dictht;

dictEntry

dictEntry是哈希表的节点,我们存储的每一个键值对都是存储在对应的dictEntry结构中的,dictEntry内部包含了key和value的指针(均为无类型指针),还有一个next指针指向另一个dictEntry,当发生哈希冲突时,可以通过这个指针将冲突的节点组成一条链表解决冲突

// dict.h
typedef struct dictEntry {void *key;union {void *val;uint64_t u64;int64_t s64;double d;} v;struct dictEntry *next;
} dictEntry;

Redis数据类型

五种数据类型

Redis有五种数据类型,分别是String、List、Set、Zset、Hash,但起始Redis实际上并没有实现这五种数据类型,只是定义了五个宏来表示这五种数据类型,因为每一种数据类型都不止一种底层数据结构,所以Redis中的五种数据类型只是一个抽象的概念

// server.h
/* The actual Redis Object */
#define OBJ_STRING 0    /* String object. */
#define OBJ_LIST 1      /* List object. */
#define OBJ_SET 2       /* Set object. */
#define OBJ_ZSET 3      /* Sorted set object. */
#define OBJ_HASH 4      /* Hash object. */

redisObject

Redis实现五种抽象数据类型存储数据的原理其实很简单,就是通过redisObject结构体来存储键值对数据的值,redisObject结构体成员type表示数据类型,encoding表示编码方式,这是Redis具体实现的数据结构,后面会提到,lru表示当前redisObject最后一次被访问的时间,refcount表示当前redisObject被引用的次数,ptr为指向底层存储结构的指针

// server.h
typedef struct redisObject {unsigned type:4;unsigned encoding:4;unsigned lru:LRU_BITS; /* LRU time (relative to global lru_clock) or* LFU data (least significant 8 bits frequency* and most significant 16 bits access time). */int refcount;void *ptr;
} robj;

所以redisObject中没有存储数据,只是存储数据的属性和指向底层数据结构的指针,Redis的五种数据类型也只不过是一个属性而已,这样做的好处是Redis可以根据数据的大小灵活地改变底层数据结构,更高效地使用内存空间和存储数据,Redis还能通过redisObject统一地进行数据存储和内存管理、实现共享对象(Redis默认创建0~9999的字符串作为共享对象)

在redisObject

Redis数据结构

十种数据编码方式

Redis存储数据时会根据数据的类型和数据的大小来选择合适的编码方式,每一种编码方式的底层数据结构都是确定的,这里提到的底层数据结构只是简单说明,在后面还会详细分析这些底层数据结构的实现原理

// server.h
/* Objects encoding. Some kind of objects like Strings and Hashes can be* internally represented in multiple ways. The 'encoding' field of the object* is set to one of this fields for this object. */
#define OBJ_ENCODING_RAW 0     /* Raw representation */
#define OBJ_ENCODING_INT 1     /* Encoded as integer */
#define OBJ_ENCODING_HT 2      /* Encoded as hash table */
#define OBJ_ENCODING_ZIPMAP 3  /* Encoded as zipmap */
#define OBJ_ENCODING_LINKEDLIST 4 /* No longer used: old list encoding. */
#define OBJ_ENCODING_ZIPLIST 5 /* Encoded as ziplist */
#define OBJ_ENCODING_INTSET 6  /* Encoded as intset */
#define OBJ_ENCODING_SKIPLIST 7  /* Encoded as skiplist */
#define OBJ_ENCODING_EMBSTR 8  /* Embedded sds string encoding */
#define OBJ_ENCODING_QUICKLIST 9 /* Encoded as linked list of ziplists */

五种数据类型与十种编码方式的对应关系如下:

typeencodingencodingencoding
stringINTEMBSTRRAW
listZIPLISTLINKEDLIST(< 3.2)QUICKLIST(>=3.2)
hashZIPLISTHT
setINTSETHT
zsetZIPLISTSKIPLIST

OBJ_ENCODING_INT

INT编码方式以整数来保存字符串数据,但是字符串长度得小于或等于20,在tryObjectEncoding函数中,如果字符串长度小于或等于20并且字符串可以非溢出地解析成long值,则会将字符串用long值进行存储,还有如果没有设置maxmemory内存限制的话并且字符串解析的long值小于最小共享值的话会直接返回共享对象(默认创建0~9999为共享对象)

// object.c
robj *tryObjectEncoding(robj *o) {long value;sds s = o->ptr;size_t len;.../* Check if we can represent this string as a long integer.* Note that we are sure that a string larger than 20 chars is not* representable as a 32 nor 64 bit integer. */len = sdslen(s);if (len <= 20 && string2l(s,len,&value)) {/* This object is encodable as a long. Try to use a shared object.* Note that we avoid using shared integers when maxmemory is used* because every object needs to have a private LRU field for the LRU* algorithm to work well. */if ((server.maxmemory == 0 ||!(server.maxmemory_policy & MAXMEMORY_FLAG_NO_SHARED_INTEGERS)) &&value >= 0 &&value < OBJ_SHARED_INTEGERS){// 没有设置maxmemory内存限制的话并且字符串解析的long值小于最小共享值decrRefCount(o);incrRefCount(shared.integers[value]);// 返回共享对象return shared.integers[value];} else {if (o->encoding == OBJ_ENCODING_RAW) {sdsfree(o->ptr);o->encoding = OBJ_ENCODING_INT;o->ptr = (void*) value;return o;} else if (o->encoding == OBJ_ENCODING_EMBSTR) {decrRefCount(o);return createStringObjectFromLongLongForValue(value);}}}...
}

OBJ_ENCODING_EMBSTR

创建字符串对象时如果字符串长度没有超过44则以EMBSTR编码方式创建,否则以raw编码方式创建

// object.c
#define OBJ_ENCODING_EMBSTR_SIZE_LIMIT 44
robj *createStringObject(const char *ptr, size_t len) {if (len <= OBJ_ENCODING_EMBSTR_SIZE_LIMIT)return createEmbeddedStringObject(ptr,len);elsereturn createRawStringObject(ptr,len);
}

从zmalloc函数可以看出redisObject和sds(Redis的字符串结构)是一起分配内存的,他们的地址是连续的,这样可以减少内存分配的次数和避免内存碎片的出现

// object.c
robj *createEmbeddedStringObject(const char *ptr, size_t len) {robj *o = zmalloc(sizeof(robj)+sizeof(struct sdshdr8)+len+1);struct sdshdr8 *sh = (void*)(o+1);o->type = OBJ_STRING;o->encoding = OBJ_ENCODING_EMBSTR;o->ptr = sh+1;...if (ptr == SDS_NOINIT)sh->buf[len] = '\0';else if (ptr) {memcpy(sh->buf,ptr,len);sh->buf[len] = '\0';} else {memset(sh->buf,0,len+1);}return o;
}

OBJ_ENCODING_RAW

当字符串长度大于44时会使用RAW编码方式存储字符串,redisObject和sds是分别申请内存的,然后再将sds的指针赋给redisObject的ptr成员变量

// object.c
robj *createRawStringObject(const char *ptr, size_t len) {return createObject(OBJ_STRING, sdsnewlen(ptr,len));
}robj *createObject(int type, void *ptr) {robj *o = zmalloc(sizeof(*o));o->type = type;o->encoding = OBJ_ENCODING_RAW;o->ptr = ptr;...return o;
}// sds.c
sds sdsnewlen(const void *init, size_t initlen) {void *sh;sds s;char type = sdsReqType(initlen);/* Empty strings are usually created in order to append. Use type 8* since type 5 is not good at this. */if (type == SDS_TYPE_5 && initlen == 0) type = SDS_TYPE_8;int hdrlen = sdsHdrSize(type);unsigned char *fp; /* flags pointer. */sh = s_malloc(hdrlen+initlen+1);...return s;
}

OBJ_ENCODING_ZIPLIST

ZIPLIST编码方式会创建一个ziplist数据结构来存储数据,list、hash、zset类型的数据在成员较少、成员值较小的时候都会采用ziplist的编码方式

// object.c
robj *createZiplistObject(void) {unsigned char *zl = ziplistNew();robj *o = createObject(OBJ_LIST,zl);o->encoding = OBJ_ENCODING_ZIPLIST;return o;
}robj *createHashObject(void) {unsigned char *zl = ziplistNew();robj *o = createObject(OBJ_HASH, zl);o->encoding = OBJ_ENCODING_ZIPLIST;return o;
}robj *createZsetZiplistObject(void) {unsigned char *zl = ziplistNew();robj *o = createObject(OBJ_ZSET,zl);o->encoding = OBJ_ENCODING_ZIPLIST;return o;
}

这两个临界值是可以在Redis的配置文件中指定的

# redis.conf
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
hash-max-ziplist-entries 512
hash-max-ziplist-value 64
zset-max-ziplist-entries 128
zset-max-ziplist-value 64

OBJ_ENCODING_LINKEDLIST

Redis3.2版本之前,list类型的数据使用LINKEDLIST编码方式,底层为adlist.h中的list数据结构

OBJ_ENCODING_QUICKLIST

Redis3.2版本之后,list类型的数据使用QUICKLIST编码方式,底层为quicklist.c中quicklist数据结构

// object.c
robj *createQuicklistObject(void) {quicklist *l = quicklistCreate();robj *o = createObject(OBJ_LIST,l);o->encoding = OBJ_ENCODING_QUICKLIST;return o;
}

OBJ_ENCODING_INTSET

当set类型的数据都是整数并且数量比较少时会使用INSET编码方式,底层为intset.h中的intset数据结构

// object.c
robj *createIntsetObject(void) {intset *is = intsetNew();robj *o = createObject(OBJ_SET,is);o->encoding = OBJ_ENCODING_INTSET;return o;
}

这个临界值同样可以通过Redis的配置文件进行指定

# redis.conf
set-max-intset-entries 512

OBJ_ENCODING_HT

hash类型的数据使用HT编码方式,底层为dict.h中的dict数据结构,在hashTypeTryConversion函数中检查hash对象,如果存储的字符长度超过临界值,就把ziplist存储结构转换为dict存储结构

// t_hash.c
void hashTypeTryConversion(robj *o, robj **argv, int start, int end) {int i;if (o->encoding != OBJ_ENCODING_ZIPLIST) return;for (i = start; i <= end; i++) {if (sdsEncodedObject(argv[i]) &&sdslen(argv[i]->ptr) > server.hash_max_ziplist_value){hashTypeConvert(o, OBJ_ENCODING_HT);break;}}
}

set类型的数据也是使用HT编码方式,创建的dict结构的值为NULL

// object.c
robj *createSetObject(void) {dict *d = dictCreate(&setDictType,NULL);robj *o = createObject(OBJ_SET,d);o->encoding = OBJ_ENCODING_HT;return o;
}

OBJ_ENCODING_SKIPLIST

zset类型的数据使用SKIPLIST编码方式,底层为zset.h中的zset数据结构,在createZsetObject函数中在创建zset的同时还需要创建一个dict和zskiplist数据结构并将它们的指针赋给zset的成员变量

// object.c
robj *createZsetObject(void) {zset *zs = zmalloc(sizeof(*zs));robj *o;zs->dict = dictCreate(&zsetDictType,NULL);zs->zsl = zslCreate();o = createObject(OBJ_ZSET,zs);o->encoding = OBJ_ENCODING_SKIPLIST;return o;
}

底层数据结构

上面说到的数据编码方式使用的对应数据结构都是Redis实际存储值的地方,现在就来看看Redis是怎么实现这些底层数据结构的,dict在一开始介绍Redis存储结构的时候已经提到,这里就略过这个数据结构了

sds

C语言的char[]数组存储字符串比较局限,所以Redis使用自定义的sds结构体(Simple Dynamic String)来存储字符串,sds结构体中包含字符串长度len,分配的空间大小alloc(已使用和未使用),用于表示结构体类型信息的标志位flags(除了sdshdr5都是低三位表示类型,高五位表示未使用的位),存储字符串的柔性数组buf[](C语言结构体特性,只是占位符,不占用空间)

// sds.h
typedef char *sds;/* Note: sdshdr5 is never used, we just access the flags byte directly.* However is here to document the layout of type 5 SDS strings. */
struct __attribute__ ((__packed__)) sdshdr5 {unsigned char flags; /* 3 lsb of type, and 5 msb of string length */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr8 {uint8_t len; /* used */uint8_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr16 {uint16_t len; /* used */uint16_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr32 {uint32_t len; /* used */uint32_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};
struct __attribute__ ((__packed__)) sdshdr64 {uint64_t len; /* used */uint64_t alloc; /* excluding the header and null terminator */unsigned char flags; /* 3 lsb of type, 5 unused bits */char buf[];
};

Redis根据字符串长度定义多种sdshdr结构体,比如根据前面的分析可以知道EMBSTR编码方式是直接使用sdshdr8结构体,RAW编码方式是调用sdsnewlen函数根据字符串的长度选择不同类型的结构体来创建字符串,sdshdr5一般不会被用到

ziplist

ziplist是一系列特殊编码的连续内存块组成的顺序型数据结构,用来节约内存,Redis没有定义ziplist的结构体,就是一个unsigned char *,本质上相当于一个字节数组,只定义了宏来表示ziplist内部的各个部分,每个部分的长度也是不同的,ziplist的内存分布:

[zlbytes] [zltail] [zllen] [zlentry] … [zlentry] [zlend]

// ziplist.c
#define ZIP_END 255
#define ZIPLIST_BYTES(zl)       (*((uint32_t*)(zl)))
#define ZIPLIST_TAIL_OFFSET(zl) (*((uint32_t*)((zl)+sizeof(uint32_t))))
#define ZIPLIST_LENGTH(zl)      (*((uint16_t*)((zl)+sizeof(uint32_t)*2)))
...
unsigned char *ziplistNew(void) {unsigned int bytes = ZIPLIST_HEADER_SIZE+ZIPLIST_END_SIZE;unsigned char *zl = zmalloc(bytes);ZIPLIST_BYTES(zl) = intrev32ifbe(bytes);ZIPLIST_TAIL_OFFSET(zl) = intrev32ifbe(ZIPLIST_HEADER_SIZE);ZIPLIST_LENGTH(zl) = 0;zl[bytes-1] = ZIP_END;return zl;
}

Redis定义了ziplist节点的结构体zlentry,但是根据注释了解到这个结构体并不是数据在ziplist的实际编码方式,Redis只是将ziplist中的节点信息按照规则解析到zlentry中,方便后续计算,ziplist节点的内存分布:

[previous_entry_length] [encoding] [content]

// ziplist.c
typedef struct zlentry {unsigned int prevrawlensize; /* 用来编码前一节点长度的字节数,就是previous_entry_length的长度 */unsigned int prevrawlen;     /* 前一节点的长度,就是previous_entry_length的值 */unsigned int lensize;        /* 用来编码节点长度和数据编码信息的字节数,就是encoding的长度 */unsigned int len;            /* 节点数据的长度,就content的长度 */unsigned int headersize;     /* prevrawlensize + lensize. */unsigned char encoding;      /* 节点数据编码 */unsigned char *p;            /* 节点数据 */
} zlentry;
/* Return a struct with all information about an entry. */
void zipEntry(unsigned char *p, zlentry *e) {ZIP_DECODE_PREVLEN(p, e->prevrawlensize, e->prevrawlen);ZIP_DECODE_LENGTH(p + e->prevrawlensize, e->encoding, e->lensize, e->len);e->headersize = e->prevrawlensize + e->lensize;e->p = p;
}

list

list就是一个很基础的双向链表

// adlist.h
typedef struct listNode {struct listNode *prev;struct listNode *next;void *value;
} listNode;
typedef struct list {listNode *head;listNode *tail;void *(*dup)(void *ptr);void (*free)(void *ptr);int (*match)(void *ptr, void *key);unsigned long len;
} list;

quicklist

quicklist也是一个双向链表,只是它的节点是用ziplist存储数据的(就是下面的unsigned char *),所以节点和链表的基本信息也会比较多,为什么要设计成这样呢,这是因为链表和压缩列表都具有局限性,链表在节点插入和删除操作上很方便,但是内存空间不连续,内存开销很大,压缩列表在一块连续的内存上,存储效率高,但是数据较多时对于节点插入和删除操作的性能都特别差,因为可能需要移动大量的内存数据,所以合理控制压缩列表存放元素个数并将其作为链表的节点可以让这两种数据结构互相弥补各自的短板,使list性能更佳

// quicklist.h
typedef struct quicklistNode {struct quicklistNode *prev;struct quicklistNode *next;unsigned char *zl;unsigned int sz;             /* ziplist size in bytes */unsigned int count : 16;     /* count of items in ziplist */unsigned int encoding : 2;   /* RAW==1 or LZF==2 */unsigned int container : 2;  /* NONE==1 or ZIPLIST==2 */unsigned int recompress : 1; /* was this node previous compressed? */unsigned int attempted_compress : 1; /* node can't compress; too small */unsigned int extra : 10; /* more bits to steal for future usage */
} quicklistNode;
typedef struct quicklist {quicklistNode *head;quicklistNode *tail;unsigned long count;        /* total count of all entries in all ziplists */unsigned long len;          /* number of quicklistNodes */int fill : QL_FILL_BITS;              /* fill factor for individual nodes */unsigned int compress : QL_COMP_BITS; /* depth of end nodes not to compress;0=off */unsigned int bookmark_count: QL_BM_BITS;quicklistBookmark bookmarks[];
} quicklist;

intset

intset是一个整数集合,存储结构为contents数组,数组的元素不会重复并且是有序的,contents数组存储的整数类型取决于encoding值,所以只会存储int16_t、int32_t和int64_t类型的整数,intset查看元素是否在集合使用二分查找法

// intset.htypedef struct intset {uint32_t encoding;uint32_t length;int8_t contents[];
} intset;
// intset.s
#define INTSET_ENC_INT16 (sizeof(int16_t))
#define INTSET_ENC_INT32 (sizeof(int32_t))
#define INTSET_ENC_INT64 (sizeof(int64_t))

zskiplist

zskiplist为跳跃表,是一种高效查询的数据结构,元素在表中都是有序的,实现了平均O(logN),最坏O(N)时间复杂度的查找,是一种空间换时间的实现方式,跳跃表的底层结构就是一个多层链表(zskiplist用数组来构造层),最底层的链表存储完整数据,其他每一层的节点数都不同,是从下层到上层递减的,查找元素的时候是从最上层链表开始并跳跃着往后遍历查找节点,这样就实现了不用遍历位于所查节点前的所有节点就能得到所查节点,有点类似于基于有序数组的二分查找

// server.h
typedef struct zskiplistNode {sds ele;double score;// 后退指针,用于从后向前遍历struct zskiplistNode *backward;// 用数组实现分层struct zskiplistLevel {// 每层都有前进指针,用于从前向后遍历struct zskiplistNode *forward;// 节点与前一个节点之间的跨度unsigned long span;} level[];
} zskiplistNode;
typedef struct zskiplist {struct zskiplistNode *header, *tail;unsigned long length;// 最大的节点层数int level;
} zskiplist;

zset

zset是一个有序的集合,存储的元素都是唯一的,元素根据score值进行排序,Redis用dict和zskiplist都构造zset结构,zskiplist中按照score值从小到大存放了所有集合元素,dict中则是维护了所有集合元素与分值的映射,这是因为同时使用这两种数据结构相比单独使用其中一种数据结构(只使用其中任意一种也可以实现zset的)可以更高效地完成zset的操作,比如查找指定元素的分值(ZSCORE命令)是使用dict的,时间复杂度是O(1),查找指定范围内的所有元素就用有序的zskiplist,而且zset的dict和zskiplist是共享元素的成员和分值的,所以不会出现重复数据而浪费内存的情况,所以使用这两个数据结构各自的特性完成对应的操作可以最大化zset的性能

// server.h
typedef struct zset {dict *dict;zskiplist *zsl;
} zset;

redis-zset

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

相关文章

  1. Endnote实用快捷键

    Endnote无疑是很方便的文献管理工具&#xff0c;但是在使用过程中习惯用电脑默认PDF阅读器打开文献&#xff0c;经常是选中文献&#xff0c;右键—File Attachments—Open File。实在很是不方便。 通过查询发现还真有快捷键&#xff1a;CtrlShiftP&#xff0c;很是方便有没有。…...

    2024/4/28 3:04:27
  2. 机器学习Day2

    前言 第二天的还是CV&#xff0c;这一次直接用作者的代码和数据集没有问题。 数据集和代码都可以从下面的github开源项目中获取。 参考 github英文&#xff1a;https://github.com/Avik-Jain/100-Days-Of-ML-Code github中文翻译版&#xff1a;https://github.com/Avik-Jain/…...

    2024/4/26 10:18:10
  3. 希捷携全线企业级解决方案出席ODCC,Exos X18与Exos 2X14硬盘斩获两项大奖

    2020年9月15日&#xff0c;数据存储与管理解决方案提供商希捷科技公司亮相2020开放数据中心&#xff08;ODCC&#xff09;峰会&#xff0c;并发表了以“数据新视界”为主题的演讲。希捷银河&#xff08;Exos&#xff09;18TB硬盘与希捷银河&#xff08;Exos&#xff09;2X14 MA…...

    2024/4/26 18:30:34
  4. webpack整体配置结构

    const path require(‘path’); module.exports { // entry 表示 入口&#xff0c;Webpack 执行构建的第一步将从 Entry 开始&#xff0c;可抽象成输入。 // 类型可以是 string | object | array entry: ‘./app/entry’, // 只有1个入口&#xff0c;入口只有1个文件 entry: …...

    2024/4/24 4:57:12
  5. volidate关键字

    volidate...

    2024/4/21 21:48:33
  6. 终于我用JOL直接打破了你对Java对象的所有想象

    使用面向对象的编程语言的好处就是&#xff0c;虽然没有女朋友&#xff0c;但是仍然可以new对象出来。Java是面向对象的编程语言&#xff0c;我们天天都在使用java来new对象&#xff0c;但估计很少有人知道new出来的对象到底长的什么样子&#xff0c;是美是丑到底符不符合我们的…...

    2024/4/21 21:48:31
  7. Pycharm 安装 unittest失败,大佬告诉我怎么解决?

    ...

    2024/4/24 7:28:11
  8. docker搭建beego环境

    docker搭建beego环境1、环境准备2、docker安装3、获取一个golang的镜像并运行4、安装beego1、环境准备 Ubuntu 18.04.1 LTS&#xff0c;Linux 4.15.0 2、docker安装 ① 选择国内的云服务商&#xff0c;这里选择阿里云 curl -sSL http://acs-public-mirror.oss-cn-hangzhou.…...

    2024/4/21 21:48:29
  9. win10桌面图标变成白色文件

    电脑图标变成白色文件&#xff0c;原本开机可以自启动的程序&#xff08;例如微信&#xff09;也不能自启动了。 Q&#xff1a;今天打开电脑后&#xff0c;桌面初我的电脑、回收站等图标全部显示异常&#xff0c;但是应用可以正常使用&#xff0c;如图所示 A&#xff1a;在网上…...

    2024/4/23 3:07:54
  10. C++笔记 可变参数模板

    primer C笔记 可变参数模板 sizeof…运算符 //用来中止递归并打印最后一个元素的函数 //此函数必须在可变参数版本的print定义之前声明 template<typename T> ostream &print(ostream &os, const T &t) {return os << t; }//除了最后一个元素之外的…...

    2024/4/23 21:37:05
  11. 聚合器成为DeFi的下一个趋势,一键操作让流动性变得更简单

    今年虽然是比特币第三次减半的元年&#xff0c;以太坊2.0版本上线的重要一年&#xff0c;但今年最热的话题却是DeFi。截至目前为止&#xff0c;DeFi的总锁仓量已经突破85亿美金&#xff0c;总价值超过3500亿美元&#xff0c;但这数值在加密货币领域只占了一个非常小的比例&…...

    2024/4/28 1:45:11
  12. css中清除浮动的标准方法

    .clearfix:after { content: ""; height: 0; line-height: 0; display: block; clear: both; visibility: hidden; } https://www.yikanys.com/...

    2024/4/30 5:25:20
  13. 牛客每日一题 7月3日 毒瘤xor (前缀和+贪心)

    毒瘤xor 题目 毒瘤xor 异或 异或&#xff08;^&#xff09; 运算规则&#xff1a;0 ^ 0 0 ,0 ^ 1 1, 1 ^ 0 1, 1 ^ 1 1. 题解 本题如果原来的数这一位是1&#xff0c;它异或一个0&#xff1b;如果原来是0&#xff0c;异或1。我们用一个前缀数组记录每一位的1的数量&a…...

    2024/4/23 6:06:03
  14. vue双向数据绑定原理

    vue双向数据绑定原理 1.vue 双向数据绑定是通过 数据劫持 结合 发布订阅模式的方式来实现的&#xff0c; 也就是说数据和视图同步&#xff0c;数据发生变化&#xff0c;视图跟着变化&#xff0c;视图变化&#xff0c;数据也随之发生改变&#xff1b; 2.核心&#xff1a;关于V…...

    2024/4/21 21:48:27
  15. opencv入门:双边滤波,2D卷积,形态学操作

    双边滤波 这个综合考虑空间信息和色彩信息的滤波方式&#xff0c;可以有效的保护图像内的边缘信息。前述的方式都只考虑空间的权重信息&#xff0c;计算方便但是边缘处理不好。双边滤波机会考虑距离信息&#xff08;越远权重越小&#xff09;&#xff0c;还会考虑色彩信息&…...

    2024/4/24 22:51:02
  16. 392_magit使用学习-push修改到源仓库

    全部的学习汇总&#xff1a; https://github.com/GreyZhang/magit_skills 克隆、提交、推送基本上是我玩Github的三板斧&#xff0c;暂且把这几个功能掌握了&#xff0c;初步就可以全面使用emacs了。 前面已经完成了commit的操作&#xff0c;接下来直接模糊搜索git push出现结果…...

    2024/4/21 21:48:25
  17. 前端面试题[“1“,“2“,“3“].map(parseInt)?

    [“1”,“2”,“3”].map(parseInt)得到什么&#xff1f; 输出结果&#xff1a;1&#xff0c;NaN&#xff0c;NaN。 先抛出一个关于结果的概念&#xff0c;也是这为什么是这三个值的原因&#xff1a; map函数传递参数的定义。parseInt函数正对于radix的理解。二进制中没有3这…...

    2024/4/21 21:48:25
  18. SQL Server 2008 R2删除时提示需要支持文件(sqlsupport.msi)

    问题如图 此文件可在安装程序所在文件夹内找到&#xff0c;路径X:SQL 2008\2052_chs_lp\x64\setup\sql2008support 选择后点击打开 点击确定后&#xff0c;删除完成...

    2024/5/1 22:43:53
  19. 深入理解JS闭包

    一、前言 闭包是javascript里面比较重要的一个知识点&#xff0c;本文会先从执行环境、变量对象以及作用域链入手&#xff0c;然后结合三者来理解闭包的概念和用法&#xff0c;最后通过闭包引入js的垃圾回收机制。 二、执行环境的基本概念 1. 执行环境 在运行函数时生成&am…...

    2024/4/21 21:48:22
  20. 每天一条Linux命令(11) unzip (超详细)

    在Linux系统中&#xff0c;命令 unzip 用于解压zip命令或其他压缩软件压缩的zip格式文件。 语法&#xff1a; unzip [选项] [压缩文件] 常用参数说明&#xff1a; -o 解压时不提示是否覆盖文件 -v 解压时显示详细信息 -d 指定解压目录 -l 不解压&#xff0c;只显示压缩文…...

    2024/4/21 21:48:21

最新文章

  1. 文件批量高效管理,批量将PDF类型文件移动到指定文件夹里,实现文件高效管理

    文件的管理与整理成为了我们生活中不可或缺的一部分。面对堆积如山的PDF文件&#xff0c;你是否也曾感到手足无措、焦头烂额&#xff1f;现在&#xff0c;有了我们的批量文件管理工具&#xff0c;PDF文件的管理将变得前所未有的高效与简单&#xff01; 首先&#xff0c;我们要…...

    2024/5/2 22:06:52
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. JVM学习笔记

    文章目录 一、内存模型1. 程序计数器2. 栈3. 本地方法栈4. 堆5. 方法区方法区位置字符串常量池位置 6. 直接内存 二、虚拟机参数设置三、类的生命周期1. 加载2. 连接1&#xff09;验证2&#xff09;准备3&#xff09;解析 3. 初始化4. 卸载 四、类加载器1. 启动类加载器2. 扩展…...

    2024/5/1 13:33:02
  4. 微信小程序实现左滑删除

    效果 实现思路 使用的是官方提供的movable-area 嵌套movable-view 1、movable-area&#xff1a;注意点&#xff0c;需要设置其高度&#xff0c;否则会出现列表内容重叠的现象。 2、由于movable-view需要向右移动&#xff0c;左滑的时候给删除控件展示的空间&#xff0c;故 mov…...

    2024/5/1 13:30:10
  5. 416. 分割等和子集问题(动态规划)

    题目 题解 class Solution:def canPartition(self, nums: List[int]) -> bool:# badcaseif not nums:return True# 不能被2整除if sum(nums) % 2 ! 0:return False# 状态定义&#xff1a;dp[i][j]表示当背包容量为j&#xff0c;用前i个物品是否正好可以将背包填满&#xff…...

    2024/5/2 11:19:01
  6. 【Java】ExcelWriter自适应宽度工具类(支持中文)

    工具类 import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.CellType; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet;/*** Excel工具类** author xiaoming* date 2023/11/17 10:40*/ public class ExcelUti…...

    2024/5/2 16:04:58
  7. Spring cloud负载均衡@LoadBalanced LoadBalancerClient

    LoadBalance vs Ribbon 由于Spring cloud2020之后移除了Ribbon&#xff0c;直接使用Spring Cloud LoadBalancer作为客户端负载均衡组件&#xff0c;我们讨论Spring负载均衡以Spring Cloud2020之后版本为主&#xff0c;学习Spring Cloud LoadBalance&#xff0c;暂不讨论Ribbon…...

    2024/5/1 21:18:12
  8. TSINGSEE青犀AI智能分析+视频监控工业园区周界安全防范方案

    一、背景需求分析 在工业产业园、化工园或生产制造园区中&#xff0c;周界防范意义重大&#xff0c;对园区的安全起到重要的作用。常规的安防方式是采用人员巡查&#xff0c;人力投入成本大而且效率低。周界一旦被破坏或入侵&#xff0c;会影响园区人员和资产安全&#xff0c;…...

    2024/5/2 9:47:31
  9. VB.net WebBrowser网页元素抓取分析方法

    在用WebBrowser编程实现网页操作自动化时&#xff0c;常要分析网页Html&#xff0c;例如网页在加载数据时&#xff0c;常会显示“系统处理中&#xff0c;请稍候..”&#xff0c;我们需要在数据加载完成后才能继续下一步操作&#xff0c;如何抓取这个信息的网页html元素变化&…...

    2024/5/2 9:47:31
  10. 【Objective-C】Objective-C汇总

    方法定义 参考&#xff1a;https://www.yiibai.com/objective_c/objective_c_functions.html Objective-C编程语言中方法定义的一般形式如下 - (return_type) method_name:( argumentType1 )argumentName1 joiningArgument2:( argumentType2 )argumentName2 ... joiningArgu…...

    2024/5/2 6:03:07
  11. 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】

    &#x1f468;‍&#x1f4bb;博客主页&#xff1a;花无缺 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P5713-洛谷团队系统【入门2分支结构】&#x1f30f;题目描述&#x1f30f;输入格…...

    2024/5/2 9:47:30
  12. 【ES6.0】- 扩展运算符(...)

    【ES6.0】- 扩展运算符... 文章目录 【ES6.0】- 扩展运算符...一、概述二、拷贝数组对象三、合并操作四、参数传递五、数组去重六、字符串转字符数组七、NodeList转数组八、解构变量九、打印日志十、总结 一、概述 **扩展运算符(...)**允许一个表达式在期望多个参数&#xff0…...

    2024/5/1 11:24:00
  13. 摩根看好的前智能硬件头部品牌双11交易数据极度异常!——是模式创新还是饮鸩止渴?

    文 | 螳螂观察 作者 | 李燃 双11狂欢已落下帷幕&#xff0c;各大品牌纷纷晒出优异的成绩单&#xff0c;摩根士丹利投资的智能硬件头部品牌凯迪仕也不例外。然而有爆料称&#xff0c;在自媒体平台发布霸榜各大榜单喜讯的凯迪仕智能锁&#xff0c;多个平台数据都表现出极度异常…...

    2024/5/2 5:31:39
  14. Go语言常用命令详解(二)

    文章目录 前言常用命令go bug示例参数说明 go doc示例参数说明 go env示例 go fix示例 go fmt示例 go generate示例 总结写在最后 前言 接着上一篇继续介绍Go语言的常用命令 常用命令 以下是一些常用的Go命令&#xff0c;这些命令可以帮助您在Go开发中进行编译、测试、运行和…...

    2024/5/1 20:22:59
  15. 用欧拉路径判断图同构推出reverse合法性:1116T4

    http://cplusoj.com/d/senior/p/SS231116D 假设我们要把 a a a 变成 b b b&#xff0c;我们在 a i a_i ai​ 和 a i 1 a_{i1} ai1​ 之间连边&#xff0c; b b b 同理&#xff0c;则 a a a 能变成 b b b 的充要条件是两图 A , B A,B A,B 同构。 必要性显然&#xff0…...

    2024/5/2 9:47:28
  16. 【NGINX--1】基础知识

    1、在 Debian/Ubuntu 上安装 NGINX 在 Debian 或 Ubuntu 机器上安装 NGINX 开源版。 更新已配置源的软件包信息&#xff0c;并安装一些有助于配置官方 NGINX 软件包仓库的软件包&#xff1a; apt-get update apt install -y curl gnupg2 ca-certificates lsb-release debian-…...

    2024/5/2 9:47:27
  17. Hive默认分割符、存储格式与数据压缩

    目录 1、Hive默认分割符2、Hive存储格式3、Hive数据压缩 1、Hive默认分割符 Hive创建表时指定的行受限&#xff08;ROW FORMAT&#xff09;配置标准HQL为&#xff1a; ... ROW FORMAT DELIMITED FIELDS TERMINATED BY \u0001 COLLECTION ITEMS TERMINATED BY , MAP KEYS TERMI…...

    2024/5/2 0:07:22
  18. 【论文阅读】MAG:一种用于航天器遥测数据中有效异常检测的新方法

    文章目录 摘要1 引言2 问题描述3 拟议框架4 所提出方法的细节A.数据预处理B.变量相关分析C.MAG模型D.异常分数 5 实验A.数据集和性能指标B.实验设置与平台C.结果和比较 6 结论 摘要 异常检测是保证航天器稳定性的关键。在航天器运行过程中&#xff0c;传感器和控制器产生大量周…...

    2024/5/2 8:37:00
  19. --max-old-space-size=8192报错

    vue项目运行时&#xff0c;如果经常运行慢&#xff0c;崩溃停止服务&#xff0c;报如下错误 FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory 因为在 Node 中&#xff0c;通过JavaScript使用内存时只能使用部分内存&#xff08;64位系统&…...

    2024/5/2 9:47:26
  20. 基于深度学习的恶意软件检测

    恶意软件是指恶意软件犯罪者用来感染个人计算机或整个组织的网络的软件。 它利用目标系统漏洞&#xff0c;例如可以被劫持的合法软件&#xff08;例如浏览器或 Web 应用程序插件&#xff09;中的错误。 恶意软件渗透可能会造成灾难性的后果&#xff0c;包括数据被盗、勒索或网…...

    2024/5/2 9:47:25
  21. JS原型对象prototype

    让我简单的为大家介绍一下原型对象prototype吧&#xff01; 使用原型实现方法共享 1.构造函数通过原型分配的函数是所有对象所 共享的。 2.JavaScript 规定&#xff0c;每一个构造函数都有一个 prototype 属性&#xff0c;指向另一个对象&#xff0c;所以我们也称为原型对象…...

    2024/5/1 14:33:22
  22. C++中只能有一个实例的单例类

    C中只能有一个实例的单例类 前面讨论的 President 类很不错&#xff0c;但存在一个缺陷&#xff1a;无法禁止通过实例化多个对象来创建多名总统&#xff1a; President One, Two, Three; 由于复制构造函数是私有的&#xff0c;其中每个对象都是不可复制的&#xff0c;但您的目…...

    2024/5/2 18:46:52
  23. python django 小程序图书借阅源码

    开发工具&#xff1a; PyCharm&#xff0c;mysql5.7&#xff0c;微信开发者工具 技术说明&#xff1a; python django html 小程序 功能介绍&#xff1a; 用户端&#xff1a; 登录注册&#xff08;含授权登录&#xff09; 首页显示搜索图书&#xff0c;轮播图&#xff0…...

    2024/5/2 7:30:11
  24. 电子学会C/C++编程等级考试2022年03月(一级)真题解析

    C/C++等级考试(1~8级)全部真题・点这里 第1题:双精度浮点数的输入输出 输入一个双精度浮点数,保留8位小数,输出这个浮点数。 时间限制:1000 内存限制:65536输入 只有一行,一个双精度浮点数。输出 一行,保留8位小数的浮点数。样例输入 3.1415926535798932样例输出 3.1…...

    2024/5/1 20:56:20
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57