当前位置: 首页 > news >正文

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的基本了解

  1. 首先可以参考官方文档是如何介绍的官方文档

    image-20231127153321774

  2. 也可以参考中文文档

    image-20231127153255188

所有的命令都可以在Redis官网上进行查找

三.Redis五大数据类型

1.String (字符串)

  1. 添加、查询、追加、获取长度、判断是否存在操作

    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
    
  2. 自增、自减操作

    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
    
  3. 截取、替换字符串操作

    #截取
    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!"
    
  4. 设置过期时间、不存在设置操作

    #设置过期时间
    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"
    
  5. 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"
    
  6. 添加获取对象、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(列表)

  1. 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"
    
  2. 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"
    
  3. 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
    
  4. 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"
    
  5. 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"
    
  6. 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集合(元素唯一不重复)

  1. 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"
    
  2. 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"
    
  3. 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"
    
  4. 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集合

  1. 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
    
  2. 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(有序集合)

  1. 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"
    
  2. 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入门&#xff1a;五大数据类型 文章目录 Redis入门&#xff1a;五大数据类型一.概述二.Redis的基本了解三.Redis五大数据类型1.String (字符串)2.List(列表)3.Set集合(元素唯一不重复)4.Hash集合5.zSet(有序集合) 一.概述 什么是Redis Redis&#xff08;Remote Dictiona…...

Learning Normal Dynamics in Videos with Meta Prototype Network 论文阅读

文章信息&#xff1a;发表在cvpr2021 原文链接&#xff1a; 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分答案)

基于最近大家都在考这个应用开发者基础认证考试&#xff0c;因此出了一期&#xff0c;一样复制word里面搜索做&#xff0c;很快&#xff0c;当然good luck 判断题 Ability是系统调度应用的最小单元,是能够完成一个独立功能的组件。一个应用可以包含一个或多个Ability。 正确(Tr…...

Ubuntu20.04 Kimera Semantic运行记录

Ubuntu20.04 Kimera Semantic 官方bag运行记录 以下基本为官方教程&#xff0c;有部分修改 依赖 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系统故障包括硬盘故障、控制器故障、电源故障、写入错误和热插拔错误。下面结合这些故障的应用场景和常规维修处理流程来详细讨论&#xff1a; 硬盘故障&#xff1a; 应用场景&#xff1a;在服务器RAID系统中&#xff0c;硬盘故障是最常见的问题之一。硬盘可能…...

计算机网络——数据链路层-封装成帧(帧定界、透明传输-字节填充,比特填充、MTU)

目录 介绍 帧定界 PPP帧 以太网帧 透明传输 字节填充&#xff08;字符填充&#xff09; 比特填充 比特填充习题 MTU 介绍 所谓封装成帧&#xff0c;就是指数据链路层给上层交付下来的协议数据单元添加帧头和帧尾&#xff0c;使之成为帧。 例如下图所示&#xff1a; …...

MySQL笔记-第03章_基本的SELECT语句

视频链接&#xff1a;【MySQL数据库入门到大牛&#xff0c;mysql安装到优化&#xff0c;百科全书级&#xff0c;全网天花板】 文章目录 第03章_基本的SELECT语句1. SQL概述1.1 SQL背景知识1.2 SQL语言排行榜1.3 SQL 分类 2. SQL语言的规则与规范2.1 基本规则2.2 SQL大小写规范 …...

FTP服务文件上传失败,错误码553的排故过程

本文主要记录文件上传失败&#xff0c;错误码553的排故过程。 1 背景 树莓派通过FTP给嵌入式板卡传输文件&#xff0c;好几套设备&#xff0c;发现有的能传输成功&#xff0c;有的传输不成功。树莓派和嵌入式板卡都一样的&#xff0c;出现问题时感觉很懵。 2 逐项对比 2.1 自…...

音频录制软件哪个好?帮助你找到最合适的一款

音频录制软件是日常工作、学习和创作中不可或缺的一部分。选择一个适合自己需求的录音软件对于确保音频质量和提高工作效率至关重要。可是您知道音频录制软件哪个好吗&#xff1f;本文将深入探讨两种常见的音频录制软件&#xff0c;通过详细的步骤指南&#xff0c;帮助您了解它…...

9.Unity搭建HTTP服务器

搭建HTTP服务器的几种方式 //1.使用别人做好的HTTP服务器软件&#xff0c;一般作为资源服务器时使用该方式&#xff08;学习阶段建议使用&#xff09; //2.自己编写HTTP服务器应用程序&#xff0c;一般作为Web服务器 或者 短链接游戏服务器时 使用该方式 使用别人做好的HTTP服…...

C# 热键注册工具类

写在前面 介绍一个验证过的热键注册工具类&#xff0c;使用系统类库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技术可行性&#xff1a;…...

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…...

软件工程 室友整理

如何理解结构化需求分析方法的基本思想; 结构化分析方法是一种面向数据流的需求分析方法&#xff0c;其中数据作为独立实体转换&#xff0c;数据建模定义数据的属性和关系&#xff0c;操作数据的处理建模表名当做数据在系统流动时候处理如何转换数据 简述面向对象的基本概念&a…...

JVM==>图解字节码指令

一&#xff0c;原始代码 我们来看一下执行这段代码的具体流程 那执行这段代码中 JVM就会把已经编译好的.class文件加载到内存中&#xff0c;交给CPU运行 1&#xff09;常量池载入运行时常量池 我们发现 10 并没有被存入常量池中&#xff0c; 这是因为short范围以内的数字不会…...

MISRA C 2012 标准浅析

MISRA(The Motor Industry Software Reliability Association)&#xff0c;汽车工业软件可靠性联会&#xff1b; 1994年&#xff0c;英国成立。致力于协助汽车厂商开发安全可靠的软件的跨国协会&#xff0c;其成员包括&#xff1a;AB汽车电子、罗孚汽车、宾利汽车、福特汽车、捷…...

Redis高可用之Sentinel哨兵模式

一、背景与简介 Redis关于高可用与分布式有三个与之相关的运维部署模式。分别是主从复制master-slave模式、哨兵Sentinel模式以及集群Cluster模式。 这三者都有各自的优缺点以及所应对的场景、对应的业务使用量与公司体量。 1、主从master-slave模式 【介绍】 这种模式可以采用…...

AI “自主运行”的计算机概念正逐渐成为现实

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…...

数据库系统概论期末经典大题讲解(用关系代数进行查询)

今天也是结束的最为密集的考试周&#xff0c;在分析过程中自己也有些许解题的感悟&#xff0c;在此分享出来&#xff0c;希望能帮到大家期末取得好成绩。 一.专门的关系运算 1.选择&#xff08;σ&#xff09; 选择操作符用于从关系中选择满足特定条件的元组 例如&#xff0c;…...

算法通关村第十六关-黄金挑战滑动窗口与堆的结合

大家好我是苏麟 , 今天带来一道小题 . 滑动窗口最大值 描述 : 给你一个整数数组 nums&#xff0c;有一个大小为 k 的滑动窗口从数组的最左侧移动到数组的最右侧。你只可以看到在滑动窗口内的 k 个数字。滑动窗口每次只向右移动一位。 返回 滑动窗口中的最大值 。 题目 : …...

基于jsp的搜索引擎

摘 要 随着互联网的不断发展和日益普及&#xff0c;网上的信息量在迅速地增长&#xff0c;在2004年4月&#xff0c;全球Web页面的数目已经超过40亿&#xff0c;中国的网页数估计也超过了3亿。 目前人们从网上获得信息的主要工具是浏览器&#xff0c;搜索引擎在网络中占有举足轻…...

【Altium designer 20】

Altium designer 20 1. Altium designer 201.1 原理图库1.1.1 上划岗 在字母前面加\在加字母1.1.2 自定义快捷键1.1.3 对齐1.1.4 在原有的电路图中使用封装1.1.5 利用excel创建IC类元件库1.1.6 现有原理图库分类以及调用1.1.7 现有原理图库中自动生成原理图库 1.2 绘制原理图1.…...

Proteus仿真--基于1602LCD与DS18B20设计的温度报警器

本文介绍基于1602LCD与DS18B20设计的温度报警器设计&#xff08;完整仿真源文件及代码见文末链接&#xff09; 仿真图如下 其中温度传感器选用DS18B20器件&#xff0c;主要用于获取温度数据并上传&#xff0c;温度显示1602LCD液晶显示器&#xff0c;报警模块选用蜂鸣器&#…...

Clickhouse Join

ClickHouse中的Hash Join, Parallel Hash Join, Grace Hash Join https://www.cnblogs.com/abclife/p/17579883.html https://clickhouse.com/blog/clickhouse-fully-supports-joins-full-sort-partial-merge-part3 总结 本文描述并比较了ClickHouse中基于内存哈希表的3种连接…...

Arduino驱动STS35数字温度传感器(温湿度传感器)

目录 1、传感器特性 2、硬件原理图 3、控制器和传感器连线图 4、驱动程序 STS35瑞士Sensirion公司新推出的温度传感器,STS35提供了一个完全校准、线性和供电电压补偿的数字输出&...

一起学docker系列之十八Docker可视化工具 Portainer:简介与安装

目录 前言1 简介2 安装过程2.1 创建docker容器数据卷2.2 构建运行protainer容器 3 Portainer 软件详细说明与界面导览3.1 查看本地Docker情况3.2 操作功能3.3 创建容器3.4 部署容器 4 Portainer的优势结语参考地址 前言 Docker作为容器化解决方案的热门工具&#xff0c;其可视…...

【数据结构】线段树

目录 1.概述2.代码实现2.1.聚合操作——求和2.2.聚合操作——求和、求最小值、求最大值 3.应用4.与前缀和之间的区别 更多数据结构与算法的相关知识可以查看数据结构与算法这一专栏。 1.概述 &#xff08;1&#xff09;线段树 (Segment Tree) 是一种二叉树形数据结构&#xff…...

王道数据结构课后代码题p175 06.已知一棵树的层次序列及每个结点的度,编写算法构造此树的孩子-兄弟链表。(c语言代码实现)

/* 此树为 A B C D E F G 孩子-兄弟链表为 A B E C F G D */ 本题代码如下 void createtree(tree* t, char a[], int degree[], int n) {// 为B数组分配内存tree* B (tree*)malloc(sizeof(tree) * n);int i 0;i…...

filter过滤器

package com.it.filter;import javax.servlet.*; import javax.servlet.annotation.WebFilter;import java.io.IOException;WebFilter(urlPatterns"/*") public class DemoFilter implements Filter {Override // 初始化的方法 只要调用一次public void init(Filte…...

上海市网站公安备案电话/seo入门版

1、开发环境 顾名思义&#xff0c;开发同学开发时使用的环境&#xff0c;每位开发同学在自己的dev分支上干活&#xff0c;提测前或者开发到一定程度&#xff0c;各位同学会合并代码&#xff0c;进行联调。 2、测试环境 也就是我们测试同学干活的环境啦&#xff0c;一般会由测…...

用什么软件做购物网站/太原网站关键词排名

在执行Hadoop的创建目录、写数据等情况&#xff0c;可能会出现该异常&#xff0c;而在读文件的时候却不会报错&#xff0c;这主要是由于系统的用户名不同导致的&#xff0c;由于我们进行实际开发的时候都是用Windows操作系统&#xff0c;而编译后的JAVA程序是部署在Linux上的。…...

商丘网站建设流程/yahoo引擎入口

美国当地时间五月26日&#xff0c;微软已经在MSDN上放出VS2010简体中文版供订阅用户下载。相关信息如下&#xff1a; Visual Studio 2010 Ultimate (x86) - DVD (Chinese-Simplified) 文件名 cn_visual_studio_2010_ultimate_x86_dvd_532347.iso 发布日期 (UTC): 5/26/2010 3:…...

建设银行网站怎么查开户行/上海网站营销推广

很多朋友对DOM有感冒&#xff0c;这里我花了一些时间写了一个小小的教程&#xff0c;这个能看懂&#xff0c;会操作了&#xff0c;我相信基于DOM的其它API&#xff08;如JDOM&#xff0c;DOM4J等&#xff09;一般不会有什么问题。 后附java代码&#xff0c;也可以下载&#xff…...

建网站被封了/百度手机助手app下载官网

第二章 项目初始化和第一个小例子.md初始化项目项目目录介绍自定义爬虫类自定义第一个爬虫录入代码代码解释&#xff1a;运行爬虫运行结果代码逐条分析简易版本经过了上一章的学习&#xff0c;我们已经在开发环境上安装好了scrapy的包&#xff0c;接下来我们就将初始化一个项目…...

wordpress弹出聊天/360上网安全导航

FPGA开发概括 FPGA的开发流程主要分为两部分(不考虑仿真)&#xff0c;.v文件的编写和.xdc文件的编写&#xff0c;前者为程序文件后者为管脚约束文件。 程序文件 程序文件里实现的功能为每一秒实现两个led的亮灭变化&#xff0c;产生跑马灯的效果。 代码如下&#xff0c;注释…...