Redis各数据类型操作命令

news2024/11/16 21:27:25

一、Redis数据类型及命令

(一)String

类别命令描述命令示例备注
取/赋值操作赋值set key valueset lclkey lclvalue
取值 get keyget lclkey
取值并赋值getset key valuegetset lclkey1 lclvalue1获取原值,并设置新的值
仅当不存在时赋值setnx key valuesetnx lcl4 value4设置成功返回1,设置失败返回0;可以用来实现分布式锁
同时设置多个值mset key value [key value ......]mset s1 v1 s2 v2 s3 v3
同时获取多个值mget key value [key value ......]mget s1 s2 s3
数值增减数值递增incr keyincr lcl3

1、当value为整数时,才能做数值增减操作

2、数值增减都是原子操作

3、redis中每一个命令都是原子操作,但是当多个命令一起执行时,就不能保证原子性,不过可以使用redis的事务和Lua脚本来实现

增加指定整数incrby key incrementincrby lcl3 5
数值递减decr keydecr lcl3
减指定证数decrby key incrmentdecrby lcl3 5
其他命令向尾部追加值append key valueappend lclkey 123该命令返回的是value的长度
获取字符串长度strlen keystrlen lclkey 

(二)hash

  hash类型也叫散列类型,它提供了字段和字段值的映射关系,字段值只能是字符串类型,不支持散列类型、集合类型等类型。

  

   hash一般用于存储需要变更的对象。

类型命令描述命令示例备注
设置/获取值设置一个字段hset key field valuehset lclhash h1 v1插入时返回1,更新时返回0
设置多个字段hmset key field value[field value......]hmset lclhash h2 v2 h3 v3 h4 v4
当字段不存在时赋值hsetnx key field valuehsetnx lclhash h5 v5
取一个字段值hget key fieldhget lclhash h1
获取多个字段的值hmget key field[field......]hmget lclhash h1 h2 h3
获所有字段的值hgetall keyhgetall lclhash返回的是错有的field和对应的值
获取字段名hkeys keyhkeys lclhash
获取字段值hvals keyhvals lclhash
获取字段数量hlen keyhlen lclhash
其他操作
 
删除一个或多个字段hdel key field[field......]hdel lclhash h1 h2
增加数字hincrby key field incrementhincrby lclhash age 5
判断字段是否存在hexists key fieldhexists lclhash h1存在返回1,不存在返回0

  String类型和hash类型的区别:hash适合存储对象数据,特别是对象属性经常发生  增删改  操作的数据;string类型也可以存储对象数据,将java对象转换成json存储,这种主要适合  查询  操作。

(三)list

  Redis的列表类型(list类型)可以存储一个有序的字符串列表,常用的操作是向列表两端添加元素,或者获得列表的某一个片段。

  列表类型内部使用双向链表实现的,所以向列表两端添加元素的时间复杂度为O(1),获取越接近两端的元素速度就越快,这意味着使用一个有几千万个元素的列表,获取头部或尾部的若干条记录也是非常快的。

  list一般用于商品的评论列表等场景

类型命令描述命令示例备注
lpush从左侧插入数据lpush key value[value......]lpush mylist 1 2 3 4
rpush从右侧插入数据rpush key value[value......]rpush mylist a b c d

lrange

从左侧获取列表中的某个片段lrange key start stoplrange mylist 0 -1
lpop从左侧弹出一个元素lpop keylpop mylist
rpop从右侧弹出一个元素rpop keyrpop mylist
llen获取列表中元素个数llen keyllen mylist
lrem删除列表中前count个值为value的元素lrem key count value

lrem mylist 2 a

当count>0时,从左边开始删除;当count<0时,从右边开始删除;当count=0时,删除所有值为value的数据
lindex获取指定索引下元素的值lindex key indexlindex mylist 5索引从0开始
ltrim只保留列表中指定片段,指定范围与lrange一致ltrim key start stopltrim mylist 5 -1
linsert向列表中插入元素linsert key before|after pivot valuelinsert mylist after b s从左侧找到pivot对应的元素,然后将value插入前/后
rpoplpush将元素从一个列表移动到另外一个列表rpoplpush list newlistrpoplprpoplpush mylist mynewlist一次只能处理一个

(四)set

  set类型为集合类型,其中的数据是不重复且没有顺序的。

  集合的常用操作是向集合中插入或删除元素,判断某个元素是否存在等,由于集合类型的redis内部是使用值为空的散列表实现的,因此所有这些操作的时间复杂度都为O(1)。

  同时redis还提供了多个集合之间的交集、并集、差集的运算。

类型命令命令描述命令样例示例备注
单集合操作sadd/srem向集合中添加/删除元素sadd key member[member......]sadd myset a b c d a a e
smembers获取集合中所有元素smembers keysmembers myset
sismember判断元素是否在集合中存在sismember key membersismember myset b存在返回1,不存在返回0
scard获取集合中元素数量scard keyscard myset
spop从集合中弹出一个元素spop keyspop myset由于set是无序的,因此spop命令会从集合中随机选择一个元素弹出
集合运算操作sdiff计算差集

sdiff key [key......]

sdiff myset myset1 myset2获取存在前一个集合但是不存在第二个集合的数据
sinter交集sinter key [key......]sinter myset myset1
sunion并集sunion key [key......]sunion myset myset1

(五)zset

  zset即sortedset,也就是有序集合,是在set集合类型的基础上,有序集合类型为集合中的每个元素都关联一个分数,这样不仅可以操作插入、删除等操作,而且还能获取分数最高或最低的前N个元素、获取指定分数范围内的元素等与分数有关的操作。

  zset和list的相同点:

    1、两者都是有序的

    2、二者都可以获取一定范围内的元素

  zset和list的不同点:

    1、列表内部是通过双向链表实现的,获取靠近两端的元素速度非常快,但是当元素增多后,获取中间的数据的速度则会变慢

    2、有序集合类型使用散列表实现,即使数据位于集合的中间部分,读取速度依然很快

    3、列表中不能简单的调整某个元素的位置,但是有序集合可以(通过更改分数实现)

    4、有序集合要比列表类型更耗内存

  zset的使用场景可以是根据商品销量对商品进行排序显示等操作。

命令命令描述命令样例示例备注
zadd

增加元素:向有序集合中加入一个元素和该元素的分数,

如果该元素已经存在,则会用新的分数替换原有的分数

zadd key score member[score member......]zadd mysortedset1 10 10a 20 20a 30 30a 6 6a
zrange/zrevrange获得排名在某个范围的元素列表(zrange是升序,zrevrange是降序)zrange key start stopzrange sortedset1 0 2
zscore获取元素的分数zscore key memberzscore mysortedset1 6a
zrem删除元素zrem key member[member......]zrem mysortedset1 6a
zrangebyscore获取指定分数区间的元素zrangebyscore key min max [withscores]zrangebyscore mysortedset1 20 60 withscores命令不带withscores时,只返回元素,如果带withscores,则返回元素及元素的分数
zincrby增加某个元素的值zincrby key increment memberzincrby mysortedset1 3 20a返回值为该元素增加后的分数
zcard获得集合中元素的数量zcard keyzcard mysortedset1
zcount获取指定分数范围内的元素个数zcount key min maxzcount mysortedset1 30 610
zremrangebyrank按照排名范围删除zremrangebyrank key start stopzremrangebyrank mysortedset1 3 4左闭右开
zremrangebyscore按照分数区间删除zremrangebyscore key min maxzremrangebyscore mysortedset1 10 30
zrangk/zrevrank获取元素的排名(下标索引)zrank key memberzrank mysortedset1 20a

(六)通用命令

命令命令描述命令样例示例备注
keys返回满足给定条件的所有keykeys patternkeys my*
del删除del keydel lcl4
exists判断key是否存在exists keyexists lcl4存在返回1,不存在返回0
expire设置超时时间(秒)expire key seconds expire lclkey 100
ttl查看key剩余过期时间ttl key ttl lclkey 如果返回-2则说明已经过期;返回-1说明没有设置过期时间
persist清除超时时间persist keypersist lclkey
pexpire设置超时时间(毫秒)pexpire key millsecondspexpire lclkey 10000
rename重命名keyrename oldkey newkeyrename lclkey qmmkey
type获取key的数据类型type keytype myset2

二、Redis特殊数据类型

(一)BitMap

  BitMap就是通过一个bit位来表示某个元素对应的值或者状态,其中的key就是元素本身,实际上底层也是通过字符串的操作来实现,redis2.2版本之后新增了setbit、getbit、bitcount等几个bitmap命令,虽然是新的命令,但是本身都是对字符串的操作,语法如下:

  使用 setbit key offset value 命令设置值,其中offset必须是数字,value只能是0或者1,同时可以使用 getbit key offset 来查询指定偏移量的值,可以使用 bitcount key 来做快速的统计(统计出来有多少设置为1的值)

127.0.0.1:6380> setbit k1 5 1
(integer) 0
127.0.0.1:6380> getbit k1 3
(integer) 0
127.0.0.1:6380> getbit k1 5
(integer) 1
127.0.0.1:6380> setbit k1 4 0
(integer) 0
127.0.0.1:6380> bitcount k1
(integer) 1
127.0.0.1:6380> setbit k1 4 1
(integer) 0
127.0.0.1:6380> bitcount k1
(integer) 2

  使用场景:

   (1)统计年活跃用户数量

    可以使用用户id作为offset,当用户在一年内访问过网站,就将对应的offset置为1,然后通过bitcount来统计i一年内访问过网站的用户数量

   (2)统计三天内活跃用户数量

  时间字符串作为key,例如"20200228:active",用户id可以作为offset,当用户访问过网站时,就将对应的偏移量的值置为1;

  统计三天的活跃用户,通过 bittop or 获取三天内访问过的用户数

  模拟场景,2021年1月21日,登陆用户3,5,7;2021年1月22日,登陆用户7,9,11;2021年1月21日,登陆用户5,6,7,8。

127.0.0.1:6380> setbit 20210121:active 3 1
(integer) 0
127.0.0.1:6380> setbit 20210121:active 5 1
(integer) 0
127.0.0.1:6380> setbit 20210121:active 7 1
(integer) 0
127.0.0.1:6380> setbit 20210122:active 7 1
(integer) 0
127.0.0.1:6380> setbit 20210122:active 9 1
(integer) 0
127.0.0.1:6380> setbit 20210122:active 11 1
(integer) 0
127.0.0.1:6380> setbit 20210123:active 5 1
(integer) 0
127.0.0.1:6380> setbit 20210123:active 6 1
(integer) 0
127.0.0.1:6380> setbit 20210123:active 7 1
(integer) 0
127.0.0.1:6380> setbit 20210123:active 8 1
(integer) 0

  统计:使用bitop命令,由于是需要统计三天内活跃的总用户,那么可以使用bitop and deskkey key[key ......],and就是取并集然后将新的值赋给deskkey,可以看到下面的命令示例,获取的统计结果为7。

127.0.0.1:6380> bitop or temp1 20210123:active 20210122:active 20210121:active
(integer) 2
127.0.0.1:6380> bitcount temp1
(integer) 7

   (3)连续三天访问的用户数量

  连续三天访问,就需要用and处理。

127.0.0.1:6380> bitop and temp2 20210121:active 20210122:active 20210123:active
(integer) 2
127.0.0.1:6380> bitcount temp2
(integer) 1

   (4)取反处理,例如当天有多少人没有访问

  使用 bitop not 命令,这里是将原有的为0的offset置为1,将1置为0,并将新的值放到新的bitmap中,这里需要特殊说明一下,bitmap的长度默认是8的倍数,因此当取反时后获取数量的话,获得的是大于原bitmap最大偏移量的最小的8的倍数减去原bitmap的数量。

  例如:为一个bitmap的23位设置位1,那么此时的bitmap长度默认为24(大于23的最小8的倍数),那么取反时,除了23位取反变成0之外,其余的23位全部由0变为1,那么新的bitmap取长度就是23

127.0.0.1:6380> setbit bitmap1 22 1
(integer) 0
127.0.0.1:6380> bitop not newbitmap bitmap1
(integer) 3
127.0.0.1:6380> bitcount bitmap1
(integer) 1
127.0.0.1:6380> bitcount newbitmap
(integer) 23

   (5)统计在线人数

  当用户登陆时,使用 setbit 设置值为1,退出时,使用 setbit 设置为0.

(二)HyperLogLog(2.8之后)

  HyperLogLog是基于bitmap计数,并且基于概率基数,这个数据结构的命令有:pfadd、pfcount、pfmerge

  可以使用pfadd向一个key中添加元素,使用pfcount获取元素个数(去重后),使用pfmerge合并两个key到一个

127.0.0.1:6380> pfadd key1 1 2 3 4 2 3 4 5 6 8 5 4 2
(integer) 1
127.0.0.1:6380> pfcount key1
(integer) 7
127.0.0.1:6380> pfadd key2 5 6 4 8 9 10 11 6
(integer) 1
127.0.0.1:6380> pfmerge key3 key1 key2
OK
127.0.0.1:6380> pfcount key3
(integer) 10

  主要用途:记录网站IP注册数,每日访问的IP数,页面实时UV,在线用户人数

  如果基数不大,就不用使用HyperLogLog。和bitmap对比,bitmap可以标识哪些用户在活跃,而HyperLogLog可以统计活跃人数等同机型内容,两者可以结合使用。

(三)Geospatial(3.0之后)

  geospatial可以用来保存地理位置,同时可以做距离计算等,geo本身不是一个数据结构,底层还是用zset来实现的。

127.0.0.1:6380> geoadd cities 116.404269 39.91582 beijing
(integer) 0
127.0.0.1:6380> geoadd cities 121.478799 31.235456 shanghai
(integer) 0
127.0.0.1:6380> geoadd cities 120.165036 30.278973 hangzhou
(integer) 1
127.0.0.1:6380> geodist cities beijing shanghai m
"1068567.6977"
127.0.0.1:6380> geodist cities beijing shanghai km
"1068.5677"
127.0.0.1:6380> zrange cities 0 -1
1) "hangzhou"
2) "shanghai"
3) "beijing"
127.0.0.1:6380> zrange cities 0 -1 withscores
1) "hangzhou"
2) "4054134264615180"
3) "shanghai"
4) "4054803475356102"
5) "beijing"
6) "4069885555377153"

  使用场景,附近的人,地图等。

二、Redis消息模式

(一)队列模式

  队列模式使用list类型的lpush和rpop实现消息队列;

  发送者使用lpush命令向list中存数据,获取数据可以使用rpop命令获取数据

阿里云:0>lpush queue 1 2 3
3

阿里云:0>rpop queue
1

阿里云:0>rpop queue
2

  但是这样存在一个问题:如果list中没有数据的话,消息接收方会一直发送rpop命令,如果这样的话,每一次都会建立一个连接,这样显然不太好。

  可以使用brpop,这样取不到数据的话,就会一直阻塞,在一定范围内没有取出则返回null

brpop list1 10

  其中key后面跟的是阻塞时间。可以忽略。

(二)发布订阅模式

  首先,消费者需要订阅:subscribe channel

subscribe lcl-channel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "lcl-channel"
3) (integer) 1

  然后消息生产者生产消息:publish channel message

publish lcl-channel "124"

  此时,消费者就会输出对应的消息

subscribe lcl-channel
Reading messages... (press Ctrl-C to quit)
1) "subscribe"
2) "lcl-channel"
3) (integer) 1
1) "message"
2) "lcl-channel"
3) "124"

  可以看到,无论订阅还是消费消息,都输出了三个结果,类型(订阅或消息)、通道、信息(订阅渠道的顺序或消费的消息)

三、Redis Stream

  redis Stream官方定义:以更抽象的方式建模日志的数据结构。通俗地讲,Redis Stream就类似于Kafka和MQ。

  Stream有消息、生产者、消费者和消费组四个部分组成。

(一)添加(XADD)、删除(XDEL)、获取长度(XLEN)

  首先添加、删除和查看消息长度;添加时,stream名称后面可以跟*或者ID,如果使用*,则redis会根据内置的规则生成ID,同时一次可以设置多个field

127.0.0.1:6380> xadd orders * orderid 123 ordertype 3
"1611839914184-0"127.0.0.1:6380> xdel orders 1611839914184-0
(integer) 1
127.0.0.1:6380> xadd orders * orderid 123 ordertype 4
"1611840003654-0"
127.0.0.1:6380> xadd orders * orderid 123 ordertype 5
"1611840014821-0"
127.0.0.1:6380> xlen orders
(integer) 2

(二)正序获取已有数据(XRANGE)、反序获取已有数据(XREVRANGE)

  可以使用XRANGE获取已有的数据,XRANGE后面需要ID的范围,获取的数据则是两个ID之间的数据,同时也可以使用 - 和 + 来表示最小ID和最大ID;也可以带count参数,表示需要获取多少条数据

127.0.0.1:6380> xrange orders - +
1) 1) "1611840003654-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "4"
2) 1) "1611840014821-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "5"
3) 1) "1611840405335-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "6"
4) 1) "1611840408395-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "7"
5) 1) "1611840410425-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "8"


127.0.0.1:6380> xrange orders - + count 3
1) 1) "1611840003654-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "4"
2) 1) "1611840014821-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "5"
3) 1) "1611840405335-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "6"

  也可以逆向读取

127.0.0.1:6380> xrevrange orders + -
1) 1) "1611840410425-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "8"
2) 1) "1611840408395-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "7"
3) 1) "1611840405335-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "6"
4) 1) "1611840014821-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "5"
5) 1) "1611840003654-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "4"
127.0.0.1:6380> xrevrange orders + - count 3
1) 1) "1611840410425-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "8"
2) 1) "1611840408395-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "7"
3) 1) "1611840405335-0"
   2) 1) "orderid"
      2) "123"
      3) "ordertype"
      4) "6"

(三)阻塞读取(XREAD)

  命令:xread count num block time streams streaname id

  阻塞获取指定stream名称中指定id的消息,如果超过设置时间,则停止阻塞。

  以 xread count 2 block 50000 streams orders $ 为例,获取stream名称为orders的2条消息,阻塞时间为50秒,如果阻塞时间为0,则表示只要没有读取到数据,则永远阻塞。后面的$表示只获取最新的数据。

127.0.0.1:6380> xread count 2 block 50000 streams orders $
1) 1) "orders"
   2) 1) 1) "1611840884859-0"
         2) 1) "orderid"
            2) "123"
            3) "ordertype"
            4) "9"
(5.17s)

  同时可以同时订阅多个stream流

xread count 2 block 50000 streams orders orders1 orders2 $

(四)消费组:创建消费组(XGROUP)、消费组读取(XREADGROUP)

  创建消费组:XGROUP [CREATE key groupname id-or-$][SETID key id-or-$] [DESTROY key groupname][DELCONSUMER key groupname consumername]

  需要注意的是,目前XGROUP CREATE的streams必须是一个存在的streams,否则会报错: 

127.0.0.1:6380> xgroup create orders111 g1 $
(error) ERR The XGROUP subcommand requires the key to exist. Note that for CREATE you may want to use the MKSTREAM option to create an empty stream automatically.
127.0.0.1:6380> xgroup create orders g1 $
OK

  根据消费组获取消息:

127.0.0.1:6380> xreadgroup group g2 qmm count 5 block 0 streams orders >
1) 1) "orders"
   2) 1) 1) "1611842177694-0"
         2) 1) "orderid"
            2) "123"
            3) "ordertype"
            4) "15"
(4.77s)

四、Redis Pipeline

  Pipeline是客户端提供的一种批处理技术,可以批量执行一组命令,一次性返回结果,可以减少频繁的请求应答。

五、Redis事务

  redis的事务是通过multi、exec、discard、watch、unwatch这五个命令来完成的。

  redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合

  redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行。

  redis不支持回滚操作。

命令描述语法
multi用于标记事务的开始,redis会将后续的命令逐个放入队列中,然后使用exec命令原子化的执行这个命令序列
exec在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态
discard清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态
watch

当某个事务需要按照条件执行时,就要使用这个命令将给定的键设置为受监控的状态

当监控一个key时,如果

watch key
unwatch清除所有先前为一个事务监控的键

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

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

相关文章

服务器解析漏洞与cms靶场搭建教程

文章目录 一、解析漏洞定义二、Kali安装docker并搭建DVWA靶场三、Win7 IIS7漏洞复现四、BEES靶场搭建五、CPMS靶场搭建六、SDCMS靶场搭建 一、解析漏洞定义 解析漏洞主要是一些特殊文件被Apache、IIS、Nginx等Web服务器在某种情况下解释成脚本文件格式并得以执行而产生的漏洞 …

The Company Requires Superficial StudyPHP 变量的使用 ③

作者 : SYFStrive 博客首页 : HomePage &#x1f4dc;&#xff1a; PHP MYSQL &#x1f4cc;&#xff1a;个人社区&#xff08;欢迎大佬们加入&#xff09; &#x1f449;&#xff1a;社区链接&#x1f517; &#x1f4cc;&#xff1a;觉得文章不错可以点点关注 &#x1f44…

基于Java电动车租赁网站设计实现(源码+lw+部署文档+讲解等)

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

信号链噪声分析20

文章目录 概要整体架构流程技术名词解释技术细节小结 概要 所有模数转换器(ADC)都有一定量的“折合到输入端噪声”&#xff0c;可以将其模拟为与无噪声 ADC 输入串联的噪声源。折合到输入端噪声与量化噪声不同&#xff0c;后者仅在 ADC 处理交流 信号时出现。多数情况下&#x…

嵌入式中C++开发的基本操作方法

第一&#xff1a;面向对象 1、配置环境 虚拟机上网&#xff08;ping www.baidu.com&#xff09;sudo apt-get update //更新软件包sudo apt-get install -f //更新软件依赖sudo apt-get install g //安装c编译器 2、C发展 c98,第一版 c03,c11,c17 3、为什么学习C 4、面向对…

python包的研究

目录 json的方法timecollectionsdatetimetimestampsocket json的方法 json.load&#xff1a;表示读取文件&#xff0c;返回python对象 json.dump&#xff1a;表示写入文件&#xff0c;文件为json字符串格式&#xff0c;无返回 json.dumps&#xff1a;将python中的字典类型转换…

11-Vue常见优化手段

前言&#xff1a; 永远不要过早优化&#xff0c;见招拆招 使用key 对于通过循环生成的列表&#xff0c;应给每个列表项一个稳定且唯一的key,这有利于在列表变动时&#xff0c;尽量少的删除&#xff0c;新增&#xff0c;改动元素 index作为key值是唯一的&#xff0c;但不够稳…

STM32外设系列—sg90(舵机)

文章目录 一、sg90简介二、引脚连接三、控制方法四、程序设计4.1 配置定时器4.2 编写控制程序 五、360舵机 一、sg90简介 首先介绍说一下什么是舵机。舵机是一种位置&#xff08;角度&#xff09;伺服的驱动器。适用于一些需要角度不断变化的&#xff0c;可以保持的控制系统。…

threejs物理效果和声音

个人博客地址: https://cxx001.gitee.io 一、Threejs中如何创建物理场景 threejs中创建物理场景我们用它的扩展库&#xff1a;Physijs。它可以使场景中的对象有重力效果&#xff0c;可以相互碰撞&#xff0c;施加力之后可以移动&#xff0c;还可以通过合页和滑块在移动过程中…

LeetCode 打卡day44--完全背包问题及其应用

一个人的朝圣 — LeetCode打卡第44天 知识总结 Leetcode 518. 零钱兑换 II题目说明代码说明 Leetcode 377. 组合总和 Ⅳ题目说明代码说明 知识总结 今天结束了完全背包问题, 完全背包问题与01背包问题的区别在于可以无限次的使用物品的数量. 其和01背包的差别在于, 01背包先遍…

Leetcode-每日一题【707. 设计链表】

题目 你可以选择使用单链表或者双链表&#xff0c;设计并实现自己的链表。 单链表中的节点应该具备两个属性&#xff1a;val 和 next 。val 是当前节点的值&#xff0c;next 是指向下一个节点的指针/引用。 如果是双向链表&#xff0c;则还需要属性 prev 以指示链表中的上一…

Spring Boot 中的 @Id 注解是什么,原理,如何使用

Spring Boot 中的 Id 注解是什么&#xff0c;原理&#xff0c;如何使用 在 Spring Boot 中&#xff0c;Id 注解是一个非常重要的注解&#xff0c;它用于映射实体类中的主键字段。本文将介绍 Id 注解的作用、原理和使用方法。 1. Id 注解的作用 在 Spring Boot 中&#xff0c;…

shardingsphere-proxy 实现postgresql的分库分表

1、docker 安装zookeeper 1、拉取镜像 docker pull zookeeper2、运行容器 docker run -d -e TZ"Asia/Shanghai" -p 2181:2181 -v /home/sunyuhua/docker/zookeeper:/data --name zookeeper --restart always zookeeper3、查看容器是不是运行成功 docker exec -i…

threejs场景

个人博客地址: https://cxx001.gitee.io 前言 对象添加到场景里才能被渲染&#xff0c;场景是整个画面的容器。场景要显示任何东西&#xff0c;一般要有摄像机、光源、渲染对象。本章主要介绍场景类里常用的方法和属性&#xff0c;以及构建场景的基本组件。几何体和网格&…

从小白开始学习CAD(一)

什么是CAD ? CAD是计算机辅助设计&#xff08;Computer-Aided Design&#xff09;的缩写&#xff0c;它是一种利用计算机软件辅助进行设计和绘图的技术。 CAD是干什么的&#xff1f; CAD广泛应用于工程设计、建筑设计、产品设计等领域&#xff0c;可以提高设计效率、减少错误…

EthersV6之BigInt踩坑记录

起因&#xff1a;今天在调用合约的时候发现使用 BIgInt 丢了精度。看了下发现是自己的姿势不对&#xff0c;记录一下问题。 一、错误操作 const amountIn 2e24 const contract contract.function(BigInt(Number(2e24))为什么会这么写呢&#xff0c; 因为我们前端库升级到了 …

【C语言初阶(6)】猜数字游戏

文章目录 1. 游戏描述2. 代码结构2.1 菜单函数2.2 游戏函数2.3 主体函数 3. 代码实现 1. 游戏描述 电脑自动生成一个1-100以内的数字。我们输入一个我们猜的数字。如果我们猜的数字比电脑随机生成的数字大&#xff0c;那么输出&#xff08;猜大了&#xff09;&#xff0c;反之…

【MinIO异常】Storage reached its minimum free drive threshold 的解决方案

Storage reached its minimum free drive threshold 的解决方案 一、背景描述二、原因分析三、问题解决 一、背景描述 部署在Linux服务器上的MinIO服务器昨天使用的还正常&#xff0c;包含上传文件&#xff0c;下载文件&#xff0c;登录MinIO浏览器端&#xff0c;然而今天登录…

chatgpt赋能python:同一个python文件能同时运行多次吗?

同一个python文件能同时运行多次吗&#xff1f; Python作为一种高级编程语言&#xff0c;具有丰富的语法和功能。在编写Python程序时&#xff0c;我们常常需要考虑不同的需求。有时我们可能需要使用相同的python文件运行不同的程序&#xff0c;这时候很自然的问题就会出现&…

【机器学习】【期末复习】有关机器学习的简答题可供期末复习参考

本文为学校课程《机器学习》中老师给出的一些有关机器学习的简答题的详细解答&#xff0c;可供复习参考&#xff0c;基本答案全是正确的。 目录 什么是判别式模型和生成式模型&#xff0c;并且举例说明各自包含哪些典型的机器学习模型&#xff1f;L1 和 L2 的正则化的区别数据归…