Redis: 特点,优势,与其他产品的区别,版本演进,以及高并发原理

news2024/11/17 5:52:00

入门Redis概述


1 )选择Redis是因为其高性能

  • 因为 Redis 它数据存储的机制是存在内存中的,减少了传统关系数据库的磁盘IO
  • 它是单线程的保证了原子性,它还提供了事务,锁等相关的机制

2 )Redis 环境安装配置

  • linux 或 docker 环境

3 )Redis 的并发下的模式演进

  • 并发在十万以下的时候,Redis提供了单机单节点模式
  • 官方测试的数据: 读取每秒11万次,写入每秒8万1, 所以性能是非常高的
  • 当并发上来了,10万 到 20万左右的时候,使用 Redis 提供到读写分离, 主从模式
  • 在这种模式下,主节点肯定要保持高可用的,Redis 提供了哨兵监控机制
  • 为了降低各节点之间存储数据的压力,Redis 提供了集群模式

4 )了解微服项目的构建以及springboot应用的开发

  • 我们围绕着项目来打通Redis任督二脉的,以项目作为驱动
  • 在项目中实现 Redis 各种应用场景:实现缓存,保证缓存中的数据一致性等等

5 )理论准备

  • 理论作为基石,需要了解缓存相关中间件,(Redis, Memcache 和 Ehcache) 的比较
  • 对 Redis 的基本理解,Redis 它的定位是什么?解决了什么问题?
  • 微服务相关的概念,最终是以微服务项目作为驱动开发的

5 )实际操作

  • 在linux环境中安装 Redis,包括了解它的一些配置信息,每一个配置项都代表什么意思
    • 以及把 Redis 作为开机自启项加入到系统服务当中,它的启动, 停止该如何去操作
  • Redis 的基本命令
  • 数据库表结构的设计
    • Redis 作为一款 nosql 数据库, 肯定不能百分百替代关系数据库的
    • 在一般项目中都是 Redis 和 mysql 组合,而 Redis 都是作为缓存层而存在
    • 它最终缓存的是关系数据库中的数据
  • SpringBoot & SpringCloud项目搭建
    • 通过一个微服务的项目,也可以使用 go-micro 或 其他
    • 这里了解 SpringBoot & SpringCloud 类似的微服务项目环境如何搭建

Redis 版本演进

  • 目前Redis有8个版本,生产环境最新版是 7,我目前常用的还是 6
  • 我们看下之前的一些版本更新的变化

1 )Redis 2.6

  • 键的过期时间支持毫秒
  • 从节点支持只读功能

2 ) Redis2.8

  • 可以用bind命令绑定多个IP地址
  • 发布订阅添加了pub/sub
  • Redis Sentinel第二版,相比于Redis2.6的 Redis Sentinel, 此版本已经变成生产可用

3 )Redis3.0 (里程碑)

  • Redis最大的改动就是添加Redis的分布式实现Redis Cluster

4 )Redis3.2

  • Redis3.2在2016年5月6日正式发布,相比于Redis3.0主要特征如下:
    • 添加GEO相关功能
    • 新的List编码类型:quicklist

5 )Redis4.0(重大改版)

  • 提供了模块系统,方便第三方开发者拓展Redis的功能
  • 提供了新的缓存剔除算法:LFU(Last Frequently Used),并对已有算法进行了优化
  • 提供了非阻塞del和flushall/flushdb功能,有效解决删除了bigkey可能造成的Redis阻塞
  • 提供了RDB-AOF混合持久化格式,充分利用了AOF和RDB各自优势。

6 )Redis5.0

  • 新的Stream数据类型
  • 客户经常连接和断开连接时性能更好

7 )Redis6.0

  • 多线程IO。多线程部分只是用来处理网络数据的读写和协议解析,执行命令仍然是单线程。

Redis 安装可能出现的问题


1 )gcc的版本的问题

  • 先安装c语言依赖
    • yum install -y gcc-c++ autoconf automake
    • 一般系统会自带 autoconf 和 automake
  • redis 在 centos 7 和 8 里面需要不同gcc版本
    • centos 8 中 gcc 版本高,安装redis比较简单
    • centos 7 中 安装最新版redis, 必须升级gcc
  • 对 gcc 做升级
    • $ yum install -y centos-release-scl scl-utils-build 安装 scl 源
    • $ yum install -y devtoolset-9-toolchain 安装 9 版本的 gcc、gcc++、gdb 工具链 (toolchain)
    • $ scl enable devtoolset-9 bash 临时覆盖系统原有的 gcc 引用
    • $ gcc -v 查看 gcc 当前版本

2 )编译安装的注意事项

  • 下载解压后,进行预编译
  • 之后编译 make (检查要安装的软件所依赖的环境是否缺失)
  • 创建一个redis 目录 $ mkdir -p /usr/local/redis
  • 安装 $ make PREFIX=/usr/local/redis install
  • 前台启动:$ ./redis-server 默认加载的配置是解压后的那个目录中的 redis.conf
  • 可以将该文件拷贝到 /usr/local/redis 目录中,之后可以进行修改
daemonize yes # 这里默认是 no, 修改成yes后守护进程打开, 这样就可以后台运行了
  • 再次启动 $ ./redis-server ./redis.conf,这样就可以后台运行了
  • 检查 $ ps -ef | grep redis

Redis 启动方式

  • 配置开机启动(centos7以上)

  • 在系统服务目录里创建redis.service文件, $ vim /etc/systemd/system/redis.service

    [Unit]
    Description=redis-server
    After=network.target
    
    [Service]
    Type=forking
    ExecStart=/usr/local/redis/bin/redis-server/usr/local/redis/bin/redis.conf
    PrivateTmp=true
    
    [Install]
    WantedBy=multi-user. target
    
  • 重载系统服务:$ systemctl daemon-reload

  • 启动 $ systemctl start redis.service

  • 停止 $ systemctl stop redis.service

  • 重启 $ systemctl restart redis.service

  • 开启成功,将服务加入开机自启: $ systemctl enable redis.service

Redis 配置

  • Redis 支持很多的参数,但都有默认值
    • daemonize 默认情况下,redis不是在后台运行的,如果需要在后台运行,把该项的值更改为 yes
    • bind 指定 Redis 只接收来自于该IP地址的请求,可以通过空格来支持多项
    • port 监听端口,默认为6379
    • databases 设置数据库的个数,默认使用的数据库是0,一般翻倍修改
    • save 设置 Redis 进行数据库镜像的频率
    • dbfilename 镜像备份文件的文件名
    • dir 数据库镜像备份的文件放置的路径
    • requirepass 设置客户端连接后进行任何其他指定前需要使用的密码,不推荐,这种方式被ACL取代
    • maxclients 限制同时连接的客户数量
    • maxmemory 设置 redis 能够使用的最大内存

Redis 基本数据类型

  • Redis作为内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。
  • 它的value支持多种类型的数据结构,基本数据结构包含:字符串(strings)、散列(hashes)、列表(lists)、集合(sets)、有序集合(sorted sets)五种。
  • 这五种数据结构在我们工作中经常使用到,也是最重要的

1 )字符串(strings)


1.1.类型介绍

  • 字符串是Redis最简单的储存类型,它存储的值可以是字符串、整数或者浮点数,对整个字符串或者字符串的其中一部分执行操作;
  • 对整数或者浮点数执行自增(increment) 或者 自减(decrement)操作
  • Redis的字符串是一个由字节组成的序列,跟java里面的ArrayList有点类似,采用预分配冗余空间的方式来减少内存的频繁分配,内部为当前字符串实际分配的空间capacity一般要高于实际字符串长度len
  • 当字符串长度小于1M时,扩容都是加倍现有的空间,如果超过1M,扩容时一次只会多扩1M的空间
  • 需要注意的是字符串最大长度为512M
  • 扩充方式是扩充一次,不足则继续尝试扩充一次,直到满足空间大小

1.2.应用场景

  • 字符串类型在工作中使用广泛,主要用于缓存数据,提高查询性能
  • 比如存储登录用户信息、电商中存储商品信息、可以做计数器(想知道什么时候封锁一个IP地址(访问超过几次))等等

1.3.操作指令

  • set key value: 添加一条String类型数据
  • get key: 获取一条String类型数据
  • mset key1 value1 key2 value2: 添加多条String类型数据
  • mget key1 key2:获取多条String类型数据
  • incr key: 白增(+1)
  • decr key: 自减(-1)
  • incrby key: 指定步长自增
  • decrby key: 指定步长自减
  • del key: 删除数据,适用于任何数据类型

2 )散列(hashes)


2.1.类型介绍

  • 散列相当于Java中的HashMap, 内部是无序字典
  • 实现原理跟HashMap一致,一个哈希表有多个节点,每个节点保存一个键值对
  • 与Java中的HashMap不同的是,rehash的方式不一样
  • 因为Java的 HashMap 在字典很大时,rehash是个耗时的操作,需要一次性全部rehash
  • Redis为了高性能,不能堵塞服务,所以采用了渐进式 rehash策略
  • 渐进式 rehash 会在 rehash的同时,保留新旧两个 hash结构,查询时会同时查询两个 hash结构
  • 然后在后续的定时任务中以及 hash 操作指令中,循序渐进地将旧 hash的内容一点点迁移到新的 hash 结构中,当搬迁完成了,就会使用新的hash结构取而代之
  • 当hash 移除了最后一个元素之后,该数据结构自动被删除,内存被回收

2.2.应用场景

  • Hash也可以同于对象存储,比如存储用户信息,与字符串不一样的是,字符串是需要将对象进行序列化(比如json序列化)之后才能保存,而Hash则可以讲用户对象的每个字段单独存储,这样就能节省序列化和反序列的时间
  • 如下:此外还可以保存用户的购买记录,比如key为用户id,field为商品id,value为商品数量
  • 同样还可以用于购物车数据的存储,比如 key 为用户id, field为商品id, value 为购买数量等等

2.3.操作指令

  • 注意这里 在 4.0 之前有细微的改动,4.0之前使用 hmset 后面修改为 hset
  • 这里直接使用示例,例如:
    • 设置哈希对象 hset userInfo username wang age 18 addr beijing # 返回 field 的数量
    • 获取一个属性 hget userInfo username # wang
    • 获取多个属性 hmget userInfo username age # wang 18
    • 获取所有属性 hgetall userInfo # 这里会输出所有 fields 和 value
    • 获取属性长度 hlen userInfo # 2
    • 指定属性步长 hincrby userInfo age 2 # 20
    • 指定属性步长 hincrby userInfo age 2 # 22 可以看到每次加2
    • 删除指定属性 hdel userInfo age
    • 删除哈希 del userInfo

3 )列表(lists)


3.1. 类型介绍

  • Redis中的lists相当于Java中的LinkedList,实现原理是一个双向链表(其底层是一个快速列表),即可以支持反向查找和遍历,更方便操作
  • 插入和删除操作非常快,时间复杂度为0(1),但是索引定位很慢,时间复杂度为O(n)

3.2. 应用场景

  • lists的应用场景非常多,可以利用它轻松实现热销榜;
  • 可以实现工作队列(利用lists的push操作,将任务存在lists中,然后工作线程再用pop操作将任务取出进行执行);
  • 可以实现最新列表,比如最新评论等

3.3. 操作指令

  • 左边插入数据 lpush animals dog cat mouse # 在动物列表中左侧插入3个动物,返回插入的个数,内部排列为:mouse cat dog
  • 右边插入数据 rpush animals fish # 这时候动物列表内部排列为:mouse cat dog fish, 内部索引为: 0 1 2 3
  • 最左边弹出 lpop animals 最左边弹出 返回弹出元素 mouse 动物列表还有:cat dog fish
  • 最右边弹出 rpop animals 最右边弹出 返回弹出元素 fish 动物列表还有:cat dog
  • 查看数据,从左到右 lrange animals 0 1 返回 cat dog 这里的 0 1 是从左到右的索引,左右索引缺一不可

4 )集合(sets)


4.1.类型介绍

  • 集合类似Java中的HashSet,内部实现是一个value永远为null的HashMap,实际就是通过计算hash的方式来快速排重的,这也是set能提供判断一个成员是否在集合内的原因

4.2.应用场景

  • redis的sets类型是使用哈希表构造的,因此复杂度是0(1),它支持集合内的增删改查,并且支持多个集合间的交集、并集、差集操作
  • 可以利用这些集合操作,解决程序开发过程当中很多数据集合间的问题。比如计算网站独立ip, 用户画像中的用户标签,共同好友等功能

4.3.操作指令

  • 在一个集合里添加元素 sadd nums 1 2 3 # 在 nums 这个集合里添加元素,返回增加成功元素的个数 3
  • 再次在nums中测试添加 sadd nums 1 1 2 2 3 3 # 返回 0 这里看到没有添加进入一个,符合 set 的特征
  • 查看集合所有元素 smembers nums # 1 2 3
  • 删除指定的元素 srem nums 2 # 返回1 表示移除了 1 条
  • spop nums 随机移除一个 # 返回被移除的元素
  • 两个集合的交集并集和差集
    • sadd nums1 1 2 3
    • sadd nums2 2 3 4
    • 这里看两个集合的交集 sinter nums1 nums2 # 输出 2 3
    • 两个集合的差集(基于第一个集合左比较) sdiff nums1 nums2 # 1
    • 两个集合的交集 sunion nums1 nums2 # 1 2 3 4

5 )有序集合(sorted sets)


5.1.类型介绍

  • sorted sets是Redis类似于 SortedSet 和 HashMap的结合体,一方面它是一个 set,保证了内部 value 的唯一性,另一方面它可以给每个value赋予一个score,代表这个value的排序权重。
  • 内部使用HashMap和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的score,使用跳跃表的结构可以获得比较高的查找效率,并且在实现上比较简单。
  • sorted sets中最后一个value被移除后,数据结构自动删除,内存被回收

5.2.应用场景

  • 主要应用于根据某个权重进行排序的队列的场景,比如游戏积分排行榜,设置优先级的任务列表,学生成绩表等

5.3.操作指令

  • 这里直接使用示例,例如:
    • zadd rank 66 zhang 88 li 77 wang # 在 rank 集合中插入3条数据,每条数据有自己对应的 score, 默认顺序按score值从低到高,重复插入操作不生效
    • zrange rank 0 3 # 这里会从小到大输出 zhang wang li
    • zrangebyscore rank 77 88 这里会输出score 从 77 到 88 的数据
    • zrem rank li # 这里删除元素,返回删除成功的个数
    • zcard rank # 返回获取到的元素个数
    • zcount rank 77 88 # 统计在一个score的范围内有多少个元素
    • zrank rank wang # 返回某个元素在有序集合中所在的位置
    • zrevrank rank wang # 返回某个元素在有序集合反转后的位置

Redis 如何支撑 10w+ QPS


1 ) Redis 特点

  • 内存数据库,速度快,也支持数据的持久化。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供Lists、Hashes、Sets、Sorted Sets 等多种数据结构的存储
  • Redis支持数据的备份(master-slave)与集群(分片存储),以及拥有哨兵监控机制
  • 支持事务

2 ) 优势

  • 性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s
  • 丰富的数据类型-Redis支持 Strings、Lists、Hashes、Sets、Sorted Sets 等数据类型操作
  • 原子操作-Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行(事务)
  • 丰富的特性-Redis还支持 publish/subscribe,通知,key 过期等特性

3 ) Redis、Memcached、Ehcache 的区别

EhcacheMemcachedRedis
最新版本2017年2月
3.3.0
2018年7月
1.5.9
2018年7月
5.0 Beta
许可证开源免费开源免费开源免费
实现语言JavaCC
服务器系统JavaFreeBSD、Linux、OSX、Unix、WindowsFreeBSD、Linux、OSX、Unix、Windows
数据类型支持不支持支持多种:string、hash、list、set、sorted set等
客户端语言Java.Net、C、C++、ColdFusion、Erlang、Java、Lisp、Lua、Ocaml、Perl、PHP、Python、RubyC、C#、C++、D、Erlang、Go、Haxe、Java、Node.js、Lisp、Lua、MatLab、Objective-C、Pascal、Perl、PHP、R、Ruby、Scala、Swift、Visual Basic 等 30十多种
  • 在分布式的情况下, 用 Ehcache,就不能很好的去实现分布式项目之间缓存的同步共享的问题
  • Memcached 对于数据类型比较单一,存在一些瓶颈
  • 最终通过比较,还是选择 Redis
  • 这三个中间件都可以应用于缓存,但目前市面上使用Redis的场景会更多,更广泛,其原因是:Redis性能高、原子操作、支持多种数据类型,主从复制与哨兵监控,持久化操作等

4 ) Redis的高并发

  • 官方的bench-mark数据:测试完成了50个并发执行100000个请求, 设置和获取的值是一个256字节字符串
  • 结果:读的速度是110000次/s,写的速度是81000次/s。redis尽量少写多读,符合缓存的适用要求
  • 单机redis支撑万级,如果10万+可以采用主从复制的模式

4.1.原理

  • Redis是纯内存数据库,所以读取速度快。
  • Redis使用的是非阻塞10,10多路复用,减少了线程切换时上下文的切换和竞争。
  • Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
  • Redis存储结构多样化,不同的数据结构对数据存储进行了优化加快读取的速度。
  • Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。

4.2. Redis的单线程

选择单线程原因

  • 不需要各种锁的性能消耗
  • 单线程多进程集群方案
  • CPU消耗

优劣对比

单进程单线程优势

  • 代码更清晰,处理逻辑更简单
  • 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
  • 不存在多进程或者多线程导致的切换而消耗CPU

单进程单线程弊端

  • 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善

4.3 IO多路复用技术

redis 采用网络10多路复用技术来保证在多连接的时候,系统的高吞吐量

  • 举个现实生活的例子,从左边水龙头流向右边,传统的模式下,需要建立5个管子,如下
  • 而在 IO 多路复用模式下,只需要建立一根管子让左侧水龙头分别与这根管子相连即可,如下
  • 最终目的,都是要提高系统的吞吐量,而提高吞吐量就是为了快速的写入和读取
  • 它拥有这些特性才能保证 Redis 在高并发的场景下,仍然是拥有非常高的性能的

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

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

相关文章

实现语音合成的三种方法:HTML5 Web Speech 、speak-tts、百度语音合成

1. 使用HTML5 Web Speech API 1.1 使用方法 window.speechSynthesis 是HTML5 Web Speech API的一部分,是浏览器原生提供的文本转语音功能。它允许开发者在网页上通过JavaScript调用,将文本转换为语音进行播放。 https://developer.mozilla.org/zh-CN/d…

Cocos Creator 剪裁精灵图片方法记录(7)

Cocos Creator 剪裁精灵图片方法记录 start 最近拿到一些图片资源,但是都需要自己手动切割。类似unity的话有专门点击精灵工具自动帮你切割了,但是目前没有找到cocos中有这种工具。所以记录一下相关方法、 解决方案-Photoshop 最好的方式就是直接用 …

计算机毕业设计 在线项目管理与任务分配系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍:✌从事软件开发10年之余,专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ 🍅文末获取源码联系🍅 👇🏻 精…

[Redis][集群][上]详细讲解

目录 0.前言1.基本概念2.数据分片算法0.前言1.哈希求余2.一致性哈希算法3.哈希槽分区算法(Redis使用) 0.前言 说明:该章节相关操作不需要记忆,理解流程和原理即可,用的时候能自主查到即可 1.基本概念 哨兵模式提高了系统的可用性&#xff0…

数据交易知多少?从零到一的数据交易指南

在数字经济浪潮汹涌的今天,数据已成为推动社会进步和经济发展的关键生产要素。从政府决策到企业运营,从城市管理到个人生活,数据的价值日益凸显。那么数据流通交易机制及公共数据在各个领域的应用你都知道吗? 一、数据要素 数字经…

OFDM通信系统发射端需要做ifftshift的原因分析

对频率为15Hz的正弦波信号进行FFT分析,并且直接画图,matlab代码如下: fs 100; % sampling frequency t 0:(1/fs):(10-1/fs); % time vector S cos(2*pi*15*t); n length(S); X fft(S); f (0:n-1)*(fs/n); %frequenc…

react 常用hooks封装--useReactive

概述 一种具备响应式的useState 我们知道用useState可以定义变量格式为: const [count, setCount] useState(0) 通过 setCount 来进行设置,count 来获取,使用这种方式才能够渲染视图 来看看正常的操作,像这样 let count 0;…

open-resty 服务安装redis插件

从github下载 作者:程序那点事儿 日期:2023/11/16 22:04 lua-resty-redis-cluster cd /usr/local/openresty/modules #进入到modules目录git clone https://github.com/cuiweixie/lua-resty-redis-cluster.git #下载插件mv lua-resty-redis-cluster/ …

数据结构编程实践20讲(Python版)—03栈

本文目录 03 栈 StackS1 说明S2 示例基于列表的实现基于链表的实现 S3 问题:复杂嵌套结构的括号匹配问题求解思路Python3程序 S4 问题:基于栈的阶乘计算VS递归实现求解思路Python3程序 S5 问题:逆波兰表示法(后缀表达式)求值求解思路Python3程…

unix中父进程如何获取子进程的终止状态

一、前言 本文将介绍在unix系统中,父进程如何获取子进程的终止状态。本文主要围绕如下函数展开: 1.wait 2.waitpid 3.waitid 4.wait3、wait4 在讨论这些函数前,先介绍一个进程从创建到释放子进程的过程。 二、子进程的创建以及终止 在unix…

【Java】单元测试【主线学习笔记】

文章目录 前言测试分类JUnit单元测试介绍编写单元测试方法的条件IDEA中简易使用JUnit 前言 Java是一门功能强大且广泛应用的编程语言,具有跨平台性和高效的执行速度,广受开发者喜爱。在接下来的学习过程中,我将记录学习过程中的基础语法、框架…

大联大友尚集团推出基于炬芯科技产品的蓝牙音箱方案

大联大控股宣布,其旗下友尚推出基于炬芯科技(Actions)ATS2835P蓝牙音频SoC的蓝牙音箱方案。 图示1-大联大友尚基于炬芯科技产品的蓝牙音箱方案的展示板图 在智能音频设备市场持续升温的浪潮中,蓝牙音箱凭借音质卓越、操作简便等…

[Linux] Linux操作系统 进程的优先级 环境变量(一)

标题:[Linux] Linux操作系统 进程的优先级 个人主页水墨不写bug (图片来源于网络) 目录 一、进程优先级 1.PRI and NI 2.PRI vs NI 的补充理解 二、命令行参数和环境变量 正文开始: 一、进程优先级 基本概念 进程的调用需要CP…

Study--Oracle-09--部署Openfiler存储服务器

免费的存储服务器软件有FreeNAS 和 Openfiler。 其中Freenas的网站上只有i386及amd64的版本,也就是说Freenas不能支持64位版本的Intel CPU,而Openfiler则提供更全面的版本支持,在其网站上可以看到支持多网卡、多CPU,以及硬件Raid的…

manim中获取并定位不规则页面的中心位置

介绍中心点 找到中心点非常重要,因为它在多个领域中都有重要的应用和意义。中心点可以指一个几何形状的中心、数据集的平均值中心、或是特定情境下的关键焦点。以下是一些中心点重要性的具体解释: 数学与几何:在几何中,中心点&…

jinaai/jina-embeddings-v2-base-zh向量模型报错解决

报错信息 OSError: We couldn’t connect to ‘https://huggingface.co’ to load this file, couldn’t find it in the cached files and it looks like jinaai/jina-bert-implementation is not the path to a directory containing a file named configuration_bert.py. 报…

C++ | Leetcode C++题解之第441题排列硬币

题目: 题解: class Solution { public:int arrangeCoins(int n) {return (int) ((sqrt((long long) 8 * n 1) - 1) / 2);} };

探索Python新境界:funboost库揭秘

文章目录 探索Python新境界:funboost库揭秘背景:为什么选择funboost?funboost是什么?如何安装funboost?简单的库函数使用方法场景应用常见Bug及解决方案总结 探索Python新境界:funboost库揭秘 背景&#x…

什么是前缀索引?

什么是前缀索引? 1、什么是前缀索引?2、为什么要使用前缀索引?3、如何选择前缀长度?4、创建前缀索引的SQL语法5、示例 💖The Begin💖点点关注,收藏不迷路💖 在处理包含长字符串的数据…

yolo自动化项目实例解析(七)自建UI--工具栏选项

在上一章我们基本实现了关于预览窗口的显示,现在我们主要完善一下工具栏菜单按键 一、添加工具栏ui 1、配置文件读取 我们后面要改的东西越来越多了,先加个变量文件方便我们后面调用 下面我们使用的config.get意思是从./datas/setting.ini文件中读取关键…