2021年4月2日星期五

rocksdb代码解析-db.h

  这篇是对rocksdb整体功能的分析,主要着眼点是db.h文件,对rocksdb进行代码解析,若想以整体的方式了解其功能,首先就应该解析db.h文件。对于rocksdb的db.h文件来说,且不论前面一大串结构体,该文件的核心无疑是class DB,从一百多行到一千多行,都是这个类。

  本文共计七千余字,分为四个部分,分别是整体方法,属性方法,参数解析和其他。

  下面对类内部进行分析,为了节约空间,函数参数不再写了。

整体方法

  该表格为整体性方法,主要操作包含Put,Get,Delete等键值存储的基础操作以及针对数据库本身的操作,还有就是rocksdb自身的扩展。

Open用指定的"name"【引用型字符串参数】打开数据库【默认列族】。在* dbptr中存储指向堆分配的数据库的指针,并在成功时返回OK。将nullptr存储在* dbptr中,并在出现错误时返回非OK状态。当不再需要* dbptr时,调用者应将其删除(delete DB)。返回值直接给db就行,一般来说数据库只用有一个,如果想分类使用列族的方式会快很多。
OpenForReadOnly以只读形式打开数据库,此时不考虑列族的问题,像删改一样的改数据的操作都会返回错误,且不会触发compaction操作。
OpenForReadOnly以只读模式打开某列族(或某些),用参数与上面的玩意区分,列族名存在vector数组中。只能打开指定的列族,如果不写指定列族的参数的话,会对默认列族进行操作。默认列族存在 kDefaultColumnFamilyName 里面,可以自行修改。假如想对n个列族进行操作的话,应该创建n-1个列族。
OpenAsSecondary

从节点功能,该方法创建了一个从节点,可以动态地追踪现有的MANIFEST文件。用户可以在需要时调用TryCatchUpWithPrimary使备份追上主节点。主节点优先级大于从节点,启动从节点的话只要主节点的句柄没有被销毁,还是可以恢复到主节点状态的。

options参数指定用于打开从节点的选项。

name参数指定用于打开主节点的主数据库的名称。

secondary_path参数指向从节点存储其信息日志的目录。

dbptr是与打开的从节点相对应的out-arg【外部指针】该指针指向一个堆中数据库,用户应在使用后将其删除。

目前不支持WAL追踪【实时从节点】,但很快就会有。

OpenAsSecondary上面的方式会以默认列族打开,而这个会指定列族的方式打开从节点,多了一个参数就是column_families,这个参数指定要打开的列族。【所谓从节点可以以MVCC的多版本控制链来理解】
Open

以列族打开数据库,用参数和上面的区分

实际上在进入代码研究之后可以发现列族不管你指不指定都必须有,不输入的话就是默认的列族。

db_options指定数据库特定的选项

column_families是数据库中所有列族的向量,包含列族名称和选项。

->可以用ListColumnFamilies()来获得所有列族的列表。也可以用只读的方式打开部分列族。

默认的列族名为default,存储在rocksdb::kDefaultColumnFamilyName.

如果没问题的话,返回时句柄的大小将与column_families相同-->handles [i]将是用于对列族column_family [i]进行操作的句柄。

用这种函数打开的数据库要删除的话需要用DestroyColumnFamilyHandle()来删除所有句柄。
Resume数据库恢复操作,与最下面的数据库修复操作不同,这个是针对备份与主存的。
Close关闭数据库,包括释放资源,清理文件等操作。为了防止意外,此方法应该在析构函数之前调用,并且若数据库中还有没释放的闪照的话会返回失败。
ListColumnFamilies这个方法会将打开指定参数名的数据库,并通过column_families参数返回该数据库中所有列族的列表。
CreateColumnFamily创建column_family并通过参数handle返回列族的句柄,通过status返回是否成功。
CreateColumnFamilies批量创建具有相同列族选项设置的列族。该函数可能会出现部分成功部分失败的情况,成功的状态会保留。
CreateColumnFamilies这个也是批量创建列族的,与上面不同的是上面的是全部相同属性的列族,传入的参数是字符串作为列族名。而这个通过列族描述符传入,每个列族属性都可能不同。
DropColumnFamily通过句柄指针删除一个列族,此调用仅在mainfest中记录一个删除记录,并防止刷新和压缩列族。
DropColumnFamily批量删除列族,此调用仅在mainfest中记录一个删除记录,并防止刷新和压缩列族。如果发生错误,请求可能会部分成功。用户可以调用ListColumnFamilies来检查结果。
DestroyColumnFamilyHandle

关闭由column_family句柄指定的列族,并销毁指定的列族句柄,以避免重复删除。默认情况下,此调用将删除列族句柄。注意:请使用此方法关闭列族而不是直接删除列族句柄。

Put

kv存储最基础的操作之一,Slice格式的输入,通过参数判断是否指定列族,最后会以write_batch的形式写入。更新操作也是通过Put来实现的。

Deletekv存储最基础的操作之一,通过key删除,如果key不存在也不会报错,因为其本质上来说也是插入操作,Put的key带有delete标记,在后续的compaction中会删除掉前面的内容。
SingleDelete通过key删除.要求key存在并且未被覆盖。如果key不存在也不会报错。如果key被overwrite(更新)了,那么调用这个会返回undefined,自从上次对该key调用SingleDelete()以来,只有该key只有一个Put()时,SingleDelete()才能正确运行。【库内只允许一条记录】-->删除方法只删除最新的,所以不能有多个记录。当前,此功能是针对非常特定的工作负载的实验性性能优化。调用者应确保SingleDelete仅用于未使用Delete()删除【因为delete本质也是put】或未使用Merge()写入的key。将SingleDelete操作与Deletes和Merges混合使用会导致不确定的行为。
DeleteRange

按range:"begin_key", "end_key"删除数据,但在生产实践中一般不用这个。

原因:1.在内存表中累积许多范围的逻辑删除将降低读取性能。(可以通过偶尔手动flush来避免这种情况。)2.在存在范围逻辑删除的情况下限制打开文件的最大数量会降低读取性能。(为避免此问题,请尽可能将max_open_files设置为-1。也就是不限制。)
MergeMerge操作,此操作简单来说就是rocksdb对于对已存在数据库中的value进行追加的一个操作,比如使key1对应的value->hello变成helloworld。对这个操作进行的算法优化。此操作包括'读-改-写'三个步骤。打开DB时,此操作的语义由用户提供的merge_operator决定,实际上是决定其在后来的compaction过程中的合并方式。
Write将指定的更新应用到数据库。如果'updates'不包含更新,但options.sync = true【是否同步】,WAL仍将同步。
Getkv存储最基础的操作之一,按key查找,不影响value。找不到返回Status::IsNotFound(),其他错误会返回其他Status。Get操作首先在内存中的表进行查询(首先是缓存,然后是memtable等内存表),在查询无果后会向下面的持久化存储LSM-tree进行逐层查询。
GetMergeOperands返回与键对应的所有合并操作数。operands【操作数】,这里是指对步骤进行拆解后需要的操作的数量
MultiGet顾名思义,一次性get多个,以参数来看是以向量作为数组传递Slice格式的参数。如果keys [i]在数据库中不存在,则第i个返回的状态将为Status :: IsNotFound()为true的状态,并且(* values)[i]将被设置为某个任意值(通常就是 "")。否则,第i个返回的状态将具有Status :: ok()为true,并且(* values)[i]将存储与keys [i]关联的值。
MultiGet重载的MultiGet API通过在读取路径中进行批处理操作来提高性能,从而提高效率。但仅支持具有完整过滤器的基于block的表格式。
KeyMayExist用于判断一个key是否存在,如果key在数据库中不存在,则返回false,否则返回true。如果调用者想在内存中找到key时获取value,则必须设置"value_found"为true。【默认false】与调用DB::Get()相比,这个方法更加轻量【消耗资源少(why:IO少了)】。
NewIterator创建迭代器,返回基于堆的数据库迭代器。NewIterator()的结果最初是无效的(调用者必须在使用迭代器之前在迭代器上调用Seek方法之一)。如果不是长时间使用,调用者请删除迭代器。在删除此数据库之前,应删除返回的迭代器。若是只传入读选项的话,会对默认列族操作,传入列族指针或是列族数组的话可以跨列族操作。另外,迭代器是堆分配的,需要在删除数据库之前将其删除。
GetSnapshot返回当前数据库状态的句柄【快照】,使用此句柄创建的迭代器都将观察当前数据库状态的稳定快照。当不再需要快照时,调用者必须调用ReleaseSnapshot(result)来释放快照。如果数据库无法进行快照或不支持快照,则将返回nullptr。
ReleaseSnapshot释放快照,注意释放后请不要再次建立快照。

 

参数

  结构体Propertiy里包含了所有有效的属性参数,这些参数通过GetProperties()获取,这些属性能在多维度反应数据库当时的运行状态。当然,底层的具体架构分布是不显示的,要是想了解的话【以db_bench为例】可以在系统的tmp文件夹里找到rocksdb开头的文件夹,在里面可以看到运行日志,具体的sst文件以及数据库参数选项的设置之类的东西,建议了解了解。其中数据库参数选项(options)的设置很大程度上决定了数据库的发挥,参数可以在相关文件中修改【不推荐】,也可以在运行时调用相关接口进行修改,或者在运行数据库时作为外部参数传入。

    

kNumFilesAtLevelPrefix

返回包含文件在第几层的字符串,用ASCII表示。

kCompressionRatioAtLevelPrefix

返回包含在第N层的压缩率的字符串,用ASCII表示。在这里压缩率被认为是-未压缩的数据大小/压缩的文件大小。没有文件的话返回"-1.0"。

kStats

返回多行字符串,其中包含kCFStats描述的数据,后跟kDBStats描述的数据。

kSSTables

返回总结当前SST文件的多行字符串

kCFStats

相当于 "rocksdb.cfstats-no-file-histogram" 和"rocksdb.cf-file-histogram" 加起来. 具体见后面的描述【histogram直方图】

kCFStatsNoFileHistogram

返回一个多行字符串,该字符串在db的生命周期(" L <n>")内具有每层的常规列族统计信息,在db的生命周期(" Sum")内进行聚合,并在自上次检索以来的时间间隔(" Int")进行聚合 。它还可以用于以映射的格式返回统计信息。在这种情况下,每个级别以及"sum"都将有一对字符串组成双精度数组。检索这种形式的统计信息时,"int"统计信息将不会受到影响。

kCFFileHistogram

输出每层读取了多少文件,以及单个请求的延迟的直方图。

kDBStats

返回包含常规数据库统计信息的多行字符串,该统计信息既是累积的(在数据库的生命周期内),又是间隔的(从上一次检索kDBStats开始)。

kLevelStats

返回多行字符串,其中包含每层的文件数和每个级别的总大小(MB)。

kNumImmutableMemTable

返回尚未flush的immutable memtables数量。

kNumImmutableMemTableFlushed

返回已经准备好flush的immutable memtables数量。

kMemTableFlushPending

如果memtable flush挂起,则返回1; 否则,返回0。

kNumRunningFlushes

返回正在flush的table的数量

kCompactionPending

如果至少有一个compaction正在挂起,则返回1,否则0

kNumRunningCompactions

返回正在compaction的数量

kBackgroundErrors

返回后台错误的统计

kCurSizeActiveMemTable

返回活动的memtable的近似大小(字节)

kCurSizeAllMemTables

返回活动的memtable和未flush的immutable memtable的近似大小(字节)。

kSizeAllMemTables

返回活动的memtable,未flush和已flush的immutable memtable的近似大小(字节)。

kNumEntriesActiveMemTable

返回活动memtable中的条目总数。

kNumEntriesImmMemTables

返回未flush的immutable memtable中的条目总数。

kNumDeletesActiveMemTable

返回活动memtable中删除条目的总数。

kNumDeletesImmMemTables

返回未flush的immutable memtable中删除条目的总数。

kEstimateNumKeys

返回memtable和未flush的immutable memtable和持久化存储中的总键的估计数量。

kEstimateTableReadersMem

返回用于读取SST表的估计内存,不包括块缓存中使用的内存(例如过滤器和索引块)。

kIsFileDeletionsEnabled

如果启用了删除过时的文件,则返回0,否则,返回一个非零数字。

kNumSnapshots

返回数据库内没释放的闪照的数量

kOldestSnapshotTime

返回表示最旧的未发布快照的Unix时间戳的数字。

kNumLiveVersions

返回现存的version数。 "version"是一个内部数据结构,细节在version_set.h里面更多的现存的版本通常意味着更多的SST文件没有被删除(来自迭代器或未完成的压缩)。

kCurrentSuperVersionNumber

返回当前LSM版本号它是一个uint64_t整数,在LSM树发生任何更改后递增。重新启动数据库后,该号码不会保留,从0开始。

kEstimateLiveDataSize

返回以字节为单位的实时数据量的估计值

kMinLogNumberToKeep

返回应保留的日志文件的最小日志数

kMinObsoleteSstNumberToKeep

返回保留过时的SST的最小文件号。如果可以删除所有过时的文件,则将返回`uint64_t`的最大值。

kTotalSstFilesSize

返回所有SST文件的总大小(字节)。如果文件太多,可能会降低在线查询的速度。

kLiveSstFilesSize

返回属于最新LSM树的所有SST文件的总大小(字节)。

kBaseLevel

返回将L0数据压缩到的层数

kEstimatePendingCompactionBytes

返回估计的重写压缩总数,以使所有级别降至目标大小以下。不适用于除基于层以外的其他压缩。

kAggregatedTableProperties

返回目标列族的聚合表属性的字符串表示形式。

kAggregatedTablePropertiesAtLevel

和前面的一样,但只针对第N层

kActualDelayedWriteRate

返回当前的实际延迟写入率。0表示没有延迟。

kIsWriteStopped

判断写入状态,如果写入已停止,则返回1。

kEstimateOldestKeyTime

返回数据库中最旧的密钥时间戳的估计值。目前仅适用于FIFO压缩中,且要求compaction_options_fifo.allow_compaction = false。

kBlockCacheCapacity

返回块缓存容量

kBlockCacheUsage

返回驻留在块缓存中的条目的内存大小

kBlockCachePinnedUsage

返回被挂起【固定】【pinned】的kv对的内存大小。

kOptionsStatistics

返回对options.statistics的描述,为多行字符串

 

   接下来是有关属性的函数:

GetProperty

数据库实现可以通过此方法导出有关其状态的属性。如果"属性"是此数据库实现可以理解的有效属性(有关有效属性,请参见上面的属性结构)

GetMapProperty

同上,获得属性及其相应的映射关系

GetIntProperty

和上面的GetProperty()类似,但仅适用于返回值为整数的属性子集。

GetAggregatedIntProperty

与 GetIntProperty()相同,但是此函数返回所有列族的聚合int属性。

ResetStats

重置数据库和所有列族的内部统计信息。请注意,这不会重置options.statistics,因为它不属于数据库

GetApproximateSizes

这个返回的是实际上大致的大小,如果用户数据压缩十倍,则返回的大小将是相应用户数据大小的十分之一。

GetApproximateMemTableStats

该方法与GetApproximateSizes相似,不同的是它返回内存表中的记录的大致数量。

CompactRange

压缩键范围[* begin,* end]的基础存储。实际压缩间隔可能是[* begin,* end]的超集。特别是删除和覆盖的版本将被丢弃,并对数据进行重新排列以减少访问数据所需的操作成本。通常,只有对基础有一定了解的用户才能调用此操作。特别的,begin==nullptr 视为数据库中所有key之前的key,end==nullptr 视为数据库中所有key之后的key。因此,以下调用将压缩整个数据库:db->CompactRange(options, nullptr, nullptr); 请注意,在压缩整个数据库之后,所有数据均被下推到包含任何数据的最后一级。如果压缩后的总数据大小减小,则该级别可能不适用于存储所有文件。在这种情况下,客户端可以将options.change_level设置为true,以将文件移回能够容纳数据集的最小级别或给定级别(由非负options.target_level指定)。

SetOptions/SetDBOptions

顾名思义,对数据库选项进行设置,不在乎先后顺序,只需将内容以vector数组的形式传入。

CompactFiles

CompactFiles()输入由文件编号指定的文件列表,并将其压缩到指定层。该行为与CompactRange()的不同之处在于CompactFiles()使用CURRENT线程执行压缩作业。也就是'立即进行'。

PauseBackgroundWork

暂停功能,该功能将一直等到所有当前正在运行的后台进程完成,返回后,将不会运行任何后台进程(compaction,batch,flush之类的操作),直到调用ContinueBackgroundWork

ContinueBackgroundWork

继续整个数据库的运行,由于停止之前就是将正在运行的后台任务运行完才暂停的,所以不会有任务进行到一半接着来的情况。

EnableAutoCompaction

如果先前禁用了给定的列族,此功能将启用它们的自动压缩。【咋禁用的:通过SetOptions()API将disable_auto_compactions设置为'true'】

DisableManualCompaction

EnableManualCompaction

开启和关闭手动compaction,很明显,禁用以后就不能用户主动调用compaction操作了。实际上若是对于rocksdb了解不足的话并不建议开启。

NumberLevels

获取此数据库使用的层数。【当前最高层数】

MaxMemCompactionLevel

如果新的压缩内存表不产生重叠,则将其推送到的最高层。

Level0StopWriteTrigger

level0中将停止写入的文件数。不给列族参数的话就对默认列族操作。

GetName

获取数据库名字 -- 与提供给DB :: Open()的参数完全相同的名称

GetEnv

从数据库获取环境对象,rocksdb和leveldb一样将系统环境以对象的形式处理。

GetOptions

获取我们对数据库设置的选项。

Flush

flush操作,也是rocksdb和leveldb的区别之一,将所有memtable内容flush到磁盘,自动flush开启时会自动flush单个列族的内容,要是想flush多个列族,需要用Flush(options, column_families).

FlushWAL

将WAL内存缓冲区刷新到文件.如果sync为true,则此后将调用SyncWAL。

SyncWAL

同步WAL。 请注意,后面带有SyncWAL()的Write()与带有sync = true的Write()并不完全相同:在后一种情况下,直到完成同步,更改才可见。当前仅在"选项"中的allow_mmap_writes = false时有效。

LockWAL/ UnlockWAL

对WAL加锁,解锁。上锁后flushWAL的内容。

SequenceNumber

最近转换的序列号,每次实际的key传入都会使该值加一。

SetPreserveDeletesSequenceNumber

指示数据库保留序列号> =传递的seqnum的删除。如果DBOptions.preserve_deletes设置为false,则无效。该函数假定用户使用单调递增的seqnums调用此函数(否则我们不能保证某些特定的删除操作已被处理);数据成功更新后返回true,如果用户尝试调用seqnum <=当前值,则返回false。

DisableFileDeletions

防止文件删除。 压缩将继续发生,但是不会删除任何过时的文件。调用这玩意多次和调用这玩意一次的效果是一样的。

EnableFileDeletions

允许压缩删除过时的文件。

如果force==true,则即使之前多次调用DisableFileDeletions(),对EnableFileDeletions()的调用也将确保在调用之后启用文件删除。

如果force == false,则EnableFileDeletions仅在被调用至少与DisableFileDeletions()相同的次数之后才启用文件删除,使两个线程可以同时调用两个方法而无需同步-即仅在两个线程都调用EnableFileDeletions()之后,才启用文件删除

GetLiveFiles

GetLiveFiles后跟GetSortedWalFiles可以生成无损备份

--检索数据库中所有文件的列表。

这些文件是相对于dbname的,不是绝对路径。尽管是相对路径,但文件名以" /"开头。

manifest文件的有效大小在manifest_file_size中返回。 manifest是一个不断增长的文件,但是只有manifest_file_size指定的部分对此快照有效。

将flush_memtable设置为true会在记录【recording】活动文件之前进行刷新。当我们不想等待刷新时,可以将flush_memtable设置为false,因为刷新可能需要等待压缩才能完成,需要花费不确定的时间。

如果您有多个列族,即使flush_memtable为true,您仍然需要在GetLiveFiles之后调用GetSortedWalFiles,以补偿在刷新其他列系列时到达已经刷新的列系列的新数据

GetSortedWalFiles

首先检索最早文件的所有wal文件的排序列表

GetCurrentWalFile

检索有关当前wal文件的信息

请注意,该调用之后日志可能已经滚动,在这种情况下current_log_file不会指向当前日志文件。

另外,为了优化起见,current_log_file-> StartSequence将始终设置为0

GetCreationTimeOfOldestFile

检索数据库中最旧文件的创建时间。仅当max_open_files = -1时,此API才有效,否则返回的Status为Status :: NotSupported()使用提供给数据库的环境设置文件创建时间。

如果数据库是从非常老的发行版创建的,则SST文件可能不具有file_creation_time属性,甚至在移至更新发行版之后,也有可能某些文件从未压缩过并且可能不具有file_creation_time属性。

在这两种情况下,file_creation_time都被视为0,这意味着该API将返回creation_time = 0,因为时间戳不会低于0。

GetUpdatesSince

注意:此API尚未与WritePrepared事务保持一致。

将iter设置为位于包含seq_number的写批处理中的迭代器。如果序列号不存在,则在请求的seq_no之后的第一个可用seq_no处返回迭代器。如果迭代器有效,则返回Status :: OK必须将WAL_ttl_seconds或WAL_size_limit_MB设置为较大的值才能使用此api,否则WAL文件将被积极清除,并且迭代器可能会在读取更新之前变得无效。

DeleteFile

从db目录中删除文件名,并更新内部状态以反映该状态。

---仅支持删除sst和日志文件。

--- "名称"必须是相对于db目录的路径。 例如。 000001.sst,/ archive / 000003.log

GetLiveFilesMetaData

返回所有表文件的列表及其level,开始key和结束key

GetColumnFamilyMetaData

获取数据库指定列系列的元数据,不指定列族的话会获取默认列族的元数据。

IngestExternalFile

IngestExternalFile()会将外部SST文件加载到数据库中,支持两种主要模式:

(1)新文件中的重复密钥将覆盖现有密钥(默认)

(2)重复的键将被跳过(设置为ingest_behind = true)

在第一种模式下,我们将尝试找到文件可以容纳的最低level,并将文件提取到该level。key范围与内存表key范围重叠的文件将要求我们在提取文件之前先刷新该内存表。

在第二种模式下,我们将始终在最底层level进行摄取

 另: (1) 可以使用SstFileWriter创建外部SST文件。(2) 即使文件压缩与级别压缩不匹配,我们也会尝试将文件提取到最低级别 (3) 如果将IngestExternalFileOptions-> ingest_behind设置为true,我们总是在最底层进行摄取,为此,应该保留该最低层(请参阅DBOPtions :: allow_ingest_behind标志)。

IngestExternalFiles

IngestExternalFiles()将提取多个列族的文件,并将结果自动记录到MANIFEST中。如果此函数返回OK,则必须成功完成所有列族的提取。如果此函数返回其他的,或者进程崩溃,则恢复后,非文件将被提取到数据库中。

注意,在执行此功能期间,应用程序可能会观察到混合状态。如果用户使用迭代器对列族执行范围扫描,则一个列族上的迭代器可能返回提取的数据,而另一列族上的迭代器则返回旧数据。

用户可以使用快照来获得一致的数据视图。如果您的数据库使用此API提取了多个SST文件,即args.size()> 1,则RocksDB 5.15和更早版本将无法打开它。

要求:每个arg对应于一个不同的列族:即,对于0 <= i <j <len(args),args [i] .column_family!= args [j] .column_family。

CreateColumnFamilyWithImport

CreateColumnFamilyWithImport()将使用column_family_name创建一个新的列族,并将元数据中指定的外部SST文件导入该列族。

 (1) 可以使用SstFileWriter创建外部SST文件。

 (2) 可以从现有数据库中的特定列族导出外部SST文件。

import_options中的Option指定是复制还是移动外部文件(默认为copy)。

如果选项指定复制,则在external_file_path中管理文件是调用者的责任。当option指定移动时,调用将确保成功返回时删除external_file_path中的指定文件,并且不会在任何错误返回时修改文件。返回错误时,返回的列族句柄将为nullptr。成功返回时将出现ColumnFamily,而错误返回时将不存在。在此调用过程中,任何崩溃都可能存在ColumnFamily。

AddFile

直接导入文件的方式,这种方式已经被弃用,请使用上面的方式。

GetPropertiesOfAllTables

获得所有表的特征描述

SuggestCompactRange

参数为列族名和起始的key,可以获得建议的压缩范围

StartTrace/EndTrace

开始/停止数据库的跟踪操作

StartBlockCacheTrace

EndBlockCacheTrace

开始/停止跟踪块缓存访问

GetStatsHistory

给定一个时间范围[start_time,end_time),设置一个StatsHistoryIterator来访问统计历史记录。

TryCatchUpWithPrimary

使备份尽可能的与主存同步

   至此,class DB的内容结束,下面是有关数据库的两个函数

DestroyDB

销毁指定数据库的内容。使用此方法时要非常小心。

RepairDB

如果无法打开数据库,则可以尝试调用此方法以尽可能多地修复数据库的内容。某些数据可能会丢失,因此在包含重要信息的数据库上调用此函数时要小心。使用此API,我们将警告并跳过与column_families中未指定的列系列相关的数据。

  db.h文件的内容到此结束,主要有数据库整体的各种操作,包括列族相关,节点相关,数据库基础相关,以及rocksdb特有的一些操作。另外还可以实时的查看当前数据库的运行状态,通过GetProperties获取相关返回值。最后还有一些数据库通用的操作的rocksdb版本,不得不说rocksdb的功能实现的有点全面的过分了。

 









原文转载:http://www.shaoqun.com/a/661730.html

跨境电商:https://www.ikjzd.com/

韩蓬:https://www.ikjzd.com/w/1635

epc:https://www.ikjzd.com/w/488


总  这篇是对rocksdb整体功能的分析,主要着眼点是db.h文件,对rocksdb进行代码解析,若想以整体的方式了解其功能,首先就应该解析db.h文件。对于rocksdb的db.h文件来说,且不论前面一大串结构体,该文件的核心无疑是classDB,从一百多行到一千多行,都是这个类。  本文共计七千余字,分为四个部分,分别是整体方法,属性方法,参数解析和其他。  下面对类内部进行分析,为了节约空
名人堂是什么:https://www.ikjzd.com/w/1082
patpat:https://www.ikjzd.com/w/1079
e邮包:https://www.ikjzd.com/w/594.html?source=tagwish
2019年中国卖家欧洲站的风险与机遇:https://www.ikjzd.com/home/16246
亚马逊毁了美国零售业?美国财政部长炮轰亚马逊!:https://www.ikjzd.com/home/102315
ProductBoost:https://www.ikjzd.com/w/250

印度一女子月经竟从眼睛流出,BMJ报道:罕见的代偿性月经

核心提示:这个罕见的病例在《英国医学杂志》(BMJ)上被重点报道,该研究认为,月经期间的变化、雌激素和孕酮可以增加毛细血管的通透性,导致子宫外组织充血,充血和继发性出血。

近日,印度一名25岁女子眼睛里不停冒出鲜血,也就是流血泪,但是眼睛却不疼也不痒,甚至在一系列检查后,确定她的眼睛完全没有问题。

最终在深入调查后医生发现,女子罹患的疾病不在眼部,而是"代偿性月经"。于是她在接受了三个月含雌激素和孕激素的口服避孕药的随访治疗后,便不再发生眼部出血。

BMJ

这个罕见的病例在《英国医学杂志》(BMJ)上被重点报道,该研究认为,月经期间的变化、雌激素和孕酮可以增加毛细血管的通透性,导致子宫外组织充血,充血和继发性出血。尽管确切的解剖学原因仍然相对未知,但专家认为,子宫内膜异位症或生殖器外器官中子宫内膜组织的存在可能是代偿性月经发展的一个因素。

一、代偿性月经,早已有之!

一个多世纪前就有相关病症的记录:18世纪的英国就有一个病例,患者Wilson舌头肿胀出血、喉咙肿痛、耳朵和头部疼痛,经医生诊断为"用舌头来月经"。

1838年,21岁女孩Mary Murphy,她住院观察期间少来了一次月经,不久之后双耳出血,每隔三到五天出现一次症状,每次持续几个小时。

二、什么是"代偿性月经"?

月经是在内分泌系统的周期性调节作用下,子宫内膜发生周期性变化而出现的周期性子宫出血,这是性成熟女性正常的生理现象。

而代偿性月经指的是,在女性经期或经期前后的周期性非子宫出血现象,原因可能与激素水平变化有关,激素造成黏膜血管扩张、脆性增加,容易破裂出血。

其中最常见的症状是流鼻血,还有少数情况出现眼睑、口腔、外耳道、皮肤、肺部、胃肠等部位出血,

除了给患者生活造成不便,情况严重时可能出现只有代偿性月经、没有正常月经,或者代偿性月经出血多、正常月经出血少的情况。

三、代偿性月经可能是妇科手术"后遗症"

如果来例假时你的鼻腔出血,可能是你的鼻黏膜对卵巢雌激素水平变化十分敏感,受其刺激,发生充血、肿胀,就像子宫内膜一样,当雌激素水平骤然下降时便发生出血。

但是,最要小心的是,妇科手术比如刮宫、剖腹产、子宫切除手术后出现的倒经,这可能是由于手术创伤,让子宫内膜移位到了肺部、胸膜、消化道和皮下组织等子宫以外的部位,结果,这些移位的子宫内膜与原位的子宫内膜一样受雌激素调节,发生增生、脱落,医学上称为"子宫内膜异位症"。发生这种情况,应及时去医院进行治疗。

四、代偿性月经诊断标准

1.根据表现症状:

鼻腔出血是这个病症最常见的一种表现症状,可伴随月经来潮同时发生,或只有周期性鼻腔而没有月经,

2.辅助检查

3.试验检查

代偿性月经一般要根据患者的表现症状,和肝脏类疾病区别诊断,同样要和外伤所致区别诊断的。中医上来讲这种病症的形成归属月中医上的"逆经"、"经行吐血"、"错经"的范畴,中医治疗代偿性月经是比较靠谱的选择。一般都体内虚热或者湿热所致。

即使是代偿性月经这种非常罕见的疾病,也有了更有效的诊断和治疗方法。医学的发展,给我们的生活带来了极大的便利。

参考资料:

http://fk.39.net/a/160119/4981151.html

https://www.odditycentral.com/news/rare-condition-causes-woman-to-bleed-from-her-eyes-during-period.html


https://www.ladbible.com/news/latest-woman-starts-bleeding-from-her-eyes-during-her-period-20210317

http://sloaneletters.com/tag/vicarious-menstruation/

https://www.wondersandmarvels.com/2012/03/vicarious-menstruation.html


原文转载:http://lady.shaoqun.com/a/278377.html

跨境电商:https://www.ikjzd.com/

tradeindia:https://www.ikjzd.com/w/2305

巴克莱银行:https://www.ikjzd.com/w/2775


核心提示:这个罕见的病例在《英国医学杂志》(BMJ)上被重点报道,该研究认为,月经期间的变化、雌激素和孕酮可以增加毛细血管的通透性,导致子宫外组织充血,充血和继发性出血。 近日,印度一名25岁女子眼睛里不停冒出鲜血,也就是流血泪,但是眼睛却不疼也不痒,甚至在一系列检查后,确定她的眼睛完全没有问题。最终在深入调查后医生发现,女子罹患的疾病不在眼部,而是"代偿性月经"。于是她在接受了三个月含雌激素和孕
敦煌网:https://www.ikjzd.com/w/189
拍怕网:https://www.ikjzd.com/w/2205
瀚霖:https://www.ikjzd.com/w/2345
老公出差我和领导疯狂相爱 口述在自己家出轨上司很后悔:http://www.30bags.com/m/a/250259.html
关注!俄罗斯或下调个人跨境物品免税额度!:https://www.ikjzd.com/home/112760
妈妈姐姐一起收 后妈的诱惑那晚我对着小兰姐就是【完】:http://www.30bags.com/m/a/255254.html

外媒称2021年F1中国站已取消 加拿大巴西大概率出局_大奖赛

原标题:外媒称2021年F1中国站已取消 加拿大巴西大概率出局

据西班牙媒体报道,由于加拿大站和圣保罗站承办F1大奖赛的可能性希望不大,土耳其和巴林可能会被加入到2021年的F1赛历之中,并且文章中明确指出中国大奖赛和越南站一样都被取消,而此前官方给出的说法是F1赛事会继续与中国大奖赛负责人及有关当局进行讨论,以望在本赛季晚些时候重新安排比赛时间。

由于疫情影响,创纪录设立了23场分站赛的2021赛季F1大奖赛赛历已经数次调整,譬如澳大利亚大奖赛便从3月份推迟到11月中下旬进行。文章还特别提到,中国和越南两站比赛已经被取消,在伊莫拉和波尔蒂芒的比赛将取而代之。

西班牙的Motorsport.com报道说,由于疫情影响,加拿大大奖赛和圣保罗大奖赛也可能被取消,文章原因巴西的UOL的话说:去年承办了两场F1赛事的赛道可能在2021年再次出现。

首先是土耳其大奖赛,从地理位置上来说,这样的选择很自然,在跑完阿塞拜疆大奖赛后,它将于6月13日取代加拿大大奖赛来一场"背靠背"的比赛。报道还称,F1曾经联系过伊斯坦布尔公园赛道方,希望他们能接替越南空出的5月2日档期,但由于当时正值斋月,所以拒绝了这一提议,后来由葡萄牙入替。

关于加拿大大奖赛的问题是,当地依然有入境限制,任何到达加拿大的人都必须接受14天隔离,这将导致比赛无法进行。至于原定于11月7日进行的圣保罗大奖赛,由于巴西国内疫情严重,并且有变异病毒存在,所以该国在世界大部分地区依然在旅行"红色名单"之上。所以重返巴林,在较短的"外环"赛道进行萨基尔大奖赛可能性很大。不过官方尚未对此做出明确声明。(陶朗加)返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/518738.html

跨境电商:https://www.ikjzd.com/

万色:https://www.ikjzd.com/w/2382

贝贝官网:https://www.ikjzd.com/w/1321


原标题:外媒称2021年F1中国站已取消加拿大巴西大概率出局据西班牙媒体报道,由于加拿大站和圣保罗站承办F1大奖赛的可能性希望不大,土耳其和巴林可能会被加入到2021年的F1赛历之中,并且文章中明确指出中国大奖赛和越南站一样都被取消,而此前官方给出的说法是F1赛事会继续与中国大奖赛负责人及有关当局进行讨论,以望在本赛季晚些时候重新安排比赛时间。由于疫情影响,创纪录设立了23场分站赛的2021赛季F
cares:https://www.ikjzd.com/w/1302
出口易:https://www.ikjzd.com/w/1317
一淘比价网:https://www.ikjzd.com/w/1698
出口欧洲当心!"黄背心"已经蔓延到意大利、英国、比利时等国!:https://www.ikjzd.com/home/13231
口述:出轨妻和她的情人要我放手(5/5):http://lady.shaoqun.com/m/a/103393.html
哪些产品需要CE认证?无CE认证的后果:https://www.ikjzd.com/home/118825

ASP.NET Core依赖注入初识与思考

文章首发地址

一、前言

在上一篇中,我们讲述了什么是控制反转(IoC)以及通过哪些方式实现的。这其中,我们明白了,控制反转(IoC) 是一种软件设计的模式,指导我们设计出更优良,更具有松耦合的程序,而具体的实现方式依赖注入依赖查找

在上篇实例中,我们通过日志的方式举例说明,其中通过代码创建了一个ILogger的接口,并实现接口实例,基于控制反转的模式,依赖的创建也移交到了外部,但是也发现存在了问题,如果类似存在这样多个接口和实现类,依赖太多,一一创建,没有统一的管理,这反而增加了实际工作量麻烦。

因此我们需要一个可以统一管理系统中所有的依赖的地方,因此,IoC容器诞生了。

容器负责两件事情:

  • 绑定服务与实例之间的关系
  • 获取实例,并管理实例对象生命周期(创建与销毁)

所以在这一篇中,我们主要讲述Asp.Net Core中内置的IoC容器。

二、说明

在Asp.Net Core中已经为我们集成提供了一个内置的IoC容器,我们可以看到在Startup.csConfigureServices中,涉及到依赖注入的核心组件,一个负责实例注册IServiceCollection和一个负责提供实例IServiceProvider

简单的说就是两步:1. 把实例注册到容器中;2. 从容器中获取实例

而在这其中,IServiceCollection为实现将开发者定义好的实例注册进去提供了三种方法

分别是:

AddTransientAddScopedAddSingleton

而这三种不同实例方法也对应的着三种不同的实例生命周期

三种不同的生命周期:

2.1 暂时性

AddTransient

每次在向服务容器进行请求时都会创建新的实例,这种生存期适合轻量级、 无状态的服务。

2.2 作用域内

AddScoped

在每次Web请求时被创建一次实例,生命周期横贯整次请求。

局部单例对象, 在某个局部内是同一个对象(作用域单例,本质是容器单例);一次请求内是一个单例对象,多次请求则多个不同的单例对象。

2.3 单例

AddSingleton

创建单例生命周期服务的情况如下:

  • 在首次请求它们时进行创建;
  • 或者在向容器直接提供实现实例时由开发人员进行创建。 很少用到此方法。

其后的每一个后续请求都使用同一个实例。如果开发者的应用需要单例服务情景,推荐的做法是交给服务容器来负责单例的创建和生命周期管理,而不是手动实现单例模式然后由开发者在自定义类中进行操作。

不要从单一实例解析指定了作用域的服务。 当处理后续请求时,它可能会导致服务处于不正确的状态。 可以从范围内或暂时性服务解析单一实例服务。

三、开始

3.1 接口

定义三个接口,分别测试Singleton,Scope,Transient三种,一个 TestService服务

 public interface ITransientService {   string GetGuid(); }
 public interface IScopedService {  string GetGuid(); }
 public interface ISingletonService {  string GetGuid(); }
 public interface ITestService  {  public string GetSingletonID();  public string GetTransientID();  public string GetScopedID(); }

3.2 实现

根据上面定义的几种接口,并一一实现对应的接口

 public class TransientService : ITransientService {  public string OperationId { get; }  public TransientService()  {   OperationId = Guid.NewGuid().ToString()[^4..];  }  public string GetGuid()  {   return $"这是一个 Transient service : " + OperationId;  } }
 public class ScopedService : IScopedService {  public string OperationId { get; }  public ScopedService()  {   OperationId = Guid.NewGuid().ToString()[^4..];  }  public string GetGuid()  {   return $"这是一个 scoped service : "+ OperationId;   } }
 public class SingletonService : ISingletonService {  public string OperationId { get; }  public SingletonService()  {   OperationId = Guid.NewGuid().ToString()[^4..];  }  public string GetGuid()  {   return $"这是一个 Singleton service : " + OperationId;  } }
 public class TestService : ITestService {  private ITransientService _transientService;  private IScopedService _scopedService;  private ISingletonService _singletonService;  public TestService(ITransientService transientService, IScopedService scopedService, ISingletonService singletonService)  {   _transientService = transientService;   _scopedService = scopedService;   _singletonService = singletonService;  }  public string GetSingletonID()  {   return _singletonService.GetGuid();  }  public string GetTransientID()  {   return _transientService.GetGuid();  }  public string GetScopedID()  {   return _scopedService.GetGuid();  } }

3.3 注入

Startup.cs类文件ConfigureServices方法中,注入依赖

  public void ConfigureServices(IServiceCollection services)  {   services.AddControllers();   services.AddTransient<ITransientService, TransientService>();   services.AddSingleton<ISingletonService, SingletonService>();   services.AddScoped<IScopedService, ScopedService>();   services.AddScoped<ITestService, TestService>();  }

3.4 调用

定义一个控制器,实现调用

[ApiController][Route("[controller]")]public class TestController : ControllerBase{ private ITransientService _transientService; private IScopedService _scopedService; private ISingletonService _singletonService;  private ITestService _testService; public TestController(ITransientService transientService, IScopedService scopedService, ISingletonService singletonService,  ITestService testService  ) {  _transientService = transientService;  _scopedService = scopedService;  _singletonService = singletonService;     _testService = testService; } [HttpGet] public JsonResult Get() {  var data1 = _transientService.GetGuid();  var data2 = _testService.GetTransientID();  var data3 = _scopedService.GetGuid();  var data4 = _testService.GetScopedID();  var data5 = _singletonService.GetGuid();  var data6 = _testService.GetSingletonID();  return new JsonResult(new {    data1,    data2,    data3 ,   data4,   data5,   data6,  }); }}

在上面中我们了解到,注入的方式一般有三种,构造函数注入, 方法注入,属性注入,而在ASP.NET Core中自带的这个IoC容器,默认采用了构造函数注入的方式。

3.5 测试

启动运行项目,访问接口/Test

效果如下:

3.6 对比

对比两次的请求访问可以发现,上面我们一共得到了 4个Transient实例,2个Scope实例,1个Singleton实例。

在请求中,AddSingleton方式的id值相同;

AddScope方式两次请求之间不同,但同一请求内是相同的;

AddTransient方式在同一请求内的多次注入间都不相同。

3.7小结

通过上述的代码示例,也证实了之前的三种方式对应不同生命周期的说明。

暂时性(Transient) : 生命周期是每次获得对象都是一次新的对象,每一次都不一样。

作用域内(Scoped) : 生命周期是在每一次请求作用域内是同一个对象,非作用域内则是新的对象。

单例(Singletion) : 生命周期是这个服务启动后都是一个对象,也即是全局单例对象

四、其他Ioc容器

通过上述的了解,我们知道IoC容器是一个依赖注入框架,在.NET Core中也提供了内置的IoC容器,通过AddXXX方法来实例依赖对象,而在实际开发中,就是每一个实例都需要一个个的添加,这样的实现方式在小项目中还好,但是如果在复杂大型的项目中,就略向麻烦些,可能需要添加很多方法来实现,整体的可观性也不好。

为了达到可以简化我们工作量,应该采用批量注册,因此我们也可以引入其他的Ioc容器框架,实现更多的功能和扩展。

在平时开发中,常用的IoC框架有很多,而在这里我们选择用Autofac,这也是在.net下比较流行的,其他的框架不做说明,可自行查阅了解。

ASP.Net Core中使用Autofac 框架注入 (在后续篇章会具体说明)

五、思考

在实际的开发中,对于这几种生命周期,我们应该如何应用呢?

比如,在像DBContext这种实例,在实际开发中是用Transient 还是Scoped呢?

建议使用Scoped

因为有些对象在请求中可以需要用到多个方法或者多个Service、Repository的时候,为了减少实例初始化的消耗,实现事务功能,可以在整个请求的生命周期共用一个Scope。

其他的思考:

  1. ASP.NET Core中,默认采用了构造函数注入的方式,如果采用属性注入或者方法注入,又该怎么实现?
  2. 一个接口多种实现的时候,我们将多种实现都给注入进了依赖注入容器中,但是在服务调用的时候总是获取到最后注入的那个方法的实现,这时候就在想能不能实现动态的选择使用哪种实现呢?
  3. 一个作用域(Scoped)服务中注入一个瞬时(Transient)服务时,瞬时服务中的值还会每次都变化吗?
  4. 链式注入时,生存期的选择,三种注入方式的权重问题

以上的思考,大家可以说说自己的想法

在后续的篇章中,也会对这些问题,进行深入讨论说明。

六、总结

本篇主要介绍了什么是IoC容器,了解到它是DI构造函注入的框架,它管理着依赖项的生命周期以及映射关系,同时也介绍实践了在ASP.Net Core中,默认提供的内置IoC容器,以及它的实例注册方式和相应的生命周期。

好啦,这篇文章就先讲述到这里吧,在后续篇章中会对ASP.Net Core中使用Autofac 框架实践说明,希望对大家有所帮助。

如果有不对的或不理解的地方,希望大家可以多多指正,提出问题,一起讨论,不断学习,共同进步。🤣









原文转载:http://www.shaoqun.com/a/659732.html

跨境电商:https://www.ikjzd.com/

bol:https://www.ikjzd.com/w/291

wish:https://www.ikjzd.com/w/105


文章首发地址一、前言在上一篇中,我们讲述了什么是控制反转(IoC)以及通过哪些方式实现的。这其中,我们明白了,控制反转(IoC)是一种软件设计的模式,指导我们设计出更优良,更具有松耦合的程序,而具体的实现方式有依赖注入和依赖查找。在上篇实例中,我们通过日志的方式举例说明,其中通过代码创建了一个ILogger的接口,并实现接口实例,基于控制反转的模式,依赖的创建也移交到了外部,但是也发现存在了问题,
夸克:https://www.ikjzd.com/w/1237
启明星:https://www.ikjzd.com/w/1436
promoted:https://www.ikjzd.com/w/971
亚马逊黄金日购物意愿降低?电子商务整体搜索量下降84%:https://www.ikjzd.com/home/132109
贱闺蜜大闹婚礼抢走我老公:http://www.30bags.com/m/a/252181.html
乡村美娘子对我实在太好了 口述我和农村小媳妇的那些事:http://www.30bags.com/m/a/250728.html

欧文准三双阿德首秀11+9+6 篮网擒黄蜂迎4连胜_篮板

原标题:欧文准三双阿德首秀11+9+6 篮网擒黄蜂迎4连胜

北京时间4月2日消息,凯里-欧文贡献15分11篮板和8助攻,阿尔德里奇首秀贡献11分9篮板6助攻,篮网队主场以111-89击败黄蜂队,篮网迎来4连胜。值得一提的是,凯文-杜兰特因为腿筋伤势继续休战,詹姆斯-哈登也因腿筋伤势缺席今日比赛。

四节具体比分为(黄蜂在场):11-32,37-36,17-24,24-19。

黄蜂:特里-罗齐尔12分,戈登-海沃德13分,德文特-格拉汉姆13分,蒙克11分,布里奇斯10分

篮网:布鲁斯-布朗14分6篮板,拉马库斯-阿尔德里奇11分9篮板6助攻2抢断,杰夫-格林21分8篮板,约翰逊15分,沙梅特17分

新援阿尔德里奇今日迎来加盟篮网队首秀,并以首发中锋的身份出战。阿尔德里奇上来就摘下一个篮板,几个回合之后又奉出一记精彩抢断。7分31秒,阿尔德里奇篮下造成华盛顿防守犯规,2罚全中,这也是加盟篮网生涯首次得分,篮网取得13-4完美开局。罗齐尔的上篮以及华盛顿的三分仍无法阻挡篮网攻势,在该节最后4分半钟时间内,黄蜂仅仅打入一球,篮网趁机打出一波15-2进攻高潮,首节战罢,篮网以32-11领先。黄蜂首节命中率仅为17.4%(23中4),三分球命中率为10%(10中1)。

次节,阿尔德里奇带队与黄蜂展开激烈交锋,8分55秒,阿尔德里奇外线稳稳投进一记三分,射落了自己篮网生涯的首个运动战进球。凭借一波15-8进攻高潮,篮网将比分改写成47-18。黄蜂众将士开始反击,连续4记三分入网后,将比分追至32-54。看到阿尔德里奇如此迅速融入到球队中后,没有顾虑的欧文开始了自己万花筒般进攻,在其带领下篮网牢牢掌控场上局势,半场战罢,篮网以68-48领先。

异地再战,篮网上来就是一波16-4进攻高潮,将比分改写成84-52。格拉汉姆的三分球帮助黄蜂队打破得分荒,但篮网将士们仍不依不饶,4分21秒,格林飙中个人本场第5记三分,篮网将领先优势扩大到31分之多。尽管罗齐尔三分命中,海沃德也连续打入两球,但三节战罢,黄蜂仍以65-92落后。

末节,黄蜂一波10-0攻势过后,将比分追至75-92。关键时刻,阿尔德里奇转身抛投命中,随后又助攻哈里斯射中三分。7分43秒,约翰逊三分得手,篮网将优势扩大到20分。6分50秒,蒙克突破上篮下落时不慎扭到右脚踝,随后被队友搀扶返回更衣室。4分26秒,欧文助攻沙梅特射中三分,篮网将比分改写成103-82,随后双方将主力核心换下,比赛进入练兵时间。

双方首发阵容

黄蜂:特里-罗齐尔,戈登-海沃德,德文特-格拉汉姆,俾斯麦-比永博,PJ-华盛顿

篮网:凯里-欧文,乔-哈里斯,布鲁斯-布朗,拉马库斯-阿尔德里奇,杰夫-格林

(晨晨)返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/517745.html

跨境电商:https://www.ikjzd.com/

parenthood:https://www.ikjzd.com/w/2497

壹米滴答:https://www.ikjzd.com/w/2314


原标题:欧文准三双阿德首秀11+9+6篮网擒黄蜂迎4连胜北京时间4月2日消息,凯里-欧文贡献15分11篮板和8助攻,阿尔德里奇首秀贡献11分9篮板6助攻,篮网队主场以111-89击败黄蜂队,篮网迎来4连胜。值得一提的是,凯文-杜兰特因为腿筋伤势继续休战,詹姆斯-哈登也因腿筋伤势缺席今日比赛。四节具体比分为(黄蜂在场):11-32,37-36,17-24,24-19。黄蜂:特里-罗齐尔12分,戈登-
二类电商:https://www.ikjzd.com/w/1457
慧聪集团:https://www.ikjzd.com/w/1836
网易考拉海购大促:https://www.ikjzd.com/w/1052
我爱上了公司的总裁 情感口述那晚老板和我最后的道别:http://www.30bags.com/a/250796.html
我和小姨子在家偷欢:http://www.30bags.com/m/a/249636.html
传统电商模式PK创新电商模式,谁是跨境电商人的首选?:https://www.ikjzd.com/home/21234

怎么让女人在性生活中爽翻天?这些性爱技巧很关键

进行性生活时,你是否掌握了良好的性技术和性姿势,或许你和他总是发现不变的性技术,长时间累了,没有新鲜感,长时间没有热情。因此,一些床上性爱技巧必须由男女学习。

1、疯狂不暴力

有些男性平时文质高雅,温柔,一到床就判断两人。出乎意料的是,在男性暴力倾向中,女性窥视着他内心的残忍、不健全、极度的自卑感。她认识到男性骨子里不为人知的一面,这种感觉给她带来的不安感,在将来的某种情况下,会引起男性意想不到的家庭内战。

所以,应该让世界各地的男性知道,女性在琐碎的家庭生活中,在忘记爱情的性气氛中,她的骨子里憧憬着安全和美丽。她们需要童话和诗,温柔的力量,男性精神上的无限高贵和平静的态度。

因为爱,爱情之间的尊敬和欣赏,即使是温柔的爱抚,热情的火焰也会燃烧在彼此的心中。

2、睁开眼睛纠缠

尽管很多恋人白天爱死了,但突然泪水相对,突然深深地凝视着,到了晚上就不肯睁开眼睛,享受对方脸上细微的表情和呼吸的律动。

出乎意料的是,在黑暗中,恋人的眼睛不会因为你的唯一存在而撒谎。爱人的对视,不仅能让双方感受到身体的依赖,还能感受到彼此心灵的真挚交流和海枯石烂般的忠贞爱情。

不断探索,知道浅的手比不得不说我的兴奋点离你抚摸的地方还有5厘米更有意义吗?

因为爱在心里,眼睛也有表情。学会让你的眼睛表达爱。只有眼睛里的钱的深情和温柔,才能呼唤恋人灵魂深处最真挚的渴望。

3、赞美他(她)身体最美的部分

爱的人有多少俊男美女,性感妖冶,浪漫?大部分只是平凡的男女!但是,爱可以让我们在恋人身上找到他(她)美丽的地方,不要吝啬你的赞美,你的赞美可以激发对方水般的爱。


原文转载:http://lady.shaoqun.com/a/277356.html

跨境电商:https://www.ikjzd.com/

焦点科技:https://www.ikjzd.com/w/1831

csa:https://www.ikjzd.com/w/904


进行性生活时,你是否掌握了良好的性技术和性姿势,或许你和他总是发现不变的性技术,长时间累了,没有新鲜感,长时间没有热情。因此,一些床上性爱技巧必须由男女学习。1、疯狂不暴力有些男性平时文质高雅,温柔,一到床就判断两人。出乎意料的是,在男性暴力倾向中,女性窥视着他内心的残忍、不健全、极度的自卑感。她认识到男性骨子里不为人知的一面,这种感觉给她带来的不安感,在将来的某种情况下,会引起男性意想不到的家庭
心怡:https://www.ikjzd.com/w/1327
递四方:https://www.ikjzd.com/w/1066
auction:https://www.ikjzd.com/w/2311
纯干货!速卖通产品上新技巧与快速出单的方法:https://www.ikjzd.com/home/132123
迫于威胁 当保姆沦为了小三:http://www.30bags.com/m/a/252845.html
Shopee单个上传产品:https://www.ikjzd.com/w/2638

人类历史上最大规模的疫苗免疫计划,多国提出“群体免疫”时间表

核心提示:群体免疫不等于根除感染,防控不能大意,自身防护不可松懈。

3月29日,国家卫健委发布了第一版《新冠疫苗接种技术指南》,标志着我国疫苗全民接种正式大规模展开。目前,全球接种疫苗5.64亿剂,其中美国接种1.458亿剂,中国接种1.109亿剂,欧盟接种6981万剂,印度接种6111万剂,英国接种3412万剂。

全球疫苗接种状况.

在全球多款新冠疫苗研制成功之时,关于疫苗采购分配的问题也随之而来:初期的疫苗产量远不能满足需求时,谁应该最先接种?许多经济发展水平较低的国家如何能够获得疫苗?来自全球疫苗免疫联盟(Gavi)、世界卫生组织(WHO)和流行病防范创新联盟(CEPI)牵头建立了多边机制"新冠肺炎疫苗实施计划"(COVAX),以提高疫苗研制效率,为疫苗快速生产和大量、公平地普及奠定基础。该计划预计在2021年年底前在全球范围内提供至少20亿剂安全有效的新冠疫苗。2020年10月8日,中国同全球疫苗免疫联盟签署协议,正式加入COVAX机制。目前COVAX机制已有186个经济体加入。

然而,根世卫组织总干事谭德塞29日称,富裕国家支配的新冠疫苗数量与贫穷国家通过疫苗全球获取机制获得的疫苗数量的差距每天都在拉大,目前仍有36个国家尚未收到任何疫苗。根据相关统计,现在占世界人口16%的富裕国家拥有了全球60%的疫苗。

3月30日,据人民日报报道,外交部发言人华春莹主持例行记者表示,疫苗是抗击病毒的利器,也是拯救生命的希望,它是应当服务于全世界、造福全人类的。中国已经加入了世卫组织新冠疫苗实施计划,明确承诺首批提供1000万剂疫苗用于发展中国家急需。我们目前也正在向80个国家和三个国际组织提供疫苗援助,同时向40多个国家出口疫苗,从10多个国家开展疫苗的研发和生产合作。

在过去1-2个月中,随着疫苗的全面接种,新冠病例死亡人数在下降,预计在未来很可能会看到社会经济生活的许多方面恢复到大流行前的正常状态。在第三季度更有可能出现群体免疫,但由于各国/地区等不同因素的影响,群体免疫时间将会延长。

对于欧盟来说,疫苗的接种是结束新冠大流行最大的驱动力。相比于英国和美国,大流行的终结可能会晚一点。现在看来疫苗供应可以在6月前为68%的成年人接种。导致延迟的原因可能有以下几个原因:与英国和美国不同的是,对欧盟来说,季节性可能会对其影响更大。公众对疫苗接种的兴趣明显低于其他国家,但现在可能正在提高。同时,更具感染性的B.1.1.7变体的流行程度因国家/地区而异。

值得注意的是,如果牛津-阿斯利康疫苗因担心血液凝块而在多个国家暂停使用,这种情况将有所改变并进一步延迟。世卫组织已确认继续支持该疫苗。

尽管欧盟,英国和美国在COVID-19方面所面对的挑战大致相似,但世界其他国家/地区看起来却大不相同。导致这种差异的原因可能有以下几个因素:

第一个因素是季节性。季节性驱动的变化发生的时间在热带地区和南半球会有所不同。诸多研究显示,新冠病毒的活性跟季度密切相关,秋冬气温下降,病毒活性升高,造成疫情在秋冬季节的必然反复。不过,随着人类应对新冠疫情经验的不断积累,死亡率已在下降,所以不必像第一波疫情出现时那么担忧。

第二个因素是疫苗接种人群。虽然许多低收入国家的年轻人口导致与COVID-19相关的死亡率降低,但在19岁以下的人群当中很难实现群体免疫。强生的一次注射疫苗似乎对严重的COVID-19十分有效,并于2月27日在美国获得了紧急使用授权。Novavax的疫苗目前处于III期试验中;初步结果表明,它在英国非常有效,但在南非却不那么有效。越来越清楚的是,英国和美国到第二季度末将有足够的剂量为所有成年人接种疫苗,欧洲应该在第三季度末达到相同的里程碑,前提是没有主要疫苗被撤回。

目前,针对6个月以上婴儿以及12岁以上儿童的疫苗试验正在进行中,这将增加可能有助于群体免疫的人。同时,新一轮COVID-19治疗药物正在紧急使用授权,这些治疗方法产生的新数据表明,有可能从根本上减少确诊病例的住院和死亡人数,从而加速向正常状态的过渡。

第三个因素是公众对疫苗的情绪问题。因为问题疫苗事件,公众对恐慌、愤怒情绪不断蔓延,对疫苗本身产生不信任感,对接种疫苗有了排斥情绪。官方与民间的信息沟通不畅会引发网民对政府和媒体的失望。

第四个因素是病毒变体的不可控性。据日本共同社29日晚消息,英国相关机构调查后获悉,在英国发现的变异新冠病毒已扩散至全球100多个国家。而在南非和巴西发现的变异新冠病毒合计在约120个国家出现。全球约20个国家已同时出现这3种变异新冠病毒。世界各国都在推进新冠疫苗接种工作。但随着各国不断发现变异新冠病毒,许多声音质疑目前的疫苗是否有效。现在,各家大型制药公司都在紧急推动疫苗改良工作。


第五个因素是也是最重要的,获得疫苗是不平等的。尽管WHO提倡缩小不公平疫苗分配,但许多低收入国家可能要到2022年才能获得足够的剂量为所有成年人接种疫苗。 到2021年底,世界正在为全球80%的人口(或接近100%的成年人口)制造足够的剂量,但是这些剂量的分布可能仍会不对称。

综上,考虑到不同地域的群体免疫的可能时间,以及疫苗保护的持续时间(免疫反应的持续时间和效力与新变种)的不确定性,仍需要采取无限期地隔离措施,如加强型疫苗,物理隔离等。另外,群体免疫不等于根除感染,即使达到了群体免疫力,也可能需要持续的监测、加强型疫苗和其他潜在的措施。根据目前形势来看,疫情还有愈演愈烈的趋势,某些国家、地区虽然疫情已经得到控制,但还有随时再度复发的可能。我们要准备应对病毒常态化与不确定性,大规模筛查后仍然存在漏网之鱼,全球再次拉起警报。因此,疫情防控不能大意,自身防护不可松懈。

以上内容仅授权39健康网独家使用,未经版权方授权请勿转载。

原文转载:http://health.shaoqun.com/a/214135.html

跨境电商:https://www.ikjzd.com/

马士基集团:https://www.ikjzd.com/w/1296

e票联:https://www.ikjzd.com/w/1452


核心提示:群体免疫不等于根除感染,防控不能大意,自身防护不可松懈。 3月29日,国家卫健委发布了第一版《新冠疫苗接种技术指南》,标志着我国疫苗全民接种正式大规模展开。目前,全球接种疫苗5.64亿剂,其中美国接种1.458亿剂,中国接种1.109亿剂,欧盟接种6981万剂,印度接种6111万剂,英国接种3412万剂。全球疫苗接种状况.在全球多款新冠疫苗研制成功之时,关于疫苗采购分配的问题也随之而来:
promoted:https://www.ikjzd.com/w/971
hunter:https://www.ikjzd.com/w/992
丰趣海淘:https://www.ikjzd.com/w/1716
新婚夜 我错把小姨子拉进了洞房:http://lady.shaoqun.com/a/272395.html
【今日外贸】速卖通"家居风"卫衣搜索量暴涨1660%!Aachoae销量猛增。:https://www.ikjzd.com/home/140744
Facebook老产品广告投不动了怎么办?来看看这个小技巧 :https://www.ikjzd.com/home/106152

2021年4月1日星期四

复活节产品销量飙升3000%!这些商品需求大涨!

4月4日,基督徒客户们将迎来全年最重要的节日之一复活节。其重要性甚至还超过了圣诞节,因为它代表着重生和希望。这是为了纪念耶稣基督身体复活而设立的一个节日。

四分之三的人说复活节是他们与家人和朋友在数月来的首次户外相聚。五分之三的人表示,他们计划在户外举办复活节活动,而五分之四的人表示,任何天气都无法阻止他们在户外举办派对的计划。

消费者希望让这个复活节周末成为一个值得纪念的庆祝活动,导致复活节的相关用品销量在近日内大增

连锁超市Sainsbury's表示:"与去年同期相比,其网站上复活节树的搜索量激增了97%,复活节装饰品的搜索量上升了948%。"而在线家居用品商店Wayfair称,本月白色人造圣诞树的搜索量比去年3月份增加了175%

M&S表示:"虽然复活节彩蛋的销量比去年增长了86%,但其平台的其他复活节礼品的销量同比增长了3000%。"


复活节作为西方国家的一大节日,抓住这一时间节点,了解消费者心理,有望实现爆单。

受疫情影响,51%的消费者计划购买食品作为复活节礼物,而在美国消费者复活节礼物清单中,衣服、配饰、珠宝和电子产品相比往年都有-2%到-9%的下降。

调查显示,最受欢迎的商品是糖果,受访者表明,因为它跨越了年龄,性别和可支配收入的范畴。

与情人节相似,复活节销售也是由糖果推动的。不管是巧克力味复活节兔子、还是吉百利乳酪鸡蛋、橡皮软糖、或各种品牌经典系列糖果,庆祝复活节的人们会购买大量糖果。

卖家可以考虑采购各种各样的糖果,比如:

·Marshmallow Peeps棉花糖

·巧克力

·软心豆粒汤

·鸡蛋外形糖果

·热门糖果品牌(比如Reese's、Haribo、Tootsie Pops)推出的复活节糖果系列

·橡胶软糖和咀嚼类糖果(比如甘草糖)

除了糖果,还有复活节其他一些相关的产品,比如复活树,还有一些装饰物等等,都是销量很高的。

卖家们在针对复活节的选品时,也可以更多考虑年轻购物者的消费喜好。例如玩具、游戏、有趣服饰等可能更会受消费者欢迎的产品。当然卖家还可以考虑准备复活节所需要的一些其他装饰品包括节日艺术品和手工艺品。



文章来源:https://www.ikjzd.com/home/143696

跨境电商:https://www.ikjzd.com/

isbn:https://www.ikjzd.com/w/174

6pm:https://www.ikjzd.com/w/317

环球易购:https://www.ikjzd.com/w/1034

复活节产品销量飙升3000%!这些商品需求大涨!

4月4日,基督徒客户们将迎来全年最重要的节日之一复活节。其重要性甚至还超过了圣诞节,因为它代表着重生和希望。这是为了纪念耶稣基督身体复活而设立的一个节日。

Hashtable 渐渐被人们遗忘了,只有面试官还记得,感动

Hashtable 是 fail-safe 机制? 别再被误导了

🎓 尽人事,听天命。博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号 @ 飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步

🎁 本文已收录于 「CS-Wiki」Gitee 官方推荐项目,现已累计 1.5k+ star,致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习

🍉 如果各位小伙伴春招秋招没有拿得出手的项目的话,可以参考我写的一个项目「开源社区系统 Echo」Gitee 官方推荐项目,目前已累计 600+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。公众号后台回复 Echo 可以获取配套教程,目前尚在更新中


本来准备这篇文章一口气写完 HashtableConcurrentHashMap 的,后来发现 Hashtable 就已经很多了,考虑各位的阅读体验,所以 ConcurrentHashMap 就放在下篇文章吧。

OK,继续上篇文章 HashMap 这套八股,不得背个十来遍? 最后提出的问题来讲:

1. 如何保证 HashMap 线程安全?

一般有三种方式来代替原生的线程不安全的 HashMap

1)使用 java.util.Collections 类的 synchronizedMap 方法包装一下 HashMap,得到线程安全的 HashMap,其原理就是对所有的修改操作都加上 synchronized。方法如下:

public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m) 

2)使用线程安全的 Hashtable 类代替,该类在对数据操作的时候都会上锁,也就是加上 synchronized

3)使用线程安全的 ConcurrentHashMap 类代替,该类在 JDK 1.7 和 JDK 1.8 的底层原理有所不同,JDK 1.7 采用数组 + 链表存储数据,使用分段锁 Segment 保证线程安全;JDK 1.8 采用数组 + 链表/红黑树存储数据,使用 CAS + synchronized 保证线程安全。

不过前两者的线程并发度并不高,容易发生大规模阻塞,所以一般使用的都是 ConcurrentHashMap,他的性能和效率明显高于前两者。

2. synchronizedMap 具体是怎么实现线程安全的?

这个问题应该很容易被大家漏掉吧,面经中也确实不常出现,也没啥好问的。不过为了保证知识的完整性,这里还是解释一下吧。

一般我们会这样使用 synchronizedMap 方法来创建一个线程安全的 Map:

Map m = Collections.synchronizedMap(new HashMap(...));

Collections 中的这个静态方法 synchronizedMap 其实是创建了一个内部类的对象,这个内部类就是 SynchronizedMap。在其内部维护了一个普通的 Map 对象以及互斥锁 mutex,如下图所示:

可以看到 SynchronizedMap 有两个构造函数,如果你传入了互斥锁 mutex 参数,就使用我们自己传入的互斥锁。如果没有传入,则将互斥锁赋值为 this,也就是将调用了该构造函数的对象作为互斥锁,即我们上面所说的 Map。

创建出 SynchronizedMap 对象之后,通过源码可以看到对于这个对象的所有操作全部都是上了悲观锁 synchronized 的:

由于多个线程都共享同一把互斥锁,导致同一时刻只能有一个线程进行读写操作,而其他线程只能等待,所以虽然它支持高并发,但是并发度太低,多线程情况下性能比较低下。

而且,大多数情况下,业务场景都是读多写少,多个线程之间的读操作本身其实并不冲突,所以SynchronizedMap 极大的限制了读的性能。

所以多线程并发场景我们很少使用 SynchronizedMap

3. 那 Hashtable 呢?

SynchronizedMap 一样,Hashtable 也是非常粗暴的给每个方法都加上了悲观锁 synchronized,我们随便找几个方法看看:

4. 除了这个之外 Hashtable 和 HashMap 还有什么不同之处吗?

Hashtable 是不允许 key 或 value 为 null 的,HashMap 的 key 和 value 都可以为 null !!!

先解释一下 Hashtable 不支持 null key 和 null value 的原理:

如果我们 put 了一个 value 为 null 进入 Map,Hashtable 会直接抛空指针异常:

2)如果我们 put 了一个 key 为 null 进入 Map,当程序执行到下图框出来的那行代码时就会抛出空指针异常,因为 key 为 null,我们拿了一个 null 值去调用方法:

OK,讲完了 Hashtable,再来解释一下 HashMap 支持 null key 和 null value 的原理:

1)HashMap 相比 Hashtable 做了一个特殊的处理,如果我们 put 进来的 key 是 null,HashMap 在计算这个 key 的 hash 值时,会直接返回 0:

也就是说 HashMap 中 key为 null 的键值对的 hash 为 0。因此一个 HashMap 对象中只会存储一个 key 为 null 的键值对,因为它们的 hash 值都相同。

2)如果我们 put 进来的 value 是 null,由于 HashMap 的 put 方法不会对 value 是否为 null 进行校验,因此一个 HashMap 对象可以存储多个 value 为 null 的键值对:

不过,这里有个小坑需要注意,我们来看看 HashMap 的 get 方法:

如果 Map 中没有查询到这个 key 的键值对,那么 get 方法就会返回 null 对象。但是我们上面刚刚说了,HashMap 里面可以存在多个 value 为 null 的键值对,也就是说,通过 get(key) 方法返回的结果为 null 有两种可能:

  • HashMap 中不存在这个 key 对应的键值对
  • HashMap 中这个 key 对应的 value 为 null

因此,一般来说我们不能使用 get 方法来判断 HashMap 中是否存在某个 key,而应该使用 containsKey 方法。

5. 那到底为什么 Hashtable 不允许 key 和 value 为 null 呢?为什么这么设计呢?

不止是 Hashtable 不允许 key 为 null 或者 value 为 null,ConcurrentHashMap 也是不允许的。作为支持并发的容器,如果它们像 HashMap 一样,允许 null key 和 null value 的话,在多线程环境下会出现问题。

假设它们允许 null key 和 null value,我们来看看会出现什么问题:当你通过 get(key) 获取到对应的 value 时,如果返回的结果是 null 时,你无法判断这个 key 是否真的存在。为此,我们需要调用 containsKey 方法来判断这个 key 到底是 value = null 还是它根本就不存在,如果 containsKey 方法返回的结果是 true,OK,那我们就可以调用 map.get(key) 获取 value。

上面这段逻辑对于单线程的 HashMap 当然没有任何问题。在单线程中,当我们得到的 value 是 null 的时候,可以用 map.containsKey(key) 方法来区分二义性。

但是!由于 HashtableConcurrentHashMap 是支持多线程的容器,在调用 map.get(key) 的这个时候 map 对象可能已经不同了。

我们假设此时某个线程 A 调用了 map.get(key) 方法,它返回为 value = null 的真实情况就是因为这个 key 不能存在。当然,线程 A 还是会按部就班的继续用 map.containsKey(key),我们期望的结果是返回 false。

但是,在线程 A 调用 map.get(key) 方法之后,map.containsKey 方法之前,另一个线程 B 执行了 map.put(key,null) 的操作。那么线程 A 调用的 map.containsKey 方法返回的就是 true 了。这就与我们的假设的真实情况不符合了。

所以,出于并发安全性的考虑HashtableConcurrentHashMap 不允许 key 和 value 为 null。

6. Hashtable 和 HashMap 的不同点说完了吗?

除了 Hashtable 不允许 null key 和 null value 而 HashMap 允许以外,它俩还有以下几点不同:

1)初始化容量不同HashMap 的初始容量为 16,Hashtable 初始容量为 11。两者的负载因子默认都是 0.75;

2)扩容机制不同:当现有容量大于总容量 * 负载因子时,HashMap 扩容规则为当前容量翻倍,Hashtable 扩容规则为当前容量翻倍 + 1;

3)迭代器不同:首先,HashtableHashMap 有一个相同的迭代器 Iterator,用法:

Iterator iterator = map.keySet().iterator();

HashMap 的 Iterator 是 快速失败 fail-fast 的,那自然 Hashtable 的 Iterator 也是 fail-fast 的。Hashtable 是 fail-fast 机制这点很明确,JDK 1.8 的官方文档就是这么写的:

但是!!!Hashtable 还有另外一个迭代器 Enumeration,这个迭代器是 失败安全 fail-safe 的。网络上很多博客提到 Hashtable 就说它是 fail-safe 的,这是不正确的、是存在歧义的!

7. 介绍下 fail-safe 和 fail-fast 机制

fail-safe 和 fail-fast 是一种思想,一种机制,属于系统设计范畴,并非 Java 集合所特有,各位如果熟悉 Dubbo 的话,一定记得 Dubbo 的集群容错策略中也有这俩。

当然,这两种机制在 Java 集合和 Dubbo 中的具体表现肯定是不一样的,本文我们就只说在 Java 集合中,这两种机制的具体表现。

1)快速失败 fail-fast:一种快速发现系统故障的机制。一旦发生异常,立即停止当前的操作,并上报给上层的系统来处理这些故障。

举一个最简单的 fail-fast 的例子:

这样做的好处就是可以预先识别出一些错误情况,一方面可以避免执行复杂的其他代码,另外一方面,这种异常情况被识别之后也可以针对性的做一些单独处理。

java.util 包下的集合类都是 fail-fast 的,比如 HashMapHashTable,官方文档是这样解释 fail-fast 的:

The iterators returned by all of this class's "collection view methods" are fail-fast: if the map is structurally modified at any time after the iterator is created, in any way except through the iterator's own remove method, the iterator will throw a ConcurrentModificationException. Thus, in the face of concurrent modification, the iterator fails quickly and cleanly, rather than risking arbitrary, non-deterministic behavior at an undetermined time in the future.

大体意思就是说当 Iterator 这个迭代器被创建后,除了迭代器本身的方法 remove 可以改变集合的结构外,其他的因素如若改变了集合的结构,都将会抛出 ConcurrentModificationException 异常。

所谓结构上的改变,集合中元素的插入和删除就是结构上的改变,但是对集合中修改某个元素并不是结构上的改变。我们以 Hashtable 来演示下 fail-fast 机制抛出异常的实例:

分析下这段代码:第一次循环遍历的时候,我们删除了集合 key = "a" 的元素,集合的结构被改变了,所以第二次遍历迭代器的时候,就会抛出异常。

另外,这里多提一嘴,使用 for-each 增强循环也会抛出异常,for-each 本质上依赖了 Iterator。

OK,我们接着往下看官方文档:

Note that the fail-fast behavior of an iterator cannot be guaranteed as it is, generally speaking, impossible to make any hard guarantees in the presence of unsynchronized concurrent modification. Fail-fast iterators throw ConcurrentModificationException on a best-effort basis. Therefore, it would be wrong to write a program that depended on this exception for its correctness: the fail-fast behavior of iterators should be used only to detect bugs.

意思就是说:迭代器的 fail-fast 行为是不一定能够得到 100% 得到保证的。但是 fail-fast 迭代器会做出最大的努力来抛出 ConcurrentModificationException。因此,程序员编写依赖于此异常的程序的做法是不正确的。迭代器的 fail-fast 行为应该仅用于检测程序中的 Bug。

2)失败安全 fail-safe:在故障发生之后会维持系统继续运行。

顾名思义,和 fail-fast 恰恰相反,当我们对集合的结构做出改变的时候,fail-safe 机制不会抛出异常

java.util.concurrent 包下的容器都是 fail-safe 的,比如 ConcurrentHashMap,可以在多线程下并发使用,并发修改。同时也可以在 for-each 增强循环中进行 add/remove

不过有个例外,那就是 java.util.Hashtable,上面我们说到 Hashtable 还有另外一个迭代器 Enumeration,这个迭代器是 fail-safe 的。

HashTable 中有一个 keys 方法可以返回 Enumeration 迭代器:

至于为什么 fail-safe 不会抛出异常呢,这是因为,当集合的结构被改变的时候,fail-safe 机制会复制一份原集合的数据,然后在复制的那份数据上进行遍历。因此,虽然 fail-safe 不会抛出异常,但存在以下缺点:

  • 不能保证遍历的是最新内容。也就是说迭代器遍历的是开始遍历那一刻拿到的集合拷贝,在遍历期间原集合发生的修改迭代器是不知道的;
  • 复制时需要额外的空间和时间上的开销。

8. 讲讲 fail-fast 的原理是什么

从源码我们可以发现,迭代器在执行 next() 等方法的时候,都会调用 checkForComodification 这个方法,查看 modCount 和 expectedModCount 是否相等,如果不相等则抛出异常终止遍历,如果相等就返回遍历。

expectedModcount 这个值在对象被创建的时候就被赋予了一个固定的值即 modCount,也就是说 expectedModcount 是不变的,但是 modCount 在我们对集合的元素的个数做出改变(删除、插入)的时候会被改变(修改操作不会)。那如果在迭代器下次遍历元素的时候,发现 modCount 这个值发生了改变,那么走到这个判断语句时就会抛出异常。

🎉 关注公众号 | 飞天小牛肉,即时获取更新

  • 博主东南大学硕士在读,利用课余时间运营一个公众号『 飞天小牛肉 』,2020/12/29 日开通,专注分享计算机基础(数据结构 + 算法 + 计算机网络 + 数据库 + 操作系统 + Linux)、Java 基础和面试指南的相关原创技术好文。本公众号的目的就是让大家可以快速掌握重点知识,有的放矢。希望大家多多支持哦,和小牛肉一起成长 😃
  • 并推荐个人维护的开源教程类项目: CS-Wiki(Gitee 推荐项目,现已累计 1.5k+ star), 致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习 ~ 😊
  • 如果各位小伙伴春招秋招没有拿得出手的项目的话,可以参考我写的一个项目「开源社区系统 Echo」Gitee 官方推荐项目,目前已累计 600+ star,基于 SpringBoot + MyBatis + MySQL + Redis + Kafka + Elasticsearch + Spring Security + ... 并提供详细的开发文档和配套教程。公众号后台回复 Echo 可以获取配套教程,目前尚在更新中。








原文转载:http://www.shaoqun.com/a/656736.html

跨境电商:https://www.ikjzd.com/

邮政电话:https://www.ikjzd.com/w/202

新蛋:https://www.ikjzd.com/w/79


Hashtable是fail-safe机制?别再被误导了🎓尽人事,听天命。博主东南大学硕士在读,热爱健身和篮球,乐于分享技术相关的所见所得,关注公众号@飞天小牛肉,第一时间获取文章更新,成长的路上我们一起进步🎁本文已收录于「CS-Wiki」Gitee官方推荐项目,现已累计1.5k+star,致力打造完善的后端知识体系,在技术的路上少走弯路,欢迎各位小伙伴前来交流学习🍉如果各位小伙伴春招秋招没
tenso:https://www.ikjzd.com/w/1552
丰趣海淘:https://www.ikjzd.com/w/1716
c79:https://www.ikjzd.com/w/1016
周旋在四角恋中生活更精彩?:http://www.30bags.com/m/a/253884.html
口述我和男邻居的婚外情故事 我竟然背着丈夫做了糊涂事:http://lady.shaoqun.com/a/270100.html
老师晚上求我桶她 老师好大好深啊把腿开开:http://www.30bags.com/m/a/249805.html

健康的减肥餐怎么吃:三个限制,一个适量

核心提示:多数人胖,就是因为吃的太多,但是不吃又很难受,小编想说如果你吃对食物了,根本不担心胖的。

想要减肥成功,不一定不吃东西,只要搭配的合理,一样让你放心瘦下去,今天这篇文章就帮你get吃的问题。


减脂餐的5大技巧:

1、限制总能量:

要逐渐降低能量的摄入,同时辅助适量的体力活动。成年的轻度肥胖者,每月体重减轻0.5kg~1.0kg为宜,即每天减少125kcal~250kcal的能量摄入。成年中度以上的肥胖者每月体重减轻2 kg~5.0kg为宜,每天减少510kcal~1280kcal的能量摄入。

2、适量蛋白质:

我们身体的每一个细胞都需要蛋白质去建构,尤其是肌肉。此外高蛋白质餐单还有很多好处,它能加快运动后的肌肉复原、减少肌肉流失以及促进肌肉生长。因为消化蛋白质的时间比碳水化合物要长,所以高蛋白质餐是比较耐饿的。


那要摄取多少份量的蛋白质呢?大约是身体的磅数转化成克,比如140磅重的男士就要摄取140克的蛋白质。

一小盒高钙脱脂奶:8.26克蛋白质

一只普通鸡蛋:6.29克蛋白质

100克瘦牛肉:36克蛋白质

3、限制脂肪:

过多摄入脂肪可导致酮症,在限制饮食能量供给的同时要限制饮食脂肪的供给,尤其是动物性脂肪的供给。脂肪容易沉积在皮下组织和内脏器官周围,从而导致脂肪肝和一些心脑血管疾病的发生。肥胖者饮食脂肪应控制在总摄入能量的25%~30%。


4、限制糖类:

糖类的供给应该控制在饮食总能量的40%~55%,避免食用蔗糖、麦芽糖等含单糖类的食物。食物纤维的摄入量可以不加限制,所以应适当多食用高纤维食物。


5、早餐大、午餐中、晚饭小:

与我们传统膳食比例刚刚相反,早午晚饭的比例应该是大中小,因为我们晚上消耗的能量通常是最少的,所以我们无需吃太多的食物。

再者说,如果在肚子很饱的情况下睡觉,腹部就很容易变大,长出小肚腩!不过小编明白晚饭对中国人的重要性,所以一星期安排一两次丰盛晚饭就差不多了,而且还能提高对生活的期待性!


原文转载:http://lady.shaoqun.com/a/277319.html

跨境电商:https://www.ikjzd.com/

acca是什么:https://www.ikjzd.com/w/1370

优1宝贝:https://www.ikjzd.com/w/1507


核心提示:多数人胖,就是因为吃的太多,但是不吃又很难受,小编想说如果你吃对食物了,根本不担心胖的。 想要减肥成功,不一定不吃东西,只要搭配的合理,一样让你放心瘦下去,今天这篇文章就帮你get吃的问题。减脂餐的5大技巧:1、限制总能量:要逐渐降低能量的摄入,同时辅助适量的体力活动。成年的轻度肥胖者,每月体重减轻0.5kg~1.0kg为宜,即每天减少125kcal~250kcal的能量摄入。成年中度以
克雷格:https://www.ikjzd.com/w/194
FEN:https://www.ikjzd.com/w/2668
淘粉吧首页:https://www.ikjzd.com/w/1725.html
中国反对贸易战态度坚决,即将到来的"清单"令美企焦虑!:https://www.ikjzd.com/home/97490
男友考上公务员就要和我分手:http://lady.shaoqun.com/m/a/273451.html
少妇口述:老公偷情上瘾却赖着不肯离婚:http://lady.shaoqun.com/a/273653.html

跑步减肥,有6个前提!怪不得你减不下去

核心提示:很多人认为,运动中流汗越多越减肥,特别是对于减肥效果最好的跑步运动,那么真的是这样吗?

在相同运动强度下,相比流汗少,流汗多代表的是消耗的肌糖原会多一点点,并不是减肥效果更好。所以,出汗的多或少,对减肥效果是没有影响的。


运动跑步出汗多的人,一定要多多喝水,在跑步的过程中,以及跑步之后,及时补水。跑步流汗多如果不喝水的话,运动后,血管扩张,供应大脑和心脏的的血液减少,心脑血管缺血会更严重。

纠正4个错误观点:

1、排汗服就是伪科学的东西,它会你身体严重脱水。

2、运动中需要大量补水,但是要多次少量的喝,以免引起肠道不适。

3、生活中也要大量喝水,不要等到渴的要死才喝水,因为那时候你身体已经脱水了。判断身体是否脱水:根据尿液来判断,尿液越黄,你可能需要喝更多的水了。

4、出汗是身体为了降温,为了带走机体内代谢产生的废物。


那到底是出汗多好,还是出汗少好?

出汗多,并不代表减脂效果就好,出汗只是起到一个调节体温,排出部分代谢废物的作用。

对于经常跑步或者想要通过跑步减肥的人来说,一定要注意以下几个问题:

1、定期体检

对于打算马拉松比赛的人来说,体检是必须的。即使不打算跑马,每个跑步的人,不管是年龄大小,也都应当定期体检。

2、避免在温度过高过低的环境中跑步

户外气温在三十度以上或者零度以下,最好就不要选择户外跑步了。这种环境下,剧烈运动,心脑血管出现意外的可能性很高。

3、及时补水

这一点在开头已经说的很清楚了。这里需要补充说明的一点就是,如果流汗过度,需要大量补水的话,最好选择淡盐水(1克盐配100克纯水的比例)。


4、要慢不要快

为了健康、减肥而跑步,速度不必求快,慢跑最佳。对于大部分跑者来说,如果跑步速度过快,或者突然加速,会导致心肌缺血,猝死的风险会直线上升。

5、要长跑,但不要太长


30公里跑,是大部分人的身体极限距离。马拉松赛场上的跑者,也多会在30公里以后,变成"走跑结合",其实就是跑不动了。所以,对于日常跑步来说,即使你有心有力,也最好不要超过30公里。对于健康来说,在半小时~1小时之间,慢跑7公里算是最优选择。

6、跑步容易嗨,注意刹车

长期坚持运动的人,往往会在运动中产生兴奋感,特别是长跑。一旦进入一个兴奋点,身上的疲倦会被一扫而空,这种情况下,很容易就会超过身体的极限,这种情况下,要及时刹车,不要盲目继续。


原文转载:http://lady.shaoqun.com/a/277318.html

跨境电商:https://www.ikjzd.com/

拍拍网服装:https://www.ikjzd.com/w/2205

折扣网:https://www.ikjzd.com/w/74


核心提示:很多人认为,运动中流汗越多越减肥,特别是对于减肥效果最好的跑步运动,那么真的是这样吗? 在相同运动强度下,相比流汗少,流汗多代表的是消耗的肌糖原会多一点点,并不是减肥效果更好。所以,出汗的多或少,对减肥效果是没有影响的。运动跑步出汗多的人,一定要多多喝水,在跑步的过程中,以及跑步之后,及时补水。跑步流汗多如果不喝水的话,运动后,血管扩张,供应大脑和心脏的的血液减少,心脑血管缺血会更严重。
lastpass:https://www.ikjzd.com/w/846
upc:https://www.ikjzd.com/w/111
易速:https://www.ikjzd.com/w/2389
差20岁老妻少夫的尴尬婚姻:http://lady.shaoqun.com/a/273485.html
"七分靠选品,三分靠运营"你选对产品了吗?:https://www.ikjzd.com/home/126907
意大利VAT怎么注册,需要什么资料?:https://www.ikjzd.com/home/121924

FBA仓库被紧急关闭!亚马逊暗自窃喜

上周末的时候有龙卷风袭击了美国东海岸,阿拉巴马州、新泽西州等地受灾严重。为此亚马逊在近期宣布紧急关闭了阿拉巴马州的FBA仓库!

这次龙卷风灾情非常严重,美国国家气象局甚至同时检测到十个以上的龙卷风形成,知道周日晚间还陆续有龙卷风在形成和袭击城镇,国家气象局直接发布了多个地区的最高恶劣天气风险警报。

亚马逊宣布紧急关闭的FBA仓库,是位于阿拉巴马州的Bessemer市的BHM1。发言人称"我们已经收到了州长发布的紧急状态与大伯明翰地区的龙卷风警告。因此,我们已经关闭了Bessemer的站点,并将在安全的情况下重新开放。"

阿拉巴马州和俄亥俄州受灾最严重,整个阿拉巴马州吹翻了各种树木和地面电力线路,导致整个州的电力系统一度瘫痪,房屋被成片成片的吹倒。

俄亥俄州遭遇的龙卷风也非常可怕,甚至有一辆亚马逊配送货车被直接卷上天空摔倒了田野中,当地所有房屋的玻璃都被狂风击碎,甚至有部分屋子的屋顶都被吹掉了。

龙卷风受灾非常严重,还将在未来波及阿肯色州、佐治亚州、密西西比州和田纳西州等地,气象局已经对这些可能受影响的多个州发布了预警,包括洪水、飓风和冰雹等恶劣天气警告。

这几个州的尾端派送时效受影响那是肯定的,入仓上架就不用想正常时间完成了,只要不出现像BHM1那样直接关停仓库的事就算不错(可以到文末扫码找我领取仓库列表查看自己的仓库是否受影响)。

不过明明俄亥俄州才是受灾最严重的地方,亚马逊在这里就没有关停仓库,反而关停了一个相对不那么严重的阿拉巴马州仓库。这里其实亚马逊是有自己的小想法的,说到这个BHM1仓库,即便没有龙卷风,也有另外一场"风暴"席卷了这里,那就是亚马逊历史上首个美国工会组织的成立投票正在这里举行。

亚马逊工会投票现状

BHM1是一个总人数6000人左右的亚马逊FBA运营中心,和其他的运营中心并没有太多不同,但是这里发生的事却牵动着亚马逊全美几十万一线工人。从2月1日开始亚马逊首个本土工会投票活动,正在BHM1的六千人中进行,这个工会的成立与否直接关系到亚马逊与工人关系的未来。

亚马逊曾经为了阻挠这次投票,使出了多种奇葩招式,包括修改BHM1外的红绿灯减少工会组织宣传的时间,在各种网站投放广告引导大家给工会成立投"否"。但是目前的形式依然对亚马逊非常不利,包括拜登和桑德斯等政府官员都对工人成立工会表示了支持,投票很快将会在31日截止,亚马逊面临背水一战。

结果上天就是这么凑巧,来了个龙卷风袭击了阿拉巴马州等地,亚马逊借机就直接把BHM1关停了,不给工人们聚集起来的机会,也减少最后几天大家投票的热情(谁会冒着大风大雨去邮局寄投票啊!)。不要小看最后这几天,有很多摇摆不定的工人都等到最后期限前投票,这么一来工会成立的事可就悬了。

不过这对卖家来说不失为一个利好的消息,因为工会成立势必会极大增加亚马逊在用工方面的成本,而这一成本的上涨最终还是会涨到使用FBA服务的卖家头上。即便是没有工会的情况下,FBA的费用几乎也是每年一涨,如果有了工会涨幅肯定更加恐怖。



来源:美鸥网


文章来源:https://www.ikjzd.com/home/143682

跨境电商:https://www.ikjzd.com/

asinseed:https://www.ikjzd.com/w/533

c88:https://www.ikjzd.com/w/1017.html

出口易:https://www.ikjzd.com/w/1317

FBA仓库被紧急关闭!亚马逊暗自窃喜

上周末的时候有龙卷风袭击了美国东海岸,阿拉巴马州、新泽西州等地受灾严重。为此亚马逊在近期宣布紧急关闭了阿拉巴马州的FBA仓库!

二胎政策开放以来,生了二胎的70后现在怎么样了?答案很扎心

核心提示:只能说,不管生不生二胎,每个家庭的情况都不同,总是几家欢喜几家愁。

阿君的大儿子已经5岁了,本来一心只想生一个孩子的她,因为意外怀孕,有了三个儿子,因为二胎是异卵双胞胎……

二胎的到来,瞬间让阿君和老公乱了阵脚。所幸,阿君家里的经济条件属于中等偏上水平,请一个保姆绰绰有余。然而,就算是多了一个人帮忙照顾孩子,阿君也还是感到力不从心。

尤其是在二胎前几个月的时候,阿君几乎没有睡过一个完整的觉。而且,家里多了两口人,生活压力也大了很多。一想到自己是三个儿子的爹,阿君的老公就头疼,恨不得自己一天24小时都在工作。


生二胎和不生二胎的家庭有什么差别?

自从国家开放二胎以来,有人反对有人支持。有的夫妻做足了避孕措施,生怕一不小心就多出一个娃。有的夫妻很快就为家里添丁,甚至还有三胎的计划。

只能说,不管生不生二胎,每个家庭的情况都不同,总是几家欢喜几家愁。从全局来看,生二胎和不生二胎,有利也有弊。

生二胎的好处在于:

第一,大部分家庭都是独生子女,生二胎可以让孩子在成长路上有个伴儿,学会如何与他人相处,长大后还能相互照顾

第二,我国已经进入老龄化社会,如果两个独生子女组成新的家庭,那么他们就要同时赡养至少四位老人。如果家中还有其他兄弟姐妹,那么负担就可以相对减轻一点。

第三,家中只有一个孩子,大人都围绕一个孩子转,很容易让孩子形成比较自我的性格,而且独立性不强。生二胎可以在无形中促进孩子间的竞争,提高竞争意识和自理能力,避免对孩子过度溺爱。

生二胎的坏处在于:

第一,显而易见的是,养一个孩子跟养两个孩子,在经济上的支出是不一样的。现代社会经济压力大,作为父母,都想给孩子最好的。一个孩子勉强还能应付,两个孩子相当于支出多了一倍,会个家庭带来较大的经济负担

第二,对于很多新手爸妈来说,平时要上班,又要照顾孩子,一个已经力不从心。生二胎,意味着一半的时间和精力要转移到另一个孩子身上。但是,时间和精力都是有限的,生二胎往往会出现力不从心的情况

第三,二胎出生之后,家里人的关注大部分转移到了二胎身上,对于家中的老大来说,会造成巨大的心理反差,认为弟弟妹妹抢走了爸爸妈妈的爱,不但会伤害孩子幼小的心灵,如果父母做不到绝对公平,还会影响两个孩子之间的关系

如今,90后、00后陆续走进婚姻的殿堂,也开始为人父母。对于生二胎,由于社会环境的影响,不同年代的人面对的情况是不一样的。

那么,对于70后来说,现在生了二胎的他们怎么样了呢?

张军和妻子都是国家公务员,在那个年代,由于政策的原因,夫妻俩只能生育一个孩子。然而,张军夫妻俩的儿子当了消防员之后,在一次执行任务中不幸殉职。

家中只有这么一个宝贝儿子,张军夫妻悲痛难忍,一夜之间老了十岁。儿子出事之后,张军夫妻想换个环境,于是双双从单位辞职,做起了小生意。


有亲戚劝张军夫妻:你们俩还年轻,可考虑再生一个。一开始,张军夫妻说什么也不同意,觉得对不起死去的儿子。后来,架不住朋友亲戚相劝,本身也喜欢孩子,夫妻俩慢慢就想通了。

于是,张军妻子通过人工受孕,再生了一个孩子。这个孩子出生之后,给张军夫妻俩带来了很大的变化,他们不再整天愁眉苦脸,开始为孩子规划未来……

面对二胎问题,总是有人欢喜有人愁。

浙江的王阿姨在50岁的时候意外怀孕了,与丈夫商量之后,王阿姨决定生下这个孩子。但是,王阿姨已经26岁的女儿小月说什么也不同意

小月觉得,自己明年就要结婚了,工作这么忙,结婚之后,爸妈理所当然地要帮忙看一下孩子。如果弟弟或妹妹出生,爸妈的时间和精力就只能放在弟弟或妹妹身上。

而且,小月还觉得,自己本来是独生子女,独享爸妈的爱二十几年了,突然冒出来一个小孩跟自己抢爸妈,心理落差很大。"我以后可不会管他/她!"对着妈妈肚子里的孩子,小月赌气地说道。

其实,不管什么年代的人,在生二胎这件事上,都是有好也有坏。

二胎不是谁都适合,需要做哪些准备?

不过,客观来讲,虽然现在提倡生二胎,但不是谁都可以生二胎,还要考虑身体、心理、经济等方面的问题。比如:

从身体上来说,是否完全做好了备孕工作,高龄孕妇能否承受生二胎的风险,在生之前和生之后体力是否招架得住。

从心理上来说,是否做好了生二胎的心理准备,是否安抚好了家中老大的心情

从经济上来说,家庭的收入来源稳不稳定,经济条件是否可以支撑再养一个孩子的支出。

从性别上来说,如果一胎是男孩,二胎想要女孩,但最后生了一个男孩,是否可以接受这种非自己心里最佳意愿性别的孩子的心理落差。

生孩子说难不难,说易不易。但是,与生孩子相比,更应该考虑养孩子的问题。对于想生二胎的夫妻来说,不能想生就生,还要考虑时间、精力、经济等方面的条件适不适合生二胎。


比如:有没有足够的时间陪伴二胎成长,有没有充足的信心让一胎和二胎和谐相处,有没有一定的经济实力承担多一个孩子的养育费用等。如果客观条件满足不了生二胎,那么还是慎重考虑为好。

总而言之,不同的家庭情况不同,生二胎的好处和坏处也不是绝对的。那么,关于生不生二胎,你是怎么看的呢?

参考资料:

[1]《全面放开二胎的第五年,第一批家庭怎么样了?》.知乎家庭教育.2019-10-28


[2]《到底要不要生二胎,总结了几个好处和坏处》.百度简单育儿经.2020-05-25

未经作者允许授权,禁止转载

39健康网()原创内容,未经授权不得转载,违者必究。内容合作请联系:020-85501999-8819或39media@mail.39.net

原文转载:http://health.shaoqun.com/a/213122.html

跨境电商:https://www.ikjzd.com/

五洲会海购:https://www.ikjzd.com/w/1068

net a porter:https://www.ikjzd.com/w/2132


核心提示:只能说,不管生不生二胎,每个家庭的情况都不同,总是几家欢喜几家愁。 阿君的大儿子已经5岁了,本来一心只想生一个孩子的她,因为意外怀孕,有了三个儿子,因为二胎是异卵双胞胎……二胎的到来,瞬间让阿君和老公乱了阵脚。所幸,阿君家里的经济条件属于中等偏上水平,请一个保姆绰绰有余。然而,就算是多了一个人帮忙照顾孩子,阿君也还是感到力不从心。尤其是在二胎前几个月的时候,阿君几乎没有睡过一个完整的觉。
logo免费制作:https://www.ikjzd.com/w/1998
败欧洲:https://www.ikjzd.com/w/1555
网络星期一:https://www.ikjzd.com/w/80
不要,啊,嗯,摸下面 小三的表情彻底点燃了我的怒火:http://www.30bags.com/m/a/254884.html
2019亚马逊情人节产品备战攻略1份,卖家收藏!:https://www.ikjzd.com/home/16072
这几个印尼电商市场常见陷阱你踩过多少?:https://www.ikjzd.com/home/21157

宝宝有耳屎,需要挖出来吗?

核心提示:成年人一般都会定期清理耳朵,那么宝宝如果有耳屎可以挖吗?宝宝有耳屎该如何清理?

耳屎,是耳道内的一种分泌物。我们都知道,一段时间不清理耳朵就会不舒服,因此一般都会定期清理耳屎。小宝宝也会有耳屎,有的新妈妈看到宝宝有耳屎,就会忍不住想帮他清理,但是有怕影响宝宝的健康,那么宝宝耳屎可以挖出来吗?

宝宝的耳屎有很多好处

耳屎能清洁耳道并杀菌:宝宝的耳屎中含"耵聍",它可粘附进入外耳道的灰尘,以及局部皮肤代谢产生的脱落细胞,起到清洁耳道的作用。而且耵聍油质味苦,能驱逐飞入耳内的小虫,捕获入侵的细菌。而且耳屎富含脂肪酸,在耳道皮肤表面形成一层酸膜,使外耳道处于酸性环境,具有轻度的杀菌作用。

耳屎能保护耳膜:婴儿宝宝的的鼓膜比蝉翼还要薄,非常娇嫩,一旦遇上猛烈声波直冲耳道,会损害到鼓膜,甚至造成破裂导致失聪。而耳屎能保护鼓膜,起屏障作用。

宝宝的耳屎需要挖出来吗?


别以为宝宝的耳屎脏,看到就想挖出来,其实耳屎对宝宝的耳朵具有极强的保护作用,而且新妈妈也不用担心宝宝的耳屎会越积越多,它随时可能会随着宝宝吃饭、说话或做各种动作的时候,着下颌运动,借助皮肤上汗毛的推动作用,自动被排出。

另外,由于宝宝的耳朵皮肤非常薄且嫩,耳膜也很薄,如果随便给宝宝挖耳朵,很有可能会刺伤鼓膜,对宝宝的听力造成危害。经常给宝宝挖耳朵,少了耳屎对耳朵的有效保护,容易受细菌、噪音的侵袭外,还可能会把皮肤划伤,细菌便会趁机进入伤口引发感染。

所以,看见宝宝耳朵里有耳屎,不要去挖它,婴儿不能挖耳朵。


原文转载:http://health.shaoqun.com/a/213121.html

跨境电商:https://www.ikjzd.com/

邮乐:https://www.ikjzd.com/w/1776

易速:https://www.ikjzd.com/w/2389


核心提示:成年人一般都会定期清理耳朵,那么宝宝如果有耳屎可以挖吗?宝宝有耳屎该如何清理? 耳屎,是耳道内的一种分泌物。我们都知道,一段时间不清理耳朵就会不舒服,因此一般都会定期清理耳屎。小宝宝也会有耳屎,有的新妈妈看到宝宝有耳屎,就会忍不住想帮他清理,但是有怕影响宝宝的健康,那么宝宝耳屎可以挖出来吗?宝宝的耳屎有很多好处耳屎能清洁耳道并杀菌:宝宝的耳屎中含"耵聍",它可粘附进入外耳道的灰尘,以及局
ola:https://www.ikjzd.com/w/2103
wario:https://www.ikjzd.com/w/887
wangwei:https://www.ikjzd.com/w/1744
口述:我和良家妇女火热地下恋情(4/4):http://lady.shaoqun.com/m/a/47230.html
国一秒物流:https://www.ikjzd.com/w/2536
旺季消费趋势:疫情下的黑五、圣诞节,如何做好热销品?:https://www.ikjzd.com/home/133790

2021年3月31日星期三

无小科比广东实力依旧顶尖 易建联能否回归成X因素_威姆斯

原标题:无小科比广东实力依旧顶尖 易建联能否回归成X因素

广东队在已经结束的48场联赛中,以43胜5负的优异成绩领跑全联盟,比第二的辽宁队领先了4个胜场,基本可以说常规赛冠军已是唾手可得。按照季后赛规则,已铁定直接晋升第二轮的广东队,将以逸待劳对阵从第一轮晋级的对手。

虽然马尚是公认的广东最强点,甚至说是全联盟最优秀的小外援也不为过,但广东队在失去马尚后,本土+威姆斯的阵容水准依旧可以排在联赛前四的水平。在场均得分、场均命中率、篮板球等主要技术指标上,广东队都是数一数二的水平。由于采用五上五下的特色打法,广东队常会在一场比赛中派出11-12名球员,阵容厚度放眼全联盟,也只有辽宁可以相提并论。

威姆斯本赛季数据全面下滑,这与出场时间大大减少有关。他场均出场20.7分钟,得到16.5分4.3板5助攻1.5抢断。但实际上,杜锋一直在给已年满35岁的威姆斯创造更多的休息时间,为季后赛储备能量。在对阵浙江队的比赛中,由于马尚和吴前相继受伤离场,末节的比拼很大程度上是威姆斯和兰兹博格的对抗,在比赛陷入胶着状态时,马尚在2分钟内连砍7分,为广东队彻底奠定胜势。在上赛季总决赛中,威姆斯也是一人打垮了辽宁队的锋线。可以说威姆斯在常规赛阶段属于养生打法,等到季后赛时会爆发出更强的战斗力。

广东队是19支球队中国手数量数一数二的,易建联、周鹏以前都是国家队的主力,任骏飞、赵睿随中国队出征2019年世界杯,胡明轩、杜润旺、徐杰也都入选了今年的国家队大名单。胡明轩在本赛季的成长有目共睹,场均13分3.4板2.4助攻1.4抢断,尤其以速度见长的突破更是拿手好戏。在同年龄球员中,胡明轩的大赛经验和心理素质无疑属于金字塔尖的佼佼者。在易建联、周鹏逐渐年龄增大后,胡明轩有望成为广东队新一代的本土领袖。

广东队一直对外宣称易建联有望在本赛季复出。从阿联近期的公开活动可以看出,阿联在日常行动方面已经没有任何不适,但能否复出参赛还是巨大的疑问。毕竟阿联受的伤是多年运动伤害累积造成的,一旦复出后同一部位再受伤,运动生涯恐将结束。如果没有彻底康复好,想必阿联和广东队都不会冒这个险。(剑风袭面)返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/514739.html

跨境电商:https://www.ikjzd.com/

扬帆计划:https://www.ikjzd.com/w/1581

hemingway:https://www.ikjzd.com/w/2344


原标题:无小科比广东实力依旧顶尖易建联能否回归成X因素广东队在已经结束的48场联赛中,以43胜5负的优异成绩领跑全联盟,比第二的辽宁队领先了4个胜场,基本可以说常规赛冠军已是唾手可得。按照季后赛规则,已铁定直接晋升第二轮的广东队,将以逸待劳对阵从第一轮晋级的对手。虽然马尚是公认的广东最强点,甚至说是全联盟最优秀的小外援也不为过,但广东队在失去马尚后,本土+威姆斯的阵容水准依旧可以排在联赛前四的水平
白色清关:https://www.ikjzd.com/w/1410
farfetch:https://www.ikjzd.com/w/2133
好卖家:https://www.ikjzd.com/w/776
他扒开我的内衣吸奶头 男朋友吃我奶头的全过程:http://www.30bags.com/m/a/249701.html
eBay第三季度营收26亿美元!总交易额达250亿美元...:https://www.ikjzd.com/home/132511
铺货依旧赚几亿,精品也有"失前蹄",2020年亚马逊要怎么打?:https://www.ikjzd.com/home/114769

别再面向 for 循环编程了,JDK 自带的观察者模式就很香!

大家好,你还在面向 for 循环编程吗?

还有谁不会用观察者模式吗?

本篇栈长带来《观察者模式》理论及实战~

什么是观察者模式?

观察者模式(Observer Pattern)定义了对象间的一种一对多的依赖关系,这样只要一个对象的状态发生改变,其依赖的所有相关对象都会得到通知并自动更新。

在观察者模式中,发生改变的对象叫做观察目标,而被通知更新的对象称为观察者,一个观察目标对应多个观察者,观察者一般是一个列表集合,可以根据需要动态增加和删除,易于扩展。

使用观察者模式的优点在于观察目标和观察者之间是抽象松耦合关系,降低了两者之间的耦合关系。

发布-订阅模式

观察者模式很多地方也叫发布-订阅模式(Publish/Subscribe),其实也可以这么理解,不过两者之间还是略有不同。

观察者模式中的观察者是直接绑定观察目标,观察目标要维护一套观察者列表,两者是有一个基于接口的组合依赖关系的,所以说观察者模式虽然是松耦合的,但并不是完全解耦的。

发布-订阅模式中的发布者和订阅者两者并没有任何联系,发布者通过中间方发布一个主题(Topic),订阅者通过中间方(调度中心)订阅一个主题(Topic),发布者状态的变更也并不会直接通知订阅者,而要通过中间方进行通知,或者订阅者自行从中间方拉取,所以说发布-订阅模式是完全解耦的。

一图搞懂它们的关系:

观察者模式和订阅发布模式的区别

从图片看两者是有差别的,统一都叫观察者模式,也没毛病。

观察者模式轮子

因观察者模式应用比较广泛,所以 JDK 工具包从 1.0 版本里面自带了观察者模式模板套装,我们根据其模板很方便就能实现观察者模式,不需要再重复造轮子了。

观察者目标类:

java.util.Observable

里面两个最重要的变量:

  • changed:观察目标状态是否变更,默认为:false;
  • obs:观察者列表(observers),一个线程安全的列表集合:Vector,默认为空集合;

里面的重要的方法都是和观察目标状态和观察者相关的,一看就清楚,这里就不介绍了。

观察者接口:

java.util.Observable

public interface Observer { /**  * This method is called whenever the observed object is changed. An  * application calls an <tt>Observable</tt> object's  * <code>notifyObservers</code> method to have all the object's  * observers notified of the change.  *  * @param o  the observable object.  * @param arg an argument passed to the <code>notifyObservers</code>  *     method.  */ void update(Observable o, Object arg);}

观察者接口只有一个 update 方法,用来通知观察者自己更新。

观察者模式实战

OK,知道了 JDK 自带了这两个东东,现在就来实现一个简单的观察者模式的应用场景,模拟公众号文章推送,观察目标是栈长我,观察者是你们大家,我在公众号Java技术栈推一篇文章,你们都能接收到更新通知并能阅读。

新增观察目标类:

import lombok.Getter;import java.util.Observable;/** * 观察目标:栈长 * 来源微信公众号:Java技术栈 */@Getterpublic class JavaStackObservable extends Observable { private String article; /**  * 发表文章  * @param article  */ public void publish(String article){  // 发表文章  this.article = article;  // 改变状态  this.setChanged();  // 通知所有观察者  this.notifyObservers(); }}

观察目标的逻辑是先发表文章,再改变观察目标的状态,再通知所有观察者。

我们来重点看 notifyObservers 方法的源码:

先获取同步锁,判断状态是否更新,如已更新则清空观察目标状态,然后再使用 for 循环遍历所有观察者,一一调用观察者的更新方法通知观察者更新。

新增观察者类:

import lombok.NonNull;import lombok.RequiredArgsConstructor;import java.util.Observable;import java.util.Observer;/** * 观察者:读者粉丝 * 来源微信公众号:Java技术栈 */@RequiredArgsConstructorpublic class ReaderObserver implements Observer { @NonNull private String name; private String article; @Override public void update(Observable o, Object arg) {  // 更新文章  updateArticle(o); } private void updateArticle(Observable o) {  JavaStackObservable javaStackObservable = (JavaStackObservable) o;  this.article = javaStackObservable.getArticle();  System.out.printf("我是读者:%s,文章已更新为:%s\n", this.name, this.article); }}

观察者的逻辑是获取到观察者目标实例对象,然后再用观察目标对象的文章信息更新为自己的文章信息,最后输出某某某的文章已更新。

观察者只要实现 Observer 这个接口的 update 方法即可,用于观察目标进行调用通知。

本节教程所有实战源码已上传到这个仓库:https://github.com/javastacks/javastack

观察目标和观察者类结构图如下:

新增测试类:

/** * 观察者:读者粉丝 * 来源微信公众号:Java技术栈 */public class ObserverTest { public static void main(String[] args) {  // 创建一个观察目标  JavaStackObservable javaStackObservable = new JavaStackObservable();  // 添加观察者  javaStackObservable.addObserver(new ReaderObserver("小明"));  javaStackObservable.addObserver(new ReaderObserver("小张"));  javaStackObservable.addObserver(new ReaderObserver("小爱"));  // 发表文章  javaStackObservable.publish("什么是观察者模式?"); }}

观察目标、观察者的创建并没有先后顺序要求,重点是发表文章通知观察者之前,观察目标要添加观察者列表这一步不能少。

输出结果:

通过这个简单的文章推送实践,大家应该对观察者模式有一个基本的认知了,在实际工作当中也可以有很多场景拿去用,就一对多的依赖关系都可以考虑使用观察者模式。

总结

不容易啊,陆陆续续又肝了大半天,你学会观察者模式了吗?

观察者模式的优点是为了给观察目标和观察者解耦,而缺点也很明显,从上面的例子也可以看出,如果观察者对象太多的话,有可能会造成内存泄露。

另外,从性能上面考虑,所有观察者的更新都是在一个循环中排队进行的,所以观察者的更新操作可以考虑做成线程异步(或者可以使用线程池)的方式,以提升整体效率。

本节教程所有实战源码已上传到这个仓库:

https://github.com/javastacks/javastack

好了,今天的分享就到这里了,后面栈长我会更新其他设计模式的实战文章,公众号Java技术栈第一时间推送。Java技术栈《设计模式》系列文章陆续更新中,请大家持续关注哦!

最后,觉得我的文章对你用收获的话,动动小手,给个在看、转发,原创不易,栈长需要你的鼓励。

版权申明:本文系公众号 "Java技术栈" 原创,原创实属不易,转载、引用本文内容请注明出处,禁止抄袭、洗稿,请自重,尊重他人劳动成果和知识产权。









原文转载:http://www.shaoqun.com/a/655721.html

跨境电商:https://www.ikjzd.com/

宝贝格子:https://www.ikjzd.com/w/1322

手机trademanager:https://www.ikjzd.com/w/730


大家好,你还在面向for循环编程吗?还有谁不会用观察者模式吗?本篇栈长带来《观察者模式》理论及实战~什么是观察者模式?观察者模式(ObserverPattern)定义了对象间的一种一对多的依赖关系,这样只要一个对象的状态发生改变,其依赖的所有相关对象都会得到通知并自动更新。在观察者模式中,发生改变的对象叫做观察目标,而被通知更新的对象称为观察者,一个观察目标对应多个观察者,观察者一般是一个列表集合
转运中国:https://www.ikjzd.com/w/1549
国际标准书号:https://www.ikjzd.com/w/174
亚马逊礼品卡:https://www.ikjzd.com/w/1090.html
英国将脱欧,亚马逊物流(FBA)优惠助你做好准备:https://www.ikjzd.com/home/17034
嫁给高个子男 最终一无所有:http://lady.shaoqun.com/a/273398.html
婚后生活被老外搞乱套 口述嫁给老外后我实在忍受不了:http://lady.shaoqun.com/a/270021.html

约基奇21+10+5穆雷砍30分 掘金轻取76人迎三连胜_费城

原标题:约基奇21+10+5穆雷砍30分 掘金轻取76人迎三连胜

北京时间3月31日,2020-21赛季NBA常规赛继续进行,丹佛掘金主场迎战费城76人。全场打完,掘金104-95轻取76人,拿到3连胜,费城在输球后,则遭遇两连败。

本场之星:小迈克尔-波特

此役,小波特发挥最为抢镜,他16投11中,得到27分,还入账10篮板4助攻1抢断1封盖,三分球7中5。

全场数据:

具体比分:22-44、23-24、26-20、24-16(掘金在后)。

76人这边,塔比亚斯-哈里斯得到12分3篮板2助攻2断2帽、丹尼-格林8分4篮板3助攻、德怀特-霍华德10分7篮板、本-西蒙斯11分2篮板3助攻2断、马克西13分2篮板、米尔顿10分4助攻。

掘金这边,除了小波特,贾马尔-穆雷入账30分6篮板4助攻3断、约基奇21分10篮板5助攻、米尔萨普10分2帽。

比赛回顾:

首节上来,掘金没有丝毫试探,就迅速向76人阵地发起猛攻,穆雷三分入网,约基奇暴扣、小波特后仰跳投连续得手。哈里斯上篮,试图费城止血。怎料,掘金此后士气愈发高涨。穆雷高难度的3+1打成,约老师补篮、上篮连进,分差被拉大到10分以上。此后,战局开始呈现一边倒的态势,小波特、穆雷先后得分上双,替补席上,米尔萨普、多齐尔也连续射中三分,随着穆雷三分再中,单节打完,掘金44-22大比分领先。

次节,米尔顿和斯科特联手拿到7分,费城攻势多少有些起色。但此后,双方的攻击效率都在下滑,本节中段,场上一度出现了长时间得分荒。接下来,约老师的跳投打破僵局,小波特三分连中,个人得分上20。穆雷上反篮得手,喂饼戈登暴扣也是技惊四座,一通操作过后,掘金领先优势回到了20分以上。费城越打越急,进入半场读秒阶段,霍华德防守巴顿动作过大,吃到一级恶意犯规。巴顿两罚全中,半场打完,掘金68-45继续领先。

易边再战,约基奇补篮得手,小波特暴扣也中,分差来到25分。但费城没有放弃,塔比亚斯-哈里斯一次勾射,一次跳投又为76人止血。此后,双方展开一段拉锯战,掘金这边,波特和穆雷的三分继续入网,费城这边,丹尼-格林的三分球,让分差维持在20分的水平线上。三节最后阶段,西蒙斯上得手,斯科特、米尔顿三分也中,76人打出7-0的小高潮,三节战罢,费城71-88落后。

末节,费城还在努力追分,替补席上科尔克马兹连得6分,米尔顿和小将马克西的三分也中。一度,费城将分差追到13分。不过,约老师的上篮得手,在本节后段为掘金定住军心。接下来,费城依然在追赶,斯科特三分再中,分差迫近到10分。只是,时间已不够。最终,全场打完,掘金104-95轻取76人,拿到3连胜,费城在输球后,则遭遇两连败。

比赛回顾:

双方首发阵容:

76人:丹尼-格林、塔比亚斯-哈里斯、德怀特-霍华德、塞斯-库里、本-西蒙斯

掘金:小迈克尔-波特、阿隆-戈登、尼古拉-约基奇、威尔-巴顿、贾马尔-穆雷

(波洛)返回搜狐,查看更多

责任编辑:

原文转载:http://sport.shaoqun.com/a/512747.html

跨境电商:https://www.ikjzd.com/

reddit:https://www.ikjzd.com/w/180

华翰物流:https://www.ikjzd.com/w/1799


原标题:约基奇21+10+5穆雷砍30分掘金轻取76人迎三连胜北京时间3月31日,2020-21赛季NBA常规赛继续进行,丹佛掘金主场迎战费城76人。全场打完,掘金104-95轻取76人,拿到3连胜,费城在输球后,则遭遇两连败。本场之星:小迈克尔-波特此役,小波特发挥最为抢镜,他16投11中,得到27分,还入账10篮板4助攻1抢断1封盖,三分球7中5。全场数据:具体比分:22-44、23-24、2
transfer:https://www.ikjzd.com/w/1735
haofang:https://www.ikjzd.com/w/1046
cares:https://www.ikjzd.com/w/1302
亚马逊解封卖家账号,但真相却很复杂.......:https://www.ikjzd.com/home/255
男人婚外情的结束规律 婚外情彻底结束的标志有哪些:http://lady.shaoqun.com/a/268819.html
香港关闭4大口岸!跨境物流再受打击?:https://www.ikjzd.com/home/115308

新一轮销量拐点来临?美国3万亿经济法案即将推行!

在国内电商市场日渐趋于饱和的大环境下,顺势转舵驶入跨境这片蓝海已成多数从业者的方向标。然而大洋彼岸这片广袤市场的探险之旅也并非一帆风顺,跨境人在深挖其蕴藏的巨大商机的同时也需要时刻把控风向。

近日跨境人的旅程又被接连扑来的几个浪头整得波折不断。先是亚马逊疑似封杀新疆棉,再有苏伊士运河堵塞运费飞速上涨,夹杂其中的还有FBA爆仓加剧,货物延误频发等风波。

动荡之中,又一个消息迎面砸来:美国再次宣布推行经济复苏计划,3万亿经济法案已经提上日程了!

风波又起:美国发钱计划再临

前两周美国1.9万新冠纾困法案的落地,使得跨境卖家如久旱逢甘霖,业绩颓势实现了触底反弹。而这波发钱热余温尚未褪尽,新一波发钱狂潮又即将席卷而来。

据AMZ123了解,拜登在其就任以来的首个新闻发布会上表示,继1.9万亿纾困法案后,美国政府又将推出3万亿美元的经济复苏提案,以借此改善美国的基础设施建设、应对气候变化,振兴美国经济。

   ▲图片来源于网络

据白宫发言人普萨基证实,拜登决定将3万亿经济复苏计划拆分为以下两个法案:

一份涉及美国基建,着重解决美国国内道路桥梁重建、乡村地区网络宽带拓宽等基础建设改革问题;

一份则涉及儿童保育措施和医疗保健补贴等问题。

  ▲图片来源于网络

对此,不少跨境人纷纷蓄势待发了起来。前不久1.9万亿发钱计划顺利落地后,卖家滞涩已久的销量泥潭终于迸射出新鲜的活力,一时之间呈暴涨之势。而此次纾困力度有过之而无不及,难道又能刺激一波销量高潮?

难题又至:销量暴涨并非定势

许多敏锐的卖家在听闻相关风向后便提前进入备战状态,着力于人手招募以及资源储备中,同时趁此风口抓紧购买美股。可以预见的是,未来该项经济法案如果顺利推行,必然会对跨境卖家的销量造成一定的刺激,然而对于具体走势却不能一昧秉承乐观态度。

美国政府这次的3万亿经济复苏计划主要致力于基础设施的建设和改革上,虽然一定程度上能促进美国人经济生活的改善,激发购物欲望,但相较于上次1.9万亿纾困法案直接将钱发到美国人手上,对于销量的刺激力度显然没那么迅猛。

  ▲图片来源于网络

不仅如此,此次的3万亿经济刺激法案尚处于商讨阶段,具体实施过程还要受到美国共和党在内的多派势力的掣肘,能否顺利推行犹未可知。

值得一提的是,将两次经济法案共计4.9万亿美元换算成人民币,大约近32万亿人民币。美国两次如此大规模印钱挽救经济颓势,俨然已经撼动了世界金融秩序的平衡,向全球输出通货膨胀,导致利率飞涨,对股票市场造成冲击。

因此,对于跨境人来说,3万亿经济法案执行后,对销量的具体促进效果以及未来人民币汇率走势如何,是目前亟待知晓的问题。

道阻且长:经济复苏之路漫漫

3万亿经济刺激法案只是美国漫漫经济复苏之路中的一部分,聚焦基建、保障民生的同时,对抗当前走势严峻的疫情也是重中之重。

据获悉,拜登还宣布了一个疫苗接种新目标,即在其履新100日内让美国接种的新冠疫苗达到2万亿剂。现在距离履新100日还有一个多月时间,美国上周的每日平均疫苗接种数为250万剂。如果按照这个速度,拜登将在就任100日前实现2万亿的新目标。

  ▲图片来源于网络

据外媒报道,新冠肺炎疫情已经导致美国数百万人失去工作,近55万人死亡。持续的疫情对美国经济造成严重影响,无数美国家庭受到冲击,失业人口以及申领救济的人数与疫情前相比大幅攀升。

现如今,美国经济发展前景关键还是取决于疫情防控结果。因此尽管美国政府接连推出多项新冠纾困法案,由于疫情迟迟得不到有效控制,经济复苏之路依然道阻且长。而美国人消费水平下降,销量自然也跟着下降,这对跨境人而言同样又是一道难题。

根据目前的形势来看,跨境卖家们不可操之过急,也不必忧虑过深。经济水平的改善就意味着消费欲望的上涨,因此3万亿经济复苏计划在很大程度上能为销量带来促进作用。而卖家当务之急,应该是做好充足的两手准备,储备好相应的货源,招募足够的人手,紧跟风向做好合理的应对。



来源:AMZ123


文章来源:https://www.ikjzd.com/home/143630

跨境电商:https://www.ikjzd.com/

鸥鹭:https://www.ikjzd.com/w/2568

tm商标:https://www.ikjzd.com/w/1069

c88是什么:https://www.ikjzd.com/w/1017

新一轮销量拐点来临?美国3万亿经济法案即将推行!

在国内电商市场日渐趋于饱和的大环境下,顺势转舵驶入跨境这片蓝海已成多数从业者的方向标。然而大洋彼岸这片广袤市场的探险之旅也并非一帆风顺,跨境人在深挖其蕴藏的巨大商机的同时也需要时刻把控风向。