Redis数据库 【总结笔记】

一、NoSql(非关系型数据库)

NoSQL:NoSQL = Not Only SQL 非关系型数据库
​ NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

1.1 优点

  • 高可扩展性
  • 分布式计算
  • 低成本
  • 架构的灵活性,半结构化数据
  • 没有复杂的关系

1.2 缺点

  • 没有标准化
  • 有限的查询功能(到目前为止)

1.3 分类

类型代表特点
列存储Hbase、Cassandra、Hypertable顾名思义,是按列存储数据的。最大的特点是方便存储结构化和半结构化数据,方便做数据压缩,对针对某一列或者某几列的查询有非常大的IO优势。
文档存储MongoDB、CouchDB文档存储一般用类似json的格式存储,存储的内容是文档型的。这样也就有有机会对某些字段建立索引,实现关系数据库的某些功能。
key-value存储Berkeley DB、MemcacheDB、Redis可以通过key快速查询到其value。一般来说,value可以是任何格式。
图存储Neo4J、FlockDB图形关系的最佳存储。使用传统关系数据库来解决的话性能低下,而且设计使用不方便。
对象存储db4o、Versant通过类似面向对象语言的语法操作数据库,通过对象的方式存取数据。
xml数据库Berkeley DB XML、BaseX高效的存储XML数据,并支持XML的内部查询语法,比如XQuery,Xpath。

二、Redis与网站架构

2.1什么是Redis?

  • Remote Dictionary Server 缩写 是个基于内存的网络存储系统

  • 丰富的数据结构(sets, sorted sets,hashes, list …)

  • 本质是key-value,但是与memcached不同的是,value的类型得到了扩展

    一个普通的问题列表需求

  • 问题本身的数据(标题,投票等等)

  • 问题的作者数据(另 张单独的 张数据表,通过某个键值关联)

  • 问题的标签(本身单独一张数据表,通过一个中间关系表与问题产生 对多的关系)

为啥不试试Redis

2.2 与sql比较

大大减少了查询数量,提高了效率
redis的API更加人性化,再也不需要构建SQL语句,节省了SQL的解析时间

三、Redis

3.1简介

Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value string类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

3.2 优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
  • 丰富的特性 – Redis还支持通知, key过期等等特性。

3.3和其他的key-value存储有什么不同

  • Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
  • Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

3.4 redis 为什么能够持久化存储 ?

因为 RDB 和 AOF

  • RDB [RDB 将数据库的快照(snapshot)以二进制的方式保存到磁盘中。]

    在运行情况下, Redis 以数据结构的形式将数据维持在内存中, 为了让这些数据在 Redis 重启之后仍然可用, Redis 分别提供了 RDB 和 AOF 两种持久化模式。

    在 Redis 运行时, RDB 程序将当前内存中的数据库快照保存到磁盘文件中, 在 Redis 重启动时, RDB 程序可以通过载入 RDB 文件来还原数据库的状态。

    RDB 功能最核心的是 rdbSave 和 rdbLoad 两个函数, 前者用于生成 RDB 文件到磁盘, 而后者则用于将 RDB 文件中的数据重新载入到内存中:

    RDB 本质上是个文件 每隔一段时间 在redis配置文件中进行设置 将内存中的数据存入文件中 如果数据过大 也容易造成数据丢失


  • AOF [ 则以协议文本的方式,将所有对数据库进行过写入的命令(及其参数)记录到 AOF 文件,以此达到记录数据库状态的目的。]

AOF 将命令追加到文件中 将原有的内容替换掉 记录到 AOF 文件, 以此达到记录数据库状态的目的, 为了方便起见, 我们称呼这种记录过程为同步。


3.5 安装redis

sudo apt-get install redis-server
安装完成后,Redis服务器会自动启动,我们检查Redis服务器程序
ps -aux|grep redis
或者
netstat -nlt | grep 6379#看见 port 6379  就成功启动了redis服务
文件名称作用
redis-serverredis 服务端
redis-cliredis 客户端
redis-benchmarkredis性能测试工具
redis-check-aofaof修复工具
redis-check-rdbrdb
redis-sentinel哨兵服务器 2.8版本之后才有

【redis-sentinel】监控你管理的作用来提高集群的高可用性

redis-cli客户端使用方式:
redis-cli 
redis-server.exe redis.windows.conf
-p  #端口
-h  #主机
链接上  
redis-cli -p 6379
127.0.0.1:6379> ping
PONG
127.0.0.1:6379>   #ping之后 pong来了就是成功了
离开客户端请输入quit服务管理
启动/停止/重启redis有三种方式
1) systemctl start/stop/restart  redis-server.service
2) service  redis-server start|restart|stop
3) cd /etc/init.d./redis-server  start/stop/restart

【redis的配置文件】

配置文件在/etc/redis/redis.conf

sudo vim /etc/redis/redis.conf
# 常用配置项
requirepass 你的密码   # 服务器远程连接密码
bind 127.0.0.1     # 绑定ip
port 5379  # 指定端口
daemonize yes # 是否以守护进程执行,如果以守护进程执行,不会在命令行下阻塞
dbfilename dump.rdb   #数据文件
dir /var/lib/redis    #数据文件存储路径#如果指定了密码,启用客户端时需要加上-a 密码
redis-cli -a 密码

四、redis数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

  • redis常用命令请参考:http://redis.cn/commands.html

4.1 string

是最简单的类型,你可以理解为一个key 对应一个value。string 类型是二进制安全的。意思是redis 的string 可以包含任何数据,比如jpg 图片或者序列化的对象。string类型是Redis最基本的数据类型,一个键最大能存储512MB。

  • 设置键

    命令:SET key value  #设置单键值对
    >set h1 100  #设置h1的值为100命令:mset key  value [key  value] #设置多个键值对
    >mset name '王宝强' age 30 gender '男'命令:setex   key seconds  value #设置键值及过期时间(秒单位)
    >setex  age 100 20 #设置年龄的值为20,过期时间100秒
    
  • 获取键

    命令:get  key  #获取单个键
    >get h1命令:mget key1 key2  key3  #获取多个键
    >mget name age sex
    
  • 查看过期时间

    命令:ttl key
    >ttl a1 #查看a1的过期时间
    
  • 运算

    原来的值必须是数值字符串
    命令:incr key  #将对应的key 加1 
    命令:decr key  #将对应的key值减1
    命令:incrby  key  num   #将对应的key加指定值
    命令:decrby  key  num   #将对应的key的值减去指定值
    
  • 其它操作

    命令:append key  value  #追加值,redis中值都是字符串,追加就是字符拼接
    >append name 'hello'  #如果原来的值是tom,那么现在就是tomhello命令:strlen  key  #获取值得长度
    

4.2 hash

Redis hash 是一个键值(key=>value)对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。每个 hash 可以存储 2的32次方 -1 键值对(40多亿)。存储形式:

key = {name:‘tom’,age: 18}

  • 设置值

    命令:hset  key  field   value  #设置key所指对象的指定属性的值
    命令:hmset key  field   value  [field value] #设置key所指对象的多个属性值
    命令:hsetnx  key  field  value  #当field字段不存在时 设置key所指对象的field属性值hset person name '二狗子'
    hmset person age 20 sex '男'
    hsetnx person maried '未婚'
    
  • 获取值

    命令: hget key field  #获取key指定的对象的属性值
    命令: hmget  key  field [field]  #获取key指定对象的多个属性值
    命令: hgetall key   #获取key所指对象的所有属性的名称和值
    命令: hkeys   key   #获取key所指对象的所有属性名
    命令: hvals   key   #获取key所指对象是的所有属性值
    命令: hlen key      #获取key所指对象的属性个数
    
  • 其它操作

    命令:hincrby  key   field   increment  #为key所指对象的指定字段的整数值加上increment
    命令:hincrbyfloat  key  field  increment #为key所指对象的指定字段的实数值加上increment
    命令:hexists key  field  #判断当前的字段是否存在在(在返回1 否则返回0)
    命令:hdel  key  field  [field] #删除字段和值
    

4.3 list

redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。列表最多可存储 2的32次方 - 1 元素 (4294967295, 每个列表可存储40多亿)。

常应用于:1、对数据量大的集合数据删减 2、任务队列

  • 添加数据

    命令:lpush  key   value [value]    #头部插入数据
    命令:lpushx  key  value            #如果列表存在则在列表头部插入数据
    命令:rpush  key  value  [value]    #在列表尾部添加数据
    命令:rpushx  key  value            #如果列表存在,则在尾部添加数据
    命令:linsert key  before|after  value  value  #在指定值前或后插入数据
    命令:lset  key  index  value       #设定指定索引元素的值
    注意:索引的值从左边开始,向右增加,左边第一个是0,从右边向左索引编号为:-1 -2...
    
  • 获取数据

    命令:lpop  key                #左侧出队并返回出队元素
    命令:rpop  key                #右侧出队并返回出队元素
    命令:lindex	key    index    #返回指定索引的值
    命令:lrange  key  start  end  #返回存储列表中的指定范围的元素[start,end]
    命令:lrem key count value     #从列表里移除前 count 次出现的值为 value 的元素count > 0: 从头往尾移除值为 value 的元素。count < 0: 从尾往头移除值为 value 的元素。count = 0: 移除所有值为 value 的元素。
    
  • 其它操作

    命令:llen  key  #获取列表长度
    命令:ltrim  key  start  stop  #裁剪列表 保留start到stop之间的元素,其它都删除ltrime  mylist  -3  -1  #从索引为-3到-2的保留, 以外的全部删除
    

4.4 set 无序的集合

Redis的Set是string类型的无序集合,元素具有唯一性 不重复。集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

常应用于:对两个集合间的数据进行交集、并集、差集运算

  • 添加元素

    sadd  key  member [member]  #添加多个元素
    
  • 获取元素

  smembers   key   #获取集合中所有的元素scard    key     #返回集合元素的个数srandmember  key   [count]  #返回集合中随机元素的值,可以返回count个
  • 其它操作

    spop   key [count]   #移除集合中随机的count个元素,并返回
    srem  key  member1  [member2]  #移除集合中 一个或者 多个 成员
    sismember  key  member   #判断元素是否在集合中  存在返回1  不在返回0
    
  • 集合操作

求多个集合的交集:  sinter  key  [key...]
求多个集合的差集 (注意比较顺序):sdiff   key  [key...]
求 多个集合的并集:   sunion  key [key....]

4.5 zset 有序从大到小排序

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

常应用于:排行榜

  • 添加元素

zadd key score member [score member] #添加多个元素
zincrby key increment member #对指定的成员增加权重increment

  • 获取元素

zrange key start end #返回指定范围的元素
zcard key #返回元素的个数
zcount key min max #返回有序集合中权重在min和max之间的元素的个数
zscore key member #返回有序集合中 member(元素) 的权重(score)
zrange key start end withscores #返回当前key中 所有的权重(score)和元素(member)

4.6 数据库切换

redis默认带有16个数据库,编号从0-15。进入redis后默认数据库是0,可以使用select num进行切换
客户端不显示中文的处理:打开客户端的时候添加参数:–raw
redis-cli --raw

4.7 其他

keys *  #查看所有的key
keys u* #查以u开始的key
keys  n???    查找以n为开头长度为4个的key
keys  n      查找 包含 n 的所有的key支持的正则表达式:
- h?llo	  匹配第二位为任意的字符
- h*llo     匹配第二位为任意字符 0个 或多个
- h[ab]llo  匹配第二位为 a或者b的字符的key
- hello  匹配第二位除了e字符以外的任意的key
- h[a-z]llo 匹配第二位为a-z的小写字母的keyexists key #判断键是否存在
type  key   #查看key对应的value的类型
del   key   #删除指定key
expire key 10  #设置过期时间,秒
persist  key   #移除key的过期时间
rename key newkey #修改key的名称(如果新的key的名字存在 则会把存在的key的值 覆盖掉)
randomkey  #随机返回一个 key
move key  db  将键移动到指定库flushdb  #清空当前库所有key 
flushall #清空所有库里的keyexit #退出redis客户端
quit 退出客户端查看服务器信息
info dbsize 当前库中有多少key

五、redis备份和还原

redis支持持久化的方式有两种:RDB和AOF

  • RDB备份

    • 查看备份目录
    #1查看配置文件
    cd /etc/redis
    vim redis.conf# 当后台进程执行save出错时,停止redis的写入操作。
    stop-writes-on-bgsave-error yes
    rdbcompression yes  # 将rdb文件进行压缩
    rdbchecksum yes   # 对rdb文件进行校验
    dbfilename dump.rdb  # rdb文件命名
    dir /var/lib/redis  # rdb文件备份存储目录#使用命令查看
    进入redis客户端
    127.0.0.1:6379> config get dir
    1) "dir"
    2) "/var/lib/redis"  #备份目录
    
    • 备份
      • 命令行下执行:redis-cli save 阻塞主进程
      • 命令行下执行:redis-cli bgsave 不阻塞主进程
      • 查看备份时间,命令行下执行 time redis-cli save
    • 还原
      • 只要将备份的dump.rdb文件覆盖原来的文件就可以还原

六、主从复制

当数据量变得庞大的时候,读写分离还是很有必要的。同时避免一个redis服务宕机,导致应用宕机的情况,我们启用sentinel(哨兵)服务,实现主从切换的功能。redis提供了一个master,多个slave的服务。

角色ip
master(主)10.20.100.186
slave(从)10.20.100.106
  • master主配置
sudo vim /etc/redis/redis.conf
#找到# bind 127.0.0.1 修改为
bind 127.0.0.1 10.20.100.186#找到# requirepass 将其修改为 这是修改的是服务器远程连接密码
requirepass 123
  • slave从配置
bind 127.0.0.1 10.20.100.106  #10.20.100.106从服务器网络地址
daemonize yes    #是否是守护进程
slaveof 10.20.100.186 6379   #主服务器的ip和端口
masterauth 123    # 主服务器的密码

重启master和slave的服务,然后登录从服务器,执行:

python@ubuntu:/etc/redis$ redis-cli -p 6380 -a 123
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:10.20.100.186
master_port:6379
master_link_status:up
master_last_io_seconds_ago:0
master_sync_in_progress:0
slave_repl_offset:1444
slave_priority:100
slave_read_only:1
connected_slaves:0
master_repl_offset:0
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0

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

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

相关文章

基于IP的H.264关键技术

一、 引言 H.264是ITU-T最新的视频编码标准&#xff0c;被称作ISO/IEC14496-10或MPEG-4 AVC&#xff0c;是由运动图像专家组(MPEG)和ITU的视频编码专家组共同开发的新产品。H.264分两层结构&#xff0c;包括视频编码层和网络适配层。视频编码层处理的是块、宏块和片的数据&…

“光伏进社区” 应及早谋划布局

所谓“光伏进社区”就是全国城乡居民家庭大批量的利用家庭光伏系统&#xff0c;甚至出现光伏的社区化联网交换、合作等更深入的活动。虽然“光伏进社区”还有很长的路要走&#xff0c;但“光伏进社区”的各种经济、技术、社会条件正越来越向有利方向发展。 城乡居民集聚社区是光…

python中的装饰器和抽象类

装饰器和抽象类 装饰器就是对函数或者方法或者类进行修饰 #第一步&#xff1a;创建一个普通函数 def laxi():print(噗哧噗哧噗哧噗哧&#xff5e;&#xff5e;&#xff5e;)#调用函数 laxi() laxi()#第二步&#xff1a;扩展函数的功能(不是装饰器) #声明一个扩展函数 def deco…

eigen库安装_OpenCV+Eigen上位机程序移植(七十一)

1、给硬盘分区现在小伙伴们对于给电脑硬盘分区想必比较头疼&#xff0c;给电脑硬盘分区分为两种情况&#xff0c;一是在安装系统之前给系统硬盘分区&#xff0c;二是在安装系统之后给硬盘分区&#xff0c;我们现在购买的品牌机和笔记本的用户比较多&#xff0c;而且笔记本和品牌…

【实战操作】使用FFmpeg将一个视频文件中音频合成到另一个视频中 只需三秒

直接进入主题 主要参数&#xff1a; -i——设置输入文件名。-f——设置输出格式。-y——若输出文件已存在时则覆盖文件。-fs——超过指定的文件大小时则结束转换。-t——指定输出文件的持续时间&#xff0c;以秒为单位。-ss——从指定时间开始转换&#xff0c;以秒为单位。-t从…

苹果依旧强大 物联网领域举足轻重

近几天科技界最火爆的话题就是苹果和谷歌两家公司&#xff0c;一是苹果发布财报&#xff0c;二是谷歌人工智能围棋战胜欧洲冠军以及谷歌母公司Alphabet或将超越苹果&#xff0c;成为世界上市值最大的公司。而在我眼里&#xff0c;未来五年内依然属于苹果。回顾下苹果公司公布的…

linux之SQL语句简明教程---SUBSTRING

SQL 中的 substring 函数是用来抓出一个栏位资料中的当中一部分。这个函数的名称在不同的资料库中不全然一样&#xff1a; MySQL: SUBSTR( ), SUBSTRING( )Oracle: SUBSTR( )SQL Server: SUBSTRING( )最经常使用到的方式例如以下 (在这里我们用 SUBSTR( ) 为例)&#xff1a; SU…

H.264/AVC技术进展及其务实发展策略思考

随着NGN、3G及3G演进和NGBW等对视频、多媒体业务与网络应用的飞速发展需求&#xff0c;作为视频业务及存储应用核心技术的高效率 视频数字压缩编(译码)技术&#xff0c;愈来愈引起人们的关注&#xff0c;成为目前广播、视频与多媒体通信领域中的亮点与热点。制定视频编码标准的…

python中错误和异常处理

错误和异常处理 在python中一共有2种错误&#xff1a;一种是语法错误&#xff0c;另外一种是异常。 语法错误 语法错误也叫做解析错误&#xff0c;是指python无法正确的识别代码的造成的。根本原因在于人的行为&#xff1a;手残&#xff0c;脑残和眼残的行为。 解决方法&#x…

listview 每行后面的小箭头_主卧带小衣帽装修,这几个装修方案,你喜欢哪个?...

南京装修交流圈 - 知乎​www.zhihu.com现在大部分人购买的房子面积还是普遍偏小的&#xff0c;每行每业都有自己的服装讲究&#xff0c;不同的场地、见不同的人等等。家中能有一个衣帽间自然也就是心中所向往和追求的。能够有独立的一个房间来做衣帽间当然更好&#xff0c;今天…

【养成好习惯】使用pipreqs导出本项目使用的环境

pipreqs pipreqs可以帮你找到当前项目的所有组件及其版本。就是当别人给你一个程序的时候&#xff0c;你要在自己电脑上运行起来&#xff0c;就需要安装程序所依赖的组件&#xff0c;总不能自己一个一个找吧。 # 安装 pip install -i https://pypi.tuna.tsinghua.edu.cn/simpl…

开放医疗交通大数据技术 服务于公共便民领域

孙丕恕还建议&#xff0c;交通拥堵的数据也可以开放&#xff0c;孙丕恕介绍&#xff0c;目前已有导航软件有部分数据&#xff0c;但还有些滞后&#xff0c;如果能够做到实时更新数据&#xff0c;那么也可以为出行者避开拥堵&#xff0c;节约时间。此外&#xff0c;如果二手车的…

Nagios_在不同平台下的安装

Nagios 是一款开源的免费网络监视工具&#xff0c;致力于打造符合行业标准的 IT 基础架构的监控系统。Nagios 提供了服务器、网络和应用的完整的 IT 监控和报警&#xff0c;可以有效监控 Windows、Linux 和 Unix 的主机状态&#xff0c;以及交换机、路由器、打印机等网络设备。…

python中的模块和包

模块和包 一个模块就是一个包含python代码的文件。一个文件就是一个模块 为什么要使用模块 1.现在程序开发文件比较大&#xff0c;都放在一个文件中维护不方便&#xff0c;拆分成多个文件方便维护与管理 2.模块可以增加代码的重用率 3.模块可以当作命名空间如何定义自己的模块 …

2005年全球H.264编解码器荟萃

2005年全球H.264编解码器荟萃videosky.9126.com Peter Lee 2005-0920【摘要】H.264/AVC作为最新的视频编码标准&#xff0c;研究领域和产业界都非常看好该标准。尤其是产业界&#xff0c;针对H.264的软硬件编解码器可谓是百花齐放、百家争鸣。本文中&#xff0c;笔者对2005年全…

【Tensorflow】基于卷积神经网络实现车牌的识别

引言&#xff1a; 过去几周我一直在涉足深度学习领域&#xff0c;尤其是卷积神经网络模型。最近&#xff0c;谷歌围绕街景多位数字识别技术发布了一篇不错的paper。该文章描述了一个用于提取街景门牌号的单个端到端神经网络系统。然后&#xff0c;作者阐述了基于同样的网络结构…

脚本启动显示查询频繁被服务器防御_面对CC攻击,该如何进行防御

网站被攻击是一件十分让人恼火的事情&#xff0c;不仅仅是让网站速度变慢、访问异常&#xff0c;导致用户体验变差&#xff0c;用户大量流失&#xff0c;而且还会导致网站关键词排名下降甚至被降权&#xff0c;极大干扰了网站的正常稳定运行。那面对CC攻击&#xff0c;该如何进…

面对SDN/NFV部署挑战 网络厂商能做什么?

近年来&#xff0c;随着云计算的不断发展&#xff0c;网络虚拟化受到广泛关注&#xff0c;而作为网络虚拟化的实现方式&#xff0c;SDN自诞生之日起就担负着网络变革的使命。那么&#xff0c;SDN技术的驱动力是什么&#xff1f;SDN在引入现网的过程中&#xff0c;如何实现平滑无…

python中的tkinter模块

tkinter介绍 tkinter是python自带的GUI库&#xff0c;是对图形库TK的封装 tkinter是一个跨平台的GUI库&#xff0c;开发的程序可以在win&#xff0c;linux或者mac下运行 除此之外还存在很多图形库&#xff0c;例如 pythonWin 仅适合window的界面编程库 wxPython 第三方界面编…

PAT甲题题解-1011. World Cup Betting (20)-误导人的水题。。。

题目不严谨啊啊啊啊式子算出来结果是37.975样例输出的是37.98我以为是四舍五入的啊啊啊&#xff0c;所以最后输出的是sum0.005结果告诉我全部错误啊结果直接保留两位小数就可以了啊啊啊啊 水题也不要这么坑人啊啊啊啊 #include <iostream> #include <algorithm> #i…