redis基本数据结构
Redis入门:五大数据类型
文章目录
- Redis入门:五大数据类型
- 一.概述
- 二.Redis的基本了解
- 三.Redis五大数据类型
- 1.String (字符串)
- 2.List(列表)
- 3.Set集合(元素唯一不重复)
- 4.Hash集合
- 5.zSet(有序集合)
一.概述
什么是Redis
Redis(Remote Dictionary Server),即远程字典服务,是一个开源的使用ANSIC语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
Redis优点:
- redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。
- 纯内存操作——绝大部分请求时存粹的内存操作,非常快速。数据存在内存中,类似于HashMap,HashMap的优势时查找和操作的时间复杂度是O(1)
- 数据结构简单,对数据操作也简单
- 单线程操作——省去多线程时CPU上下文会切换的时间,也不用去考虑各种锁的问题,不存在加锁释放锁的操作,没有死锁问题导致的性能消耗
- 免费和开源!是当下最热门的NoSQL技术之一!也被人们称为结构化数据库!
二.Redis的基本了解
-
首先可以参考官方文档是如何介绍的官方文档

-
也可以参考中文文档

所有的命令都可以在Redis官网上进行查找
三.Redis五大数据类型
1.String (字符串)
-
添加、查询、追加、获取长度、判断是否存在操作
127.0.0.1:6379> set name aaa #插入一个key为"name" value为"aaa"的数据 OK 127.0.0.1:6379> get name #获取key为"name"的value值 "aaa" 127.0.0.1:6379> KEYS * # 查看当前库的所有值 1) "name" 127.0.0.1:6379> EXISTS name #判断key为'name'的数据是否存在,存在放回1 (integer) 1 127.0.0.1:6379> EXISTS name1 # 不存在返回0 (integer) 0 127.0.0.1:6379> GET key (nil) 127.0.0.1:6379> APPEND name bbbccc #追加到key为"name"的数据后拼接值为"bbbccc",如果key存在就类似于Java中字符串的"+",不存在则新增一个,并且返回该数据的总长度 (integer) 9 127.0.0.1:6379> GET name "aaabbbccc" 127.0.0.1:6379> STRLEN name #查看key为'name'的字符串长度 (integer) 9 127.0.0.1:6379> get name "aaabbbccc" 127.0.0.1:6379> set key1 "hello world!" #如果数据中有空格的数据,需要使用双引号否则会报错 OK 127.0.0.1:6379> set key1 hello world! (error) ERR syntax error 127.0.0.1:6379> set key1 hello,world! #逗号是可以的 OK -
自增、自减操作
127.0.0.1:6379> set num 0 #插入一个初始值为0的数据 OK 127.0.0.1:6379> get num "0" 127.0.0.1:6379> INCR num #指定key为"num"的数据自增1,返回结果 相当于Java中的 i++ (integer) 1 127.0.0.1:6379> get num "1" 127.0.0.1:6379> INCR num (integer) 2 127.0.0.1:6379> INCR num (integer) 3 127.0.0.1:6379> get num "3" 127.0.0.1:6379> DECR num #指定key为"num"的数据自减1,返回结果 相当于Java中的 i-- (integer) 2 127.0.0.1:6379> DECR num (integer) 1 127.0.0.1:6379> DECR num (integer) 0 127.0.0.1:6379> DECR num (integer) -1 127.0.0.1:6379> DECR num (integer) -2 127.0.0.1:6379> DECRBY num 3 # num-3 (integer) -5 127.0.0.1:6379> INCRBY num 10# num+10 (integer) 5 -
截取、替换字符串操作
#截取 127.0.0.1:6379> set key "hello world!" OK 127.0.0.1:6379> get key "hello world!" 127.0.0.1:6379> GETRANGE key 0 4 # 截取字符串,相当于Java中的subString,从下标0开始,不会改变原有的数据 "hello" 127.0.0.1:6379> GETRANGE key 0 -1 # 0至-1相当于get key,获取整条数据 "hello world!" #替换 127.0.0.1:6379> set key2 "hello,,,world!" OK 127.0.0.1:6379> get key2 "hello,,,world!" 127.0.0.1:6379> SETRANGE key2 5 888 #此语句跟java中replace有点类似,下标也是从0开始,但是有区别:java中是指定替换字符,Redis中是从指定位置开始替换,替换的数据根据你所需替换的长度一致,返回值是替换后的长度 (integer) 14 127.0.0.1:6379> get key2 "hello888world!" 127.0.0.1:6379> SETRANGE key2 5 67 #此处只替换了两位 (integer) 14 127.0.0.1:6379> get key2 "hello678world!" -
设置过期时间、不存在设置操作
#设置过期时间 127.0.0.1:6379> SETEX name1 15 aabbcc #新建一个key为"name1",值为"aabbcc",过期时间为15秒的字符串数据 OK 127.0.0.1:6379> ttl name1 #查看key为name1的key的过期时间 (integer) 7 127.0.0.1:6379> ttl name1 (integer) 6 127.0.0.1:6379> ttl name1 (integer) 3 127.0.0.1:6379> ttl name1 # 返回-2时证明key已经过期,即不存在 (integer) -2 #不存在设置 127.0.0.1:6379> SETNX name2 ddeeff #如果key为'name2'不存在,新增数据,返回值1为成功 (integer) 1 127.0.0.1:6379> get name2 "ddeeff" 127.0.0.1:6379> keys * 1) "name2" 127.0.0.1:6379> setnx name2 "aaabbbccc" #如果key为'name2'已存在,设置失败,返回值为0 (integer) 0 127.0.0.1:6379> get name2 "ddeeff" -
mset、mget操作
127.0.0.1:6379> mset k1 v1 k2 v2 k3 v3 #插入多条数据 OK 127.0.0.1:6379> keys * 1) "k2" 2) "k1" 3) "k3" 127.0.0.1:6379> mget k1 k2 k3 1) "v1" 2) "v2" 3) "v3" 127.0.0.1:6379> MSETNX k1 v1 k4 v4 #msetnx是一个原子性的操作,在一定程度上保证了事务!要么都成功,要么都失败!相当于if中的条件&&(与) (integer) 0 127.0.0.1:6379> MSETNX k5 v5 k4 v4 #全部成功 (integer) 1 127.0.0.1:6379> keys * 1) "k2" 2) "k3" 3) "k1" 4) "k5" 5) "k4" -
添加获取对象、getset操作
#这里其实本质上还是字符串,但是我们讲其key巧妙的设计了一下。 ##mset student:1:name student 相当于类名,1 相当于id,name 相当于属性 #如果所需数据全部这样设计,那么我们在java的业务代码中,就不需要关注太多的key #只需要找到student类,下面哪个id,需要哪个属性即可,减少了代码的繁琐,在一定程度上可以理解为这个一个类的对象! 127.0.0.1:6379> mset student:1:name aabbcc student:1:age 22 #新增一个key为‘student:1:name’,value为‘dingdada ’的数据 OK 127.0.0.1:6379> keys * #查看所有的key 1) "student:1:name" 2) "student:1:age" 127.0.0.1:6379> mget student:1:age student:1:name #获取数据 1) "22" 2) "aabbcc"#getset操作 127.0.0.1:6379> GETSET name1 aabb #先get再set,先获取key,如果没有,set值进去,返回的是get的值 (nil) 127.0.0.1:6379> get name1 "aabb" 127.0.0.1:6379> GETSET name1 112233 #先获取key,如果有,set最新的值进去,返回get的值 "aabb" 127.0.0.1:6379> GETSET name1 #替换成功 "112233"
String是Redis中最常用的一种数据类型,也是Redis中最简单的一种数据类型。首先,表面上是字符串,但其实可以灵活的表示字符串、整数、浮点数3种值。Redis会自动识别这3种值。
2.List(列表)
-
lpush(左插入)、lrange(查询集合)、rpush(右插入)操作
#lpush 127.0.0.1:6379> LPUSH list v1 #新增一个集合 (integer) 1 127.0.0.1:6379> LPUSH list v2 (integer) 2 127.0.0.1:6379> LPUSH list v3 (integer) 3 127.0.0.1:6379> LRANGE list 0 -1 #查询list的所有元素值 1) "v3" 2) "v2" 3) "v1" 127.0.0.1:6379> LPUSH list1 v1 v2 v3 v4 v5 #批量添加集合元素 (integer) 5 127.0.0.1:6379> LRANGE list 0 -1 1) "v3" 2) "v2" 3) "v1" 127.0.0.1:6379> LRANGE list1 0 -1 1) "v5" 2) "v4" 3) "v3" 4) "v2" 5) "v1" # 这里先进去的会到后面 #rpush 127.0.0.1:6379> LRANGE list 0 1 #指定查询列表中的元素,从下标0开始,1结束,两个元素 1) "v3" 2) "v2" 127.0.0.1:6379> LRANGE list 0 0 #指定查询列表中的唯一元素 1) "v3" 127.0.0.1:6379> lpush list rv0 #右插入,跟lpush相反,这里添加进去元素是在尾部! (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 #查看集合所有元素 1) "rv0" 2) "v3" 3) "v2" 4) "v1" -
lpop(左移除)、rpop(右移除)操作
#lpop 127.0.0.1:6379> LRANGE list1 0 -1 1) "v5" 2) "v4" 3) "v3" 4) "v2" 5) "v1" 127.0.0.1:6379> lpop list1 "v5" #rpop 127.0.0.1:6379> LRANGE list1 0 -1 1) "v4" 2) "v3" 3) "v2" 4) "v1" 127.0.0.1:6379> rpop list1 "v1" 127.0.0.1:6379> LRANGE list1 0 -1 1) "v4" 2) "v3" 3) "v2" -
lindex(查询指定下标元素)、llen(获取集合长度)操作
#lindex 127.0.0.1:6379> LRANGE list1 0 -1 1) "v4" 2) "v3" 3) "v2" 127.0.0.1:6379> LRANGE list1 0 -1 1) "v4" 2) "v3" 3) "v2" 127.0.0.1:6379> LINDEX list1 1 #获取指定下标位置集合的元素,下标从0开始计数 "v3" 127.0.0.1:6379> LINDEX list1 0 "v4" #llen 127.0.0.1:6379> llen list1 #获取指定集合的元素长度 (integer) 3 -
lrem(根据value移除指定的值)
127.0.0.1:6379> LRANGE list1 0 -1 1) "v4" 2) "v3" 3) "v2" 127.0.0.1:6379> lrem list1 1 v2 #移除集合list中的元素v2的元素1个 (integer) 1 127.0.0.1:6379> LRANGE list1 0 -1 1) "v4" 2) "v3" 127.0.0.1:6379> lrem list1 0 v3 #移除集合list中的元素v3的元素1个,这里0和1效果一样 (integer) 1 127.0.0.1:6379> lpush list1 v3 v2 v2 v2 (integer) 5 127.0.0.1:6379> LRANGE list1 0 -1 1) "v2" 2) "v2" 3) "v2" 4) "v3" 5) "v4" 127.0.0.1:6379> LREM list1 2 v2 #移除集合list中元素为v2 的‘2’个,这里的参数数量,如果实际中集合元素数量不达标,不会报错,全部移除后返回成功移除后的数量值 (integer) 2 127.0.0.1:6379> LRANGE list1 0 -1 1) "v2" 2) "v3" 3) "v4" -
ltrim(截取元素)、rpoplpush(移除指定集合中最后一个元素到一个新的集合中)操作
#ltrim 127.0.0.1:6379> lpush list v1 v2 v3 v4 (integer) 4 127.0.0.1:6379> LRANGE list 0 -1 1) "v4" 2) "v3" 3) "v2" 4) "v1" 127.0.0.1:6379> LTRIM list 1 2 #通过下标截取指定的长度 OK 127.0.0.1:6379> LRANGE list 0 -1 1) "v3" 2) "v2" #rpoplpush 127.0.0.1:6379> lpush list v1 v2 v3 v4 v5 (integer) 5 127.0.0.1:6379> LRANGE list 0 -1 1) "v5" 2) "v4" 3) "v3" 4) "v2" 5) "v1" 127.0.0.1:6379> RPOPLPUSH list newlist #移除list集合中的最后一个元素到新的集合newlist中,返回值是移除的最后一个元素值 "v1" 127.0.0.1:6379> LRANGE newlist 0 -1 #存在newlist集合并且有刚刚移除的元素 1) "v1" -
lset(更新)、linsert操作
#lset 127.0.0.1:6379> LRANGE list 0 -1 1) "v5" 2) "v4" 3) "v3" 4) "v2" 127.0.0.1:6379> lset list 1 newV5 # 更新list集合中下标为'1'的元素为'newV5' OK 127.0.0.1:6379> LRANGE list 0 -1 1) "v5" 2) "newV5" 3) "v3" 4) "v2" ##注意 127.0.0.1:6379> lset list1 0 vvvv #如果指定的集合不在,报错 (error) ERR no such key 127.0.0.1:6379> lset list 8 vvv #如果集合存在,但是指定的下标不存在,报错 (error) ERR index out of range #linsert 127.0.0.1:6379> LRANGE list 0 -1 1) "v5" 2) "newV5" 3) "v3" 4) "v2" 127.0.0.1:6379> LINSERT list after v3 insertv3 #在集合中的'v3'元素'(after)之后'加上一个元素 (integer) 5 127.0.0.1:6379> LRANGE list 0 -1 1) "v5" 2) "newV5" 3) "v3" 4) "insertv3" 5) "v2" 127.0.0.1:6379> LINSERT list before v3 insertv3 #在集合中的'v3'元素'(before)之后'加上一个元素 (integer) 6 127.0.0.1:6379> LRANGE list 0 -1 1) "v5" 2) "newV5" 3) "insertv3" 4) "v3" 5) "insertv3" 6) "v2"
3.Set集合(元素唯一不重复)
-
sadd(添加)、smembers(查看所有元素)、sismember(判断是否存在)、scard(查看长度)、srem(移除指定元素)操作
127.0.0.1:6379> sadd set1 aa bb cc dd #添加set集合 (integer) 4 127.0.0.1:6379> SMEMBERS set1 1) "bb" 2) "aa" 3) "dd" 4) "cc" 127.0.0.1:6379> SISMEMBER set1 aa (integer) 1 127.0.0.1:6379> SISMEMBER set1 aab (integer) 0 127.0.0.1:6379> SCARD set1 (integer) 4 127.0.0.1:6379> srem set1 aa (integer) 1 127.0.0.1:6379> SMEMBERS set1 1) "bb" 2) "dd" 3) "cc" -
srandmember(抽随机)操作
127.0.0.1:6379> sadd myset 1 2 3 4 5 6 7 (integer) 7 127.0.0.1:6379> SMEMBERS myset 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7" 127.0.0.1:6379> SRANDMEMBER myset 1 #从set中随机取一个数 1) "7" 127.0.0.1:6379> SRANDMEMBER myset 1 1) "4" 127.0.0.1:6379> SRANDMEMBER myset 1 1) "3" 127.0.0.1:6379> SRANDMEMBER myset 3 #从set中随机取三个数 1) "2" 2) "6" 3) "4" 127.0.0.1:6379> SRANDMEMBER myset 3 1) "2" 2) "3" 3) "7" -
spop(随机删除元素)、smove(移动指定元素到新的集合中)操作
127.0.0.1:6379> spop myset #随机删除一个元素 "5" 127.0.0.1:6379> spop myset 1 #随机删除一个元素 1) "4" 127.0.0.1:6379> spop myset 2 #随机删除两个元素 1) "1" 2) "2" 127.0.0.1:6379> SMEMBERS myset 1) "3" 2) "6" 3) "7" 127.0.0.1:6379> SMOVE myset myset2 3 #移动指定set中的元素到新的set中 (integer) 1 127.0.0.1:6379> SMEMBERS myset 1) "6" 2) "7" 127.0.0.1:6379> SMEMBERS myset2 1) "3" -
sdiff(差集)、sinter(交集)、sunion(并集)操作
127.0.0.1:6379> sadd myset 1 2 3 4 5 (integer) 5 127.0.0.1:6379> sadd myset2 3 4 5 6 7 (integer) 5 127.0.0.1:6379> SMEMBERS myset 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 127.0.0.1:6379> SMEMBERS myset2 1) "3" 2) "4" 3) "5" 4) "6" 5) "7" 127.0.0.1:6379> SDIFF myset myset2 #差集 1) "1" 2) "2" 127.0.0.1:6379> SINTER myset myset2 #并集 1) "3" 2) "4" 3) "5" 127.0.0.1:6379> SUNION myset myset2 #交集 1) "1" 2) "2" 3) "3" 4) "4" 5) "5" 6) "6" 7) "7"
4.Hash集合
-
hset(添加hash)、hget(查询)、hgetall(查询所有)、hdel(删除hash中指定的值)、hlen(获取hash的长度)、hexists(判断key是否存在)
127.0.0.1:6379> hset hash1 name aaa age 20 #添加hash,可添加多个 (integer) 2 127.0.0.1:6379> hget hash1 name # 获取hash中key是name的值 "aaa" 127.0.0.1:6379> hget hash1 age "20" 127.0.0.1:6379> HGETALL hash1 #获取hash中全部的值包括key 1) "name" 2) "aaa" 3) "age" 4) "20" 127.0.0.1:6379> hset hash1 del test (integer) 1 127.0.0.1:6379> HGETALL hash1 1) "name" 2) "aaa" 3) "age" 4) "20" 5) "del" 6) "test" 127.0.0.1:6379> HDEL hash1 del age # 删除指定的hash中的key(可多个),key删除后对应的value也会删除 (integer) 2 127.0.0.1:6379> HGETALL hash1 1) "name" 2) "aaa" 127.0.0.1:6379> HLEN hash1 #获取指定的hash的长度 (integer) 1 127.0.0.1:6379> HEXISTS hash1 name # 判断key是否存在于指定的value中,存在返回1 (integer) 1 127.0.0.1:6379> HEXISTS hash1 age # 不存在返回0 (integer) 0 -
hkeys(获取所有的key)、hval(获取所有value)、hincrby(给值加增量)、hsetnx(存在不添加)操作
127.0.0.1:6379> hset hash1 age 20 hight 180 (integer) 2 127.0.0.1:6379> hgetall hash1 1) "name" 2) "aaa" 3) "age" 4) "20" 5) "hight" 6) "180" 127.0.0.1:6379> HKEYS hash1 #获取指定hash中所有的key 1) "name" 2) "age" 3) "hight" 127.0.0.1:6379> HVALS hash1 #获取指定hash中所有的val 1) "aaa" 2) "20" 3) "180" 127.0.0.1:6379> HINCRBY hash1 age 2 #让hash中age的value指定+2(自增) (integer) 22 127.0.0.1:6379> HINCRBY hash1 age -1 #让hash中age的value指定-1(自减) (integer) 21 127.0.0.1:6379> HSETNX hash1 nokey novalue #添加hash中不存在的值返回新增成功的数量 (integer) 1 127.0.0.1:6379> HSETNX hash1 name haha #添加存在则失败返回0 (integer) 0 127.0.0.1:6379> HGETALL hash1 1) "name" 2) "aaa" 3) "age" 4) "21" 5) "hight" 6) "180" 7) "nokey" 8) "novalue"
5.zSet(有序集合)
-
zadd(添加)、zrange(查询)、zrangebyscore(排序小-大)、zrevrange(排序大-小)、zrangebyscore withscores(查询所有值包含key)
127.0.0.1:6379> zadd zset 1 one 2 two 3 three #添加多个zset值 (integer) 3 127.0.0.1:6379> ZRANGE zset 0 -1 #查询所有的值 1) "one" 2) "two" 3) "three" # -inf 代表负无穷 +inf代表正无穷 127.0.0.1:6379> ZRANGEBYSCORE zset -inf +inf #将zset按从小到大排序并输出 1) "one" 2) "two" 3) "three" 127.0.0.1:6379> ZRANGEBYSCORE zset 0 1 #只查询key<=1的值并且排序从小到大 1) "one" 127.0.0.1:6379> ZREVRANGE zset 1 -1 #从大到小排序输出 1) "two" 2) "one" 127.0.0.1:6379> ZRANGEBYSCORE zset -inf +inf withscores #查询指定zset的所有值,包含序号的值 1) "one" 2) "1" 3) "two" 4) "2" 5) "three" 6) "3" -
zrem(移除元素)、zcard(查看元素个数)、zcount(查询指定区间内的元素个数)操作
127.0.0.1:6379> zadd set 1 v1 2 v2 3 v3 4 v4 (integer) 4 127.0.0.1:6379> ZRANGE set 0 -1 1) "v1" 2) "v2" 3) "v3" 4) "v4" 127.0.0.1:6379> zrem set v3 #移除指定元素,可多个 (integer) 1 127.0.0.1:6379> ZRANGE set 0 -1 1) "v1" 2) "v2" 3) "v4" 127.0.0.1:6379> ZCARD set #查看元素个数 (integer) 3 127.0.0.1:6379> ZCOUNT set 0 100 #查看指定区间的元素个数 (integer) 3 127.0.0.1:6379> ZCOUNT set 0 2 (integer) 2
以上就是Redis的五大类型的使用,关于其他命令都可以在外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传](https://img-home.csdnimg.cn/images/20230724024159.png?origin_url=r&pos_id=img-SWDR0SC1-1701160381600)上进行查找。
“one”
2) “1”
3) “two”
4) “2”
5) “three”
6) “3”
2. zrem(移除元素)、zcard(查看元素个数)、zcount(查询指定区间内的元素个数)操作```shell
127.0.0.1:6379> zadd set 1 v1 2 v2 3 v3 4 v4
(integer) 4
127.0.0.1:6379> ZRANGE set 0 -1
1) "v1"
2) "v2"
3) "v3"
4) "v4"
127.0.0.1:6379> zrem set v3 #移除指定元素,可多个
(integer) 1
127.0.0.1:6379> ZRANGE set 0 -1
1) "v1"
2) "v2"
3) "v4"
127.0.0.1:6379> ZCARD set #查看元素个数
(integer) 3
127.0.0.1:6379> ZCOUNT set 0 100 #查看指定区间的元素个数
(integer) 3
127.0.0.1:6379> ZCOUNT set 0 2
(integer) 2
以上就是Redis的五大类型的使用,关于其他命令都可以在官网上进行查找。
相关文章:
redis基本数据结构
Redis入门:五大数据类型 文章目录 Redis入门:五大数据类型一.概述二.Redis的基本了解三.Redis五大数据类型1.String (字符串)2.List(列表)3.Set集合(元素唯一不重复)4.Hash集合5.zSet(有序集合) 一.概述 什么是Redis Redis(Remote Dictiona…...
Learning Normal Dynamics in Videos with Meta Prototype Network 论文阅读
文章信息:发表在cvpr2021 原文链接: Learning Normal Dynamics in Videos with Meta Prototype Network 摘要1.介绍2.相关工作3.方法3.1. Dynamic Prototype Unit3.2. 视频异常检测的目标函数3.3. 少样本视频异常检测中的元学习 4.实验5.总结代码复现&a…...
Unity 关于SpriteRenderer 和正交相机缩放
float oldWidth 750f;float oldHeight 1334f;float newWidth Screen.width;float newHeight Screen.height;float oldAspect oldWidth / oldHeight;float newAspect newWidth / newHeight;//水平方向缩放float horizontalCompressionRatio newAspect / oldAspect;//垂直…...
HarmonyOS应用开发者基础认证考试(98分答案)
基于最近大家都在考这个应用开发者基础认证考试,因此出了一期,一样复制word里面搜索做,很快,当然good luck 判断题 Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(Tr…...
Ubuntu20.04 Kimera Semantic运行记录
Ubuntu20.04 Kimera Semantic 官方bag运行记录 以下基本为官方教程,有部分修改 依赖 sudo apt-get install python3-wstool python3-catkin-tools protobuf-compiler autoconf sudo apt-get install ros-noetic-cmake-modulessudo apt-get install ros-noetic-i…...
服务器RAID系统的常见故障,结合应用场景谈谈常规的维修处理流程
常见的服务器RAID系统故障包括硬盘故障、控制器故障、电源故障、写入错误和热插拔错误。下面结合这些故障的应用场景和常规维修处理流程来详细讨论: 硬盘故障: 应用场景:在服务器RAID系统中,硬盘故障是最常见的问题之一。硬盘可能…...
计算机网络——数据链路层-封装成帧(帧定界、透明传输-字节填充,比特填充、MTU)
目录 介绍 帧定界 PPP帧 以太网帧 透明传输 字节填充(字符填充) 比特填充 比特填充习题 MTU 介绍 所谓封装成帧,就是指数据链路层给上层交付下来的协议数据单元添加帧头和帧尾,使之成为帧。 例如下图所示: …...
MySQL笔记-第03章_基本的SELECT语句
视频链接:【MySQL数据库入门到大牛,mysql安装到优化,百科全书级,全网天花板】 文章目录 第03章_基本的SELECT语句1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类 2. SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 …...
FTP服务文件上传失败,错误码553的排故过程
本文主要记录文件上传失败,错误码553的排故过程。 1 背景 树莓派通过FTP给嵌入式板卡传输文件,好几套设备,发现有的能传输成功,有的传输不成功。树莓派和嵌入式板卡都一样的,出现问题时感觉很懵。 2 逐项对比 2.1 自…...
音频录制软件哪个好?帮助你找到最合适的一款
音频录制软件是日常工作、学习和创作中不可或缺的一部分。选择一个适合自己需求的录音软件对于确保音频质量和提高工作效率至关重要。可是您知道音频录制软件哪个好吗?本文将深入探讨两种常见的音频录制软件,通过详细的步骤指南,帮助您了解它…...
9.Unity搭建HTTP服务器
搭建HTTP服务器的几种方式 //1.使用别人做好的HTTP服务器软件,一般作为资源服务器时使用该方式(学习阶段建议使用) //2.自己编写HTTP服务器应用程序,一般作为Web服务器 或者 短链接游戏服务器时 使用该方式 使用别人做好的HTTP服…...
C# 热键注册工具类
写在前面 介绍一个验证过的热键注册工具类,使用系统类库user32.dll中的RegisterHotkey函数来实现全局热键的注册。 代码实现 [Flags]public enum KeyModifiers{Alt 1,Control 2,Shift 4,Windows 8,NoRepeat 0x4000}public static class HotKeyHelper{[DllImp…...
nodejs微信小程序+python+PHP天天网站书城管理系统的设计与实现-计算机毕业设计推荐
目 录 摘 要 I ABSTRACT II 目 录 II 第1章 绪论 1 1.1背景及意义 1 1.2 国内外研究概况 1 1.3 研究的内容 1 第2章 相关技术 3 2.1 nodejs简介 4 2.2 express框架介绍 6 2.4 MySQL数据库 4 第3章 系统分析 5 3.1 需求分析 5 3.2 系统可行性分析 5 3.2.1技术可行性:…...
Hive环境准备[重点学习]
1.前提启动hadoop集群 hadoop在统一虚拟机中已经配置了环境变量 启动hdfs和yarn集群 命令:start-all.sh [rootnode1 /]# start-all.sh启动mr历史服务 命令:mapred --daemon start historyserver [rootnode1 /]# mapred --daemon start historyserver检查服务 命令:jps [r…...
软件工程 室友整理
如何理解结构化需求分析方法的基本思想; 结构化分析方法是一种面向数据流的需求分析方法,其中数据作为独立实体转换,数据建模定义数据的属性和关系,操作数据的处理建模表名当做数据在系统流动时候处理如何转换数据 简述面向对象的基本概念&a…...
JVM==>图解字节码指令
一,原始代码 我们来看一下执行这段代码的具体流程 那执行这段代码中 JVM就会把已经编译好的.class文件加载到内存中,交给CPU运行 1)常量池载入运行时常量池 我们发现 10 并没有被存入常量池中, 这是因为short范围以内的数字不会…...
MISRA C 2012 标准浅析
MISRA(The Motor Industry Software Reliability Association),汽车工业软件可靠性联会; 1994年,英国成立。致力于协助汽车厂商开发安全可靠的软件的跨国协会,其成员包括:AB汽车电子、罗孚汽车、宾利汽车、福特汽车、捷…...
Redis高可用之Sentinel哨兵模式
一、背景与简介 Redis关于高可用与分布式有三个与之相关的运维部署模式。分别是主从复制master-slave模式、哨兵Sentinel模式以及集群Cluster模式。 这三者都有各自的优缺点以及所应对的场景、对应的业务使用量与公司体量。 1、主从master-slave模式 【介绍】 这种模式可以采用…...
AI “自主运行”的计算机概念正逐渐成为现实
每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...
数据库系统概论期末经典大题讲解(用关系代数进行查询)
今天也是结束的最为密集的考试周,在分析过程中自己也有些许解题的感悟,在此分享出来,希望能帮到大家期末取得好成绩。 一.专门的关系运算 1.选择(σ) 选择操作符用于从关系中选择满足特定条件的元组 例如,…...
Android Wi-Fi 连接失败日志分析
1. Android wifi 关键日志总结 (1) Wi-Fi 断开 (CTRL-EVENT-DISCONNECTED reason3) 日志相关部分: 06-05 10:48:40.987 943 943 I wpa_supplicant: wlan0: CTRL-EVENT-DISCONNECTED bssid44:9b:c1:57:a8:90 reason3 locally_generated1解析: CTR…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
HBuilderX安装(uni-app和小程序开发)
下载HBuilderX 访问官方网站:https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本: Windows版(推荐下载标准版) Windows系统安装步骤 运行安装程序: 双击下载的.exe安装文件 如果出现安全提示&…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
Redis:现代应用开发的高效内存数据存储利器
一、Redis的起源与发展 Redis最初由意大利程序员Salvatore Sanfilippo在2009年开发,其初衷是为了满足他自己的一个项目需求,即需要一个高性能的键值存储系统来解决传统数据库在高并发场景下的性能瓶颈。随着项目的开源,Redis凭借其简单易用、…...
热门Chrome扩展程序存在明文传输风险,用户隐私安全受威胁
赛门铁克威胁猎手团队最新报告披露,数款拥有数百万活跃用户的Chrome扩展程序正在通过未加密的HTTP连接静默泄露用户敏感数据,严重威胁用户隐私安全。 知名扩展程序存在明文传输风险 尽管宣称提供安全浏览、数据分析或便捷界面等功能,但SEMR…...
JavaScript 标签加载
目录 JavaScript 标签加载script 标签的 async 和 defer 属性,分别代表什么,有什么区别1. 普通 script 标签2. async 属性3. defer 属性4. type"module"5. 各种加载方式的对比6. 使用建议 JavaScript 标签加载 script 标签的 async 和 defer …...
Java设计模式:责任链模式
一、什么是责任链模式? 责任链模式(Chain of Responsibility Pattern) 是一种 行为型设计模式,它通过将请求沿着一条处理链传递,直到某个对象处理它为止。这种模式的核心思想是 解耦请求的发送者和接收者,…...
使用ch340继电器完成随机断电测试
前言 如图所示是市面上常见的OTA压测继电器,通过ch340串口模块完成对继电器的分路控制,这里我编写了一个脚本方便对4路继电器的控制,可以设置开启时间,关闭时间,复位等功能 软件界面 在设备管理器查看串口号后&…...
