Redis的基本数据类型
初识Redis缓存
Redis缓存:
实际开发中经常使用Redis作为缓存数据库,从而提高数据存取效率,减轻后端数据库的压力。
可以将经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到MySQL中去查询了,而是直接获取Redis中的缓存数据。
Redis是键值对类型的数据库,在设计数据时都要指定key和value。
例如某查询系统可以根据提供的网站名称返回相应的网址,因为查询的系统的并发量较高,此时可以将上述的对应关系通过Redis缓存到内存中。
设置网站名称baidu到网址http://www.baidu.com的对应关系:名称作为key,网址作为value
取出缓存:用户输入名称,数据库就可以把对应网址取出来了
设置缓存的时间:
实际项目里一般需要同时设置数据的生存时间。如果不设置,那么内存里的数据会越积越多,最终造成内存溢出。
可以在命令后通过ex或px参数设置该对象的生存时间,其中ex的时间单位是秒,px的时间单位是毫秒,如:
设置了val1对象的生存时间是2秒,当过了对应的时间用get命令去获取对象的值时,只能得到表示空的null值。
Redis数据类型
Redis为了存储不同类型的数据,提供了五种常用数据类型
string (字符串)
hash (哈希散列)
list (列表)
set (集合)
zset (sorted set:有序集合)
注意此处的数据类型指的是Value(值)的数据类型,而非key。
基本数据类型String
SDS:
字符串是Redis里最基本的数据类型,Redis使用标准C语言编写,但在存储字符时,Redis并未使用C语言的字符类型。
而是自定义了一个属于特殊结构SDS(Simple Dynamic String)即简单动态字符串)。【可以理解为用C的结构体实现了一个String类型】
SDS是一个可以修改的内部结构,非常类似于Java的ArrayList。
SDS的结构定义如下:
String类型的空间分配方式:
string采用了预先分配冗余空间的方式来减少内存的频繁分配,如下图所示:
(总体空间即上图char buf[]的空间 )
Redis每次给string分配的空间都要大于字符串实际占用的空间,这样就在一定程度上提升了Redis string存储的效率,比如当字符串长度变大时,无需再重新申请内存空间。
当字符串所占空间小于1MB时,Redis对字符串存储空间的扩容是以成倍的方式增加的;而当所占空间超过1MB时,每次扩容只增加1MB。Redis字符串允许的最大值字节数是512MB。
String类型的使用:
字符串是Redis里最基本的数据类型。
可以使用set命令设置字符串类型数据,具体语法如下:
set key value [EX seconds|PX milliseconds] [NX|XX] [KEEPTTL]
key和value分别表示待设置字符串的键和值,如果对应的key里已经有值,那么再次执行set命令时会进行覆盖。value就是String类型。[]中为可选内容
通过EX和PX参数可以指定该变量的生存时间,在大多数场景里,应该合理设置对应的生存时间,否则可能会导致内存溢出的问题。
NX参数表示当key不存在时才进行设置值的操作,如果key存在,那么该命令执行;XX参数表示当key存在时才进行操作。
KEEPTTL是Redis6.0的新特性,是指"保留生存时间”,既重复set时,保留值的过期时间。
设置以后,可以通过get key的方式读取对应key的字符串变量,具体示例:
设置获取单个字符串:
缓存员工号002、姓名Tom"的数据:
设置获取多个字符串:
mset和mget命令分别能同时设置和获取多个字符串。
其中,mset命令的语法:mset key value [key value...]
mget命令的语法:mget key [key...]
mset和mget命令不包含NX、XX、PX和EX等参数。
示例:
ttl =-1 代表永久有效
对值进行增量和减量操作:
通过incr key命令能对key所对应的数字类型值进行加1操作,如果k不存在,默认在0的基础上+1
通过decr key命令能对key所对应的值进行减1操作,如果k不存在,默认在0的基础上-1
通过incrby key increment命令能对key对应的值进行加lincrement的操作
通过decrby by decrement命令能对key对应的值进行减decrement的操作
incr和decr命令作用在字符类型上,会出错
运行上述命令时,需要确保key对应的值是数字类型,否侧会报错。在实际项目里,上述命令一般会用在统计流量和控制并发的场景中
通过getset命令设置新值:
getset key value
如果key对应的值存在,则会用value覆盖旧值,同时返回旧值(set可以覆盖但不会返回旧值)
如果key对应的值不存在,也会设值,但会返回null
基本数据类型Hash
Hash类型:
Redis hash(哈希散列)是由字符类型的field(字段)和value组成的哈希映射表结构(也称散列表)
【redis的键值对映射则指的是整体数据】
hash类型中,field与value一一对应,且不允许重复。
Redis hash特别适合于存储对象。一个filed/value可以看做是表格中一条数据记录;而一个key可以对应多条数据(多个字段和value的组合)。
当hash类型移除最后一个元素后,该存储结构就会被自动删除,其占用内存也会被系统回收。
Hash类型底层存储结构的实现方式(2种):
第一种,当存储的数据量较少时,hash采用ziplist(压缩列表,内存中一块连续的存储空间)作为底层存储结构,此时要求符合以下两个条件:
(1)哈希对象保存的所有键值对(键和值)的字符串长度总和小于64个字节。
(2)哈希对象保存的键值对数量要小于512个。
当无法满足上述条件时,hash就会采用第二种方式来存储数据:
也就是dict(字典结构)该结构类似于Java的HashMap,是一个无序的字典,并采用了数组和链表相结合的方式存储数据。
在Redis中,dict是基于哈希表算法实现的,因此其查找性能非常高效,其时间复杂度为O(1)。
哈希表:
哈希表又称散列表,其初衷是将数据映射到数组中的某个位置上, 这样就能够通过数组下标来访问该数据,从而提高数组的查询效率。
现在有1/5/8/ 三个数字,你需要把这三个数字映射到数组中,由于哈希表规定必须使用下标来访问数据,因此你需要构建一个0到8的数组
普通查找:把待查找的数字,在相应的下标数组上标记出来,它们之间一一对应。虽然这样能查,但很浪费存储空间,并且查找效率也不高。
如果采用哈希表的话,我们只需要申请一个长度为3的数组(与待查找的元素个数相同),如下图所示:
将1/5/8分别对数组长度3做取模运算,然后把它们指向运算结果对应的数组槽位,这样就把一组离散的数据映射到了连续的空间中,从而在最大限度上提高了空间的利用率,并且也提高了元素的查找效率。
但可能会出现一个问题,数字5、8映射到同一个槽位上,这样就导致其中一个数字无法查找到。上述这种情况在实际中也会遇到,我们把它称为“哈希冲突”或者“哈希碰撞”。
解决哈希冲突:
有许多方法可以解决“哈希冲突”,比如开放地址法、链表地址法,再次散列法等,而Redis采用是链表地址法。
将有冲突的数据使用链表把它们串联起来,这样即使发生了冲突,也可以将数据存储在一起,最后,通过遍历链表的方式就找到上述发生“冲突”的数据。
如下所示:
如果值是字符串的话,就需要通过哈希函数将字符串转换成具体的数值,然后再对其进行映射。
设置与获取(hset和hget)
哈希类型可以通过hset命令来设置数据,通过hget命令来读取数据。
hset的命令格式如下
hset key field value [field value ...]
其中key是待缓存对象的键,field value是以键值对的形式描述的对象数据。
针对同一个key,可以用多个field value对来存储数据,这里field可以理解成对象的属性名,value可以理解成对象的属性值。
hget的命令格式如下,其中key是待读取对象的键,如果存在key和field所对应的数据,则返回该数据,否则返回null值。仅传入key而不传入field参数,会报错。
hget key field
示例:
hsetnx命令
用hset命令设置哈希类型的变量时,如果出现重复,就会用后设的数据覆盖掉之前的数据。
与之对应的是hsetnx命令
hsetnx key field value
只有当key和field所对应的value不存在时才会设置对应的value,而且key之后只能带一对field和value
hset命令的key之后能带多个field和value对。
针对key的相关操作
通过hkeys key命令,能查看该key所对应哈希类型数据的所有field;
通过hvals key命令,能查看key所对应哈希类型数据的所有value;
通过hgetall key命令,能以field和value对的形式查看key对应的哈希类型数据。
hexists命令
通过hexists命令,能判断key和field对应的value是否存在。
hexists命令的格式:
hexists key field
对哈希类型数据的删除操作:
通过hdel命令,能删除key指定的field数据,该命令的格式如下:
hdel key field [field...]
通过该命令能同时删除一个key对应的多个field数据。如果要删除指定key所对应的整个哈希类型的数据,则需要用del key命令。
基本数据类型List
Redis list(列表)相当于Java语言中的LinkedList结构,是一个链表而非数组,其插入、删除元素的时间复杂度为O(1),但是查询速度欠佳,时间复杂度为O(n)。
当向列表中添加元素值时,首先需要给这个列表指定一个key键,然后使用相应的命令,从列表的左侧(头部)或者右侧(尾部)来添加元素,这些元素会以添加时的顺序排列。
当列表弹出(pop)最后一个元素时,该结构会被自动删除。
Redis列表的底层存储结构,其实是一个被称为快速链表(quicklist)的结构。
当列表中存储的元素较少时:
Redis 使用一块连续的内存来存储这些元素这个连续的结构被称为ziplist(压缩列表),它将所有的元素紧挨着一起存储。使用压缩列表来做列表的底层实现的情况:
(1) 当一个列表只包含少量列表项,并且每个列表项要么就是小整数值要么就是长度比较短的字符串,
(2)当一个哈希只包含少量键值对,比且每个键值对的键和值要么就是小整数值,要么就是长度比较短的字符串,
压缩列表是Redis为了节约内存而开发的,是由一系列特殊编码的连续内存块组成的顺序型(sequential))数据结构。
一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值。
当列表中存储的元素较多时:
Redis列表用quicklist(快速链表)存储元素。
Redis之所以采用两种方法相结合的方式来存储元素,这是因为单独使用普通链表存储元素时,所需的空间较大,会造成存储空间的浪费。因此采用了链表和压缩列表相结合的方式,也就是quicklist+ziplist,结构如下图:
将多个ziplist使用双向指针串联起来,这样既能满足快速插入、删除的特性,又节省了一部分存储空间。
设置与获取:
可以通过lpush命令把一个或多个值依次且一次性插入到列表的头部,因此读取索引号是0的数据时,返回的是最后插入的数据。
key指定待插入的列表,element表示插入到列表的值。
lpush key element [element ...]
也可以用rpush命令在指定列表的尾部插入数据,该命令格式如下:
rpush key element [element ...]
可以通过lindex命令读取列表的值,key指定待读取的列表,index指定待读取列表值的索引号。注意,索引号是从0开始的。
lindex key index
示例:
模拟堆栈和队列:
lpush:向左边(list头)添加数据。rpush:向右边(list尾)添加数据
与之对应的有lpop和rpop命令,表示分别从Iist头和list尾读数据,而且读完会把该数据从列表里弹出(移除)。
通过如下的lpush和lpop命令能模拟"先入后出”的堆栈效果:
还可以通过lpush和rpop命令来模拟“先来先服务”的队列效果:
lrange:
通过lrange命令可以获取指定区间内的数据,start和stop分别表示开始索引和结束索引。
该命令的格式:
lrange key start stop
start <= stop时,才会取出数据。负数则表示倒数第几个。
获取列表包含的所有元素:
快捷方法:使用0作为起始索引、-1作为结束索引去调用lrange命令,这种方法非常适合于查看长度较短的列表。
列表中的最后一个元素索引为-1,依次类推。
修改列表中的元素:
通过lset命令能修改列表里的元素,能把由key指定的列表里index的数据修改为element。
该命令的格式:
lset key index element
将元素插入列表
通过使用linsert命令,用户可以将一个新元素插入列表某个指定元素的前面或者后面:
linsert list BEFORE|AFTER target_element new_element
linsert命令第二个参数的值可以是before或after,它们分别用于指示命令将新元素插入目标元素的前面或后面
获取列表的长度:
用户可以通过执行llen命令来获取列表的长度,即列表包含的元素数量:
llen list
移除指定的元素:
可以通过lrem命令删除列表里的指定元素,该命令的格式如下:
lrem key count element
当count = 0时,删除该列表里所有值是element的数据;
当count > 0时,删除从头到尾方向数量为count个、值是element的数据;(从左往右删除)
当count < 0时,删除从尾到头方向数量为count个、值是element的数据。(从右往左删除)
修剪列表:
ltrim命令接受一个列表和一个索引范围作为参数,并移出列表中位于给定索引范围之外的所有元素,只保留给定范围之内的元素:
LTRIM list start end
LTRM命令在执行完移除操作之后将返回OK作为结果。
基本数据类型Set
Set类型:
Redis的集合(set)键允许用户将任意多个各不相同的元素存储到集合中,这些元素既可以是文本数据,也可以是二进制数据。
虽然都可以存储多个元素,但集合与列表有以下两个明显的区别:
(1)列表可以存储重复元素,而集合只会存储非重复元素,尝试将一个已存在的元素添加到集合将被忽略。
(2)列表以有序方式存储元素,而集合则以无序方式存储元素。
这两个区别带来的差异主要跟命令的复杂度有关:
在执行像LINSERT和LREM这样的列表命令时,即使命令只针对单个列表元素,程序有时也不得不遍历整个列表以确定指定的元素是否存在,因此这些命令的复杂度都为O(N)。
对于集合来说,因为所有针对单个元素的集合命令都不需要遍历整个集合,所以复杂度都为O(1)。
因此当我们需要存储多个元素时,就可以考虑这些元素是否可以以无序的方式存储,并且是否不会出现重复。如果是,那么就可以使用集合来存储这些元素,从而有效地利用集合操作的效率优势。
将新元素添加到集合中:
使用sadd命令将一个或多个元素添加到集合中,命令格式如下:
sadd set element [element ...]
用sadd添加元素时,会自动忽略已存在的元素,只将不存在于集合的新元素添加到集合中。
集合中移除已有的元素
使用srem命令将一个或多个元素从集合中移除
srem set element [element ...]
这个命令会返回被移除的元素数量:
将指定的元素从一个集合移动到另一个集合
smove命令允许用户将指定的元素从源集合移动到目标集合:
smove source target element
smove命令在移动操作成功执行时返回1。如果指定的元素并不存在于源集合,那么smove命令将返回0,表示移动操作执行失败。
获取集合包含的所有元素
通过使用smembers命令,用户可以取得集合包含的所有元素:
smembers set
因为Redis集合以无序的方式存储元素,并且SMEMBERS命令在获取集合元素时也不会对元素进行任何排序动作,所以根据元素添加顺序的不同,2个包含相同元素的集合在执行SMEMBERS命令时的结果也可能会有所不同。
获取集合包含的元素数量
通过scard命令,用户可以获取给定集合的大小,即集合包含的元素数量:
scard set
检查给定元素是否存在于集合中
使用sismember命令:
sismember set element
从集合中随机地获取指定数量的元素:
通过使用SRANDMEMBER命令,用户可以从集合中随机地获取指定数量的元素。
SRANDMEMBER命令接受一个可选的count参数,用于指定用户想要获取的元素数量,如果用户没有给定这个参数,那么SRANDMEMBER命令默认只获取一个元素:
SRANDMEMBER set [count]
被SRANDMEMBER命令返回的元素仍然会存在于集合当中。
若count参数的值为正数,SRANDMEMBER命令将返回count个不重复的元素。
若count参数的值为负数,SRANDMEMBER命令将随机返回abs(count)个元素,并且在这些元素当中允许出现重复的元素。
随机从集合中移除指定数量的元素:
SPOP命令接受一个可选的cout参数,用于指定需要被移除的元素数量。如果用户没有给定这个参数,那么SPOP命令默认只移除一个元素:
spop key [count]
SPOP命令只接受正数count值,如果向SPOP命令提供负数count值将引发错误,因为负数count值对于SPOP命令是没有意义的
集合运算:
sinter命令可以计算用户给定的所有集合的交集,然后返回这个交集包含的所有元素:
sinter set [set..,]
sunion命令可以计算出用户给定的所有集合的并集,然后返回这个并集包含的所有元素:
sunion set [set..,]
sdiff命令可以计算出给定集合之间的差集,并返回差集包含的所有元素:
sdiff set [set..,]
有序集合:
Redis的有序集合(sorted set)同时具有“有序”和“集合”两种性质。
这种数据结构中的每个元素都由一个成员和一个与成员相关联的分值组成,其中成员以字符串方式存储,而分值则以64位双精度浮点数格式存储。
与集合一样,有序集合中的每个成员都是独一无二的,同一个有序集合中不会出现重复的成员。有序集合的成员将按照它们各自的分值大小进行排序:比如,分值为3.14的成员将小于分值为10.24的成员,而分值为999的成员也会小于分值为10086的成员。
有序集合的分值除了可以是数字之外,还可以是字符串" +inf "或者" -inf ",这两个特殊值分别用于表示无穷大和无穷小。
同一个有序集合不能存储相同的成员,但不同成员的分值却可以是相同的。
当两个或多个成员拥有相同的分值时,Rdis将按照这些成员在字典序中的大小对其进行排列:
举个例子,如果成员"apple"和成员"zero"都拥有相同的分值100,那么Redis将认为成员"apple"小于成员"zero",这是因为在字典序中,字母"a"开头的单词要小于字母"z"开头的单词。
有序集合是Redis提供的所有数据结构中最为灵活的一种,它可以以多种不同的方式获取数据,比如根据成员获取分值、根据分值获取成员、根据成员的排名获取成员、根据指定的分值范围获取多个成员等。
有序集合_添加或更新成员:
使用ZADD命令,用户可以向有序集合添加一个或多个新成员:
zadd sorted_set score member [score member ...]
ZADD命令除了可以向有序集合添加新成员之外,还可以对有序集合中已存在成员的分值进行更新:
在默认情况下,如果用户在执行ZADD命令时,给定成员已经存在于有序集合中,并且给定的分值和成员现有的分值并不相同,那么ZADD命令将使用给定的新分值去覆盖现有的旧分值。
有序集合_移除指定的成员:
通过使用ZREM命令,用户可以从有序集合中移除指定的一个或多个成员以及与这些成员相关联的分值:
zrem sorted_set member [member...]
通过使用ZSCORE命令,用户可以获取与给定成员相关联的分值:
zscore sorted_set member
有序集合_对成员分值执行自增或自减操作:
使用ZINCRBY命令,对有序集合中指定成员的分值执行自增操作,为其加上指定的增量。
zincrby sorted_set increment member
redis没有相应的自减操作,所以可以将一个负数增量传给ZINCRBY命令,达到对分值的自减操作。
有序集合_获取成员在有序集合中的排名:
排名标记是从0开始的。
ZRANK命令返回的是成员的升序排列排名,即成员在按照分值从小到大进行排列时的排名
ZRANK sorted_set member
ZREVRANK命令返回的则是成员的降序排列排名,即成员在按照分值从大到小进行排列时的排名。
ZREVRANK sorted_set member
有序集合_获取指定索引范围内的成员:
排名标记是从0开始的。
ZRANGE命令返回的是在索引范围内成员的升序排列排名,即成员在按照分值从小到大进行排列时的排名
zrange sorted_set start end
ZREVRANGE命令返回的则是在索引范围内成员的降序排列排名,即成员在按照分值从大到小进行排列时的排名。
zrevrange sorted_set start end
有序集合_获取指定分值范围内的成员:
ZRANGEBYSCORE以升序排列的方式获取有序集合中分值介于指定范围内的成员:
ZRANGEBYSCORE sorted_set min max
ZREVRANGEBYSCORE以降序排列的方式获取有序集合中分值介于指定范围内的成员:
ZREVRANGEBYSCORE sorted_set max min
命令的min参数和max参数分别用于指定用户想要获取的成员的最小分值和最大分值
ZRANGEBYSCORE命令和ZREVRANGEBYSCORE命令接受min参数和max参数的顺序正好相反。
有序集合_统计指定分值范围内的成员数量
使用ZCOUNT命令,可以统计出有序集合中分值介于指定范围之内的成员数量:
zcount sorted_set min max
范围控制:
ZRANGEBYSCORE、ZCOUNT等命令可以控制区间的开合。上述命令接受的分值范围都是闭区间分值范围。
如果用户想要定义的是开区间而不是闭区间,那么可以在给定分值范围时,在分值参数的前面加上一个单括号“(”,这样,具有给定分值的成员就不会出现在命令返回的结果当中。
min参数和max参数除了可以是普通的分值或者带有(符号的分值之外,还可以是特殊值+inf或者-inf。前者用于表示无穷大,而后者则用于表示无穷小。
相关文章:

Redis的基本数据类型
初识Redis缓存 Redis缓存: 实际开发中经常使用Redis作为缓存数据库,从而提高数据存取效率,减轻后端数据库的压力。 可以将经常被查询的数据缓存起来,比如热点数据,这样当用户来访问的时候,就不需要到MyS…...

通过vite+vue3+pinia从0到1搭建一个uniapp应用
最近项目上要做一个app,选择了用uniapp作为开发框架;我大概看了一下uniapp的文档,根据文档从0到1搭了一个uniapp应用供大家参考。 因为本人习惯使用了WebStorm编译器,但是uniapp官方推荐使用HBuilder搭建,如果和我一样…...

Linux的桌面
Linux的桌面是可以卸载的 的确,Linux并不像Windows,Linux本身是一个基于命令行的操作系统,在内核眼中,桌面只不过是个普通的应用程序,所以,在Linux的桌面中可以完成的事情,命令行中也基本可以完…...

Easyexcel(5-自定义列宽)
相关文章链接 Easyexcel(1-注解使用)Easyexcel(2-文件读取)Easyexcel(3-文件导出)Easyexcel(4-模板文件)Easyexcel(5-自定义列宽) 注解 ColumnWidth Data…...

操作系统实验 C++实现死锁检测算法
实验目的 模拟实现死锁检测算法 实验内容 1、 输入: “资源分配表”文件,每一行包含资源编号、进程编号两项(均用整数表示,并用空格分隔开),记录资源分配给了哪个进程。 “进程等待表”文件&…...

小鹏汽车智慧材料数据库系统项目总成数据同步
1、定时任务处理 2、提供了接口 小鹏方面提供的推送的数据表结构: 这几个表总数为100多万,经过条件筛选过滤后大概2万多条数据 小鹏的人给的示例图: 界面: SQL: -- 查询车型 select bmm.md_material_id, bmm.material_num, bm…...

1、HCIP之RSTP协议与STP相关安全配置
目录 RSTP—快速生成树协议 STP STP的缺点: STP的选举(Listening状态中): RSTP P/A(提议/同意)机制 同步机制: 边缘端口的配置: RSTP的端口角色划分: ensp模拟…...

Linux云服务器docker使用教程
诸神缄默不语-个人CSDN博文目录 我用的是腾讯云服务器,操作系统是OpenCloudOS 9,基本上可以当特色版CentOS用。 docker安装跟各个系统关系太大了,我就不写了。OpenCloudOS 9安装docker见这篇博文:腾讯云服务器使用教程 文章目录 …...

如何从android的webview 取得页面上的数据
要从Android的WebView中获取页面上的数据,通常有几种常见的方法: JavaScript Interface:通过JavaScript和Android Interface进行通信。这种方法允许你在JavaScript中调用Android的方法,反之亦然。 Evaluate JavaScriptÿ…...

VTK知识学习(12)- 读取PNG图像
1、代码 private void ShowPngImage(){vtkPNGReader pngReader vtkPNGReader.New();pngReader.SetFileName("D:\\图像\\boxes\\cardboard_boxes_01.png");pngReader.Update();vtkImageActor imageActor vtkImageActor.New();imageActor.SetInputData(pngReader.Get…...

Springboot项目搭建(3)-更改用户信息与文件上传
1.概要 前一章节完成了用户信息的注册、登录、详细信息查询,以及线程池与拦截器技术。 这一章完善了用户信息更新/更改功能,包括昵称、邮箱、头像、密码等... 而后接触到了本地上传和云上传,其二者区别: 选择本地上传还是云上…...

Docker1:认识docker、在Linux中安装docker
欢迎来到“雪碧聊技术”CSDN博客! 在这里,您将踏入一个专注于Java开发技术的知识殿堂。无论您是Java编程的初学者,还是具有一定经验的开发者,相信我的博客都能为您提供宝贵的学习资源和实用技巧。作为您的技术向导,我将…...

python成绩分级 2024年6月python二级真题 青少年编程电子学会编程等级考试python二级真题解析
目录 python成绩分级 一、题目要求 1、编程实现 2、输入输出 二、算法分析 三、程序代码 四、程序说明 五、运行结果 六、考点分析 七、 推荐资料 1、蓝桥杯比赛 2、考级资料 3、其它资料 python成绩分级 2024年6月 python编程等级考试二级编程题 一、题目要求 …...

android 如何获取当前 Activity 的类名和包名
其一:getClass().getSimpleName() public static String getTopActivity(Context context){ ActivityManager am (ActivityManager) context.getSystemService(context.ACTIVITY_SERVICE); ComponentName cn am.getRunningTasks(1).get(0).topAct…...

Spring Boot 项目 myblog 整理
myblog 项目是一个典型的 Spring Boot 项目,主要包括用户注册、登录、文章管理(创建、查询、更新、删除)等功能。 1. 项目结构与依赖设置 项目初始化与依赖 使用 Spring Initializr 创建项目。引入必要的依赖包: Spring Boot W…...

uniapp 城市选择插件
uniapp城市选择插件 如上图 地址 完整demo <template><view><city-selectcityClick"cityClick":formatName"formatName":activeCity"activeCity":hotCity"hotCity":obtainCitys"obtainCitys":isSearch&quo…...

测试工程师如何在面试中脱颖而出
目录 1.平时工作中是怎么去测的? 2.B/S架构和C/S架构区别 3.B/S架构的系统从哪些点去测? 4.你为什么能够做测试这一行?(根据个人情况分析理解) 5.你认为测试的目的是什么? 6.软件测试的流程ÿ…...

Mesh路由组网
Mesh无线网格网络,多跳(multi-hop)网络,为解决全屋覆盖信号,一般用于家庭网络和小型企业 原理 网关路由器(主路由,连接光猫),Mesh路由器(子路由,…...

LeetCode131:分割回文串
题目链接:131. 分割回文串 - 力扣(LeetCode) 代码如下: class Solution { private:vector<vector<string>> result;vector<string> path; // 放已经回文的子串void backtracking (const string& s, int s…...

详细解析 devmem 命令:在 Linux 系统中直接访问内存的利器
目录 什么是 devmem?为什么需要 devmem?devmem 命令的基本语法devmem 在硬件调试中的应用安全性与风险devmem 的常见应用示例结论 在嵌入式系统开发和硬件调试中,开发者经常需要直接与硬件打交道,访问和修改内存中某些特定区域的内…...

[Docker-显示所有容器IP] 显示docker-compose.yml中所有容器IP的方法
本文由Markdown语法编辑器编辑完成。 1. 需求背景: 最近在启动一个服务时,突然发现它的一个接口,被另一个服务ip频繁的请求。 按理说,之前设置的是,每隔1分钟请求一次接口。但从日志来看,则是1秒钟请求一次ÿ…...

【前端知识】nodejs项目配置package.json深入解读
package.json详细解读 文件解读一、文件结构二、字段详解三、使用场景四、注意事项 组件版本匹配规则 文件解读 package.json 文件是 Node.js 项目中的一个核心配置文件,它位于项目的根目录下,并包含项目的基本信息、依赖关系、脚本、版本等内容。以下是…...

XGBOOST算法Python实现(保姆级)
摘要 XGBoost算法(eXtreme Gradient Boosting)在目前的Kaggle、数学建模和大数据应用等竞赛中非常流行。本文将会从XGBOOST算法原理、Python实现、敏感性分析和实际应用进行详细说明。 目录 0 绪论 一、材料准备 二、算法原理 三、算法Python实现 3…...

JDK、MAVEN与IDEA的安装与配置
1.认识JDK、MAVEN与IDEA JDK 提供了编译和运行Java程序的基本环境。Maven 帮助管理项目的构建和依赖。IDEA 提供了一个强大的开发环境,使得编写、调试和运行Java程序更加高效。 2. 安装与环境配置 2.1 官网地址 选择你需要的版本下载: MAVEN下载传送…...

输出比较简介
输出比较简介 主要是用来输出PWM波形,这个波形是驱动电机的(智能车和机器人等)必要条件 OC(Output Compare)输出比较,还有IC,全称是Input Capture,意为输入捕获,还有CC…...

什么是反向 DNS 查找以及它的作用是什么?
反向DNS查询(rDNS)是一种技术,用于确定与某个IP地址对应的域名。当我们对一个IP地址进行反向DNS查询时,实际上是向域名系统(DNS)的特殊部分请求信息,这部分被称为PTR记录。PTR记录会返回与这个I…...

集群聊天服务器(13)redis环境安装和发布订阅命令
目录 环境安装订阅redis发布-订阅的客户端编程环境配置客户端编程 功能测试 环境安装 sudo apt-get install redis-server 先启动redis服务 /etc/init.d/redis-server start默认在6379端口上 redis是存键值对的,还可以存链表、数组等等复杂数据结构 而且数据是在…...

[ubuntu]编译共享内存读取出现read.c:(.text+0x1a): undefined reference to `shm_open‘问题解决方案
问题log /tmp/ccByifPx.o: In function main: read.c:(.text0x1a): undefined reference to shm_open read.c:(.text0xd9): undefined reference to shm_unlink collect2: error: ld returned 1 exit status 程序代码 #include <stdio.h> #include <stdlib.h> #…...

Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装
Python Matplotlib 安装指南:使用 Miniconda 实现跨 Linux、macOS 和 Windows 平台安装 Matplotlib是Python最常用的数据可视化工具之一,结合Miniconda可以轻松管理安装和依赖项。在这篇文章中,我们将详细介绍如何使用Miniconda在Linux、mac…...

DimensionX 部署笔记
目录 生成视频用CogVideoX-5b-I2V 推理代码: DimensionX 生成视频用CogVideoX-5b-I2V 推理代码: 可以生成,从左向右旋转的,也可以生成从上往下旋转的: import torch from diffusers import CogVideoXImageToVideo…...