面试专区|【62道Redis高频题整理(附答案背诵版)】

什么是Redis?

Redis是一个高性能的开源内存数据库系统,它使用键值对存储数据,并支持多种数据结构,如字符串、哈希、列表、集合和有序集合。与传统关系型数据库不同,Redis将数据存储在内存中,以实现快速读写操作。同时,它还提供持久化功能,可以将数据周期性地写入磁盘,以保证数据的持久性。

由于Redis的高性能和丰富的数据结构,它在许多应用场景中得以广泛应用。例如,它可以用作缓存系统,将热门的数据存储在内存中,以提高读取速度。此外,Redis还可以用作消息队列,实现异步任务处理和解耦系统组件。在实时统计和计数方面,Redis也能很好地应用,例如实时在线用户数统计、访问频次计数等。总之,Redis是一个功能强大、灵活多样的数据库系统。

关系型数据库和非关系型数据库有什么区别?

关系型数据库(RDBMS)和非关系型数据库(NoSQL)在数据存储和处理方面存在着一些区别。

  1. 数据结构:关系型数据库使用表格结构(二维表)来组织数据,并且表格之间可以建立关系,即通过外键进行关联。而非关系型数据库采用不同的数据模型,如键值对、文档、列族、图等,没有固定的结构。

  2. 扩展性:关系型数据库在处理海量数据时可能会面临性能瓶颈。而非关系型数据库设计用于处理大规模、高并发的数据,能够更好地水平扩展,可以通过添加更多的节点来提高系统的处理能力。

  3. 灵活性:关系型数据库需要在设计阶段定义表结构,并且需要遵循预设的模式。一旦定义后,数据的修改可能会变得复杂。而非关系型数据库更加灵活,可以随着应用需求的变化进行数据结构的调整和扩展。

  4. 事务支持:关系型数据库支持事务,可以保证数据的一致性和可靠性。非关系型数据库根据不同的类型和实现方式,事务支持程度可能有所不同。

  5. 查询语言:关系型数据库使用结构化查询语言SQL来查询和操作数据。非关系型数据库则使用不同的查询语言或接口,如键值对数据库使用键来访问值,文档数据库使用类似JSON的查询语法。

注:关系型数据库和非关系型数据库并没有绝对的优劣之分,而是根据应用场景和需求选择适当的数据库类型。关系型数据库适用于复杂的事务处理,非关系型数据库则适用于需要高可扩展性和灵活性的大数据处理。

非关系型数据库你还了解哪些?

除了Redis之外,常见的非关系型数据库还有以下几种:

  1. 文档数据库(Document Database):文档数据库使用类似JSON的文档格式来存储数据,每个文档都可以包含不同的字段和值。MongoDB是一种著名的文档数据库,它适用于存储半结构化和动态模式的数据。

  2. 列族数据库(Column-family Database):列族数据库以列族为单位存储数据,每个列族包含多个列。列族数据库适用于大数据量的高吞吐量场景,例如日志分析和时间序列数据存储。HBase是一种常见的列族数据库。

  3. 搜索引擎(Search Engine):搜索引擎是一种特殊类型的非关系型数据库,用于支持全文搜索和复杂的查询。Elasticsearch和Solr是两个常用的搜索引擎,它们广泛应用于日志分析、数据搜索和实时数据分析等领域。

Memcached与Redis的区别都有哪些?

Memcached和Redis都是流行的内存缓存系统,但它们在某些方面有一些区别,适用于不同的应用场景。

  1. 数据结构:Memcached只支持键值对的存储,而Redis支持多种数据结构(字符串、哈希、列表、集合、有序集合等),使得Redis可以更灵活地应对不同的数据需求。

  2. 持久化:Redis支持数据持久化,可以将数据写入磁盘,从而保证数据的持久性。而Memcached没有持久化功能,重启后数据会丢失。

  3. 数据查询和处理:Redis提供了更多的数据查询和处理功能,例如按范围获取数据、排序、异步操作等。Memcached则主要关注于高性能的读取和写入操作。

  4. 内存管理和性能:Redis通过使用更复杂的数据结构以及多线程模式来提高内存使用效率和性能。Memcached则更加简单,更专注于高速缓存。

根据这些区别,对于适合的应用场景来说:

  • 如果只需要简单的键值缓存和高速写入读取操作,可以选择Memcached。它常用于缓存数据库查询结果、减轻数据库压力,或存储临时、短暂、快速失效的数据。

  • 如果需要更复杂的数据结构和功能,或者需要持久化数据,更好地支持数据分析和实时处理,可以选择Redis。它适用于具有实时计数、排行榜、发布/订阅消息等需求的应用,也可用作分布式锁等高级应用。

需要注意的是,由于Redis提供的功能更多且更复杂,相对来说也消耗更多的内存资源和处理能力。因此,在选择缓存系统时,根据具体的需求和资源限制,权衡Memcached和Redis的优劣非常重要。

Redis 一般都有哪些使用场景?

Redis一般有以下几种使用场景:

  1. 缓存:Redis最常见的使用场景是作为内存职业键值存储来构建缓存。由于Redis的性能非常高,可以处理大量的读写操作,因此非常适合用于缓存场景。

    例如,可以缓存从数据库查询出来的数据,后面再需要这些数据时,可以直接从Redis中读取,而不需要再次进行数据库查询,从而提高性能。

  2. 消息队列系统:Redis也可以作为消息队列使用。其PUB/SUB模型可以用来创建实时的消息系统。

    例如,一个电商网站,用户下订单后,可以把订单任务放入Redis的消息队列,然后有专门的工作线程负责处理这些订单任务。

  3. 计数器:Redis可以非常方便地实现计数器功能。比如用来记录网站的点击次数,或者用户的行为次数。

    例如,社交网络网站可以用Redis来记录用户发布的消息数量,或者用户被赞的次数。

  4. 实时系统:由于Redis的高性能特性,也经常被用于构建实时系统。比如实时统计用户的行为、游戏的实时排行榜等。

    例如,一个在线游戏,可以使用Redis来存储用户的分数,然后使用Redis的排序功能,实时生成用户的排行榜。

以上就是Redis的一些典型应用场景。

那 Redis 不适合什么应用场景呢?

虽然Redis非常强大和灵活,但并非适合所有的应用场景。特定的场景下可能需要慎用Redis:

  1. 大数据存储:Redis将所有数据存储在内存中,虽然这可以提供非常快的读写速度,但也限制了其数据存储量。如果需要存储的数据超过了机器的内存,或者你需要一个长期存储大量数据的方案,如历史数据分析,那么你可能需要考虑硬盘存储的数据库系统,比如MySQL或者Hadoop。

  2. 关系型数据处理:如果你的应用需要处理复杂的关系型数据,并且需要执行复杂的SQL查询,那么使用关系数据库可能是更好的选择。因为Redis不支持执行SQL查询,而你可能需要使用例如MySQL这样的关系数据库。

  3. 需要ACID事务的应用:虽然Redis有一定的事务处理能力,但没有提供像传统关系数据库那样的ACID(原子性、一致性、隔离性和持久性)事务支持。因此,对数据一致性有严格要求的应用,比如银行转账等,可能会倾向于使用支持ACID事务的数据库。

Redis 常见的数据类型有哪些?

  • 1. string 字符串

字符串类型是 Redis 最基础的数据结构,首先键是字符串类型,而且其他几种结构都是在字符串类型基础上构建的。字符串类型实际上可以是字符串:简单的字符串、XML、JSON;数字:整数、浮点数;二进制:图片、音频、视频。

使用场景:缓存、计数器、共享 Session、限速。

  • 2. Hash(哈希)

在 Redis中哈希类型是指键本身是一种键值对结构,如 value={{field1,value1},…{fieldN,valueN}}

使用场景:哈希结构相对于字符串序列化缓存信息更加直观,并且在更新操作上更加便捷。所以常常用于用户信息等管理,但是哈希类型和关系型数据库有所不同,哈希类型是稀疏的,而关系型数据库是完全结构化的,关系型数据库可以做复杂的关系查询,而 Redis 去模拟关系型复杂查询开发困难且维护成本高。

  • 3. List(列表)

列表类型是用来储存多个有序的字符串,列表中的每个字符串成为元素,一个列表最多可以储存 2 ^ 32 - 1 个元素,在 Redis 中,可以队列表两端插入和弹出,还可以获取指定范围的元素列表、获取指定索引下的元素等,列表是一种比较灵活的数据结构,它可以充当栈和队列的角色。

使用场景:Redis 的 lpush + brpop 命令组合即可实现阻塞队列,生产者客户端是用 lpush 从列表左侧插入元素,多个消费者客户端使用 brpop 命令阻塞式的“抢”列表尾部的元素,多个客户端保证了消费的负载均衡和高可用性。

image-20210608011814007

  • 4. Set(集合)

集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中不允许有重复的元素,并且集合中的元素是无序的,不能通过索引下标获取元素,Redis 除了支持集合内的增删改查,同时还支持多个集合取交集、并集、差集。合理的使用好集合类型,能在实际开发中解决很多实际问题。

使用场景:如:一个用户对娱乐、体育比较感兴趣,另一个可能对新闻感兴趣,这些兴趣就是标签,有了这些数据就可以得到同一标签的人,以及用户的共同爱好的标签,这些数据对于用户体验以及曾强用户粘度比较重要。

  • 5. zset(sorted set:有序集合)

有序集合和集合有着必然的联系,它保留了集合不能有重复成员的特性,但不同得是,有序集合中的元素是可以排序的,但是它和列表的使用索引下标作为排序依据不同的是:它给每个元素设置一个分数,作为排序的依据。

使用场景:排行榜是有序集合经典的使用场景。例如:视频网站需要对用户上传的文件做排行榜,榜单维护可能是多方面:按照时间、按照播放量、按照获得的赞数等。

Zset 的底层是如何实现的?

Redis的有序集合(Zset)是一种既可以看作是Set,又可以看作是Hash的数据结构,其底层实现主要使用了哈希表和跳跃表。

  1. 哈希表:在Redis的Zset中,每个元素是唯一的,同时与每个元素关联的还有一个分数(Score)。元素的唯一性保证可以由哈希表来实现。即Redis的Zset将元素作为哈希表的键,将对应的分数作为哈希表的值。

  2. 跳跃表:Redis的Zset还需要依据分数来对元素进行排序,这个特性是通过跳跃表来实现的。跳跃表是一种可以进行快速查找的数据结构。由于跳跃表的特性,对于分数的查找、插入、删除都具有较好的时间复杂度。

所以,Zset的基本形状就是:哈希表确保了成员的唯一性和查找的速度,跳跃表确保了有序性以及区间查找。

以上就是Redis的Zset底层实现简述。

什么是跳跃表?

跳跃表(Skip List)是一种可以替代平衡树的数据结构。在它的简单形式中,跳跃表和链表是一致的,只不过在跳跃表中,链表的每个节点可能有多个指向其后继的指针,这样可以实现快速查找等操作。跳跃表最主要的特点是它的查找,插入,删除操作的时间复杂度都是O(logn)。

基本思想:
假设我们有一个有序链表,我们想要查找一个元素,需要从头开始,一步一步的查找,这种情况下查找的时间复杂度是O(n)。

现在,我们对链表做一些增强,我们抽取出部分数据在上一级创建一个新的链表,上级链表的元素个数是下级链表的1/2,同理,我们再在上级链表的基础上抽取出数据在更高级别创建链表,这样就构成了多级索引。

level3:  ---------------63
level2:  ----31---------63
level1:  ----31----47---63
level0:  15--31--47--63

如上,我们有一个包含4个元素{15,31,47,63}的链表,我们在这个链表的基础上创建了三个更高级别的链表,最高级别的链表只包含一个元素。这样构成的数据结构就是跳跃表。

现在,如果我们想要查找47,我们可以从最高级别的链表开始,63>47,所以我们到第二级别的链表查找,31<47,再向右走,到达63,63>47,所以我们进入下一级链表,47就在这里。在跳跃表中,47这样的查找就是logn的复杂度。

跳跃表不仅能提供较快的查找速度,而且插入和删除元素也相对简单,主要是调整索引,改变指针的指向即可。因此,跳跃表在很多场景下,例如Redis的Sorted Set,都有被广泛应用。

PS:如果要详细了解,建议自己找文章看

Redis 为什么这么快?

Redis之所以能够具有高速的性能,主要是由于以下几个原因:

  1. 数据存储在内存:Redis将数据存储在内存中,而内存的读写速度比磁盘快几个数量级。这使得Redis可以快速响应读写操作,适合于对延迟要求较高的应用场景。

  2. 单线程模型:Redis采用单线程的方式来处理客户端请求。通过避免多线程之间的锁竞争和上下文切换,可以减少了不必要的开销,提高了处理效率。

  3. 精简的数据结构和高效算法:Redis提供了多种数据结构(如哈希、集合、有序集合等),这些数据结构在内部经过精心优化,使用了高效的算法,以提高执行效率。

  4. 高效的网络通信:Redis使用自己的协议进行网络通信(IO多路复用模型),协议简单且紧凑,减少了网络开销。此外,Redis还支持连接复用和连接池等机制,提高了网络通信的效率。

需要指出的是,虽然Redis在内存存储和单线程上具有高性能,但在数据量较大或复杂计算场景下,其性能仍然会受到一定限制。因此,在选择使用Redis时,需要考虑具体的应用需求和数据规模,综合评估其性能与可伸缩性。

什么是缓存穿透?怎么解决?

缓存穿透是指在使用缓存系统时,恶意请求或者不存在的数据频繁地被发送到缓存中,导致缓存无法命中,最终请求会直接落到后端数据库,造成数据库压力过大。

缓存穿透可能出现的原因包括:

  1. 恶意攻击:攻击者有意发送不存在的数据请求,试图使缓存失效,以达到影响系统性能或者触发系统错误的目的。
  2. 随机查询:大量并发的随机查询请求,其中大部分请求的数据都不存在于缓存中。
  3. 存在但很少访问的数据:一些数据很少被访问,经常被请求但却不存在于缓存中,导致缓存穿透。

为了解决缓存穿透问题,可以采取以下措施:

  1. 布隆过滤器(Bloom Filter):布隆过滤器是一种高效的数据结构,用于判断某个元素是否存在于集合中。在请求到来时,先使用布隆过滤器进行判断,如果被拦截则不再继续访问缓存和数据库,减轻了数据库的压力。

  2. 缓存空对象(Cache Null Object):当某个请求查询的数据不存在时,将空对象或者null放入缓存,以防止相同的请求频繁查询数据库。在一定时间内,如果有相同的请求再次到来,则直接从缓存中获取到空对象,避免了对数据库的重复查询。

  3. 数据预热(Cache Pre-warming):在系统启动时,将一些常用或重要的数据预先加载到缓存中,提前热身缓存,避免了对这部分数据的缓存穿透问题。

  4. 异步加载(Asynchronous Loading):对于即将过期的缓存数据,可以在后台异步地进行数据加载和缓存的更新,避免了数据过期期间的缓存穿透。

  5. 限流和防护机制:通过对请求进行限流、IP白名单校验和请求验证等手段,防止恶意攻击和异常流量对缓存系统造成压力。

综合采取上述措施可以有效应对缓存穿透问题,提高系统的性能和稳定性。

什么是缓存雪崩?该如何解决?

缓存雪崩是指在缓存中大量的缓存数据同时过期或者缓存服务器宕机,导致大量请求直接访问后端数据库,造成数据库压力过大,甚至引发系统崩溃。

缓存雪崩可能出现的原因包括:

  1. 缓存数据同时过期:在某个时间点,大量的缓存数据同时过期,导致大量请求落到后端数据库。
  2. 缓存服务器宕机:缓存服务器突然宕机或者故障,导致所有请求无法访问缓存,直接访问后端数据库。

为了解决缓存雪崩问题,可以采取以下措施:

  1. 设置缓存失效时间的随机性:在设置缓存失效时间时,可以为不同的缓存设置不同的失效时间,以避免大量数据在同一时间内同时失效。可以在原有失效时间的基础上加上一个随机的时间,使得失效时间分散化。

  2. 使用热点数据永不过期:对于一些热点数据,可以将其缓存设置为永不过期,以保证热点数据在任何时候都可以快速访问,避免因过期导致的缓存雪崩。

  3. 实时监控和预警:监控缓存系统的状态和数据过期情况,及时发现异常并采取相应的措施,例如提前进行缓存的更新操作,或者在缓存失效前主动将其刷新。

  4. 备份缓存服务:部署多个独立的缓存服务器,以充分利用缓存的高可用性。如果一个缓存服务器出现故障,其他服务器仍然可以继续提供缓存服务。

  5. 数据预热:在系统启动时,将一些常用或重要的数据预先加载到缓存中,提前热身缓存,减少冷启动时缓存雪崩的风险。

  6. 限流和熔断机制:对缓存系统进行限流控制,可以设置最大并发数、最大请求时间等,以及在缓存故障时启用熔断机制,防止大量请求直接落到后端数据库。

综合采取上述措施可以有效应对缓存雪崩问题,保证系统的稳定性和可靠性。

什么是缓存击穿?如何解决?

缓存击穿是指当缓存中没有某个key的数据,这当然会导致缓存无法命中,然后请求就会穿透缓存层,直接访问数据库。如果这个不命中的请求不止一个,而是成千上万个同时发生,那么就会对数据库形成巨大的访问压力,可能会导致数据库访问瞬间崩溃。

最常见的缓存击穿场景就是有大量请求同时查询一个热点key,但是此时缓存中该key的数据刚好过期,于是大量的请求就会直接穿透到数据库。

针对缓存击穿问题,常见的解决方案有:

  1. 设置热点数据永不过期:这种方法适用于某些更新不频繁但是访问非常频繁的热点数据。

  2. 缓存数据过期时间设置随机,防止同一时间大量数据过期现象发生。

  3. 使用互斥锁(Mutex key):对于同一个key,只允许一个线程去加载数据,其他线程等待加载完成直接使用即可。

  4. 服务降级与熔断:如果数据库压力过大,可以暂时拒绝部分请求,让系统在承受的压力范围内运行。

每种解决方案都各有优势,可以根据实际情况选择。

布隆过滤器的原理是什么?它的优点是什么?缺陷是什么?

布隆过滤器(Bloom Filter)是一种数据结构,用于快速判断一个元素是否属于一个集合,它的原理、优点和缺陷如下:

原理

  1. 哈希函数:布隆过滤器使用多个哈希函数(通常是非加密哈希函数),将输入元素映射成多个不同的位数组索引。
  2. 位数组:布隆过滤器内部维护一个位数组,所有位的初始值都为0。
  3. 添加元素:当要将一个元素添加到布隆过滤器中时,对该元素应用多个哈希函数,然后将相应位数组索引位置的位设置为1。
  4. 查询元素:当要查询一个元素是否存在于布隆过滤器中时,同样对该元素应用多个哈希函数,检查相应位数组索引位置的位是否都为1。如果所有位都为1,则可能存在;如果有任何一位为0,则一定不存在。

优点

  1. 节省内存:相比于使用散列表或集合等数据结构,布隆过滤器占用的内存较少,因为它只需要维护位数组。
  2. 快速查询:布隆过滤器的查询操作非常快速,通常只需要几个哈希函数的计算和位的检查。
  3. 可用于大规模数据:适用于处理大规模数据集,尤其是在内存有限的情况下,可以快速过滤掉大部分不可能存在的元素,减轻后续查询的压力。

缺陷

  1. 误判率:布隆过滤器可能会产生误判,即判断一个元素存在时,实际上它可能不存在。这是因为多个元素可能映射到相同的位数组索引,导致冲突。
  2. 不支持删除:由于布隆过滤器的位数组只能设置为1,不能删除元素。如果需要删除元素,需要重新构建布隆过滤器。
  3. 容量不可扩展:一旦位数组的大小确定,就不能动态扩展,因此需要在设计时估计好位数组的大小以应对数据规模的增长。

总之,布隆过滤器是一种高效的数据结构,适用于需要快速过滤数据的场景,但要注意其误判率和不支持删除的特点。在实际应用中,通常需要根据具体需求权衡其优点和缺陷。

由于内容太多,更多内容以链接形势给大家,点击进去就是答案了

16. 在生成 RDB 期间,Redis 可以同时处理写请求么?

17. 如何实现数据尽可能少丢失又能兼顾性能呢?

18. 哈希槽又是如何映射到 Redis 实例上呢?

19. Redis如何做内存优化?

20. Redis线程模型

21. Redis事务及其相关面试题

22. Redis是单线程的,如何提高多核CPU的利用率?

23. 为什么要做Redis分区?

24. 你知道有哪些Redis分区实现方案?

25. Redis分区有什么缺点?

26. 如何解决 Redis 的并发竞争 Key 问题

27. 分布式Redis是前期做还是后期规模上来了再做好?为什么?

28. Redis相比Memcached有哪些优势?

29. 为什么要用 Redis 而不用 map/guava 做缓存?

30. 如何选择合适的持久化方式

31. Redis key的过期时间和永久有效分别怎么设置?

32. 双写一致性方案一:先删除缓存,后更新数据库

33. 双写一致性方案二:先更新数据库,后删除缓存

34. 什么是缓存预热?

35. 什么是缓存降级?

36. Redis真的是单线程?

37. Redis 6.0为何引入多线程?

38. Redis 6.0 多线程的实现机制?

39. Redis 6.0 采用多线程后,性能的提升效果如何?

40. Redis 6.0开启多线程后,是否会存在线程并发安全问题?

41. Redis 6.0 与 Memcached 多线程模型的对比

42. 介绍下Redis单副本

43. 介绍下Redis多副本(主从)

44. 介绍下Redis Sentinel(哨兵)

45. 介绍下Redis Cluster

46. 介绍下Redis自研

47. Redis高可用方案具体怎么实施?

48. 了解主从复制的原理吗?

49. 由于主从延迟导致读取到过期数据怎么处理?

50. 主从复制的过程中如果因为网络原因停止复制了会怎么样?

51. Redis主从架构数据会丢失吗,为什么?

52. 如何解决主从架构数据丢失的问题?

53. Redis哨兵是怎么工作的?

54. 故障转移时会从剩下的slave选举一个新的master,被选举为master的标准是什么?

55. 同步配置的时候其他哨兵根据什么更新自己的配置呢?

56. 为什么Redis哨兵集群只有2个节点无法正常工作?

57. Redis cluster中是如何实现数据分布的?这种方式有什么优点?

58. Redis cluster节点间通信是什么机制?

59. 什么是分布式锁?为什么用分布式锁?

60. 常见的分布式锁有哪些解决方案?

61. Redis实现分布式锁

62. RedLock的原理

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CPU核心是如何影响VPS性能的?

为什么VPS对于各种类型和规模的网站和应用程序来说都是非常出色的解决方案&#xff1f; 首先&#xff0c;它比其他类型的托管具有许多优势&#xff0c;但也许它最大的优势是它可以以合适的价格为您提供合适的性能。 然而&#xff0c;只有当您满足所需的规格时它才会这样做。 …

JAVA小知识27:异常与异常处理全解

一、异常 异常就是代表程序出现了问题&#xff0c;像我们之前学数组的时候碰到的数组越界异常&#xff0c;以及空指针异常等等都属于开发中经常能碰到的异常。 我们学习异常不是为了在以后中避免异常&#xff0c;而是学习碰到了异常以后该如何的处理。 1.1、异常的分类 Java…

【Python科研】如何使用Python计算年度和季节的平均降水栅格数据并进行批量裁剪

目录 1.环境准备 2.设置文件路径 3.读取矢量数据 4.定义年份和季节 5.创建输出文件夹 6.裁剪栅格数据的函数 7.计算和保存年度平均降水数据 8.计算和保存季节平均降水数据 9.结论 10.完整代码 本次分享内容中&#xff0c;我们将介绍如何使用Python计算和裁剪年度和季…

复合构件之消息对话框

代码; #include <gtk-2.0/gtk/gtk.h> static void font_dialog_response(GtkFontSelectionDialog *dialog,gint response,gpointer data)// 处理字体选择对话框按钮按下事件 {gchar *font;GtkWidget *message;switch (response) {case (GTK_RESPONSE_APPLY):case (GTK_R…

ClipArt ETC - 典雅的剪贴画网站

文章目录 ClipArt ETCClippix佛罗里达教学技术中心课堂数字内容 ClipArt ETC 网站地址&#xff1a; https://etc.usf.edu/clipart/ ClipArt ETC为学生和教师提供了超过71,500件高质量的教育剪贴画。 每个插图都有图像大小的选择以及学校项目中正确引用的完整源信息。 所有图像…

UniApp 开发微信小程序教程(一):准备工作和环境搭建,项目结构和配置

文章目录 一、准备工作和环境搭建1. 安装 HBuilderX步骤&#xff1a; 2. 注册微信开发者账号步骤&#xff1a; 3. 创建 UniApp 项目步骤&#xff1a; 二、项目结构和配置1. UniApp 项目结构2. 配置微信小程序修改 manifest.json修改 pages.json 3. 添加首页文件index.vue 示例&…

【查缺补漏】python

python查缺补漏 底板除 还有一种除法是//&#xff0c;称为地板除&#xff0c;两个整数的除法仍然是整数&#xff1a; >>> 10 // 3 3你没有看错&#xff0c;整数的地板除//永远是整数&#xff0c;即使除不尽。要做精确的除法&#xff0c;使用/就可以。 因为//除法只…

一文讲清楚分销裂变是什么?怎么做好分销裂变?【附案例】

在数字化营销日益盛行的今天&#xff0c;分销裂变作为一种高效的推广手段&#xff0c;受到了越来越多企业的青睐。那么&#xff0c;分销裂变究竟是什么&#xff1f;我们又该如何做好分销裂变呢&#xff1f;林叔将从定义、方法以及案例分析三个方面进行阐述。 一、分销裂变是什…

MySQL的数据存储一定是基于硬盘吗?

一、典型回答 不是的&#xff0c;MySQL也可以基于内存的&#xff0c;即MySQL的内存表技术。它允许将数据和索引存储在内存中&#xff0c;从而提高了检验速度和修改数据的效率。优点包括具有快速响应的查询性能和节约硬盘存储空间。此外&#xff0c;使用内存表还可以实现更高的复…

数据库讲解---(数据库设计)

目录 一.数据库设计概述 1.1数据库设计的内容 1.1.1数据库的结构设计 1.1.2数据库的行为设计 1.2数据库设计方法 1.2.1直观设计法 1.2.2规范设计法 1.2.3计算机辅助设计法 1.2.4自动化设计法 1.3数据库设计的基本步骤 1.3.1需求分析 1.3.2概念结构设计 1.3.3逻辑结…

丹尼尔·T·琼斯:精益生产到底是什么?

本文摘要自《精益思想》、《改变世界的机器》作者之一丹尼尔T琼斯的文章。丹尼尔T琼斯是一位学者、英国作家和研究员。他曾多次获得瑞士山吉奥卓越运营奖研究与专业出版类别的奖项&#xff0c;也包括了国际精益六西格玛研究所&#xff08;ILSSI&#xff09;[1]的"精益思想…

CentOS Linux 7系统中离线安装MySQL5.7步骤

预计数据文件存储目录为&#xff1a;/opt/mysql/data 1、文件下载&#xff1a; 安装文件下载链接&#xff1a;https://downloads.mysql.com/archives/community/ 2、检查当前系统是否安装过MySQL [rootcnic51 mysql]# rpm -qa|grep mariadb mariadb-libs-5.5.68-1.el7.x86_6…

Java中的运算符及其示例

Java中的运算符及其示例 运算符是指示编译器执行特定操作的符号。例如&#xff0c;“”运算符指示编译器执行加法&#xff0c;“>”运算符指示编译执行比较&#xff0c;“”用于赋值等等。在本指南中&#xff0c;我们将借助示例讨论java中的操作。 运算符和操作数&#…

一文读懂什么是SaaS产品运营?如何做好SaaS产品运营?

在当今数字化时代&#xff0c;SaaS&#xff08;Software-as-a-Service&#xff0c;软件即服务&#xff09;产品已成为企业运营不可或缺的一部分。本文将结合具体案例&#xff0c;深入解析SaaS产品运营的定义与策略。 一、什么是SaaS产品运营&#xff1f; SaaS产品运营是指通过…

由于“xinput1_3.dll缺失“而导致的错误有哪些解决办?分享几种修复xinput1_3.dll丢失的方法

当您尝试运行某些游戏或程序时&#xff0c;可能会遇到由于"xinput1_3.dll缺失"而导致的错误。这个DLL文件是MicrosoftDirectX的一部分&#xff0c;用于处理游戏中的输入设备&#xff0c;如操纵杆和游戏手柄。下面我们将探讨为何电脑会缺少xinput1_3.dll文件&#xff…

Spring系统学习 - FactoryBean和基于XML的自动装配

Factory Bean Spring的FactoryBean是一个特殊的Bean&#xff0c;用于创建其他Bean实例。FactoryBean接口定义了一个工厂Bean&#xff0c;该Bean可以用来生成其他Bean的实例。通过实现FactoryBean接口&#xff0c;开发人员可以自定义Bean的创建逻辑&#xff0c;实现更灵活的Bea…

软硬件节水“组合拳”,助力智慧灌区信息化建设!

水资源短缺已成为全球共同面临的挑战&#xff0c;尤其在农业灌溉领域&#xff0c;其影响尤为显著。农业作为水资源消耗的主要行业之一&#xff0c;在日益严峻的水资源形势下&#xff0c;构建节水型灌区的紧迫性日益凸显。 节水型灌区的建设&#xff0c;旨在通过优化灌溉方式、减…

【C++ | 移动构造函数】C++11的 移动构造函数 详解及例子代码

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; ⏰发布时间⏰&#xff1a;2024-06-12 2…

「Python-docx 专栏」docx 获取页面大小、设置页面大小(纸张大小)

本文目录 前言一、docx纸张大小介绍1、document.xml① 关于 document.xml 的一些知识点② 纸张大小在哪里③ 纸张大小都有啥④ EMU对应的尺寸列表二、获取docx纸张大小1、完整代码2、运行效果图三、python为docx设置纸张大小1、完整代码2、效果图前言 今天的这边文章,我们来说…

Java多线程基础知识-2

线程的3个方法&#xff1a; Thread.sleep()&#xff1a;当前线程睡眠多少毫秒&#xff0c;让给其他线程去执行。 Thread.yield()&#xff1a;当前线程退出一下&#xff0c;进入到等待队列&#xff0c;让其他线程执行&#xff0c;即让出线程一下。 Thread.join()&#xff1a;…