首页> 搜索结果页
"fifa 数据库" 检索
共 19 条结果
一文深度解读音视频行业技术发展历程
从1948年的香农定律,到音视频的今天。IMMENSE、36氪|作者北京时间2月28日凌晨,FIFA年度颁奖典礼在巴黎举行。梅西荣膺年度最佳球员,斯卡洛尼当选年度最佳男足主帅,马丁内斯荣获年度最佳男足门将!阿根廷因此成为FIFA史上首个在同一届颁奖礼上赢得三个最佳评选的国家。毫无疑问,2022卡塔尔世界杯的冠军奖杯为此次评选增添了不少份量。回望卡塔尔世界杯赛场,观众印象最深的不仅是“诸神黄昏”的老将谢幕、球王梅西的终极加冕,还有无数次比赛结果的逆转,而这些惊天大冷门的“参与者”——VAR,视频助理裁判(Video Assistant Referee)吸引了无数人的目光。在小组赛第一轮中,VAR将阿根廷的3个进球全部判为无效,致使阿根廷1:2败于沙特阿拉伯,爆出本次世界杯最大冷门,差点在小组赛中淘汰了本届冠军阿根廷。VAR的背后,是12台鹰眼摄像机,捕捉球员身体29个关键点,每秒50次严密追踪,并将这些音视频数据实时发送至云端进行处理。在云计算时代,随着音视频技术的飞速发展,还有更多像VAR这样的新兴应用,既改写着绿茵场上的比赛结果,也改变了我们生活的方方面面。01 从黑白小电视到超清4K直播在世界杯举办的近百年历史上,大多数人可以坐在家中,实时观看赛事直播的历史,只是近几十年的事情。由于摄影摄像、音视频编解码、信号传输等种种技术限制,一直到1954年的瑞士世界杯,人类才在历史上第一次通过电视观看世界杯比赛。在此之前,观众只能通过报纸、广播、甚至口口相传才能得知赛事结果。央视第一次转播世界杯则是1978年的阿根廷世界杯。然而很少有人知道,彼时,还叫做“北京电视台”的央视,是由足球评论员宋世雄在香港的一间小酒店房间里完成了78年阿根廷世界杯的半决赛和总决赛赛事转播。几十个球迷围着一台9寸黑白电视,如饥似渴地期待着进球结果,成了那个时代最具特色的一道风景。那个时候,电视还是个稀缺物件,球迷们被迫盯着屏幕上模糊得连球员五官都看不清楚的超低分辨率画面,忍受着断断续续、时常“雪花”的信号传输。几十年的人们大概很难想象,2023年的今天,通过云技术处理的比赛转播已经高达8K、60帧,延时缩短至1秒,运动员们纤毫毕现的赛事画面成为了日常,网络传输与边缘云技术的发展,更是让全球亿万观众能够轻松地通过电脑、手机、平板等多种设备流畅无阻地观看赛事。也许更难想象的是,今天,云端处理的AI语音成为了赛事的播报员、视频技术让VAR成为了赛事结果的改判者,曾经只存在于科幻小说里的“VR看球”更是走进了现实。正是云计算技术的持续进步,让人类能够不断突破音视频技术的边界,创造出更多超越想象力的全新体验。02 「4.56亿」背后的技术奇迹除了世界杯赛场上的种种应用外,各类音视频技术的创新应用,也正改变着我们生活的方方面面。首先,直播、短视频毫无疑问已经成为了当代生活的重要组成部分。根据中国互联网络信息中心数据,截至2022年6月,我国网民规模为10.51亿,其中短视频用户规模已经达到了9.62亿,占网民整体的91.5%。而根据《中国网络表演(直播)行业发展报告(2021-2022)》数据,截至2021年12月,我国网络表演(直播)行业主播账号累计达到近1.4亿个,行业市场规模达1844.42亿元。十年之前,仅用一台手机就能面向成百上千、甚至上亿人次的流畅无卡顿直播,简直是天方夜谭。当时,视频压缩、编解码、网络传输等诸多技术都严重限制了网络直播的发展,人们大多数还是从电视频道上观看各种大型直播,拥有昂贵设备与卫星转播系统的电视台成为了唯一能够驾驭“亿”这种量级的平台机构。然而,十年之后的今天,在云、网、边、端技术的共同发展之下,直播从大屏走向小屏,2022年天猫双11预售首日,李佳琦一场直播的观看量就达到了惊人的4.56亿人次,同时接入观看的节点数高达千万级以上。一方面,如此惊人的高并发流量对网络造成了巨大的压力。如何保证画面清晰、流畅、不卡顿成为了工程师们的最大挑战之一。在直播兴起初期,“卡的宝子退出来重进一下”几乎成了各大平台主播的日常用语。另一方面,跟传统直播技术的单向传播不同,直播电商对实时互动更高,几秒钟的延时损害的不仅仅是用户体验,还会直接影响交易达成——这可是商家的命脉。为了降低电商直播端到端的延时,并在超高并发情况下依旧可靠,阿里云与淘宝技术共同攻坚,将传统的CDN内容分发网络进行改造,打造了一张全球实时传输网GRTN(Global Real-Time Transport Network)。而基于这张网的超低延时直播技术RTS(Real-Time Streaming)更是让淘宝直播能够做到千万级大规模并发下,将延时控制在1s以内,做到真正意义上的低延时和沉浸式互动。淘宝直播的技术升级既是一个新时代的典型应用,又是音视频行业技术发展的一个缩影。回望过去十年间,我们可以看到音视频行业发展的三大趋势:1)超感体验毫无疑问,人类对感受与体验的不断追求,正是驱动音视频行业迅猛发展的最大动力。视觉方面,更快、更清晰、更细腻、更多彩、更流畅的观影体验始终是音视频大厦的根基。产业历经十年从1080P、走到4K、再走到了8K画质,传输数据量越来越大,每一代编码的升级复杂度以百倍计算,视频延时却由30秒急剧下降到10秒、1秒、甚至目前达到的百毫秒以内。听觉方面,21世纪以来,音频编码技术突飞猛进,英国之宝的联合创始人Bob Stuart所开发出的MQA高格式PCM无损处理和压缩技术让网络流媒体高音频传输成为现实。杜比全景声等技术所覆盖的终端产品越来越广,手机、电脑、平板、电视、音箱、游戏主机……足以以假乱真的超感音频体验让每一个人身临其境。与此同时,DTS也推出下一代音效技术DTS:X,试图凭借这个新一代开放的沉浸式音编解码标准与基于声音对象的多维空间音频技术与老对手杜比平分秋色。“2009年,你拿着最潮流的诺基亚手机,使用着刚刚普及的3G网络,打开DVD,与家人看一场1080P分辨率的经典大片,这就是幸福。”今天,你在地铁上打开5G手机,一场杜比全景声4K超清音视频盛宴就在眼前。以体育赛事为例,曾几何时,观众梦想着像“上帝视角”一样对运动员多方位、多角度、自由观看。北京冬奥期间,阿里云与优酷联合,通过在体育场馆内环绕部署多台摄像机,将现场采集的多路视频内容编排整合后回传至中心云或边缘节点,通过中心云或边缘节点部署的算力,将视频流做3D渲染重建,再将渲染后的视频流实时传送给观众。此时,观众就可以像操控游戏角色一样,立体、自由、360度地观看运动员赛事的精彩瞬间,将直播体验发挥到极致,赋能视频行业突破原有业务边界。2)极致成本技术的普及从来都离不开成本的降低。许多前沿音视频技术之所以鲜为人知,不是因为没有发明出来,而是因为它真的——太贵了。举个例子,2018年,央视宣布开始投建三阶段4K推进计划,其项目总投资85.5亿元,建成后每年运行维护及节目传输投入10.94亿元,每年4K节目制作投入约150亿元(不含人员等经费)。商业需求驱动视频技术极致化发展,也燃动着对成本的极致化追求,而边缘云技术的发展则为这一难题提供了解法。当前,90%的直播业务已下沉至边缘云,基于广泛覆盖的节点就近分布,边缘云将能力拓延至“最后一公里”,在降低传输与算力延时基础上,以更低的综合成本推动着用户的体验不断升级。想要在保证观看体验的前提下降低成本,一种从人眼视觉模型出发,以“主观体验最好”为目标的编码和传输方式——窄带高清可以实现两者的平衡。原始视频的数据非常巨大,需要进行编码与压缩才能进行存储与传输。从某种程度来说,编解码技术的发展正是音视频技术的发展。传统云端转码是在用户端形成一个原始视频,经过编码之后以视频流的形式传到服务端,在服务端解码之后做转码,然后再编码通过CDN分发出去。而窄带高清技术的“窄带”是指让视频经过窄带高清转码之后,对带宽的需求变得更小。同时,“高清”是指经过转码后的画质仍然能够保持高清、丰富的视觉体验。此外,在算力方面,视频编码与视频处理均为计算密集型场景,如何解决视频云赛道的算力困局,让高压缩率的视频编码算法更加普惠?更强大、更高效、更多样的云端音视频处理能力离不开底层算力的支持,近年来,云计算厂商纷纷开启了多样的技术架构升级。首先,是依托老牌厂商,不断进行硬件升级。例如英特尔Data Center GPU Flex解决方案,内置了开源 AV1 编解码器, 显著提高了压缩效率,与AVC 和HEVC相比使带宽增加30%以上,有助于大幅降低总拥有成本, 在不影响视频质量的情况下增加了云服务器支持的视频流密度。另外一条,即是自研。作为国内云计算产业的领头玩家,阿里云也在2021年的云栖大会上推出了首款自研云原生处理器CPU——倚天710,该芯片针对云场景研发,同时兼顾了性能与易用性。经过一年的业务验证后,基于倚天710的云计算实例在数据库、大数据、视频编解码、AI推理等核心场景中的性价比提升30%以上,单位算力功耗(耗电量)降低了60%以上。3)虚实融合如果说更清晰、流畅、低成本是音视频行业在过去半个世纪以来永不停歇的不懈追求,那么在最近十年间,一项最具时代特色的音视频体验则非虚实融合莫属。无论是《雪崩》中的元宇宙社区,还是《头号玩家》中的“绿洲”,人类对于打破虚拟与现实界限的超次元体验始终怀有梦一般的向往。过去,这种向往只能在科幻作品中实现,然而这十年间,SLAM技术的高速发展让机器能够迅速定位人体位置,光学与现实技术的突飞猛进让更轻、更薄、更逼真的VR/AR头显成为现实,Pancake光学方案、双眼4K屏、90Hz超高刷新率等曾经难以企及的技术更是成为了虚拟现实的标配。在音视频超感体验的不断发展与边缘云、视频云技术的不断降本增效之下,3D网络购物成为了现实;《黑客帝国》中惊心动魄的“子弹时间”如今可以在云端实时合成;《钢铁侠》中的万能AI管家贾维斯有了自然语言处理能力,我们甚至能够为他配上一张有着细腻喜怒哀乐表情的逼真面庞。冬奥期间,在演播室里,当谷爱凌在自由式滑雪女子大跳台的决赛中一举夺冠时,AI剪辑系统实时提供谷爱凌精彩动作视频集锦并第一时间成片后,这一视频迅速登上央视频首页推荐焦点位,两小时内播放量超过500万。除了冬奥赛场上,音视频技术的发展也正不断突破我们日常生活中的体验。VR看球、工业孪生建模、3D全息购物……更多交互维度的虚实融合拓宽着人类感知的边界,引领着一个更有想象力的未来。而音视频行业之所以能够不断向前发展,衍生出360度自由视角观看、AI剪辑、VR看球等诸多超越想象力的精彩应用,正是由于技术与产业的共同进步。03 从克劳德·香农到Imagine Computing大赛1948年,近代最伟大的数学家之一、信息论的创始人、美国天才电子工程师克劳德·香农,以一篇震惊世界的《A Mathematical Theory of Communication》论文,正式拉开了当代信息论的大幕。此后的几十年间,由信息论衍生出的信道编码、图像/视频压缩、甚至人工智能技术,成为了推动音视频产业进步、甚至大量计算机科学产业突破的底层动力。是的,任何产业技术领域的突破进展,都离不开产、学、研多方面的共同努力。近年间,人工智能领域最有名的学术大赛当属ImageNet计算机识别挑战赛。在2012年的ImageNet大赛上,日后的“深度学习三巨头”之一、多伦多大学的Geoffrey Hinton教授带领团队首次使用深度学习技术训练人工智能进行图像识别,错误率骤降至15.3%。而在2015年的ImageNet大赛上,来自微软亚洲研究院的团队更是第一次将错误率压到了3.57%——这意味着,人工智能第一次在图像识别上,超越了人类。这一成果,成为了音视频学科历史上的又一个里程碑式事件。前沿技术的探索需要学界和产业的共同探索,音视频技术涵盖了编解码、网络调度、人工智能、云端协同等多个技术领域,覆盖面广、技术体系复杂,面对飞速发展的业务需求,往往技术人才的储备和创新实践却显得不足。去年,阿里云与英特尔联合主办的Imagine Computing创新技术天池大赛以“新算力·新体验”为主题,聚焦音视频与云技术结合的关键领域技术创新。“新算力”与“新体验”分别指代的是音视频行业发展的两大重要技术基础,也是本次大赛两大赛道的比拼主线。首先是“新体验”。体验始终是驱动音视频技术发展的根基。无论是更先进的音视频编码技术让画面更清晰流畅,还是更强大的网络分发技术让用户观看得更低延时、更实时互动,其本质上都是工程师们对于更好、更快的音视频体验的不懈追求。随着企业数字进程的加速,云上视频算力也从中心逐步延展到网络边缘从而形成新型的边缘基础设施。算力和网络在边缘侧加速融合,而视频应用是否流畅、高清、低延时等这些直观感受已成为用户最为关心的,如何基于边缘云构建实时音视频处理的应用,有效降低计算时延和成本,提升最终用户体验,成为了本次比赛关注的赛道之一。其次是“新算力”。众所周知,近半个世纪以来,电子信息科学的进步与芯片算力、云计算架构的发展息息相关。当前,继公有云、私有云、混合云的不断发展之后,企业对云计算的使用需求愈加多样化,推动云计算服务不断向边缘延伸、下沉,向更加全局化的分布式模式进发,并逐渐形成了涵盖中心云、区域云、边缘云的分布式云形态。其中,由于边缘云可以提供靠近终端用户的、全域覆盖的、弹性分布式算力资源,通过将视频存储和分发、AI计算、智能化数据分析等工作放在边缘处理,构建实时音视频处理,达到降低响应时延、减轻云端压力、降低带宽成本,并供全网调度、算力分发等云服务的目的,而如何准确地预测网民侧的客户体验水平是视频内容分发网络进行节点优化布局、调整流量调度策略、节点软件优化的基础和指南针。基于此,边缘云内容分发网络客户体验预测算法的探索变得至关重要。此外,如上文所言,音视频的创新和突破不仅需要从云服务层面入手,也需要底层算力的硬件支撑。本次赛事还为参赛者提供了基于英特尔® Data Center GPU Flex 系列GPU产品的解决方案,其标准且灵活的开放软件堆栈和oneAPI、强大的AV1编码器和AI视觉推理能力,有助于减少边缘云使用不同解决方案并管理异构或专有环境的需求,助力参赛选手更好的探索性能加速与低延时命题。04 结语从9英寸的黑白世界杯到4亿人次观看的淘宝直播,从1948年的香农定理到2022年的Imagine Computing大赛,随着音视频技术的不断发展与突破,感知与技术的边界也正被不断拓宽,许多曾经以为天方夜谭的新奇应用,正随着人工智能算法、算力、以及网络技术的共同发展,逐步从科幻作品中走进现实。在1966年的科幻电视剧《星际迷航》中,Kirk船长与企业号船员们常常使用“通用翻译”听懂宇宙各地的外星人语言;在1968年的科幻电影《2001:太空漫游》中,宇宙飞船上的计算机HAL9000能够直接用AI语音与乘务员进行对话;而在1992年的科幻小说《雪崩》中,黑客、日本武士兼披萨饼快递员Hiro Protagonist与女孩Y·T一同在元宇宙中制服了雪崩病毒。今天,它们都成为了现实。当人类优渥于一种状态,总有想象力来冲破平衡。Cloud Imagine《云想之力》是阿里云联合36氪共同打造的系列报道,旨在探索云计算大背景下爆发的应用场景和新兴技术,以想象的高维碰撞之力,窥探“云”上的无限空间。从9英寸的黑白世界杯到4.56亿人的直播狂欢,从1948年的香农定理到2022年的lmagine Computing的天池大赛,一个超越想象力的崭新纪元,就在眼前。
文章
编解码  ·  人工智能  ·  边缘计算  ·  算法  ·  调度  ·  vr&ar  ·  云计算  ·  计算机视觉  ·  异构计算  ·  CDN
2023-02-28
基于PHP和MySQL的新闻发布系统
关于世界杯⚽️国际足联世界杯(FIFA World Cup),简称“世界杯”,是由全世界国家级别球队参与,象征足球界最高荣誉,并具有最大知名度和影响力的足球赛事。世界杯全球电视转播观众超过35亿 。世界杯每四年举办一次,任何国际足联会员国(地区)都可以派出代表队报名参加这项赛事。今年在卡塔尔举行的世界杯也是赚足了广大球迷的眼球,奈何自己不是很懂,只能看个热闹,恰好最近学习了PHP连接数据库,简单完成一个关于“世界杯”的新闻发布系统练练手,也算是对世界杯有个小回忆了。展示效果展示页面:新闻发布后台:整理思路我们可以做一个思维导图来整理下自己的思路,也方便能够清晰地写出各个功能页面:首先是一个用于展示已发布新闻的页面,那么如何让这些新闻展示出来呢——那就需要用到SQL语句中的 查询语句;然后就是管理员:通过注册的方式获取对新闻的操作权限,注册完成后再登录进入新闻发布的后台,对新闻进行发布、删除、修改操作。🆗,这就是大体思路。功能实现首先做好准备工作:开启数据库和服务器通过数据库管理工具创建相关数据表新闻表:用户表:测试数据库连接情况//测试文件conn.php,测试数据库连接情况 <?php header("content-type:text/html;charset=utf-8"); $mysqli=new mysqli("localhost:3306","root","","2021info"); if(!$mysqli){ die("error"); } $mysqli->query(("set names utf-8")); ?> //连接成功 展示页面<?php // 该页面用于展示新闻,并提供登录和注册入口进入后台对新闻进行操作 include "./conn.php"; //能够实现所需功能的SQL语句 $sel = "select * from news order by mtime limit 0,5"; //执行SQL语句 $rs = $mysqli->query($sel); //将查询得到的语句转化成一维数组 $result = $rs->fetch_assoc(); //用来设置服务器的默认时区,Asia表示亚洲,Shanghai用来表示中国上海 date_default_timezone_set("Asia/Shanghai"); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <title>新闻展示页面</title> <!-- <link rel="stylesheet" type="text/css" href="./css/导航条.css" /> --> <link rel="stylesheet" type="text/css" href="./css/index1.css" /> <link rel="stylesheet" type="text/css" href="./css/lunbo.css" /> </head> <body style="background-color:rgb(60, 108, 236);color: antiquewhite;"> <div class="bd"> <img src="./img/世界杯.png" alt=""> </div> <div class="div1"> <p>点击观看精彩赛事</p> <div class="demo"> <a href="#"> <div class="demo1"> <img src="./img/pic1.png" alt=""> <img src="./img/pic2.png" alt=""> <img src="./img/pic3.png" alt=""> <img src="./img/pic4.png" alt=""> <img src="./img/pic5.png" alt=""> </div> </a> </div> <div class="div2"> <img src="./img/世界杯1.png"> <h4 class="font1">新闻</h4> <h4 class="font2">发布时间</h4> //利用列表将需要展示的新闻字段展示出来 <?php while ($result = $rs->fetch_assoc()) : ?> <li class="title"><a href="watch.php?id=<?= $result['id'] ?>"> <span class="title"><a href="contents.php?id=<?= $result['id'] ?>"> <?php //利用mb_strlen()函数和mb_substr()函数,返回新闻标题的一部分,多出部分用“...”代替,使之更加美观 if (mb_strlen($result['title']) > 3) { echo mb_substr($result['title'], 0, 6) . "..."; } else { echo $result['title']; } ?></span></li> //与 date_default_timezone_set("Asia/Shanghai");共同将时间戳转换成日期 <li class="ctime"><?= date("Y-m-d H:i:s", $result['mtime']) ?></li></a> <?php endwhile; ?> </div> <div class="div3"> <a href="./regis.php">注册</a> <a href="./login.php">登录</a> </div> </div> </body> </html> //watch.php <?php include "./conn.php"; date_default_timezone_set("Asia/Shanghai"); $id = $_GET['id']; $sel = "select title,author,content,mtime from news where id={$id};"; $re = $mysqli->query($sel); $result = $re->fetch_assoc(); // var_dump($result); // if(!$re){ // echo "<script>alert('失败');location.href='newsshow.php';</script>"; // } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" type="text/css" href="./css/watch.css"/> </head> <body style="background-color:rgb(60, 108, 236)"> <div class="div1"> <div class="titleBox"> <h2><span><?= $result['title'] ?></span></h2> </div> <div class="author"> <h4>发布者:<span><?= $result['author'] ?></span></h4> </div> <div class="content"> <p><?= $result['content'] ?></p> </div> <div class="mtime"> <p><?=date("Y-m-d H:i:s",$result['mtime'])?><a href="./newshow.php">返回首页</a></p> </div> </div> </body> </html> 注册登录注册://register.html <h3>sign up</h3> <form action="register_do.php" method="post" id="myform"> 请输入用户名:<input type="text" name="username" id="username"> 请输入手机号:<input type="text" name="usertel" id="usertel"> 请输入邮箱:<input type="text" name="useremail" id="useremail"> 请输入密码:<input type="password" name="userpwd" id="userpwd"> 请确认密码:<input type="password" name="repwd" id="repwd"> <input type="submit" value="注册"> </form> <script src="./js/register.js"></script> //js实现用户输入信息是否正确 //设置页面加载完成即执行js代码 window.onload=function(){ //获取id对象 var myform=document.getElementById("myform"); var username=document.getElementById("username"); var usertel=document.getElementById("usertel"); var useremail=document.getElementById("useremail"); var pwd=document.getElementById("userpwd"); var repwd=document.getElementById("repwd"); myform.onsubmit=function(){ if(username.value==""){ alert("用户名不可为空!"); return false; } if(usertel.value.length!=11){ alert("请输入正确手机号!"); return false; } if(useremail.value.indexOf('@')<1 || useremail.value.indexOf('.')<3){ alert("请输入正确邮箱!"); return false; } if(userpwd.value.length==0){ alert("密码不能为空!"); return false; } if(userpwd.value.length<6){ alert("密码不可少于6位!"); return false; } if(repwd.value==""){ alert("确认密码不可为空!"); return false; } if(repwd.value!=pwd.value){ alert("密码输入不一致!"); return false; } } } <?php //register_do.php // 该页面任务是拿到resigter的页面传递的数据,并进行用户名重复性检查. include "./conn.php"; //post传递参数 $username=$_POST['username']; $pwd=md5($_POST['pwd']); $repwd=md5($_POST['repwd']); $sel="select * from userpub where username='{$username}';"; $rs=$mysqli->query($sel); //从查询中输出所影响记录行数,利用影响的行数来判断是否重复注册用户名 $rows=$mysqli->affected_rows; //若影响的行数大于0,则代表重复注册用户名 if($rows>0){ echo "<script>alert('用户名注册失败,请重新选择用户名');location.href='regis.php';</script>"; }else{ //没有影响行数代表用户名可注册,执行插入语句 $in="insert into userpub(username,password,repwd)values('{$username}','{$pwd}','{$repwd}');"; $st=$mysqli->query($in); if($st){ echo "<script>alert('注册成功');location.href='login.php';</script>"; }else{ echo "<script>alert('注册失败');location.href='register.php';</script>"; } } ?> 登录://login.js window.onload=function(){ //获取id 对象 var myform=document.getElementById("myform"); var user=document.getElementById("username"); var pwd=document.getElementById("userpwd"); myform.onsubmit=function(){ if(username.value==""){ alert("用户名不可为空!"); return false; } if(userpwd.value.length==0){ alert("密码不能为空!"); return false; } } } //login_do.php <?php // 该页面将登录页面收集到的信息与后台注册的用户名和密码进行核对,核对成功进入数据库 include "./conn.php"; $username=$_POST['username']; $userpwd=md5($_POST['userpwd']); $sel="select * from admin where username='{$username}';"; $rs=$mysqli->query($sel); //从查询中输出所影响记录行数,利用影响的行数来判断是否重复注册用户名 $rows=$mysqli->affected_rows; if($rows>0){ // 用户名存在 验证用户输入的密码和数据表中存在的用户名对应的密码是否一致,将用户名对应的字段转换成一维数组,通过数组名加下标的方式判断用户密码输入是否正确。 $result=$rs->fetch_assoc(); if($userpwd==$result['userpwd']){ echo "<script>alert('登录成功');location.href='news_select.php'</script>"; }else{ echo "<script>alert('密码错误,请重新输入或注册');location.href='login.php'</script>"; } }else{ // 用户名不存在 echo "<script>alert('用户名不存在,请重新输入或者先注册');location.href='login.php';</script>" ; } ?> 增加——insert// news_insert.html 该页面用于收集新闻相关信息 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <form action="insert_do.php" method="post"> 请输入新闻标题:<input type="text" name="title"></br> 请输入新闻内容:<textarea name="content" id="" cols="30" rows="10"></textarea></br> 请输入新闻作者:<input type="text" name="author"> <input type="submit" value="发布"> </form> </body> </html> //insert_do.php 该页面拿到相关的新闻信息,并执行插入SQL语句将其插入到news表中 <?php include './conn.php'; $title=$_POST['title']; $content=$_POST['content']; $author=$_POST['author']; $ctime=time(); $mtime=time(); $in="insert into news(title,content,author,ctime,mtime)values('{$title}','{$content}','{$author}',$ctime,$mtime);"; $st=$mysqli->query($in); if($st){ echo "<script>alert('发布成功!');location.href='news_select.php';</script>"; }else{ echo "<script>alert('发布失败!');location.href='insert_do.php';</script>"; } ?> 查询——select//news_select.php <?php // 该页面用于展示从数据库中最新的几条新闻 include "./conn.php"; $sel="select * from news order by ctime desc limit 0,10;"; $rs=$mysqli->query($sel); date_default_timezone_set("Asia/Shanghai"); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <table border="1px"> <tr> <th>id</th> <th>title</th> <th>content</th> <th>author</th> <th>发布时间</th> <th>修改时间</th> <th>修改</th> <th>删除</th> </tr> <?php while($result=$rs->fetch_assoc()){?> <tr> <td><?=$result['id']?></td> <td><?=$result['title']?></td> <td><?=$result['content']?></td> <td><?=$result['author']?></td> <td><?=date("Y-m-d H:i:s",$result['ctime'])?></td> <td><?=date("Y-m-d H:i:s",$result['mtime'])?></td> <td><a href="news_update.php?id=<?=$result['id']?>">修改</a></td> <td><a href="news_delete.php?id=<?=$result['id']?>">删除</a></td> </tr> <?php }?> </table> <a href="./news_insert.html">发布新闻</a> <a href="./newshow.php">回到首页</a> <a href="./delnews.php">查看已删新闻</a> </body> </html> 修改——update//news_update.php 该页面用于收集对新闻的修改信息 <?php include "./conn.php"; //get传参 id $id=$_GET['id']; ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <form action="update_do.php?id=<?=$id?>" method="post"> 请输入新的标题:<input type="text" name="newtitle"></br> 请输入新的内容:<textarea name="newcontent" id="" rows="10" cols="30"></textarea></br> 请输入新闻作者:<input type="text" name="newauthor"> <!-- 隐藏域获取id --> <input type="hidden" name="id" value="<?=$id?>"> <input type="submit" value="修改"> </form> </body> </html> //update_do.php 该页面拿到收集到的相关修改信息,并执行修改的SQL语句,完成对数据表的修改。 <?php require("./conn.php"); $id=$_POST['id']; $title=$_POST['newtitle']; $content=$_POST['newcontent']; $author=$_POST['newauthor']; $mtime=time(); $upd="update news set title='{$title}',content='{$content}',author='{$author}',mtime=$mtime where id={$id};"; $st=$mysqli->query($upd); if($st){ echo "<script>alert('修改成功');location.href='news_select.php';</script>"; }else{ echo "<script>alert('修改失败');location.href='news_select.php';</script>"; } ?> 删除——delete<?php include "./conn.php"; $id=$_GET['id']; $del="delete from newpub where id={$id};"; $st=$mysqli->query($del); if($st){ echo "<script>alert('删除成功');location.href='newselect.php';</script>"; }else{ echo "<script>alert('删除失败');location.href='newselect.php';</script>"; } ?> 优化功能查看已删新闻数据表:如果我们想要查看已经删除的新闻的话,就需要再创建一个数据表来存储删除的新闻信息,这里我创建了一个delnews 表;并增加了删除时间 字段。//news_delete.php 该页面将所要删除的记录放到一个新的表中,并从原来表中删除。 <?php include "./conn.php"; $id=$_GET['id']; $dtime=time(); date_default_timezone_set("Asia/Shanghai"); // 将获取的id相应的数据读取成一个result数组中,然后利用数组将读取的字段插入到delnews表中。 $sel="select * from news where id={$id};"; $re=$mysqli->query($sel); $result=$re->fetch_assoc(); // var_dump($result); $in="insert into delnews(id,title,content,author,ctime,mtime,dtime)values('{$result['id']}','{$result['title']}','{$result['content']}','{$result['author']}', '{$result['ctime']}','{$result['mtime']}',$dtime);"; $st=$mysqli->query($in); if($st){ $del="delete from news where id={$id};"; $de=$mysqli->query($del); if($de){ echo "<script>alert('删除成功!');location.href='news_select.php';</script>"; }else{ echo "<script>alert('删除失败!');location.href='news_select.php';</script>"; } }else{ echo "<script>alert('删除失败!');location.href='news_select.php';</script>"; } ?> <?php //delnews.php 该页面用于从delnews表中读取内容,以表格的形式展出。 include "./conn.php"; $sel = "select * from delnews order by dtime desc"; $re = $mysqli->query($sel); date_default_timezone_set("Asia/Shanghai"); ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> </head> <body> <table border="1px"> <tr> <th>title</th> <th>content</th> <th>author</th> <th>发布时间</th> <th>修改时间</th> <th>删除时间</th> <th>撤销删除</th> </tr> <?php while ($result = $re->fetch_assoc()) { ?> <tr> <td><?= $result['id'] ?></td> <td><?= $result['title'] ?></td> <td><?= $result['author'] ?></td> <td><?= date("Y-m-d H:i:s", $result['ctime']) ?></td> <td><?= date("Y-m-d H:i:s", $result['mtime']) ?></td> <td><?= date("Y-m-d H:i:s", $result['dtime']) ?></td> <td><a href="delnews_do.php?id=<?= $result['id'] ?>">撤销删除</a></td> </tr> <?php } ?> </table> </body> </html> 撤销已删新闻撤销功能和对news表中数据的删除功能类似://delnews_do.php 该页面用于撤销删除已删新闻。 <?php include "./conn.php"; $id=$_GET['id']; $mtime=time(); date_default_timezone_set("Asia/Shanghai"); $sel="select * from delnews where id={$id};"; $rs=$mysqli->query($sel); $result=$rs->fetch_assoc(); $in="insert into news(id,title,content,author,ctime,mtime)values('{$result['id']}','{$result['title']}','{$result['content']}','{$result['author']}', '{$result['ctime']}','{$result['mtime']}');"; $st=$mysqli->query($in); if($st){ $del="delete from delnews where id={$id};"; $de=$mysqli->query($del); if($de){ echo "<script>alert('撤销成功!');location.href='news_select.php';</script>"; }else{ echo "<script>alert('撤销失败!');location.href='news_select.php';</script>"; } }else{ echo "<script>alert('撤销失败!');location.href='news_select.php';</script>"; } 总结🥇刚开始接触php连接数据库的时候可能会遇到很多小问题,首先就是检查数据库的连接状态是否正常,再就是注意参数的传递,SQL语句的写法等。当然还有更多需要优化的地方:没有进行cookie和session来记录用户状态,以及增强存储在服务器的数据的安全性;在基础功能上还需要添加更多改善用户体验的方面。那么在后续的文章还会给大家分享学习经验,继续优化这个新闻发布系统。如有不足,感谢指正
文章
存储  ·  SQL  ·  关系型数据库  ·  MySQL  ·  数据库连接  ·  PHP  ·  数据库  ·  UED
2023-02-09
多语言版虚拟币数字资产交易所
什么是代币化?区块链的潜力不仅仅是为加密货币交换提供数据库和平台。自 2016 年以来的一个增长趋势继续解决如何将现实世界的资产转移到区块链上以获得比特币的优势,同时保持资产的特性。资产标记化实现了这一目标。令牌化是将权利和利益转换为特定价值单位的过程,例如将资产转换为存在于比特币 (BSV) 区块链上的数字令牌。代币化是如何运作的由比特币 SV 区块链提供支持,代币化可实现高效直接的拥有、验证和传输模式。存在几类数字令牌:安全性、实用性、身份等。资产可以是有形的也可以是无形的,任何你认为有价值的东西都可以被代币化。资产代币化为更广阔的市场打开了潜在的投资者基础,与传统证券相比增加了流动性,并减少了交易所需的时间。通过比特币 (BSV) 区块链的协议进行传输、记录保存、管理和存储,改变了我们处理传统资产转移的方式。比特币 (BSV) 区块链确保代币的交易历史无可辩驳。代币化的主要优势由比特币 (BSV) 区块链提供支持的数字代币允许标记部分权利,例如内容许可。此外,比特币 (BSV) 区块链允许对全部财产进行代币化,例如拥有公寓。代币化进一步能够将大量非流动资产拆分为更小、流动性更强的部分。以公寓为例,多方可以拥有该单元,代币可以代表每个所有者的股份。这可以简化与政府的流程,并满足记录保存的要求。这个过程在交易资产方面创造了更多的自由,同时降低了非流动性溢价,建立了一个更有效的过程和额外的价值来源。将代币化资产与流畅的跨境平台相结合,为开放市场设定了框架。这允许鼓励参与的流动、动态和包容性渠道,为每个人释放集体价值。比特币 (BSV) 分类账记录了所有后续的所有权变更。比特币交易的数字痕迹不仅可以验证归属历史,还有助于确保减少欺诈。比特币 (BSV) 区块链的不变结构使得代币持有者不可能“双重出售”代币,即接受来自两个不同来源的同一资产的转移。存在状态区块链技术区分两种存在状态;可替代代币和不可替代代币。可替代代币是可分割的、相同的,并且可以被另一个相同的项目替换,例如普通入场音乐会门票或忠诚度积分。如果双方拥有相等的数量,他们可以交换它们而不会失去或获得任何东西。另一方面,不可替代性表示一种独特的表示形式,因为另一个项目无法替代它,从而造成资产的可验证稀缺性。存储在每个令牌中的是单独的元数据。令牌中的元数据可以包括对每个令牌属性的引用,例如关于所有权的信息。这些经过验证的细节最终可以增加价值,因为投资者可以对其来源充满信心。这种不可替代的性质表明了它们的用例与可替代的对应物有何不同。一个例子是您最喜欢的球员在冠军赛期间穿的比赛日球衣或一件艺术品。实际用例资产标记化的好处包括易于转移、自动化和不再受现金或有形资产约束的固定交易档案。这个过程改变了广泛的资产类别的获取和转移方式,使所有权民主化,从版权到房地产。为资产创建代币,为其转移提供了坚实的后盾,为其合法性提供了安全保障。为了演示代币化的工作原理,假设您要出售价值 50,000 美元的 FIFA 世界杯决赛的 VIP skybox 门票。由于猖獗的欺诈行为,进入高级活动很难进行交易。需要仔细检查以确保卖家不会在结算时和所有权合法易手时引入假票。多语言版虚拟币数字资产交易所PHP网站源码/币币交易/C2C交易/带机器人+合约交易,支持三十多国语言通过代币化,您可以用代币表示门票的价值,例如 1 FWC(国际足联世界杯门票)= 5 BSV。通过将智能合约与代币化相结合,交换过程可以变得简单高效,而不是与第三方经纪人进行交换,这会减慢过程。遗产规划是令牌化的另一个实际应用。对遗产进行代币化可以更轻松、更简单地将您的资产分配给家人和朋友,同时保证遵守您的意愿。交易所和平台搭建怎么搭建交易所现货交易所搭建搭建比特币交易所比特币交易所搭建比特币 交易所 搭建代理可以在智能合约中包含某些业务逻辑,同时允许自动事件发生并提高结算速度。他们还可以将合规性编程到代币中,包括对所有拥有数字身份的参与者进行相关合规性 KYC/AML 检查。令牌化入门任何令牌系统最关键的目标是它允许实际和有益的用例。考虑到这一目标,Tokenized 团队将屡获殊荣的开源 Tokenized Protocol 开发为全球数据交换标准。Tokenized 平台为发行人和用户提供了一种使用智能合约创建、管理和交易证券或实用程序令牌的简单而安全的方式。它也是一个功能齐全的比特币 SV 钱包。“我们期待帮助生态系统中的每个人在他们自己的项目中增加对开源令牌化协议的支持。我们也欢迎所有用户、组织、开发人员、政府和投资者联系并了解 Tokenized Protocol 如何使他们受益,” Tokenized 创始人兼首席执行官 James Belding 解释道。我们相信我们的解决方案是迄今为止市场上最好的代币和智能合约系统,并结合了比特币 SV (BSV) 网络无与伦比的扩展能力;我们相信我们可以系统地改进我们的世界参与自愿交流的方式。代币化协议的主要特点:支持多种资产类型:普通股 (SHC)、忠诚度和奖励积分、优惠券、货币、入场券和会员资格(更多资产类型即将公布)多资产原子互换用于编排多重签名、阈值签名、令牌交换交易等签名的链上消息传递对 Identity Oracles 的智能合约支持确保发行人即使在二级交易中也能遵守 KYC、AML、CTF 法律,同时维护用户隐私Tokenized 平台将引导用户通过四个简单的步骤来确保代币发行合法并满足他们的需求。资产仍然属于他们,可以以持有人选择的任何方式出售或筹集资金。用户根据他们选择的条款和条件创建自定义智能合约。有关令牌化协议的更多信息,请访问其主页。事实上,令牌化对于您了解比特币和区块链至关重要。但是,要完全了解比特币是如何产生的,您还需要了解郁金香信托及其对比特币的影响。
文章
存储  ·  安全  ·  机器人  ·  测试技术  ·  区块链  ·  PHP  ·  数据库  ·  数据安全/隐私保护
2022-12-28
阿里云数据库全新功能Redis读写分离,全维度技术解析
阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统https://yq.aliyun.com/articles/277885 文末有彩蛋,请务必记得看完整哦 背景 目前的阿里云redis不管主从版还是集群规格,slave作为备库不对外提供服务,只有在发生HA,slave提升为master后才承担读写。这种架构读写请求都在master上完成,一致性较高,但性能受到master数量的限制。经常有用户数据较少,但因为流量或者并发太高而不得不升级到更大的集群规格。 为满足读多写少的业务场景,最大化节约用户成本,阿里云redis推出了读写分离规格,为用户提供透明、高可用、高性能、高灵活的读写分离服务。 架构 目前的redis集群模式有redis-proxy, master,slave, HA等几个角色,在读写分离中,新增readonly slave角色承担读流量,slave作为热备不提供服务,架构上保持对现有集群规格的兼容性。redis-proxy按权重将读写请求转发到master或者某个readonly slave上;HA负责监控DB节点的健康状态,异常时发起主从切换或重搭readonly slave,并更新路由。 一般来说,根据master和readonly slave的数据同步方式,可以有两种架构:星型复制,链式复制。 星型复制 星型复制就是将所有的readonly slave直接和master保持同步,每个readonly slave之间相互独立,任何一个节点异常不影响到其他节点,同时因为复制链比较短,readonly slave上的复制延迟比较小。 redis是单进程单线程模型,主从之间的数据复制也在主线程中处理,readonly slave数量越多,数据同步对master的cpu消耗就越严重,集群的写入性能会随着readonly slave的增加而降低。此外,星型架构会让master的出口带宽随着readonly slave的增加而成倍增长。master上较高的CPU和网络负载又会抵消掉星型复制延迟较低的优势。可以看出,星型复制架构会带来比较严重的扩展问题,整个集群的性能会受限于master。 链式复制 链式复制将所有的readonly slave组织成一个复制链,如下图所示,master只需要将数据同步给slave和复制链上的第一个readonly slave。 链式复制解决了星型复制的扩展问题,理论上可以无限增加readonly slave的数量,随着节点的增加整个集群的性能也可以基本上呈线性增长。 链式复制的架构下,复制链越长,复制链末端的readonly slave和master之间的同步延迟就越大,考虑到读写分离主要使用在对一致性要求不高的场景下,这个缺点一般可以接受。但是如果复制链中的某个节点异常,会导致下游的所有节点数据都会大幅滞后,更加严重的是这可能带来全量同步,并且全量同步将一直传递到复制链的末端,这会对服务带来一定的影响,为了解决这个问题,读写分离的redis都使用阿里云优化后的binlog复制版本,最大程度的降低全量同步的概率。结合上述的讨论和比较,redis的读写分离选择链式复制的架构。 透明、兼容 读写分离和普通集群规格一样,都使用了redis-proxy做请求转发,多shard时部分命令使用存在一定的限制,但从主从升级单分片读写分离,或者从集群升级到多分片的读写分离集群可以做到完全兼容。 规格 主从版本 读写分离(单shard) 集群 读写分离集群 兼容性 100% 100% 部分命令使用受到限制 部分命令使用受到限制 在集群模式下,有部分命令使用必须限制所有key在同一个slot中,具体可以参考阿里云官网:https://help.aliyun.com/document_detail/26356.html?spm=5176.doc43829.6.562.NDJFXm 用户和redis-proxy建立连接,redis-proxy会识别出客户端连接发送过来的请求是读还是写,然后按照权重作负载均衡,将请求转发到后端不同的DB节点中,写请求转发给master,读操作转发给readonly slave(master默认也提供读,可以通过权重控制)。 用户只需要购买读写分离规格的实例,直接使用任何客户端即可直接使用,业务不用做任何修改就可以开始享受读写分离服务带来的巨大性能提升,接入成本几乎为0。 高可用 高可用模块(HA)监控所有DB节点的健康状态,为整个实例的可用性保驾护航,master宕机时自动切换到新主。如果某个readonly slave宕机,HA也能及时感知,然后重搭一个新的readonly slave,下线宕机节点。 除HA之外,redis-proxy也能实时感知每个readonly slave的状态。在某个readonly slave异常期间,redis-proxy会自动降低这个节点的权重,如果发现某个readonly slave连续失败超过一定次数以后,会暂时屏蔽异常节点,直到异常消失以后才会恢复其正常权重。 redis-proxy和HA一起做到尽量减少业务对后端异常的感知,提高服务可用性。 性能 对于读多写少的业务场景,直接使用集群版本往往不是最合适的方案,现在读写分离提供了更多的选择,业务可以根据场景选择最适合的规格,充分利用每一个readonly slave的资源。 目前单shard对外售卖1master + 1/3/5 readonly slave多种规格(如果有更大的需求可以提工单反馈给我们),提供60W qps 和 192MByte/s的服务能力,在完全兼容所有命令的情况下突破单机的资源限制。后续将去掉规格限制,让用户根据业务流量随时自由的增加或减少readonly slave数量。 规格 qps 带宽 1 master 8~10W读写 10~48MB 1 master + 1 readonly_slave 10W写 + 10W读 20~64MB 1 master + 3 readonly_slave 10W写 + 30W读 40~128MB 1 master + 5 readonly_slave 10W写 + 50W读 60~192MB 其他 redis主从异步复制,从readonly slave中可能读到旧的数据,使用读写分离需要业务可以容忍一定程度的数据不一致,后续将会给客户更灵活的配置和更大的自由,比如配置可以容忍的最大延迟时间。更多的购买和使用细节可以移步官网:https://promotion.aliyun.com/ntms/act/redisseparation.html 这里是彩蛋 感谢各位小伙伴的耐心阅读,现在参加Redis读写分离微博转发活动还有机会获得2017年 FIFA世俱杯门票以及阿里云T恤点击云栖社区官方微博活动链接:https://weibo.com/1939498534/FydFv4EB1?ref=home&type=comment#_rnd1512444442357 ,12月6日抽取8名幸运用户2017年 FIFA世俱杯门票1张,12月12日抽20名幸运用户赠阿里云T恤1件。
文章
NoSQL  ·  Redis  ·  数据库  ·  监控  ·  负载均衡
2017-11-30
asmlib方式管理oracle asm环境下,新加存储需特别注意
oracle10g 数据库主机已经连接有使用RDAC的存储,计划新增扩容IBM新存储(要求使用dm-multipath多路径软件),多个多路径软件能否共存?启后sd设备名是否会发生改变,是否影响asm和oracle启动? 这是一个涉及操作系统、存储、数据库多专业协同才能回答的问题,涉及很多细节,也需要查看具体case的详细情况,这里我提示一点:此处有坑!请做好备份,准备好充分的实施时间窗口。如果需要专业咨询和协助请联系15201657722,这里的弯弯绕我基本都已通过实验和实践予以解决。 涉及思路和知识点大概有: 1、查清现状: 1)linux设备管理知识,分清楚设备名与存储lun之间的对应关系 fdisk -l、lvm(vgs、pvs等)等 2)现有多路径管理方式 multipath -ll等 3)数据库现有信息等等 2、备份数据、留存配置 数据库备份、 磁盘头备份等等 3、新增存储、调整多路径配置 不要聚合老设备和无关设备 如果有问题,可以kfed分析磁盘盘头,极端情况下(Device "/dev/dm-3" defines a device with no label、oraclelist没有输出等等)甚至于写磁盘盘头。 4、asmlib层面操作 5、数据库层面操作 本文转自 liu99fifa 51CTO博客,原文链接:http://blog.51cto.com/andrewliu/1730238,如需转载请自行联系原作者
文章
存储  ·  Oracle  ·  关系型数据库  ·  数据库  ·  Linux
2017-11-27
oracle goldengate实施简明介绍
一、检查环境 1.1、跑预检查脚本和快照脚本 本数据库是否存在OGG不支持的数据类型 1.2、检查生产端的归档日志的空间 1.3、检查生产库实际占用空间大小 1.4、检查主机文件系统剩余空间,规划OGG安装目录、rman备份目录和归档备份目录 1.5、需要提前准备goldengate数据库用户单独使用的表空间,GG用户授予权限; 二、修改数据库设置 2.1、打开数据库级别的附加日志: Select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEMENTAL_LOG_DATA_FK, SUPPLEMENTAL_LOG_DATA_ALL from v$database; SQL> Select SUPPLEMENTAL_LOG_DATA_MIN,SUPPLEMENTAL_LOG_DATA_PK,SUPPLEMENTAL_LOG_DATA_UI,SUPPLEMENTAL_LOG_DATA_FK,   2  SUPPLEMENTAL_LOG_DATA_ALL from v$database; SUPPLEME SUP SUP SUP SUP -------- --- --- --- --- YES      NO  NO  NO  NO alter database add supplemental log data;                                          alter database add supplemental log data (primary key, unique,foreign key) columns; alter system switch logfile;       2.2.开启数据库强制日志模式 检查之前是否是强制日志:  改变: 2.3.停止业务,无session,停监听,lsnrctl stop; 2.3.1关闭数据库的recyclebin (实施DDL时进行配置) 2.3.2 建立OGG的DDL对象   三、部署新版本OGG 3.1、上传新版本OGG软件 解开tar包,对应目录下运行./ggsci GGSCI> create subdirs 3.2、环境变量 oracle用户.profile 添加环境变量(之前可能为/oggfs,此处要改过来) 3.3、修改上传生产端脚本   编辑mgr.prm 编辑extea.prm 3.4.编辑GLOBALS参数文件 3.5.添加抽取/传输进程与队列文件 3.6.cp参数文件和密码文件到目标端对应目录   四、rman初始化目标端数据 源端rman备份,记录备份完后的SCN; 目标端rman恢复 五、目标端数据库更改参数和模式 六、容灾端部署OGG、编辑参数文件,启动OGG   本文转自 liu99fifa 51CTO博客,原文链接:http://blog.51cto.com/andrewliu/661146,如需转载请自行联系原作者
文章
Oracle  ·  关系型数据库  ·  数据库  ·  SQL  ·  容灾
2017-11-27
阿里云Redis读写分离典型场景:如何轻松搭建电商秒杀系统
阿里云数据库全新功能Redis读写分离,全维度技术解析 https://yq.aliyun.com/articles/277325 文末有彩蛋,请务必记得看完整哦 背景 秒杀活动是绝大部分电商选择的低价促销,推广品牌的方式。不仅可以给平台带来用户量,还可以提高平台知名度。一个好的秒杀系统,可以提高平台系统的稳定性和公平性,获得更好的用户体验,提升平台的口碑,从而提升秒杀活动的最大价值。本次主要讨论阿里云云数据库Redis缓存设计高并发的秒杀系统。 秒杀的特征 秒杀活动对稀缺或者特价的商品进行定时,定量售卖,吸引成大量的消费者进行抢购,但又只有少部分消费者可以下单成功。因此,秒杀活动将在较短时间内产生比平时大数十倍,上百倍的页面访问流量和下单请求流量。 秒杀活动可以分为3个阶段: 秒杀前:用户不断刷新商品详情页,页面请求达到瞬时峰值。 秒杀开始:用户点击秒杀按钮,下单请求达到瞬时峰值。 秒杀后:一部分成功下单的用户不断刷新订单或者产生退单操作,大部分用户继续刷新商品详情页等待退单机会。 消费者提交订单,一般做法是利用数据库的行级锁。只有抢到锁的请求可以进行库存查询和下单操作。但是在高并发的情况下,数据库无法承担如此大的请求,往往会使整个服务blocked,在消费者看来就是服务器宕机。 秒杀系统 系统架构图 秒杀系统的流量虽然很高,但是实际有效流量是十分有限的。利用系统的层次结构,在每个阶段提前校验,拦截无效流量,可以减少大量无效的流量涌入数据库。 利用浏览器缓存和CDN抗压静态页面流量 秒杀前,用户不断刷新商品详情页,造成大量的页面请求。所以,我们需要把秒杀商品详情页与普通的商品详情页分开。对于秒杀商品详情页尽量将能静态化的元素尽量静态化处理,除了秒杀按钮需要服务端进行动态判断,其他的静态数据可以缓存在浏览器和CDN上。这样,秒杀前刷新页面导致的流量进入服务段的流量只有很小的一部分 利用阿里云读写分离Redis缓存拦截流量 CDN是第一级流量拦截,第二级流量拦截我们使用支持读写分离的阿里云Redis。在这一阶段我们主要读取数据,读写分离Redis能支持高大60万以上qps的,完全可以支持需求。 首先通过数据控制模块,提前将秒杀商品的缓存到阿里云读写分离Redis,并设置秒杀开始标记: "goodsId_count": 100 //总数 "goodsId_start": 0 //开始标记 "goodsId_access": 0 //接受下单数 秒杀开始前,服务集群读取goodsId_Start为0,直接返回未开始。数据控制模块将goodsId_start改为1,标志秒杀开始。服务集群缓存开始标记位并开始接受请求,并记录到redis中goodsId_access,商品剩余数量为(goodsId_count - goodsId_access)。当接受下单数达到goodsId_count后,继续拦截所有请求,商品剩余数量为0可以看出,最后成功参与下单的请求只有少部分可以被接受。在高并发的情况下,允许稍微多的流量进入。因此可以控制接受下单数的比例。 利用阿里云主从版Redis缓存加速库存扣量 成功参与下单,进入下层服务,开始进行订单信息校验,库存扣量。为了避免直接访问数据库,我们使用阿里云主从版Redis来进行库存扣量,阿里云主从版Redis提供10万级别的QPS。我们使用Redis来优化库存查询,提前拦截秒杀失败的请求,将大大提高系统的整体吞吐量。我们也是通过数据控制模块提前将库存存入Redis: //我们将每个秒杀商品在redis中用一个hash结构表示 "goodsId" : { "Total": 100 "Booked": 100 } 扣量时,服务器通过请求Redis获取下单资格,我们通过lua脚本实现,由于Redis时单线程模型,lua可以保证多个命令的原子性: lua脚本: local n = tonumber(ARGV[1]) if not n or n == 0 then return 0 end local vals = redis.call("HMGET", KEYS[1], "Total", "Booked"); local total = tonumber(vals[1]) local blocked = tonumber(vals[2]) if not total or not blocked then return 0 end if blocked + n <= total then redis.call("HINCRBY", KEYS[1], "Booked", n) return n; end return 0 先使用SCRIPT LOAD将lua脚本提前缓存在Redis,然后调用EVALSHA调用脚本,比直接调用EVAL节省网络带宽: redis 127.0.0.1:6379>SCRIPT LOAD "lua code" "438dd755f3fe0d32771753eb57f075b18fed7716" redis 127.0.0.1:6379>EVAL 438dd755f3fe0d32771753eb57f075b18fed7716 1 goodsId 1 秒杀服务通过判断Redis是否返回抢购个数n,即可知道此次请求是否扣量成功。 使用阿里云主从版Redis实现简单的消息队列异步下单入库 扣量完成后,需要进行订单入库。如果商品数量较少的时候,直接操作数据库即可。如果秒杀的商品是1万,甚至10万级别,那数据库锁冲突将带来很大的性能瓶颈。因此,利用消息队列组件,当秒杀服务将订单信息写入消息队列后,即可认为下单完成,避免直接操作数据库。 消息队列组件依然可以使用Redis实现,在R2中用list数据结构表示: orderList { [0] = {订单内容} [1] = {订单内容} [2] = {订单内容} ... } 将订单内容写入Redis: LPUSH orderList {订单内容} 异步下单模块从Redis中顺序获取订单信息,并将订单写入数据库: BRPOP orderList 0 我们通过使用Redis作为消息队列,异步处理订单入库,有效的提高了用户的下单完成速度。 数据控制模块,管理秒杀数据同步 最开始,我们利用阿里云读写分离Redis进行流量限制,只让部分流量进入下单。对于下单检验失败和退单等情况,我们需要让更多的流量进来。因此,数据控制模块需要定时将数据库中的数据进行一定的计算,同步到主从版Redis,同时再同步到读写分离的Redis,让更多的流量进来。 使用阿里云Redis的优势 阿里云主从版Redis提供10万的QPS,读写分离版本Redis提供60万QPS最大力度支持秒杀系统的高并发需求。 资深专家团队深度开发维护Redis源码,经千万服务考验,超高稳定性和安全性。 双机热备架构,故障秒级自动迁移,全力保障订单数据。 一键创建,一键扩容,全方位智能监控运维平台。请求量,活跃度一眼就能看清。 专业服务团队,实时监控可用性,7 x 24小时在线咨询。 广告 云数据库Redis版(ApsaraDB for Redis)是一种稳定可靠、性能卓越、可弹性伸缩的数据库服务。基于飞天分布式系统和全SSD盘高性能存储,支持主备版和集群版两套高可用架构。提供了全套的容灾切换、故障迁移、在线扩容、性能优化的数据库解决方案。欢迎各位购买使用:云数据库 Redis 版 这里是彩蛋 感谢各位小伙伴的耐心阅读,现在参加Redis读写分离微博转发活动还有机会获得2017年 FIFA世俱杯门票以及阿里云T恤点击云栖社区官方微博活动链接:https://weibo.com/1939498534/FydFv4EB1?ref=home&type=comment#_rnd1512444442357 ,12月6日抽取8名幸运用户2017年 FIFA世俱杯门票1张,12月12日抽20名幸运用户赠阿里云T恤1件。
文章
新零售  ·  NoSQL  ·  JavaScript  ·  数据库  ·  Redis
2017-12-04
DS4300 更换控制器电池 (二)
3 实施 3.1 请客户停止DS4300上涉及的业务和数据库等软件 为什么要停止业务,下面举一些例子: 1、             如果数据库在非归档模式,如果意外发生,可能损坏current log,会造成一定量的交易丢失;正常停止数据库会将主机内存中交易数据写入磁盘; 2、             如果主机因为业务要求(如ASM裸盘)或其他情况,没有部署多路径软件,更换动作将造成IO访问路径丢失,对业务系统读写数据造成影响;主动干预优于被动影响; 3、             取下和安装控制器过程中盘阵硬盘双LOOP将变为单LOOP,如果此时有硬盘出现故障的情况,单LOOP环可能中断,影响业务; 4、             微码或软硬件BUG原因; 5、             规定时间内没有完成更换动作; 6、             维护过程中出现其他情况。 3.2 请客户备份业务和盘阵数据 停止业务和备份数据的前后顺序取决于业务类型、数据库模式,比如非归档一定要选择脱机备份,所以请客户选用安全的顺序完成数据备份,因主要的维护动作在盘阵上,所以最好备份数据到其他介质上。 3.3 备份盘阵配置信息    config 保存config,但是不要使用恢复,因为它会初始化logical driver,破坏以后数据   3.4 将现在访问路径在B控上的LUN切换到A控; 如果禁用B控,则B控上LUN自动切换到A控;此动作则不需要; 切换方法: Highlight the logical drive, right-click and select Change → Ownership/Preferred Path. Then select the controller to which you want the logical drive to move. Depending on the current workload, the operation can take a while to finish. 3.5 查看写缓存和控制器之间cache镜像是否被禁用,如果没有,则手动禁用,   禁用后,等待3分钟,等待数据写入;   3.6 禁用B控   确认B控琥珀灯亮 If the preferred controller need to be replaced, you should disable the controller first. This will intentionally cause a failover of LUNs to the other controller and allow the removal and replacement of the preferred controller. This is considered a routine ownership change and is reported with an informational entry in the event log.   3.7 lable cable标B控上线缆,移除线缆 标签纸 3.8 物理拔出控制器,更换电池,插入控制器,连线 需要30分钟内完成,否则可能导致过热; 3.9 启用B控,观察状态 使用下面两种方法检查 v Use the Storage Manager Client GUI to verify that the controller is online (up) and running by selecting the menu option to display the properties of the controller that has just been replaced. If the controller is not up, you will get a controller-connection error window instead of the controller properties window. Wait a minute and retry until you get the properties window. 检查充电情况和盘阵状态; 3.10 enable cache,lun切换回首选路径,查看battery时间,必要的话,清零;     3.11 启动业务,存储状态再次检查确认,业务测试 3.12 保存日志和配置信息 3.13 签字验收、动作结束。 4 实施后工作 归还借用物品,清理现场; 5 参考 其他资料   本文转自 liu99fifa 51CTO博客,原文链接:http://blog.51cto.com/andrewliu/678006,如需转载请自行联系原作者
文章
数据库  ·  安全  ·  缓存  ·  存储
2017-11-27
号称简明实用的Django上手教程
1 几个基本概念   前置条件:假设读者基本Python语言基础,或者具备某种编程语言的基础。你还熟悉web开发环境,懂些css,js,db等。 Django是什么? Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的软件设计模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。 Django的主要目标是使得开发复杂的、数据库驱动的网站变得简单。Django注重组件的重用性和“可插拔性”,敏捷开发和DRY法则(Don't Repeat Yourself)。在Django中Python被普遍使用,甚至包括配置文件和数据模型。 -----维基百科 Django是一个开放源代码的Web应用框架,由Python写成。采用了MVC的框架模式,即模型M,视图V和控制器C。它最初是被开发来用于管理劳伦斯出版集团旗下的一些以新闻内容为主的网站的,即是CMS(内容管理系统)软件。并于2005年7月在BSD许可证下发布。这套框架是以比利时的吉普赛爵士吉他手Django Reinhardt来命名的。 ----百度百科 MTV开发模式? Django是一个基于MVC构造的框架。但是在Django中,控制器接受用户输入的部分由框架自行处理,所以 Django 里更关注的是模型(Model)、模板(Template)和视图(Views),称为 MTV模式。它们各自的职责如下: (1) 模型(Model),即数据存取层 处理与数据相关的所有事务: 如何存取、如何验证有效性、包含哪些行为以及数据之间的关系等。 (2) 视图(View),即表现层 处理与表现相关的决定: 如何在页面或其他类型文档中进行显示。 (3) 模板(Template),即业务逻辑层 存取模型及调取恰当模板的相关逻辑。模型与模板的桥梁。 Django的架构? 让我们一览 Django 全貌: urls.py 网址入口,关联到对应的views.py中的一个函数(或者generic类),访问网址就对应一个函数。 views.py 处理用户发出的请求,从urls.py中对应过来, 通过渲染templates中的网页可以将显示内容,比如登陆后的用户名,用户请求的数据,输出到网页。 models.py 与数据库操作相关,存入或读取数据时用到这个,当然用不到数据库的时候 你可以不使用。 forms.py 表单,用户在浏览器上输入数据提交,对数据的验证工作以及输入框的生成等工作,当然你也可以不使用。 templates 文件夹 views.py 中的函数渲染templates中的Html模板,得到动态内容的网页,当然可以用缓存来提高速度。 admin.py 后台,可以用很少量的代码就拥有一个强大的后台。 settings.py Django 的设置,配置文件,比如 DEBUG 的开关,静态文件的位置等。 上面的py文件不理解也没有关系,后面会详细介绍。一图胜千言,架构全貌工作机制如下所示:   Django大家都在使用的商业网站 Sohu 邮箱  、果壳网  、 豆瓣  、 爱调研 、 易度在线云办公 、 优容网  、 快玩游戏、九九房、贷帮网 、 趣奇网 、知乎、时尚时空 、游嘻板: YxPad webpy、DNSPod 国际版 、下厨房  、 贝太厨房 、 Wopus问答 、 咕咚网 、扇贝网 、站长工具、易度文档管理系统、个人租房、 在线文档查看-易度云查看 、 FIFA310 足球数据分析专家、 搜狐随身看等等。 2 Django配置准备  前置条件:pip、python、sublime、anaconda环境已经安装。 后置条件: pip install django 检查是否安装成功:   xxx数据统计分析(决策)平台 系统环境:WIN10 64bit开发环境:sublime+Anaconda数据库:Mysql 5.6.17语言:python3.5框架:django1.11+Bootstrap可视化工具:Highchart|Echarts|plotly|Bokeh(采用Echarts) 3 Django基础配置安装  1 创建项目,项目决策分析:xmjc_analysis 在E盘根目录下创建xmjc_analysis: django-admin startproject xmjc_analysis 效果: settings.py 项目的设置文件urls.py 总的urls配置文件wsgi.py 部署服务器文件__init__.py python包的目录结构必须的,与调用有关。 2 创建App名为analysis django-admin startapp analysis 效果: 3 新定义的app加到settings.py中的INSTALL_APPS中 4 视图和网址创建第一个页面 (1)我们在analysis这个目录中,把views.py打开,修改其中的源代码: '''第一个页面author:白宁超site:http://www.cnblogs.com/baiboy/''' coding:utf-8 from django.shortcuts import renderfrom django.http import HttpResponsedef index(request): return HttpResponse(u"欢迎进入第一个Django页面!") 第一行是声明编码为utf-8, 因为我们在代码中用到了中文,如果不声明就报错. 第二行引入HttpResponse,它是用来向网页返回内容的,就像Python中的 print 一样,只不过 HttpResponse 是把内容显示到网页上。 我们定义了一个index()函数,第一个参数必须是 request,与网页发来的请求有关,request 变量里面包含get或post的内容。 (2)我们打开 xmjc_analysis/xmjc_analysis/urls.py 这个文件, 修改其中的代码: from django.conf.urls import urlfrom django.contrib import admin from analysis import views as analysis_views urlpatterns = [ url(r'^admin/', admin.site.urls), url(r'^index/$', analysis_views.index,name='index'),# 首页 ] (3)本地运行服务器测试 注意在项目根目录xmjc_analysis运行结果如下: (4)页面传参数,显示欢迎‘admin’字样 修改view.py源码: 通过get方式接受页面参数,当然也可以采用post,结合form实现。效果如下 5 配置简单数据库操作,默认sqlite,咱们指定mysql数据库 (1)在xmjc_analysis/settings.py文件下修改如下: '''配置Mysql数据库2017年7月26日16:40:38白宁超'''DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME': 'test', 'USER': 'test', 'PASSWORD': 'test123', 'HOST':'localhost', 'PORT':'3306', }, } xmjc_analysis/__init__.py下修改: import pymysqlpymysql.install_as_MySQLdb() (2)在analysis/models.py下设计数据库表,采用ORM方式 from django.db import models Create your models here. class User(models.Model): username = models.CharField('用户名', max_length=30) userpass = models.CharField('密码',max_length=30) useremail = models.EmailField('邮箱',max_length=30) usertype = models.CharField('用户类型',max_length=30) def __str__(self): return self.username (3) 在analysis/admin.py中定义显示数据 from django.contrib import adminfrom .models import User class UserAdmin(admin.ModelAdmin): list_display = ('username','userpass','useremail') # 自定义显示字段 admin.site.register(User,UserAdmin) (4)创建更改的文件,将生成的py文件应用到数据库 python manage.py makemigrationspython manage.py migrate (5)创建超级管理员:用户名,test;密码密码:test123456 python manage.py createsuperuser (6)登录后台查看信息 运行服务器:python manage.py runserver   可以看到后台信息,并对数据表进行增删改查操作,但是后台全部英文,可以改为中文显示? 后台管理设置为中文显示,xmjc_analysis/settings.py下修改代码: LANGUAGE_CODE = 'zh-Hans' # 中文显示 再去查看: (7) Django 提供的 QuerySet API,shell玩转MySql 在xmjc_analysis下输入【 python manage.py shell】,然后查询数据表。 创建一条用户信息: User.objects.create(username="李白", userpass="libai123",useremail="libai@163.com",usertype="超级管理员") 后台查看: 其他操作方式: # 方法 1User.objects.create(username="李白", userpass="libai123",useremail="libai@163.com",usertype="超级管理员") 方法 2 twz =User(username="李白", userpass="libai123",useremail="libai@163.com",usertype="超级管理员")twz.save() 获取对象: Person.objects.all() 满足条件查询 User.objects.filter(username="李白") 迭代查询: es = Entry.objects.all()for e in es: print(e.headline) 查询排序: User.objects.all().order_by('username') 链式查询: User.objects.filter(name__contains="WeizhongTu").filter(email="tuweizhong@163.com") 去重查询: qs = qs.distinct() 删除操作: User.objects.all().delete() # 更新操作:Person.objects.filter(name__contains="abc").update(name='xxx') 数据的导出:python manage.py dumpdata [appname] > appname_data.jsonpython manage.py dumpdata blog > blog_dump.json 导出用户数据python manage.py dumpdata auth > auth.json # 导出用户数据 (8)批量向数据表导入数据 将name.txt导入数据库: 数据导入源码: #!/usr/bin/env python coding:utf-8 from django.core import serializersimport jsonimport osos.environ.setdefault("DJANGO_SETTINGS_MODULE", "xmjc_analysis.settings") '''Django 版本大于等于1.7的时候,需要加上下面两句import djangodjango.setup()否则会抛出错误 django.core.exceptions.AppRegistryNotReady: Models aren't loaded yet.''' import djangoimport jsonif django.VERSION >= (1, 7):#自动判断版本 django.setup() def main(): from analysis.models import User f = open('./readme/files/name.txt',encoding='utf-8') for line in f: name,pwd,email,type = line.split('|') User.objects.create(username=name,userpass=pwd,useremail=email,usertype=type) f.close() def jsondb(): from analysis.models import User data = eval(serializers.serialize("json", User.objects.all())) # json userdata = json.dumps(data) print(type(userdata)) if name == "__main__": main() # jsondb() print('插入完毕!') 查看结果:  
文章
JSON  ·  大数据  ·  数据库  ·  数据格式  ·  Python
2017-08-30
ORA-00119错误的解决。
今天在启动服务器上的ORACLE时遇到如下错误:   SQL> startup;   ORA-00119: invalid specification for system parameter LOCAL_LISTENER   ORA-00132: syntax error or unresolved network name ’LISTENER_ORCL’   然后,在网上找了一些资料,解决了此问题。   解决的方式如下(这是网上的一位达人解决方案,我照他的步骤顺利解决,不过决定还是做一个笔记):   第一步:复制一份pfile参数文件(注意:oracle中的pfile指的就是init<sid>.ora文件)   $ ./sqlplus / as sysdba;   SQL> create pfile from spfile=’/u01/oracle/product/10.2.0/db_1/dbs/spfileorcl.ora’;   第二步:修改pfile参数文件(也即修改init<sid>.ora文件)   经过第一步以后,你就会在$ORACLE_HOME/dbs目录下发现有这么一个文件init<sid>.ora,这就是你第一步创建的文件。由于我的oracle实例名为orcl,所以我的pfile文件为initorcl.ora。   用gedit打开,找到local_listener这一行,然后将其值修改为:   (ADDRESS_LIST=(Address=(Protocol=tcp) (Host=your_hostname)(Port=1521)))   其中的your_hostname为你的主机名,其实导致ORA-00119和ORA-00132错误的原因就很可能是你修改了你的hostname,但是我看了一下我的tnsname.ora文件里面的那个LISTENER_ORCL(可能你不是这个名字)和后面修改的your_hostname一致,我做的只是将tnsname.ora文件中的(ADDRESS_LIST=(Address=(Protocol=tcp) (Host=your_hostname)(Port=1521)))复制到pfile文件的“local_listener=”后面,然后就顺利启动了数据库,我也不知道为什么直接用*.local_listener=’LISTENER_ORCL’就找不到,而一定要*.local_listener=’(ADDRESS_LIST=(Address=(Protocol=tcp) (Host=your_hostname)(Port=1521)))’才可以,这个问题以后研究一下。   以下是我的一个修改样例:   修改之前可能是这样   *.local_listener=’LISTENER_ORCL’   修改后的值大概就是这个样子了   *.local_listener=’(ADDRESS_LIST=(Address=(Protocol=tcp) (Host=your_hostname)(Port=1521)))’   然后保存退出   第三步:以pfile创建spfile   使用以下命令创建spfile   SQL> create spfile from pfile=’/u01/oracle/product/10.2.0/db_1/dbs/initorcl.ora’;   第四步:启动数据库   SQL> startup;   ORACLE instance started.   Total System Global Area *** bytes   Fixed Size *** bytes   Variable Size *** bytes   Database Buffers *** bytes   Redo Buffers *** bytes   Database mounted.   Database opened. 本文转自 liu99fifa 51CTO博客,原文链接:http://blog.51cto.com/andrewliu/1731993,如需转载请自行联系原作者
文章
Oracle  ·  网络协议  ·  关系型数据库  ·  数据库
2017-11-27
跳转至:
阿里云视频云
126 人关注 | 149 讨论 | 515 内容
+ 订阅
  • 靠近用户侧和数据,算网融合实现极致协同
  • 聚焦「就近」与「轻计算」,阿里云边缘云连续3年领跑!
  • 借AI之势,打破创意与想象的边界
查看更多 >
数据库
252947 人关注 | 52318 讨论 | 99299 内容
+ 订阅
  • MySQL5.6如何实现全文搜索?具体步骤是怎样的?底层原理是什么?
  • 如何在MySQL中优化表性能?底层原理是什么?
  • 如何在MySQL中优化表性能?
查看更多 >
开发与运维
5786 人关注 | 133444 讨论 | 319611 内容
+ 订阅
  • 什么是PHP设计模式?底层原理是什么?
  • Handler消息传递机制浅析
  • 云记事本在线共享
查看更多 >
云计算
21833 人关注 | 59802 讨论 | 58199 内容
+ 订阅
  • 阿里云5大基础产品——ECS云服务器
  • 利用IBCS虚拟专线和haproxy,构建安全高效的本地数据中心
  • CSS实现单行、多行文本溢出隐藏
查看更多 >
人工智能
2875 人关注 | 12395 讨论 | 102725 内容
+ 订阅
  • MySQL5.6如何实现全文搜索?具体步骤是怎样的?底层原理是什么?
  • pytorch 神经网络设置初始固定参数
  • pytorch如何将多个tensor一维度张量,合并成一个张量
查看更多 >