【复习】Redis
数据结构
Redis常见的数据结构
- String:缓存对象
- Hash:缓存对象、购物车
- List:消息队列
- Set:点赞、共同关注
- ZSet:排序
Zset底层?
Zset底层的数据结构是由压缩链表或跳表实现的
- 如果有序集合的元素 < 128,并且每个元素 < 64字节时,会用压缩列表作为Zset类型的底层数据结构
- 如果有序集合的元素不满足上面的条件,会用跳表作为Zset类型的底层数据结构
跳表是怎么实现的?

跳表在创建节点时,随机生成每个节点的层数。
跳表在创建节点时,先生成[0, 1]的随机数,如果随机数 < 0.25,层数就会增加一层;然后继续生成下一个随机数,直到随机数 > 0.25结束,最终确定该节点的层数
为什么Zset使用跳表而不是B+树?
- B+树的设计目标是优化磁盘,通过减少树的高度来降低磁盘寻道次数;跳表是基于链表,通过多级索引加速查询,内存访问模式更符合CPU缓存局部性。Redis是内存数据库,数据完全存储在内存中,不需要优化磁盘IO,B+树的磁盘特性对Redis意义不大,跳表的设计更优
- 跳表相比B+树实现起来更简单,B+树插入和删除可能需要触发节点的分裂和合并,跳表插入时只需要随机生成层高,删除时直接移除节点并调整指针即可。
- B+树每个节点需要存储多个键值和叶子节点,存在内存碎片;跳表每个节点只需要存储键值、层高、多个前向指针,内存占用更紧凑。
压缩列表是怎么实现的?
压缩列表是由连续内存块组成的顺序型数据结构,类似数组。
- 查找第一个元素和最后一个元素时间复杂度:O(1)
- 查找其他元素:只能逐个查找,复杂度O(n)
压缩列表的缺点:会发生连锁更新,导致压缩列表占用的内存空间要多次重新分配,这回直接影响到压缩列表的访问性能。
压缩列表只适合保存数据量不多的场景。
quicklist和listpack这两种数据结构就是为了尽可能地保持压缩列表节省内存的优势
哈希表怎么扩容的?
在正常服务请求阶段,插入的数据都会写到哈希表1中,此时哈希表2没有被分配空间,随着数据量的增多,触发了rehash操作:
- 给哈希表2分配空间,一般比哈希表1大2倍
- 将哈希表1的数据移动到哈希表2中
- 迁移完成后,把哈希表1的空间释放,并把哈希表2设置为哈希表1,在哈希表1新创建一个空白的哈希表,为下次rehash做准备。
存在问题:如果哈希表1非常大,那么每次迁移到哈希表2的时候,可能会对redis造成阻塞,无法响应其他请求。
解决:在rehash进行期间,每次进行新增、删除、查找操作,redis除了操作哈希表1,还会操作redis2,这样就把一次大量数据的迁移工作分摊到了多个请求中。
注:哈希表扩容时,如果来了一个读请求,会现在哈希表1里查找;如果没找到,才会到哈希表2里查找。
String是用什么存储的?为什么不用c语言的字符串?
redis中的string字符串使用SDS数据结构存储的,SDS结构如下:
- len:记录了字符串的长度
- alloc:分配给字节数组的空间长度
- flags:用来表示不同类型的SDS(sdshdr5、sdshdr8、sdshdr16、sdshdr32、sdshdr64)
- buf[]:字符数组,用来保存实际数据
SDS数据结构可以O(1)获取字符串长度,c语言的字符串需要O(n)
SDS不需要"\0"来表示字符串结尾,有个len来记录字符串的长度(但是她为了兼容部分c的库函数,还是加了"\0")
C语言的字符串在追加的时候是不安全的,程序内部不会判断缓冲区大小是否够用,当缓冲区发生溢出后会导致程序异常;SDS结构里加入alloc和len,这样可以通过alloc - len来判断剩余缓冲区的大小,当缓冲区大小不够用时,redis会自动扩大SDS的空间大小。
线程模型
Redis为什么快?
单线程的redis吞吐量可以达到10w/s
- Redis大部分的操作都在内存中完成的,redis的瓶颈可能是机器的内存或网络带宽而非CPU
- Redis采用单线程模型可以避免多线程之间的竞争,省去了多线程切换带来的开销
- Redis采用IO多路复用机制处理大量客户端的Socket请求,在只运行单线程的情况下,该机制允许内核同时存在多个监听Socket和已连接Socket。
Redis的单线程指的是”接收客户端请求 -> 解析请求 -> 进行读写数据操作 -> 发送数据给客户端“这个过程是一个线程完成的,但是Redis程序不是单线程的,Redis在启动时,会启动后台线程
关闭文件、AOF刷盘、释放内存这些任务会创建单独的线程来处理,如果放在主线程来处理,Redis主线程就会发生阻塞。
Redis6也采用多个IO线程来处理网络请求,因为随着硬件的升级,Redis的性能瓶颈出现在网络IO的处理上
Redis怎么实现IO多路复用
因为Redis是单线程的,所有的操作都是按顺序进行,由于读写操作等待用户的输入和输出都是阻塞的,IO多路复用就是为了单线程的服务同时处理多个客户端的请求。
多路:指多个网络连接客户端
复用:指复用同一个进程
IO多路复用是使用一个线程来检查多个Socket的就绪状态,在单个线程中通过记录跟踪每个Socket的状态来管理处理多个IO流
日志
Redis的持久化方式?
Redis的读写操作都是发生在内存的,但是redis重启后,内存中的数据就会丢失,为了保证内存中的数据不丢失,就需要持久化机制,把数据存储到磁盘,这样Redis重启后就能从磁盘中恢复数据,Redis主要有两种持久化方式,分别是:
-
AOF日志:每执行一条写操作,就会把该命令以追加的方式写入文件中,redis重启时,会逐一执行这个文件里的命令将数据恢复。redis由三种写回磁盘的策略:
- Always:每次写操作命令执行完后,同步将AOF日志数据写回磁盘
- Everysec:每次写操作命令执行完后,先将命令写到缓冲区中,再每隔一秒将数据写回磁盘
- No:Redis不控制写回磁盘的时机,交给操作系统控制,每次写操作后先将命令写到缓冲区,由操作系统决定何时将命令写回磁盘。
-
RDB快照:RDB快照只记录一瞬间的内存数据,记录的是实际的数据。Redis有两个命令来生成RDB快照:
- save命令:在主线程中生成RDB文件(会阻塞主线程)
- bgsave命令:创建一个子线程来生成RDB文件(避免阻塞主线程)
AOF日志记录的是操作命令,用AOF做故障恢复时,需要全量把日志全部执行一遍,一旦AOF日志非常多,会造成Redis恢复操作慢。所以引入了RDB快照(记录一瞬间的内存数据,记录的是实际数据,AOF文件记录的是命令操作的日志,而不是实际数据)
内存淘汰和过期删除
内存淘汰和过期删除的区别?
内存淘汰是在内存满时会触发内存淘汰策略来淘汰一些不必要的资源
过期删除是将已过期的键值对进行删除
内存淘汰策略有哪些?
内存淘汰:当Redis内存达到设置的阈值时,Redis就会主动挑选部分key删除以释放更多的内存。
Redis在每次处理客户端命令时,都会对内存使用情况判断,如果必要,则执行内存淘汰。内存淘汰的策略有:
- 前缀:
- allkeys:对所有的key进行淘汰,从dict的哈希表中挑选
- volatile:只对设置了TTL的key进行淘汰,从expires的哈希表中挑选
- 后缀:
- ttl:淘汰ttl小的
- random:随机挑选
- lru:基于LRU算法
- lfu:基于LFU算法
过期删除策略?
redis的失效缓存不会立即删除,而是使用惰性删除 + 定期删除这两种策略配合
- 惰性删除:在访问或修改key时,判断key是否过期,如果过期就删除key;如果没有过期,就不做处理,返回正常的键值对
- 定期删除:每隔一段时间随机从数据库中取出一部分key进行检查,删除过期的key,如果过期的key≥选举的key的四分之一,则再次选取,直到<四分之一,这个过程可能会很长时间,所以需要设置循环的上限。
集群
Redis主从同步
-
全量同步:以下情况会发生全量同步
- 主从集群首次建立连接
- 从服务器断开连接时间过长
步骤:
- 从服务器发送SYNC命令,开始请求同步
- 主服务器收到SYNC命令后,生成RDB快照,并将生成的RDB文件发送到从服务器中
- 从服务器收到RDB文件后,先清空当前的数据集,并载入RDB文件中的数据
- 在RDB文件传输的过程中,如果又有新的指令,主服务器会将新的指令先放在缓冲区中,一旦RDB文件传输完成,主服务器又会将缓冲区里的命令发给从服务器,保证数据的一致性。
-
增量同步:允许从服务器从断点处继续同步
步骤:
- 从服务器在网络恢复后,发送psync命令
- 主服务器收到psync命令后,告诉从服务器接下来要用增量同步的方式同步数据
- 主服务器将从服务器断开这段时间内执行的命令,发送给从服务器。
(断开这段时间内执行的命令会存在主服务器的环形缓冲区中,主要存放的是最近传播的写命令,如果缓冲区里的一部分数据还没同步给从服务器,就已经被覆盖了,主服务器就会再次采取全量同步)
哨兵机制的原理?
redis的主从集群中,主从模式是读写分离的,如果主节点挂了,需要选择一个主节点变成从节点,如果没有哨兵机制,那么只能人工选择一个主节点变成从节点,还要通知其他从节点现在主节点的变更。
哨兵机制主要是实现了主从节点的故障转移,他会检测主节点是否存活,如果主节点挂了,就会选取一个从节点当成主节点,并且把新的主节点信息通知给其他的从节点。
哨兵机制选择主节点的算法?
-
故障节点主观下线:哨兵节点会定时对redis集群里的所有节点发送心跳包检测节点是否正常,如果一个节点没有恢复哨兵节点的心跳包,则认为该节点主观下线
-
故障节点客观下线:当一个节点被标记成故障,不代表这个节点下线了,但是如果哨兵集群中有超过quorum数量的哨兵节点认为该redis节点主观下线,则该redis客观下线
如果下线的redis节点是从节点或哨兵节点,则没有后续操作了;如果是主节点,则开始故障转移,从剩下的从节点中选出一个节点升级为主节点
-
哨兵集群中选择Leader:要从redis集群中选择一个节点变成主节点,必须先从哨兵节点中选取leader,一个哨兵节点至少要拿到quorunm个赞成票,才能成为Leader
-
哨兵Leader选择新主节点:哨兵Leader从redis从节点中选择一个redis节点作为主节点
- 首先判断slave节点与master节点断开时间长短,如果超过指定值(down-after-milliseconds * 10)则会排除该slave节点。
- 然后判断slave节点的slave-priority值,值越小优先级越高。(如果是0则用不参与选举,默认是0)
- 如果slave-priority一样,则判断slave节点的offset值,越大说明数据越新,优先级越高。
- 最后是判断slave节点的运行id大小,越小优先级越高。
Redis集群的模式?
Redis缓存数据量大到一台服务器无法缓存时,就需要使用Redis切片集群,将数据分布在不同的服务器上,降低对单主节点的依赖。
一个切片有16384个哈希插槽,这些哈希插槽类似数据分区,根据他的key被映射到一个哈希槽中。
场景
为什么使用Redis
- Redis具备高性能:如果用户第一次访问Mysql中的某些数据,这个过程比较慢,因为是从磁盘上读取的;如果将该用户的数据缓存在Redis中,下次在访问这些数据的时候就可以直接从Redis中读取了,操作Redis缓存就是直接操作内存,速度快。【需要考虑Mysql和Redis中的数据一致性】
- Redis具备高并发:单台Redis的QPS是Mysql的10倍,所以访问Redis能承受的请求远远大于Mysql,因此可以考虑将数据库中一部分数据缓存到Redis中,这样就不需要每次请求都到数据库中查了。
为什么Redis比Mysql快?
- Redis是基于内存存储、Mysql是基于磁盘存储
- Redis是基于键值对结构,支持简单的数据结构;Mysql需要定义表结构、索引等复杂的数据结构
- Redis采用单线程可以避免多线程之间的竞争,省去了多线程切换带来的开销。
本地缓存和分布式缓存的区别
本地缓存:将数据存储在本地应用程序或服务器上,用于加速数据访问,本地缓存通常是使用内存作为存储介质,利用内存的高速读写来提高访问速度。
本地缓存:由于本地缓存是存储在本地内存中,访问速度快,而且能够降低对远程服务器的访问次数;但是本地缓存的可扩展性收到硬件资源的限制,无法支持大规模的数据存储。
分布式缓存:将数据存储在多个分布式节点上,通过协同工作来提供高性能的数据访问服务,利用多台服务器来分担数据存储和访问的压力。
分布式缓存:节点可以动态扩展,能够支持大规模数据存储和访问的需求;但是相对本地缓存,分布式存储的访问速度相对慢,因为数据需要从多个节点进行访问,且需要通过网络进行数据传输。
Redis分布式锁的实现原理?
分布式锁是分布式环境下并发控制的一种机制,用来控制某个资源在同一时刻只能被一个应用使用。
Redis本身可以被多个客户端共享,可以用来保存分布式锁,而且Redis的读写性能高,可以应对高并发锁的场景。
redis的set命令有个nx参数可以实现”key不存在时插入“,所以可以使用它实现分布式锁:
- 如果key不存在,则表示插入成功(加锁成功)
- 如果key存在,则表示插入失败(加锁失败)
加锁的操作要注意:
- 加锁包括了:读取锁变量、检查锁变量值、设置锁变量三个操作,需要以原子操作的方式完成,所以使用set命令要带上nx选项来实现加锁。
- 锁变量需要设置过期时间,以免客户端拿到锁后发生异常,导致锁一直无法释放
- 锁变量的值需要能够区分来自不同客户端的加锁操作。
大Key问题?
字符串类型的Key对应的Value值占用空间很大就是大Key问题
大Key问题会导致:内存占用过高,从而触发内存淘汰策略;大Key会占用大量内存,导致性能下降;会造成网络拥堵;会导致主从同步延迟
解决:
- 对大Key进行拆分,将一个含有数万成员的hashkey拆分成多个hashkey;
- 将不适用Redis的数据移到别的地方存储,并在Redis中异步删除这个数据
什么是热key?
一般是以key的请求频率来判断的,例如:
- QPS集中在特定的key
- 带宽使用率集中在特定的Key
- CPU使用时间占比集中在特定的Key
解决:
- 将对应的热ky进行复制并迁移到其他的数据分片,来解决单个数据分片的热key压力
- 如果热key的产生来自读请求,可以使用读写分离架构来降低每个数据分片的读请求,也可以不断增加从节点。
怎么保证redis和mysql数据缓存的一致性?
- 对于读数据,如果redis不命中,会先去数据库中查询后加载到redis中
- 对于写数据,会更新数据库后去删除缓存
缓存系统就是CAP中的AP,通过牺牲强一致性来提高性能,如果需要数据库和缓存保持强一致性,就不适合用缓存。
缓存的过期时间设置是太短、太长都不好:
- 太短的话,请求可能会比较多的落在数据库上,就失去了缓存的意义
- 太长的话,缓存中的脏数据会让系统长时间处于一个延迟的状态,会浪费内存。
通过一些方案是可以达到最终一致性的(针对删除缓存异常的情况):
- 删除缓存重试策略(消息队列):如果删除缓存失败,可以从消息队列中重新读取数据,然后再删除缓存;如果删除缓存成功,就要把数据从消息队列中移除,避免重复操作。
- 订阅MySQL binlog,再操作缓存:正常操作是先更新数据库,再删除缓存,一旦数据库更新成功,就会产生一条变更日志记录再binlog里,我们通过订阅binlog日志,拿到要操作的数据,然后执行缓存删除。
缓存雪崩、缓存击穿、缓存穿透是什么?
-
缓存雪崩:大量缓存数据同时失效,或redis宕机,如果有大量的用户请求,都无法在redis中处理,于是请求直接访问数据库,造成数据库的压力,严重的会导致数据库宕机
- 如果要给缓存设置过期时间,应该避免大量的数据设置同一个过期时间,可以在设置过期时间的时候给这些数据加上随机数,这样数据就不会在同一时间过期
- 当业务线程在处理用户请求时,如果访问的数据不在redis里,就加个互斥锁,保证同一时间只能由一个请求来构建缓存(未能获取互斥锁的请求要么锁释放后重新读取缓存,要么返回空值或默认值),互斥锁一定要设置过期时间,不然一个请求拿到锁可能因为一些意外而阻塞,这时其他请求也一直拿不到锁。
- 让缓存“永久有效”,将更新缓存的工作交给后台线程定时更新
-
缓存击穿:缓存中某个热点数据过期,大量的请求访问该热点数据,就无法从缓存中读取,直接访问数据库,数据库很容易被高并发的请求冲垮。
- 当业务线程在处理用户请求时,如果访问的数据不在redis里,就加个互斥锁,保证同一时间只能由一个请求来构建缓存(未能获取互斥锁的请求要么锁释放后重新读取缓存,要么返回空值或默认值),互斥锁一定要设置过期时间,不然一个请求拿到锁可能因为一些意外而阻塞,这时其他请求也一直拿不到锁。
- 不给热点数据设置过期时间,由后台异步更新缓存,或者在热点数据过期前,提前通知后台线程更新缓存
缓存击穿可以理解成时缓存雪崩的一个子集,缓存雪崩指的是大量的key过期,而缓存击穿特指的是热点key过期。
-
缓存穿透:用户访问的数据即不在缓存中,也不在数据库中,导致请求在访问缓存时,发现缓存缺失,再去访问数据库,数据库也没有对应的数据,当有大量的这种请求到来,数据库的压力就会很大。
- 在Api入口处判断要请求的参数是否合法,如果不合法直接返回错误,防止进一步去访问数据库和缓存
- 可以争对查询的数据,在缓存中也设置一个空值或默认值,这样后续的请求就可以从缓存中获取空值或默认值返回给应用,而不会继续查询数据库
- 布隆过滤器:在写入数据库数据时,先用布隆过滤器做个标记,在用户请求到来时,业务线程确认缓存失效后,可以通过查询布隆过滤器快速判断数据是否存在,不存在就不通过查询数据库来判断数据库来判断数据是否存在。即使发生了缓存穿透,大量的请求只会查询Redis和布隆过滤器,而不会查询数据库。
介绍一下布隆过滤器的原理
在写入数据库数据时,先用布隆过滤器做个标记。
请求过来会先经过布隆过滤器,布隆过滤器先判断数据库中是否存在这条数据,如果不存在,就会拒绝这个请求。


注意,布隆过滤器判断一个元素不存在时,它绝对不存在;但是如果它判断一个元素存在,这个元素可能会不存在。
如何实现秒杀场景处理高并发以及超卖现象?
-
在数据库层面:
- 在查询商品库存时加排他锁,比如“select * from goods where id = #{id} for update”,此时相当于对id为#{id}的数据行加锁,其他线程可以使用select读取数据,但是如果是select for update、update、delete都会阻塞,直到线程A提交事务,其他线程才能获得锁。
- 在更新数据库的时候,可以通过加一个库存限制的条件“select * from goods where id = #{id} and stock > 0”
-
利用分布式锁:同一个key,同一个时间只有一个客户端拿到锁,其他客户端会陷入无限等待来尝试获取锁,只有获得锁的客户端才能执行接下来的业务逻辑
缺点:同一个商品在多个用户同时下单时,会基于分布式锁串行化处理,导致没法同时处理用同一个商品的大量下单请求。
-
利用Redis的incr、decr的原子性 + 异步性:
- 系统初始化时,将商品库存加到Redis中
- 收到秒杀请求时,再redis中进行预减库存(利用incr、decr的原子性),当redis中库存不足时,直接返回秒杀失败
- 把秒杀请求放入异步队列,返回正在排队中
- 服务端异步请求出队(有些商品规定用户只能购买一次,防止重复秒杀),出队成功的商品可以生成秒杀订单,扣减库存
- 用户在客户端申请秒杀请求后,会有个定时任务进行查询,查看秒杀是否成功,如果秒杀成功就进入秒杀订单详情,否则就会提示秒杀失败。
相关文章:
【复习】Redis
数据结构 Redis常见的数据结构 String:缓存对象Hash:缓存对象、购物车List:消息队列Set:点赞、共同关注ZSet:排序 Zset底层? Zset底层的数据结构是由压缩链表或跳表实现的 如果有序集合的元素 < 12…...
在Spring Boot+Vue前后端分离的项目中使用JWT实现基本的权限校验
说明 在 Spring Boot + Vue 前后端分离的项目中,如果不使用第三方服务(如 Spring Security、Shiro 等),可以通过自定义实现基本的权限校验。 使用JWT实现步骤 以下是实现步骤: 1. 设计权限模型 通常权限模型包括: 用户(User):系统的使用者。角色(Role):用户的权…...
蓝桥杯单片机组第十二届省赛第二批次
前言 第十二届省赛涉及知识点:NE555频率数据读取,NE555频率转换周期,PCF8591同时测量光敏电阻和电位器的电压、按键长短按判断。 本试题涉及模块较少,题目不难,基本上准备充分的都能完整的实现每一个功能,并…...
伪404兼容huawei生效显示404
根据上述思考,以下是详细的中文分步说明: --- **步骤 1:获取目标设备的User-Agent信息** 首先,我们需要收集目标设备的User-Agent字符串,包括: 1. **iPhone设备的User-Agent**: Mozi…...
UIAutomation开发常用方法的参考文档
简介 由于UIAutomation的官方文档只有一个github中的readme文件,只是简单的使用示例,具体使用还需要在代码中查找,非常不方便。经过我多年使用UIAutomation开发的经验和整理,把常用的功能梳理成本文档,作为我的开发参考使用,这样就不用每次都翻代码了,同时也可以使用AI…...
数据库面试题(基础常考!!!)
在数据库领域,无论是日常开发还是面试场景,都有一些高频且重要的问题需要我们深入理解和掌握。本文将对这些常见面试题进行详细阐述,帮助大家更好地应对面试和实际工作中的挑战。 面试题一:三范式详解 什么是三范式 三范式是关…...
ASP.NET Core Clean Architecture
文章目录 项目地址一、项目主体1. CQRS1.1 Repository数据库接口1.2 GetEventDetail 完整的Query流程1.3 创建CreateEventCommand并使用validation 2. EFcore层2.1 BaseRepository2.2 CategoryRepository2.3 OrderRepository 3. Email/Excel导出3.1 Email1. IEmail接口层2. Ema…...
蓝桥杯备赛-精卫填海-DP
精卫终于快把东海填平了!只剩下了最后的一小片区域了。同时,西山上的木石也已经不多了。精卫能把东海填平吗? 事实上,东海未填平的区域还需要至少体积为 v 的木石才可以填平,而西山上的木石还剩下 n 块,每块…...
Windows10配置C++版本的Kafka,并进行发布和订阅测试
配置的环境为:Release x64下的环境 完整项目:https://gitee.com/jiajingong/kafka-publisher 1、首先下载相应的库文件(.lib,.dll) 参考链接: GitHub - eStreamSoftware/delphi-kafka GitHub - cloade…...
vue3 下载文件 responseType-blob 或者 a标签
在 Vue 3 中,你可以使用 axios 或 fetch 来下载文件,并将 responseType 设置为 blob 以处理二进制数据。以下是一个使用 axios 的示例: 使用 axios 下载文件 首先,确保你已经安装了 axios: npm install axios然后在你…...
【Gin-Web】Bluebell社区项目梳理6:限流策略-漏桶与令牌桶
本文目录 一、限流二、漏桶三、令牌桶算法四、Gin框架中实现令牌桶限流 一、限流 限流又称为流量控制,也就是流控,通常是指限制到达系统的并发请求数。 限流虽然会影响部分用户的使用体验,但是能一定程度上保证系统的稳定性,不至…...
51单片机-AT24CXX存储器工作原理
1、AT24CXX存储器工作原理 1.1、特点: 与400KHz,I2C总线兼容1.8到6.0伏工作电压范围低功耗CMOS技术写保护功能当WP为高电平时进入写保护状态页写缓冲器自定时擦写周期100万次编程/擦除周期可保存数据100年8脚DIP SOIC或TSSOP封装温度范围商业级和工业级…...
突破性能极限:DeepSeek开源FlashMLA解码内核技术解析
引言:大模型时代的推理加速革命 在生成式AI大行其道的今天,如何提升大语言模型的推理效率已成为行业焦点。DeepSeek团队最新开源的FlashMLA项目凭借其惊人的性能表现引发关注——在H800 GPU上实现580 TFLOPS计算性能,这正是大模型推理优化的…...
点击修改按钮图片显示有问题
问题可能出在表单数据的初始化上。在 ave-form.vue 中,我们需要处理一下从后端返回的图片数据,因为它们可能是 JSON 字符串格式。 vue:src/views/tools/fake-strategy/components/ave-form.vue// ... existing code ...Watch(value)watchValue(v: any) …...
[AI]从零开始的树莓派运行DeepSeek模型教程
一、前言 在前面的教程中,教了大家如何在windows中使用llama.cpp来运行DeepSeek模型。根据前面的教程中,我们也了解到了,我们只需要编译好llama.cpp就可以运行DeepSeek以及类似的LLM模型。那么本次教程就来教大家如何使用树莓派来运行大模型。…...
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二)
2024-2025 学年广东省职业院校技能大赛 “信息安全管理与评估”赛项 技能测试试卷(二) 第一部分:网络平台搭建与设备安全防护任务书第二部分:网络安全事件响应、数字取证调查、应用程序安全任务书任务 1:应急响应&…...
Open WebUI本地部署教程
文章目录 1、系统环境配置2、源码下载2.1 github源码地址下载 3、环境启动3.1 后端环境3.2 前端环境 4、问题4.1 浏览器跨域问题4.2 all-MiniLM-L6-v2模型文件下载失败问题4.3 单独部署backend启动报错问题 1、系统环境配置 操作系统:windows/linux/macos Python版…...
Missing required prop: “maxlength“
背景: 封装一个使用功能相同使用频率较高的input公共组件作为子组件,大多数长度要求为200,且实时显示统计子数,部分input有输入提示。 代码实现如下: <template><el-input v-model"inputValue" t…...
dify本地部署
安装docker。 在官网安装docker。 如果遇到wsl报错,就使用 wsl --updata 进行更新。如果问题解决,进入docker应该是如下界面: 克隆 在自己创建的文件内使用 git clone gitgithub.com:langgenius/dify.git 或 git clone https://github.com…...
python学习一
学习网络安全为什么要学python? 1、在实际的渗透测试过程中,面对复杂多变的网络环境,当常用工 具不能满足实际需求的时候,往往需要对现有工具进行扩展,或者 编写符合我们要求的工具、自动化脚本,这个时候就需要具备一定 的编程能力。 2、python是一门编程语言经常用它…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)
设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile,新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...
【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...
【JavaSE】绘图与事件入门学习笔记
-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角,以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向,距离坐标原点x个像素;第二个是y坐标,表示当前位置为垂直方向,距离坐标原点y个像素。 坐标体系-像素 …...
深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
回溯算法学习
一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...
