redis基本数据结构

news2024/11/26 6:01:24

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的五大类型的使用,关于其他命令都可以在官网上进行查找。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1264974.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【好用的个人工具】在Docker环境下部署Simple mind map思维导图工具

【好用的个人工具】在Docker环境下部署Simple mind map思维导图工具 一、Simple mind map介绍1.1 Simple mind map简介1.2 Simple mind map特点 二、本地环境介绍2.1 本地环境规划2.2 本次实践介绍 三、本地环境检查3.1 检查Docker服务状态3.2 检查Docker版本3.3 检查docker co…

基于STM32 + TIM _定时器的基本机构和工作原理详解

前言 本篇博客主要学习了解定时器的基本结构和工作原理&#xff0c;掌握定时器的驱动程序和设计。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本次博客板子使用的是正点原子精英版&#xff0c;芯片是STM32F103ZET6,需要资料可以我拿取。 本博客内容原…

线性系统理论 -- 降阶观测器的设计

定理&#xff1a; 若系统能观测&#xff0c;且rankCm&#xff0c;则系统的状态观测器的最小维数是(n-m)。 线性定常时不变系统方程如下&#xff08;以三阶(n3)单入单出系统为例&#xff0c;有mrankC1&#xff09;&#xff1a; 取变换阵P&#xff0c;有&#xff1a; 对上述系统…

AT89S52单片机的定时器

目录 定时器/计数器的结构 工作方式控制寄存器TMOD和TCON 定时器/计数器T1、T0的4种工作方式 1.方式0 2.方式1 3.方式2 4.方式3 定时器/计数器T2的结构与工作方式 1.T2的特殊功能寄存器T2MOD和T2CON 2.特殊功能寄存器T2CON 3.T2的三种工作模式 1. 捕捉方式 2.重新…

LangChain 14 SequencialChain链接不同的组件

LangChain系列文章 LangChain 实现给动物取名字&#xff0c;LangChain 2模块化prompt template并用streamlit生成网站 实现给动物取名字LangChain 3使用Agent访问Wikipedia和llm-math计算狗的平均年龄LangChain 4用向量数据库Faiss存储&#xff0c;读取YouTube的视频文本搜索I…

基于Eclipse+Mysql+Tomcat开发的挖掘机配件营销系统

基于EclipseMysqlTomcat开发的挖掘机配件营销系统 项目介绍&#x1f481;&#x1f3fb; 大家都有目共睹&#xff0c;现在的科学技术发展很迅速。而如今&#xff0c;计算机应用已经完全融入到人们的生产和生活当中&#xff0c;特别是企业&#xff0c;现在的企业几乎都是离不开计…

论如何让Spring Boot在高压力环境下依然与众不同

文章目录 &#x1f50a;博主介绍&#x1f964;本文内容调优线程池优化线程池配置多样化设备支持分布式控制同步编程 &#x1f4e2;文章总结&#x1f4e5;博主目标 &#x1f50a;博主介绍 &#x1f31f;我是廖志伟&#xff0c;一名Java开发工程师、Java领域优质创作者、CSDN博客…

网络和信息系统指令 ( NIS2 ) 及其全球影响

网络和信息系统指令 ( NIS2 ) 将于 2024 年 10 月生效&#xff0c;旨在提高欧盟 (EU) 的网络弹性。 不过&#xff0c;其影响可能会更广泛&#xff0c;带来更严格的流程和控制&#xff0c;并重新定义我们向被视为国家关键的组织提供服务的方式。 该强制性指令将具有效力&#x…

centos7.9 + gitlab12.3.0安装

本文在centos7.9操作系统上安装gitlab 12.3.0&#xff0c;gitlab官方最新的版本已经是16.6.0了&#xff0c;这里仍然安装12.3.0版本的原因是汉化包的最新版本是12.3.0&#xff0c;如果汉化包的版本和gitlab的版本不对应&#xff0c;会出现汉化他无法启动的现象。 1、安装依赖 …

第3章 表、栈和队列

前言 本章讨论最简单和最基本的三种数据结构。实际上&#xff0c;每一个有意义的程序都将至少明确使用一种这样的数据结构&#xff0c;而栈则在程序中总是隐含使用&#xff0c;不管你在程序中是否做了声明。 在这一章&#xff0c;我们将&#xff1a; 介绍抽象数据类型…

python实现rpc的几种方式(SimpleXMLRPCServer 自带的、第三方ZeroRPC)、连接linux远程开发分布式锁、分布式id

1 python实现rpc的几种方式 1.1 SimpleXMLRPCServer 自带的 1.2 第三方ZeroRPC 2 连接linux远程开发 3 分布式锁 4 分布式id 1 python实现rpc的几种方式 # 远程过程调用-1 借助于rabbitmq,可以跨语言-2 SimpleXMLRPCServer 自带的-3 ZeroRPC-4 GRPC&#xff1a;跨语言的 htt…

【Python】torch.exp()和 torch.sigmoid()函数详解和示例

本文对torch.exp&#xff08;&#xff09;和 torch.sigmoid&#xff08;&#xff09;函数进行原理和示例讲解&#xff0c;以帮助大家理解和使用。 目录 torch.exp函数原理运行示例 torch.sigmoid&#xff08;&#xff09;函数原理运行示例torch.sigmoid相关知识 结合运行 torc…

C++设计模式——工厂模式 :简单工厂、工厂方法、抽象工厂

工厂模式可以分为三种&#xff0c;简单工厂模式&#xff0c;工厂方法模式和抽象工厂模式。 那么&#xff0c;这三种工厂模式长啥样&#xff0c;又为啥会衍生出这三种模式来呢&#xff1f;本篇和大家一起来学习总结一下。 一、简单工厂模式 简单工厂SimpleFactory 负责创建所有…

Day12 qt QMianWindow,资源文件,对话框,布局方式,常用ui控件

QMianWindow 概述 QMainWindow 是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏&#xff08; menu bar &#xff09;、多 个工具栏 (tool bars) 、多个铆接部件 (dock widgets) 、一个状态栏 (status bar) 及 一个中心部件 (central widget) 许多应用程序的基础…

Python内置类属性`__name__`属性的使用教程

更多Python学习内容&#xff1a;ipengtao.com Python中的__name__是一种内置的特殊属性&#xff0c;通常用于判断模块是作为主程序运行还是作为模块被导入。本文将深入讲解__name__属性的用法&#xff0c;通过丰富的示例代码展示其在不同情景下的应用。 模块作为主程序运行 当一…

软著项目推荐 深度学习二维码识别

文章目录 0 前言2 二维码基础概念2.1 二维码介绍2.2 QRCode2.3 QRCode 特点 3 机器视觉二维码识别技术3.1 二维码的识别流程3.2 二维码定位3.3 常用的扫描方法 4 深度学习二维码识别4.1 部分关键代码 5 测试结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天…

西南科技大学数字电子技术实验二(SSI逻辑器件设计组合逻辑电路及FPGA实现 )FPGA部分

一、实验目的 1、掌握用SSI(小规模集成电路)逻辑器件设计组合电路的方法。 2、掌握组合逻辑电路的调试方法。 3、学会分析和解决实验中遇到的问题。 4、学会用FPGA实现本实验内容。 二、实验原理 包括:原理图绘制和实验原理简述 1、1位半加器 2、1位全加器 3、三…

基于SSM的高校学生实习管理系统设计与实现

末尾获取源码 开发语言&#xff1a;Java Java开发工具&#xff1a;JDK1.8 后端框架&#xff1a;SSM 前端&#xff1a;Vue 数据库&#xff1a;MySQL5.7和Navicat管理工具结合 服务器&#xff1a;Tomcat8.5 开发软件&#xff1a;IDEA / Eclipse 是否Maven项目&#xff1a;是 目录…

快上车~「黄钊的AI日报·第二季」预约抢跑群、锁定明晚早鸟价

本周&#xff0c;即将开启我的小报童专栏「黄钊的AI日报第二季」&#xff08;12月1日~2月29日&#xff09;。 周三&#xff08;明天&#xff09;晚上&#xff0c;会举办“抢跑群”活动&#xff0c;首发「早鸟票」、专栏内容及相关福利介绍&#xff0c;包括但不限于&#xff1a;…

服务器中启动和停止项目

服务器中启动和停止项目 一、前言二、使用命令启动和关闭项目1、启动项目2、停止项目 三、使用可执行脚本启动和关闭项目1、启动项目2、停止项目 一、前言 在服务器上部署项目&#xff0c;一般就是将项目挂在后台&#xff0c;如果是微服务首选docker-compose&#xff0c;但如果…