本文首发于公众号:Hunter后端
原文链接:Redis数据结构三之压缩列表
本篇笔记介绍压缩列表。
在 Redis 3.2 版本之前,压缩列表是列表对象、哈希对象、有序集合对象的的底层实现之一。
因为压缩列表本身结构上的一些缺陷,压缩列表这个结构被替换了,但是压缩列表结构本身有一些可取之处,并且替换它的新结构 listpack 与之很相似,所以我们这里还是介绍一下压缩列表的结构和存储
压缩列表是 Redis 为了节约内存而开发的,由一个连续内存块组成的顺序型数据结构。
它的组成结构如下:
| zlbytes | zltail | zllen | entry1 | entry2 | ... | entryN | zlend |
压缩列表的英文名是 ziplist,所以它的属性都是 zl 开头。
zlbytes
zlbytes 长度为 4 字节,记录整个压缩列表占用的内存字节数
zltail
zltail 长度为 4 字节,记录压缩列表最后一个节点,也就是我们结构示例中的 entryN 到 zlbytes 的地址之间的偏移量。
zllen
zllen 长度为 2 字节,记录的是压缩列表包含的节点数量,也就是结构中的 N。
zlend
zlend 长度为 1 字节,它的值为 0xFF
(十进制 255),用于标记压缩列表的末端。
对于每一个 entry 节点,也就是压缩列表中的元素节点,它的结构示意如下:
| previous_entry_length | encoding | content |
previous_entry_length
previous_entry_length 属性记录的是压缩列表中前一个节点的长度
previous_entry_length 属性本身的长度可以是 1 字节或者 5 字节
如果前一节点的长度小于 254 字节,那么 previous_entry_length 属性的长度为 1 字节,前一个节点的长度保存在这个字节里
如果前一节点的长度大于等于 254 字节,那么 previous_entry_length 属性的长度为 5 字节,第一个字节被设置成 0xFE(也就是 254),之后的四个字节用于前一节点的长度。
通过 previous_entry_length 属性,我们可以通过当前节点的地址和 previous_entry_length 属性,计算出前一个节点的起始地址,压缩列表的从表尾到表头的遍历操作就是使用这个原理一个节点一个节点往前回溯实现的。
encoding
encoding 属性记录了节点的 content 属性所保存数据的类型以及长度。
encoding 的值如果是一字节长,且值的最高位以 11 开头,那么表示是整数编码,表示 content 属性保存着整数值。
encoding 的值为 一字节、两字节、五字节长,且值的最高位为 00、01、10 则表示是字节数组编码
content
content 属性保存的是节点的值,可以是一个字节数组或者整数,值的类型和长度由节点的 encoding 属性决定。
在压缩列表的节点属性中,previous_entry_length 属性的长度是根据前一节点的长度来进行赋值的,如果前一节点的长度小于 254 字节,那么下一节点的 previous_entry_length 属性长度为 1 字节,如果前一节点的长度大于等于 254 字节,那么下一节点的 previous_entry_length 属性为 5 字节。
那么在这种情况下,就存在一种较为极端的情况,那就是压缩列表中每个节点的长度都在 250 - 253 字节之间,这时候,如果在表头插入一个长度大于等于 254 字节的节点,那么相对应的第二个节点的 previous_entry_length 的长度就要从 1 字节变为 4 字节,那么该节点的整体长度就大于等于 254 字节。
依此类推,压缩列表的每一个节点的长度都会产生连锁反应,长度都会逐个变成大于等于 254 字节长度,程序就需要不断地对压缩列表执行空间重分配的操作。
Redis 将这种在特殊情况下产生的连续多次空间扩展操作称为连锁更新。
除了新增节点这种情况,还有一种删除节点也可能造成连锁更新的情况,比如有这么几个节点,big 节点的长度大于等于 254 字节,small 节点长度小于254 字节,e1 到 eN 的节点长度都在 250-253 字节之间。
| zlbytes | zltail | zllen | big | small | entry1 | entry2 | ... | entryN | zlend |
这时候,删除 small 节点,entry1 节点的前节点的长度就会从 250-253 变成大于等于 254,因此 entry1 节点的 previous_entry_length 长度就会变成 5 字节,entry1 整体长度就会大于等于 254 字节,依次之后每个节点都会这样产生连锁更新。
尽管连锁更新的复杂度较高,但它真正造成性能问题的几率是很低的:
首先,压缩列表里要恰好有多个连续的、长度介于 250-253 字节之间的节点,连锁反应才有可能被引发
其次,即使出现连锁更新,但只要被更新的节点数量不多,就不会对性能造成任何影响,比如对只拥有三五个节点的压缩列表进行连锁更新。
压缩列表虽然能节约内存,但仍然存在一些缺点:
如果想获取更多后端相关文章,可扫码关注阅读:
大家好,又见面了,我是你们的朋友全栈君。现在开始打造你的office20071.全自动安装: a)在每个.ww里面有一个名为Config.XML的配置文件来实现的。专业增强版本位于光盘根目录下的ProPlus.ww目录下,企业版则位于Enterprise.WW目录下 b)用记事本打开目录下的Config.xml,我们只需要修改里面的相应行就可以实现免输序列号、自动输入用户名、单位、定制安装组件。 <PIDKEYValue=“有效的安装序列号”/> <USERNAMEValue=”用户名”/> <COMPANYNAMEValue=”公司名”/> 以上内容禁用中文符号 <OptionStateId=“OptionID”State=”absent”Children=“force”/> 我们只要将不需要安装的项目替换其中的“OptionID”即可。如果需要不安装多个项目,则可以分多行来指定,absent就是不安装的意思 <OptionStateId=“OptionID”State=”Local”Children=“
大家好,又见面了,我是你们的朋友全栈君。前言:Eureka已经停止更新了,在新的项目中,不推荐使用,通过对周阳老师视频的学习,本篇文章主要是简单介绍下Eureka,以及如何搭建集群环境的Eureka,让大家对Eureka有个初步的了解。1.什么是EurekaEureka是Netflix开发的,一个基于REST服务的,服务注册与发现的组件, 以实现中间层服务器的负载平衡和故障转移。 它主要包括两个组件:EurekaServer和EurekaClient EurekaClient:一个Java客户端,用于与EurekaServer的交互 EurekaServer:提供服务注册和发现的能力(通常就是微服务中的注册中心)。 服务在Eureka上注册,然后每隔30秒发送心跳来更新它们的租约。如果客户端不 能多次续订租约,那么它将在大约90秒内从服务器注册表中剔除。注册信息和更新被 复制到集群中的所有eureka节点。来自任何区域的客户端都可以查找注册表信息(每 30秒发生一次)来定位它们的服务(可能在任何区域)并进行远程调用。复制2.Eureka集群项目搭建该示例主要包括4个maven项目,1个
✍️作者简介:一个热爱把逻辑思维转变为代码的技术博主?作者主页:【主页——?获取更多优质源码】?web前端期末大作业:【?毕设项目精品实战案例(1000套)】?程序员有趣的告白方式:【?HTML七夕情人节表白网页制作(110套)】?超炫酷的Echarts大屏可视化源码:【?echarts大屏展示大数据平台可视化(150套)】?免费且实用的WEB前端学习指南:【?web前端零基础到高级学习视频教程120G干货分享】?关于作者:?历任研发工程师,技术组长,教学总监;曾于2016年、2020年两度荣获CSDN年度十大博客之星。十载寒冰,难凉热血;多年过去,历经变迁,物是人非。然而,对于技术的探索和追求从未停歇。?坚持原创,热衷分享,初心未改,继往开来!<hr>@TOC<hr>一、??网站题目?校园篮球网页设计、⚽足球体育运动、?体育游泳运动、?兵乓球、?网球、等网站的设计与制作。<hr>二、✍️网站描述?️大学生校园运动静态HTML网页设计作品,采用DIVCSS布局制作,内容包括:校园运动、运动技巧、运动规则、技术规则、经典动作。页面主体内容区域宽度为1
1.引言经过多篇文章的介绍,我们对32位保护模式已经有了很深的认识,尤其是分段机制以及由此带来的对内存的保护。 进军保护模式 保护模式进阶—再回实模式这一切都和32位保护模式全新的内存分段和寻址方式密不可分。 经过上面两篇文章的介绍,全局描述符表GDT的结构和使用已经非常清晰了,本文我们来介绍与他非常类似的局部描述符表—LDT。2.局部描述符表LDT此前,我们已经介绍过局部描述符表。IA-32CPU可以寻址4GB大小的内存,只用一个GDT来进行分段显得粒度过大,LDT则提供了进一步细分内存段的机制。 内存中只能有一个GDT,但却可以存在多个LDT,如上图所示,每个LDT作为GDT中一个描述符描述的内存段。 通常,一个LDT用于划分一个特定任务执行过程中需要使用的内存分段。3.描述符结构LDT描述符与GDT描述符的结构是一模一样的:可以参看: 详解32位保护模式与内存分段机制4.实战LDT那么,接下来我们就来实际写代码操作,使用LDT完成我们的功能。4.1.创建代码段,编写代码我们将原本在GDT中的显示代码独立到一个新的SECTION中。[SECTION.ldtcode] ALIGN32
背景:使用dockerhub官方的mongodb3.6部署了3副本的workload,但是每次重启pod,都会发现原本该pod写入持久卷的数据丢失,经过排查,找到了问题所在。问题复现用户使用如下yaml文件创建了workload1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59apiVersion:apps/v1 kind:StatefulSet metadata: name:mongo namespace:default spec: podManagementPolicy:OrderedReady replicas:3 revisionHistoryLimit:10 selector: matchLabels: k8s-app:mongo serviceName:mongo te
目录1事务1.1事务特性1.2隔离级别1.3实战解释各个级别遇到的问题1.3.1查询当前数据库的隔离级别1.3.2进行测试1.3.2.1演示是否有脏读问题:1.3.2.2演示是否有不能重复读问题:1事务1.1事务特性事务的基本要素(ACID)1、原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节。事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有发生一样。也就是说事务是一个不可分割的整体,就像化学中学过的原子,是物质构成的基本单位。2、一致性(Consistency):事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。3、隔离性(Isolation):同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。4、持久性(Durability):事务完成后,事务对数据库的所有更新将被保存到数据库,不能回滚。1.2隔离级别因为有多个事务,各个事务之间有没有影响呢?所以就有了隔离级别。 而且不同的隔离级
Android更换头像前言正文一、新建项目二、配置项目三、布局、样式改动四、权限请求五、底部弹窗显示六、工具类七、打开相机、相册八、页面返回显示图片九、本地缓存十、后台获取十一、源码总结运行效果图: 前言 做Android应用开发,通常是有很多的功能组成,今天就来看一下这个用户头像更换的功能该怎么去写。相信很多的小伙伴都写过这个功能,因为作为一个APP来说这是很普遍的功能,基本都会有。只要你的APP有用户模块,就会有用户的个人信息的修改,比如常规的手机号码修改、地址修改、头像修改、昵称修改等。这里面技术含量高一点的就是头像修改了,进入正题吧。正文 这里我还是新建一个项目来做这个头像修改的功能,这样对于没有接触过这个功能的朋友更友好,这也是我一直以来的写作风格,不要嫌我啰嗦啊。一、新建项目创建一个名为ChangeAvatarDemo的项目 项目创建好之后,先想清楚你的这个功能需要什么,换头像常规肯定是上传到后台去,那么你肯定是要有网络权限的,其次如果你的网络请求地址是http开头的话,而在Android9.0及以上版本则要配置http访问许可才行,之后你是否会用到一些第三方框架,比
本文实例讲述了Android基于AlarmManager实现用户在线心跳功能。分享给大家供大家参考,具体如下:在做即时通信或者其他检测是否在线等操作时要用到心跳。比较常用的是AlarmManager全局定时器去实现。AlarmManager的使用机制有的称呼为全局定时器,有的称呼为闹钟。其实它的作用和Timer有点相似。都有两种相似的用法:(1)在指定时长后执行某项操作(2)周期性的执行某项操作AlarmManager对象配合Intent使用,可以定时的开启一个Activity,发送一个BroadCast,或者开启一个Service.下面的代码详细的介绍了两种定时方式的使用:(1)在指定时长后执行某项操作//操作:发送一个广播,广播接收后Toast提示定时操作完成Intentintent=newIntent(Main.this,alarmreceiver.class); intent.setAction("short"); PendingIntentsender=PendingIntent.getBroadcast(Main.this,0,intent,0); //
datax数据流转小试牛刀最近在做MySQL向infobright的迁移工作,用的方法是shell脚本的方法。之前听说过有datax的方法也可以做数据流转,今天下班后,就试了试datax的方法,整个过程还是比较顺利的。记录一下。01datax介绍Datax是阿里的一个开源项目,项目地址放在这里:https://github.com/alibaba/DataX它的主要用途是数据流转,是一个易购数据源离线同步工具,所谓的异构,就是指来源不同,晚上有张图画的比较好,截取一下大家看看:它可以将各种来源不同的数据之间进行高效稳定的同步,现在在阿里内部被广泛使用。数据流转的过程也很简单,画成图就是下面这样:其中,Reader:Reader为数据采集模块,负责采集数据源的数据,将数据发送给Framework。Writer:Writer为数据写入模块,负责不断向Framework取数据,并将数据写入到目的端。Framework:Framework用于连接reader和writer,作为两者的数据传输通道,并处理缓冲,流控,并发,数据转换等核心技术问题。目前,datax已经有了全面的插件体系,主流的RD
1、springmvc用到的注解,作用是什么,原理。@Controller注解 是在Spring的org.springframework.stereotype包下,org.springframework.stereotype.Controller注解类型用于指示Spring类的实例是一个控制器,使用@Controller注解的注解注解的控制器可以同时支持处理多个请求动作,使程序开发变的更加灵活。 @Controller用户标记一个类,使用它标记的类就是一个SpringMVCController对象,即:一个控制器类。Spring使用扫描机制查找应用程序中所有基于注解的控制器类,分发处理器会扫描使用了该注解的方法,并检测该方法是否使用了@RequestMapping注解,而使用@RequestMapping注解的方法才是真正处理请求的处理器。为了保证Spring能找到控制器,我们需要完成两件事:1、在SpringMVC的配置文件中的头部引入spring-context; 2、使用元素,该元素的功能是:启动包扫描功能,以便注册带有@Controller、@Service、@reposito
β测试_Beta测试β测试,英文是Betatesting。又称Beta测试,用户验收测试(UAT)。β测试是软件的多个用户在一个或多个用户的实际使用环境下进行的测试。开发者通常不在测试现场,Beta测试不能由程序员或测试员完成。当开发和测试根本完成时所做的测试,而最终的错误和问题需要在最终发行前找到。这种测试一般由最终用户或其他人员员完成,不能由程序员或测试员完成。α测试_Alpha测试α测试,英文是Alphatesting。又称Alpha测试。Alpha测试是由一个用户在开发环境下进行的测试,也可以是公司内部的用户在模拟实际操作环境下进行的受控测试,Alpha测试不能由该系统的程序员或测试员完成。在系统开发接近完成时对应用系统的测试;测试后,仍然会有少量的设计变更。这种测试一般由最终用户或其他人员来完成,不能由程序员或测试员完成。可移植性测试可移植性测试,英文是Portabilitytesting。又称兼容性测试。可移植性测试是指测试软件是否可以被成功移植到指定的硬件或软件平台上。用户界面测试-UI测试用户界面测试,英文是Userinterfacetesting。又称UI测试。用户界
“高层次的抽象”作者:TomaszUrbaszek我们会对在发现应用响应慢的时候做一些优化,但是现实效果都不怎么满意。正如它所显示的,最慢的部分是在我们应用中上传文件的时候。然而是否还有加快上传文件速度的可能呢?在我们着手优化之前先来一个简短的介绍。如果你是正在处于一个商业应用的开发当中,你有可能会遇到关于应用不能及时响应的需求。问题的瓶颈可能是由以下的其中一点造成的:极少的优化代码服务器或客户设备运行慢不好的网络条件第一条,无论是遗留下来的代码,没有优化的数据库查询语句或者在浏览器的JavaScript代码块,都可以相对轻松地跟踪和修复。(轻松的意思是指“我知道这该怎么做”,而不必是“这是小菜一蹀”)。假设你的代码已经很高质量了,但是你的服务器还是无法很好地对所有用户提供服务的时候——这实际上听起来像是一个对你和你的业务相当好的一个信号。你可能会通过更换更强大的服务器来处理所有正在增长的请求。还是说它可能只是一个高度隐藏的潜在问题?那么网络分发内容(CDN)这篇文章可以是你需要的。web应用一般不会因为用户设备而运行慢,因为几乎所有设备都可以运行能够提供相当好体验的浏览器。所有关于因
摘要:为了筛选出最有可能转化的用户,京东DNN实验室结合大数据进行了相关研究。本文以新品手机为例,使用商品相似度和基于分类的手段进行用户群筛选,详解了基于余弦相似度的相似度模型构建和基于SVM的分类预测方法。当电商网站发布一款新产品的时候,怎样找到一群最有可能购买该新品的用户进行营销是一种提高产品销量的重要手段。当然全网营销手段肯定能覆盖所有用户,但这样做一方面浪费资源,增加营销成本;另一方面用户收到过多不感兴趣的信息,会让用户反感,降低用户的体验度。电商数字化营销成为了营销过程中必不可少的手段。为了筛选出最有可能转化的用户,京东DNN实验室结合大数据进行了相关研究。本文以新品手机为例,使用商品相似度和基于分类的手段进行用户群筛选。余弦相似度的筛选方式在实际应用中,我们为了找出相似的文章或者相似新闻,需要用到“余弦相似性”,下面我们举例说明什么是余弦相似性。为了简单起见,我们来看两个简单的句子。句子A:我喜欢吃中餐,不喜欢吃西餐。句子B:我不喜欢吃中餐,也不喜欢吃西餐。我们怎样才能计算A,B句子的相似度呢?基本思路是:如果这两句话的用词越相似,它们的内容就应该越相似。因此,可以从词频入
认识app.jsonapp.json官方给的定义是小程序公共设置在这里面可以配置的东西有官方给的定义微信小程序进行全局配置,决定页面文件的路径、窗口表现、设置网络超时时间、设置多tabbar也就是在iOS中baseViewController、navController、tabbarController的一个结合文件下面剖析一下这个文件:app.json剖析{ "pages":[], "window":{}, "tabBar":{}, "networkTimeout":{}, "debug":true }复制pages存放页面路径类型为Array是唯一一个在app.json必须存在的配置项 接受一个数组,每一项都是字符串,来指定小程序由哪些页面组成。每一项代表对应页面的【路径+文件名】信息,数组的第一项代表小程序的初始页面。小程序中新增/减少页面,都需要对pages数组进行修改。 文件名不需要写文件后缀,因为框架会自动去寻找路径.json,.js,.wxml,.wxss的四个文件进行整合
机器学习和优化问题很多机器学习方法可以归结为优化问题,对于一个参数模型,比如神经网络,用y=f(x;θ)来表示的话,训练模型其实就是下面的参数优化问题:其中L是lossfunction,比如神经网络中分类常用的cross-entropy。CNN学到了什么?特征(Representation)。把原始图像看做一个维度是像素×通道的向量,经过各种复杂的CNN结构,其实只不过成了另一个向量。这个向量所在的空间也许有更好的线性可分性,也许是相似样本的“距离”更近,原始的数据经过变换到了这里之后,就是特征。可视化CNN那么有个问题来了,如何可视化一个CNN结构学到的特征呢?答案有很多,其中一种就是本文的主题:不再通过优化求解网络的参数,而是求解输入图像。优化网络的输入,是相对于“正统”的机器学习优化参数而言的。当一个CNN训练完全后,我们可以固定好参数,把输入作为可训练的量,根据目的给定一个新的目标函数。把这种方法最早用在深度学习里大概是Bengio组在2009年的一个Techreport:《VisualizingHigher-LayerFeaturesofaDeepNetwork》。文章里提出
1.接口描述接口请求域名:iotexplorer.tencentcloudapi.com。 批量解绑子产品 默认接口请求频率限制:20次/秒。 APIExplorer提供了在线调用、签名验证、SDK代码生成和快速检索接口等能力。您可查看每次调用的请求内容和返回结果以及自动生成SDK调用示例。 2.输入参数以下请求参数列表仅列出了接口请求参数和部分公共参数,完整公共参数列表见公共请求参数。 参数名称 必选 类型 描述 Action 是 String 公共参数,本接口取值:UnbindProducts。 Version 是 String 公共参数,本接口取值:2019-04-23。 Region 是 String 公共参数,详见产品支持的地域列表,本接口仅支持其中的:ap-guangzhou,ap-shanghai,ap-shanghai-fsi,eu-frankfurt,na-ashburn。 GatewayProductId 是 String 网关产品ID ProductIds.N 是 ArrayofString 待解绑的子产品ID数组
1先上坐标取到的值: 获取到的坐标部分如下: '北京市':[116.39564503788,39.92998577808], '天津市':[117.21081309155,39.14392990331], '上海市':[121.48789948569,31.249161710015], '重庆市':[106.53063501341,29.544606108886], '合肥市':[117.28269909168,31.866942260687], '芜湖市':[118.38410842323,31.366019787543], '蚌埠市':[117.35707986588,32.929498906698], '淮南市':[117.01863886329,32.642811823748], '马鞍山市':[118.51588184662,31.68852815888], '淮北市':[116.79144742863,33.960023305364], '铜陵市':[117.81942872881,30.940929694666], '安庆市':[117.05873877211,30.
目录 MASAFramework-整体设计思路 MASAFramework-EventBus设计 MASAFramework-MASAFramework-DDD设计(1) MASAFramework-MASAFramework-DDD设计(2) DDD 领域驱动设计是一个有关软件开发的方法论,它提出基于领域开发的开发模式,基于DDD理论,我们可以设计出高质量的软件模型。 它围绕业务概念构建领域模型来控制业务的复杂度,解决软件难以理解和演化的问题。 微服务 微服务是一种架构风格,通过进程间通讯、容错和故障隔离等方式,实现去中心化的服务治理。 DDD与微服务 它们都是高内聚、低耦合,从业务视角分离复杂度,提高响应能力。 高内聚:把相关的业务聚集在一起 低耦合:把关联性较低的拆分为独立的服务 使用DDD搭建微服务我们将获得以下优势: 设计清晰,规范 基于领域模型,有利于领域知识的传递和传承 帮助团队建立良好的沟通 协助系统架构的演进 提高团队的设计能力(面向对象,架构) 设计 领域设计涉及技术与业务,如何让它们协作起来呢? 战略设计(业务) 领域、子域、限界上下文 将领域拆分成子域
CREATETABLEEMP (EMPNOintNOTNULL, ENAMEVARCHAR(10), JOBVARCHAR(9), MGRint, HIREDATEDATETIME, SALint, COMMint, DEPTNOint) INSERTINTOEMPVALUES (7369,'SMITH','CLERK',7902, '12/17/1980',800,NULL,20) INSERTINTOEMPVALUES (7499,'ALLEN','SALESMAN',7698, '2/20/1981',1600,300,30) INSERTINTOEMPVALUES (7521,'WARD','SALESMAN',7698, '2/22/1981',1250,500,30) INSERTINTOEMPVALUES (7566,'JONES','MANAGER',7839, '4/2/1981',2975,NULL,20) INSERTINTOEMPVALUES (7654,'MARTIN','SALESMAN',7698, '9/28/1981',1250,1400,30) I
Oracle创建用户、角色、授权、建表 oracle数据库的权限系统分为系统权限与对象权限。系统权限(databasesystemprivilege)可以让用户执行特定的命令集。例如,createtable权限允许用户创建表,grantanyprivilege权限允许用户授予任何系统权限。对象权限(databaseobjectprivilege)可以让用户能够对各个对象进行某些操作。例如delete权限允许用户删除表或视图的行,select权限允许用户通过select从表、视图、序列(sequences)或快照(snapshots)中查询信息。 每个oracle用户都有一个名字和口令,并拥有一些由其创建的表、视图和其他资源。oracle角色(role)就是一组权限(privilege)(或者是每个用户根据其状态和条件所需的访问类型)。用户可以给角色授予或赋予指定的权限,然后将角色赋给相应的用户。一个用户也可以直接给其他用户授权。 一、创建用户 oracle内部有两个建好的用户:system和sys。用户可直接登录到system用户以创建其他用户,因为system具有创