• 关于 Redis的命令返回值 的搜索结果

问题

Redis 的使用:报错

kun坤 2020-06-06 14:44:27 0 浏览量 回答数 1

问题

有关Redis 通讯协议方面的疑问

落地花开啦 2019-12-01 20:02:27 1051 浏览量 回答数 1

回答

详细解答可以参考官方帮助文档 云数据库 Redis 版兼容 Redis 3.0 版本,支持 Redis 3.0 的 Geo 命令。目前还有小部分暂未开放的命令和受限制的命令。 支持的命令操作 Keys(键) String(字符串) Hash(哈希表) List(列表) Set(集合) SortedSet(有序集合) DEL APPEND HDEL BLPOP SADD ZADD DUMP BITCOUNT HEXISTS BRPOP SCARD ZCARD EXISTS BITOP HGET BRPOPLPUSH SDIFF ZCOUNT EXPIRE BITPOS HGETALL LINDEX SDIFFSTORE ZINCRBY EXPIREAT DECR HINCRBY LINSERT SINTER ZRANGE MOVE DECRBY HINCRBYFLOAT LLEN SINTERSTORE ZRANGEBYSCORE PERSIST GET HKEYS LPOP SISMEMBER ZRANK PEXPIRE GETBIT HLEN LPUSH SMEMBERS ZREM PEXPTREAT GETRANGE HMGET LPUSHX SMOVE ZREMRANGEBYRANK PTTL GETSET HMSET LRANGE SPOP ZREMRANGEBYSCORE RANDOMKEY INCR HSET LREM SRANDMEMBER ZREVRANGE RENAME INCRBY HSETNX LSET SREM ZREVRANGEBYSCORE RENAMENX INCRBYFLOAT HVALS LTRIM SUNION ZREVRANK RESTORE MGET HSCAN RPOP SUNIONSTORE ZSCORE SORT MSET RPOPLPUSH SSCAN ZUNIONSTORE TTL MSETNX RPUSH ZINTERSTORE TYPE PSETEX RPUSHX ZSCAN SCAN SET ZRANGEBYLEX OBJECT SETBIT ZLEXCOUNT SETEX ZREMRANGEBYLEX SETNX SETRANGE STRLEN 以及 HyperLogLog Pub/Sub(发布/订阅) Transaction(事务) Connection(连接) Server(服务器) Scripting(脚本) Geo(地理位置) PFADD PSUBSCRIBE DISCARD AUTH FLUSHALL EVAL GEOADD PFCOUNT PUBLISH EXEC ECHO FLUSHDB EVALSHA GEOHASH PFMERGE PUBSUB MULTI PING DBSIZE SCRIPT EXISTS GEOPOS PUNSUBSCRIBE UNWATCH QUIT TIME SCRIPT FLUSH GEODIST SUBSCRIBE WATCH SELECT INFO SCRIPT KILL GEORADIUS UNSUBSCRIBE KEYS SCRIPT LOAD GEORADIUSBYMEMBER CLIENT KILL CLIENT LIST CLIENT GETNAME CLIENT SETNAME CONFIG GET MONITOR SLOWLOG 说明 集群实例下,client list 命令列出所有连接到该 proxy 的 user connection。其中,id、age、idle、addr、fd、name、db、multi、omem、cmd 字段和redis内核表达的意思一样。sub、psub 在 proxy 层没有区分,要么都为1,要么都为0。qbuf、qbuf-free、obl、oll 字段目前没有意义。 集群实例下,client kill 命令目前支持两种形式:client kill ip:port和client kill addr ip:port。 暂未开放的命令 Keys(键) Server(服务器) MIGRATE BGREWRITEAOF BGSAVE CONFIG REWRITE CONFIG SET CONFIG RESETSTAT COMMAND COMMAND COUNT COMMAND GETKEYS COMMAND INFO DEBUG OBJECT DEBUG SEGFAULT LASTSAVE ROLE SAVE SHUTDOWN SLAVEOF SYNC 集群实例受限制的命令 Keys Strings Lists HyperLogLog Transaction Scripting RENAME MSETNX RPOPLPUSH PFMERGE DISCARD EVAL RENAMENX BRPOP PFCOUNT EXEC EVALSHA SORT BLPOP MULTI SCRIPT EXISTS BRPOPLPUSH UNWATCH SCRIPT FLUSH WATCH SCRIPT KILL SCRIPT LOAD 说明 集群实例受限命令只支持所操作 key 均分布在单个 hash slot 中的场景,没有实现多个 hash slot 数据的合并功能,因此需要用 hash tag 的方式确保要操作的 key 均分布在一个 hash slot 中。 比如有 key1,aakey,abkey3,那么我们在存储的时候需要用 {key}1,aa{key},ab{key}3 的方式存储,这样调用受限命令时才能生效。具体关于 hash tag 的用法请参见 Redis 官方文档:http://redis.io/topics/cluster-spec。 事务之前没有使用 watch 命令且事务中都是单 key 的命令场景,不再要求所有 key 必须在同一个 slot 中,使用方式和直连 redis 完全一致。其他场景要求事务中所有命令的所有 key 必须在同一个 slot 中。 多 key 命令包括:DEL、SORT、MGET、MSET、BITOP、EXISTS、MSETNX、RENAME、 RENAMENX、BLPOP、BRPOP、RPOPLPUSH、BRPOPLPUSH、SMOVE、SUNION、SINTER、SDIFF、SUNIONSTORE、SINTERSTORE、SDIFFSTORE、ZUNIONSTORE、ZINTERSTORE、 PFMERGE、PFCOUNT。 不允许在事务中使用的命令包括:WATCH、UNWATCH、RANDOMKEY、KEYS、SUBSCRIBE、 UNSUBSCRIBE、PSUBSCRIBE、PUNSUBSCRIBE、PUBLISH、PUBSUB、SCRIPT、EVAL、 EVALSHA、SCAN、ISCAN、DBSIZE、ADMINAUTH、AUTH、PING、ECHO、FLUSHDB、 FLUSHALL、MONITOR、IMONITOR、RIMONITOR、INFO、IINFO、RIINFO、CONFIG、 SLOWLOG、TIME、CLIENT。 Lua使用限制 Lua 脚本放开限制,标准版-双节点、标准版-单节点支持用户直接调用。 集群版本条件性支持: 所有key都应该由 KEYS 数组来传递,redis.call/pcall 中调用的redis命令,key的位置必须是KEYS array(不能使用Lua变量替换KEYS),否则直接返回错误信息,"-ERR bad lua script for redis cluster, all the keys that the script uses should be passed using the KEYS array\r\n"。 所有key必须在1个slot上,否则返回错误信息,"-ERR eval/evalsha command keys must be in same slot\r\n"。 调用必须要带有key,否则直接返回错误信息, "-ERR for redis cluster, eval/evalsha number of keys can't be negative or zero\r\n"。 自研的集群实例命令 info key 命令:查询 key 所属的 slot 和 db。Redis 原生的 info 命令中最多可以带一个可选的 section (info [section])。目前云数据库 Redis 版的集群实例,部分命令限制所有 key 必须在同一个 slot 中,info key 命令方便用户查询某些 key 是否在同一个 slot 或 db 节点中。用法如下: 127.0.0.1:6379> info key test_key slot:15118 node_index:0 注意 线上旧版本可能出现 info key 显示出来的 node index 和实例拓扑图的 node index 不一致,最新版本已经修复。 info key 显示的 node 是指集群规格下后端的物理节点,和 select 命令中的 db 不是同一个概念。 iinfo 命令:用法类似于 info,用于在指定的 Redis 节点上执行 info 命令。用法如下: iinfo db_idx [section] 其中,db_idx 的范围是[0, nodecount],nodecount 可以通过 info 命令获取,section 为 info 官方一致的值。要了解某个 Redis 节点的 info 可以使用 iinfo 命令或者从控制台上查看实例拓扑图,详情请参见 如何查看 Redis 集群子实例内存。 riinfo 命令:和 iinfo 命令类似,但只能在读写分离的模式下使用。用法中增加了一个 readonly slave 的 idx,用于指定在第几个 readonly slave 上执行 info 命令。在读写分离集群中可以用来在指定 readonly slave 上执行 info 命令。如果在非读写分离集群中使用,会返回错误。用法如下: riinfo db_idx ro_slave_idx [section] iscan 命令:在集群模式下可以在指定的 db 节点上执行 scan 命令。在 scan 命令的基础上扩展了一个参数用于指定 db_idx, db_idx 的范围是[0, nodecount],nodecount 可以通过 info 命令获取或者从控制台上查看实例拓扑图。用法如下: iscan db_idx cursor [MATCH pattern] [COUNT count] imonitor 命令:和 iinfo, iscan 类似,在 monitor 的基础上新增一个参数指定 monitor 执行的 db_idx,db_idx 的范围是[0, nodecount), nodecount 可以通过 info 命令获取或者从控制台上查看实例拓扑图。用法如下: imonitor db_idx rimonitor 命令:和 riinfo 类似,用于读写分离场景下,在指定的 shard 里的指定只读从库上执行 monitor 命令。用法如下: rimonitor db_idx ro_slave_idx 说明 关于 Redis 命令的详细信息,请参见 官方文档。 云数据库 Redis 版集群实例最新的命令支持详情,请参见 云栖社区说明。

2019-12-01 23:09:35 0 浏览量 回答数 0

新用户福利专场,云服务器ECS低至96.9元/年

新用户福利专场,云服务器ECS低至96.9元/年

回答

我们将这两个范围的起始位置存在Redis的Sorted Sets数据结构中,基本范围起始值作为score,范围名加start和end为其value值:这样数据在插入Sorted Sets后,相当于是将这些起始位置按顺序排列好了。现在我需要查找15这个值在哪一个范围中,只需要进行如下的zrangbyscore查找:`redis 127.0.0.1:6379> zrangebyscore ranges (15 +inf LIMIT 0 11) "A_end"`这个命令的意思是在Sorted Sets中查找大于15的第一个值。(+inf在Redis中表示正无穷大,15前面的括号表示>15而非>=15)查找的结果是A_end,由于所有值是按顺序排列的,所以可以判定15是在A_start到A_end区间上,也就是说15是在A这个范围里。至此大功告成。当然,如果你查找到的是一个start,比如咱们用25,执行下面的命令`redis 127.0.0.1:6379> zrangebyscore ranges (25 +inf LIMIT 0 11) "B_start"`返回结果表明其下一个节点是一个start节点,也就是说25这个值不处在任何start和end之间,不属于任何范围。

落地花开啦 2019-12-02 01:48:40 0 浏览量 回答数 0

问题

Redis 4.0、codis 、云数据库 Redis 版集群对比分析

云栖大讲堂 2019-12-01 21:20:41 1050 浏览量 回答数 0

回答

你说的问题的确存在,你这里涉及到的问题其实就是普遍的读-改-写,redis可以保证每个操作的原子性,但是无法保证多个操作的原子性,解决的方法可以使用redis提供的multi和watch命令,具体使用如下:1.watch住你想要读取的key2.multi开启事务3.读取key的内容4.修改value内容5.更新key内容6.exec提交事务,如果在2-6之间发生key的value发生了变化,那么会报错。以上所说只是redis能够提供的最大的原子性操作,但是对于你的问题是没有任何帮助的,因为在事务中执行的命令只有等到事务提交之后才能获取返回值,但是你的更改需要基于前一步的结果进行操作,那么事务不提交你也就无法获取到原来的内容,所以无法更新。解决办法是把json格式字符串使用redis的hash结构进行保存,更新的时候直接更新hash下的一个key即可,这样也就不会出现并发了,但是如果你还是需要基于原始的值进行判断然后再修改,那么问题还是跟上面说的一样,没有任何变化。

爵霸 2019-12-02 01:57:49 0 浏览量 回答数 0

问题

WP 使用走 Unix Sockets 的 Redis 作为对象缓存

妙正灰 2019-12-01 22:03:24 6116 浏览量 回答数 1

问题

安装并设置以 Unix Socket 运行的 Redis-Server

妙正灰 2019-12-01 20:54:01 5129 浏览量 回答数 1

回答

在Redis的事务中,WATCH命令可用于提供CAS(check-and-set)功能。假设我们通过WATCH命令在事务执行之前监控了多个Keys,倘若在WATCH之后有任何Key的值发生了变化,EXEC命令执行的事务都将被放弃,同时返回Null multi-bulk应答以通知调用者事务  执行失败。例如,我们再次假设Redis中并未提供incr命令来完成键值的原子性递增,如果要实现该功能,我们只能自行编写相应的代码。其伪码如下:   val = GET mykey   val = val + 1   SET mykey $val   以上代码只有在单连接的情况下才可以保证执行结果是正确的,因为如果在同一时刻有多个客户端在同时执行该段代码,那么就会出现多线程程序中经常出现的一种错误场景--竞态争用(race condition)。比如,客户端A和B都在同一时刻读取了mykey的原有值,假设该值为10,此后两个客户端又均将该值加一后set回Redis服务器,这样就会导致mykey的结果为11,而不是我们认为的12。为了解决类似的问题,我们需要借助WATCH命令的帮助,见如下代码:   WATCH mykey   val = GET mykey   val = val + 1   MULTI   SET mykey $val   EXEC   和此前代码不同的是,新代码在获取mykey的值之前先通过WATCH命令监控了该键,此后又将set命令包围在事务中,这样就可以有效的保证每个连接在执行EXEC之前,如果当前连接获取的mykey的值被其它连接的客户端修改,那么当前连接的EXEC命令将执行失败。这样调用者在判断返回值后就可以获悉val是否被重新设置成功。

不语奈何 2020-01-09 19:48:39 0 浏览量 回答数 0

回答

有必要; Redis事务使用总结: Redis的事务机制允许同时执行多条指令,它是原子性操作,事务中的命令要么全部执行,要么全部不执行,另外,事务中的所有指令都会被序列化,而且其开始执行过程中,不回被即时过来的指令所打断,其需要经历三个过程,分别为开始事务、命令入队以及执行事务。 ·     相关命令 ·     如何使用 ·     脚本事务 ·     遇到问题 ·     例子演示 一、相关命令 1、MULTI 该命令用来开启事务,它总是返回ok结果,当其执行之后,客户端可以继续发送任意条数量的指令,这些指令不会立即被执行,而是被放到了队列中,直到EXEC被调用之后,所有命令才会被序列化执行。 2、EXEC 该命令负责触发并执行队列中所有的命令。 NOTE: 如果MULTI开启之后,因为某些原因没有成功执行EXEC,那么事务中所有的命令都不会被执行的。 3、DISCARD 该命令用来刷新事务中所有排队等待执行的指令,它总是返回ok结果,并且将服务连接状态恢复到正常。如果已经使用WATCH,那么其会将释放所有被WATCH的key。 4、WATCH 标记所有指定的key被监控起来,使其在事务中有条件的执行(乐观锁)。 NOTE: A、WATCH使得EXEC命令需要有条件的执行,也就是事务只能在所有被监视的键没有被修改的前提下才能执行。另外,在EXEC被执行之后,所有的WATCH都会被取消。 B、UNWATCH手动取消对所有键的WATCH,如果执行了EXEC或者DISCARD,则不需要手动执行UNWATCH命令。 二、如何使用 Redis原生使用(Redis-cli): 127.0.0.1:6379> multi     // 事务开始的动作标志下面即为入队 OK 127.0.0.1:6379> set book-name "Thinking in Java" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "java" "Programming""Thinking" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> exec     // 执行事务 1) OK 2) "Thinking in Java" 3) (integer) 3 4) 1) "Thinking" 2) "Programming" 3) "java" 127.0.0.1:6379> discard  // 事务已执行完毕 已经自动取消 (error) ERR DISCARD without MULTI 127.0.0.1:6379> multi OK 127.0.0.1:6379> set book-name "Patterns in Java" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "Java" "Thinking""Programming" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> discard  // 事务未执行 可以刷新队列指令状态 取消执行 OK 127.0.0.1:6379> exec     // 事务已经被取消不能再执行 (error) ERR EXEC without MULTI 三、脚本事务 Redis 2.6开始支持了脚本,而该脚本本身就是一种事务机制,所以任何在事务里可以完成的事,在脚本里面也能完成,并且使用脚本更简单些,并且速度也更快。不过因为事务提供了一种即使不使用脚本,也可以避免竞争条件的方法,并且事务本身的实现并不复杂,所以现在的使用也比较多,但不排除日后可能被替代或是占据主要地位的可能。 NOTE: Redis为什么引入两种处理事务的方式?脚本功能是 Redis 2.6 才引入的,而事务功能则在更早之前就存在,所以 Redis 才会同时存在两种处理事务的方法。另外,事务脚本会在后续文章中总结介绍。 四、遇到问题 1、乐观锁实现 举个例子,假设我们需要原子性为某个键加1操作(假设INCR不存在),那么应该是这样的执行语句: SET mykey 1 val = GET mykey val = val + 1 SET mykey ${val} 单个客户端访问操作没有任何问题,如果是多个客户端同时访问mykey,就会产生资源共享访问问题,比如:现在有个两个客户端访问同一个键mykey,那么mykey的可能是2,但是我们期望的值应该是3才对,这个类似于高并发下的sync锁机制,所以我们需要使用WATCH来监控被共享的键mykey,如下: WATCH mykey(可监控多个键) val = GET mykey val = val + 1 MULTI SET mykey ${val} EXEC NOTE: 虽然大多情况下,多个客户端访问操作同一个键的情况很少或没有,但是不能排除这个特殊情况,所以建议在有可能产生键共享的指令中使用WATCH在EXEC执行前对其监管。 2、Redis不支持回滚(Roll Back) Redis的事务不支持回滚,这点不同于关系数据库中的事务,所以它的内部保持了简单且快速的特点。另外,Redis不支持回滚是这样考虑的:Redis事务中命令之所以会失败,是由于错误的编程所造成,通过事务回滚是不能回避这个根本问题。 NOTE: Redis事务中命令执行失败,仍会继续执行后面的执行,在没有特殊干预前提下,直到执行完队列中所有指令为止。 3、使用事务可能遇到的问题 A、事务在执行 EXEC 之前,入队的命令可能会出错,举个例子:命令可能会产生语法错误(参数数量错误,参数名错误等),或者其他更严重的错误,比如内存不足(如果服务器使用maxmemory 设置了最大内存限制的话)。 B、事务在执行 EXEC 之前,举个例子:事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面等。 对于发生在 EXEC 执行之前的错误,客户端以前的做法是检查命令入队所得的返回值:如果命令入队时返回QUEUED ,那么入队成功;否则,就是入队失败。如果有命令在入队时失败,那么大部分客户端都会停止并取消这个事务。 从 Redis 2.6.5 开始,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务。 在 Redis 2.6.5 以前, Redis 只执行事务中那些入队成功的命令,而忽略那些入队失败的命令。而新的处理方式则使得在管道技术中包含事务变得简单,因为发送事务和读取事务的回复都只需要和服务器进行一次通讯即可。 至于那些在 EXEC 命令执行之后所产生的错误,并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。 五、例子演示 <?php $redis = new \Redis(); $redis->connect('127.0.0.1',6379); $result = array(); // 开启事务 $redis->multi(); // 添加指令到队列 $redis->set('book-name','Thinking in PHP!'); $redis->sAdd('tags','PHP','Programming','Thinking'); $bookname = $redis->get('book-name'); $tags = $redis->sMembers('tags'); // 执行事务 $redis->exec(); // 显示结果 echo '书名:'.$bookname.' 标签:'.$tags; ?> 结果:   答案来源于网络

养狐狸的猫 2019-12-02 02:14:26 0 浏览量 回答数 0

回答

redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定, redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定,而且没有在实际的一些大型系统应用的实例。此外,缺乏mc中批量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。 性能测试结果: SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下: Linux 2.6, Xeon X3320 2.5Ghz. stackoverflow 网站使用 Redis 做为缓存服务器。 安装过程: Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。 Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。 一、下载最新版 wget http://redis.googlecode.com/files/redis-2.0.0-rc4.tar.gz 二、解压缩 tar redis-2.0.0-rc4.tar.gz 三、安装C/C++的编译组件(非必须) apt-get install build-essential 四、编译 cd redis-2.0.0-rc4 make make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下: redis-server:Redis服务器的daemon启动程序 redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作 redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能 redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况 在后面会有这几个命令的说明,当然是从网上抄的。。。 五、修改配置文件 /etc/sysctl.conf 添加 vm.overcommit_memory=1 刷新配置使之生效 sysctl vm.overcommit_memory=1 补充介绍: **如果内存情况比较紧张的话,需要设定内核参数: echo 1 > /proc/sys/vm/overcommit_memory 内核参数说明如下: overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 **编辑redis.conf配置文件(/etc/redis.conf),按需求做出适当调整,比如: daemonize yes #转为守护进程,否则启动时会每隔5秒输出一行监控信息 save 60 1000 #减小改变次数,其实这个可以根据情况进行指定 maxmemory 256000000 #分配256M内存 在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运 行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是我们上面第二个cp操作的redis.conf文件,目前 它被我们拷贝到了/usr/local/redis/etc/目录下。修改它就可以配置我们的server了。如何修改?下面是redis.conf的主 要配置参数的意义: daemonize:是否以后台daemon方式运行 pidfile:pid文件位置 port:监听的端口号 timeout:请求超时时间 loglevel:log信息级别 logfile:log文件位置 databases:开启数据库的数量 save * :保存快照的频率,第一个表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。 rdbcompression:是否使用压缩 dbfilename:数据快照文件名(只是文件名,不包括目录) dir:数据快照的保存目录(这个是目录) appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。 appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步) 下面是一个略做修改后的配置文件内容: daemonize yes pidfile /usr/local/redis/var/redis.pid port 6379 timeout 300 loglevel debug logfile /usr/local/redis/var/redis.log databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes dbfilename dump.rdb dir /usr/local/redis/var/ appendonly no appendfsync always glueoutputbuf yes shareobjects no shareobjectspoolsize 1024 将上面内容写为redis.conf并保存到/usr/local/redis/etc/目录下 然后在命令行执行: 1 /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 即可在后台启动redis服务,这时你通过 1 telnet 127.0.0.1 6379 即可连接到你的redis服务。 六、启动服务并验证 启动服务器 ./redis-server 或 $redis-server /etc/redis.conf 查看是否成功启动 $ ps -ef | grep redis 或 ./redis-cli ping PONG 七、启动命令行客户端赋值取值 redis-cli set mykey somevalue ./redis-cli get mykey 八、关闭服务 $ redis-cli shutdown #关闭指定端口的redis-server $redis-cli -p 6380 shutdown 九、客户端也可以使用telnet形式连接。 [root@dbcache conf]# telnet 127.0.0.1 6379 Trying 127.0.0.1... Connected to dbcache (127.0.0.1). Escape character is '^]'. set foo 3 bar +OK get foo $3 bar ^] telnet> quit Connection closed. 答案来源于网络

养狐狸的猫 2019-12-02 02:17:01 0 浏览量 回答数 0

回答

redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定, redis 是一个高性能的key-value数据库。 redis的出现,很大程度补偿了memcached这类keyvalue存储的不足,在部 分场合可以对关系数据库起到很好的补充作用。它提供了Python,Ruby,Erlang,PHP客户端,使用很方便。问题是这个项目还很新,可能还不足够稳定,而且没有在实际的一些大型系统应用的实例。此外,缺乏mc中批量get也是比较大的问题,始终批量获取跟多次获取的网络开销是不一样的。 性能测试结果: SET操作每秒钟 110000 次,GET操作每秒钟 81000 次,服务器配置如下: Linux 2.6, Xeon X3320 2.5Ghz. stackoverflow 网站使用 Redis 做为缓存服务器。 安装过程: Redis是一种高级key-value数据库。它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富。有字符串,链表,集 合和有序集合。支持在服务器端计算集合的并,交和补集(difference)等,还支持多种排序功能。所以Redis也可以被看成是一个数据结构服务 器。 Redis的所有数据都是保存在内存中,然后不定期的通过异步方式保存到磁盘上(这称为“半持久化模式”);也可以把每一次数据变化都写入到一个append only file(aof)里面(这称为“全持久化模式”)。 一、下载最新版 wget http://redis.googlecode.com/files/redis-2.0.0-rc4.tar.gz 二、解压缩 tar redis-2.0.0-rc4.tar.gz 三、安装C/C++的编译组件(非必须) apt-get install build-essential 四、编译 cd redis-2.0.0-rc4 make make命令执行完成后,会在当前目录下生成本个可执行文件,分别是redis-server、redis-cli、redis-benchmark、redis-stat,它们的作用如下: redis-server:Redis服务器的daemon启动程序 redis-cli:Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作 redis-benchmark:Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能 redis-stat:Redis状态检测工具,可以检测Redis当前状态参数及延迟状况 在后面会有这几个命令的说明,当然是从网上抄的。。。 五、修改配置文件 /etc/sysctl.conf 添加 vm.overcommit_memory=1 刷新配置使之生效 sysctl vm.overcommit_memory=1 补充介绍: **如果内存情况比较紧张的话,需要设定内核参数: echo 1 > /proc/sys/vm/overcommit_memory 内核参数说明如下: overcommit_memory文件指定了内核针对内存分配的策略,其值可以是0、1、2。 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存 **编辑redis.conf配置文件(/etc/redis.conf),按需求做出适当调整,比如: daemonize yes #转为守护进程,否则启动时会每隔5秒输出一行监控信息 save 60 1000 #减小改变次数,其实这个可以根据情况进行指定 maxmemory 256000000 #分配256M内存 在我们成功安装Redis后,我们直接执行redis-server即可运行Redis,此时它是按照默认配置来运行的(默认配置甚至不是后台运 行)。我们希望Redis按我们的要求运行,则我们需要修改配置文件,Redis的配置文件就是我们上面第二个cp操作的redis.conf文件,目前 它被我们拷贝到了/usr/local/redis/etc/目录下。修改它就可以配置我们的server了。如何修改?下面是redis.conf的主 要配置参数的意义: daemonize:是否以后台daemon方式运行 pidfile:pid文件位置 port:监听的端口号 timeout:请求超时时间 loglevel:log信息级别 logfile:log文件位置 databases:开启数据库的数量 save * *:保存快照的频率,第一个*表示多长时间,第三个*表示执行多少次写操作。在一定时间内执行一定数量的写操作时,自动保存快照。可设置多个条件。 rdbcompression:是否使用压缩 dbfilename:数据快照文件名(只是文件名,不包括目录) dir:数据快照的保存目录(这个是目录) appendonly:是否开启appendonlylog,开启的话每次写操作会记一条log,这会提高数据抗风险能力,但影响效率。 appendfsync:appendonlylog如何同步到磁盘(三个选项,分别是每次写都强制调用fsync、每秒启用一次fsync、不调用fsync等待系统自己同步) 下面是一个略做修改后的配置文件内容: daemonize yes pidfile /usr/local/redis/var/redis.pid port 6379 timeout 300 loglevel debug logfile /usr/local/redis/var/redis.log databases 16 save 900 1 save 300 10 save 60 10000 rdbcompression yes dbfilename dump.rdb dir /usr/local/redis/var/ appendonly no appendfsync always glueoutputbuf yes shareobjects no shareobjectspoolsize 1024 将上面内容写为redis.conf并保存到/usr/local/redis/etc/目录下 然后在命令行执行: 1 /usr/local/redis/bin/redis-server /usr/local/redis/etc/redis.conf 即可在后台启动redis服务,这时你通过 1 telnet 127.0.0.1 6379 即可连接到你的redis服务。 六、启动服务并验证 启动服务器 ./redis-server 或 $redis-server /etc/redis.conf 查看是否成功启动 $ ps -ef | grep redis 或 ./redis-cli ping PONG 七、启动命令行客户端赋值取值 redis-cli set mykey somevalue ./redis-cli get mykey 八、关闭服务 $ redis-cli shutdown #关闭指定端口的redis-server $redis-cli -p 6380 shutdown 九、客户端也可以使用telnet形式连接。 [root@dbcache conf]# telnet 127.0.0.1 6379 Trying 127.0.0.1... Connected to dbcache (127.0.0.1). Escape character is '^]'. set foo 3 bar +OK get foo $3 bar ^] telnet> quit Connection closed. “答案来源于网络,供您参考” 希望以上信息可以帮到您!

牧明 2019-12-02 02:15:43 0 浏览量 回答数 0

回答

有必要; Redis事务使用总结: Redis的事务机制允许同时执行多条指令,它是原子性操作,事务中的命令要么全部执行,要么全部不执行,另外,事务中的所有指令都会被序列化,而且其开始执行过程中,不回被即时过来的指令所打断,其需要经历三个过程,分别为开始事务、命令入队以及执行事务。 · 相关命令 · 如何使用 · 脚本事务 · 遇到问题 · 例子演示 一、相关命令 1、MULTI 该命令用来开启事务,它总是返回ok结果,当其执行之后,客户端可以继续发送任意条数量的指令,这些指令不会立即被执行,而是被放到了队列中,直到EXEC被调用之后,所有命令才会被序列化执行。 2、EXEC 该命令负责触发并执行队列中所有的命令。 NOTE: 如果MULTI开启之后,因为某些原因没有成功执行EXEC,那么事务中所有的命令都不会被执行的。 3、DISCARD 该命令用来刷新事务中所有排队等待执行的指令,它总是返回ok结果,并且将服务连接状态恢复到正常。如果已经使用WATCH,那么其会将释放所有被WATCH的key。 4、WATCH 标记所有指定的key被监控起来,使其在事务中有条件的执行(乐观锁)。 NOTE: A、WATCH使得EXEC命令需要有条件的执行,也就是事务只能在所有被监视的键没有被修改的前提下才能执行。另外,在EXEC被执行之后,所有的WATCH都会被取消。 B、UNWATCH手动取消对所有键的WATCH,如果执行了EXEC或者DISCARD,则不需要手动执行UNWATCH命令。 二、如何使用 Redis原生使用(Redis-cli): 127.0.0.1:6379> multi // 事务开始的动作标志下面即为入队 OK 127.0.0.1:6379> set book-name "Thinking in Java" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "java" "Programming""Thinking" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> exec // 执行事务 1) OK 2) "Thinking in Java" 3) (integer) 3 4) 1) "Thinking" 2) "Programming" 3) "java" 127.0.0.1:6379> discard // 事务已执行完毕 已经自动取消 (error) ERR DISCARD without MULTI 127.0.0.1:6379> multi OK 127.0.0.1:6379> set book-name "Patterns in Java" QUEUED 127.0.0.1:6379> get book-name QUEUED 127.0.0.1:6379> sadd tag "Java" "Thinking""Programming" QUEUED 127.0.0.1:6379> smembers tag QUEUED 127.0.0.1:6379> discard // 事务未执行 可以刷新队列指令状态 取消执行 OK 127.0.0.1:6379> exec // 事务已经被取消不能再执行 (error) ERR EXEC without MULTI 三、脚本事务 Redis 2.6开始支持了脚本,而该脚本本身就是一种事务机制,所以任何在事务里可以完成的事,在脚本里面也能完成,并且使用脚本更简单些,并且速度也更快。不过因为事务提供了一种即使不使用脚本,也可以避免竞争条件的方法,并且事务本身的实现并不复杂,所以现在的使用也比较多,但不排除日后可能被替代或是占据主要地位的可能。 NOTE: Redis为什么引入两种处理事务的方式?脚本功能是 Redis 2.6 才引入的,而事务功能则在更早之前就存在,所以 Redis 才会同时存在两种处理事务的方法。另外,事务脚本会在后续文章中总结介绍。 四、遇到问题 1、乐观锁实现 举个例子,假设我们需要原子性为某个键加1操作(假设INCR不存在),那么应该是这样的执行语句: SET mykey 1 val = GET mykey val = val + 1 SET mykey ${val} 单个客户端访问操作没有任何问题,如果是多个客户端同时访问mykey,就会产生资源共享访问问题,比如:现在有个两个客户端访问同一个键mykey,那么mykey的可能是2,但是我们期望的值应该是3才对,这个类似于高并发下的sync锁机制,所以我们需要使用WATCH来监控被共享的键mykey,如下: WATCH mykey(可监控多个键) val = GET mykey val = val + 1 MULTI SET mykey ${val} EXEC NOTE: 虽然大多情况下,多个客户端访问操作同一个键的情况很少或没有,但是不能排除这个特殊情况,所以建议在有可能产生键共享的指令中使用WATCH在EXEC执行前对其监管。 2、Redis不支持回滚(Roll Back) Redis的事务不支持回滚,这点不同于关系数据库中的事务,所以它的内部保持了简单且快速的特点。另外,Redis不支持回滚是这样考虑的:Redis事务中命令之所以会失败,是由于错误的编程所造成,通过事务回滚是不能回避这个根本问题。 NOTE: Redis事务中命令执行失败,仍会继续执行后面的执行,在没有特殊干预前提下,直到执行完队列中所有指令为止。 3、使用事务可能遇到的问题 A、事务在执行 EXEC 之前,入队的命令可能会出错,举个例子:命令可能会产生语法错误(参数数量错误,参数名错误等),或者其他更严重的错误,比如内存不足(如果服务器使用maxmemory 设置了最大内存限制的话)。 B、事务在执行 EXEC 之前,举个例子:事务中的命令可能处理了错误类型的键,比如将列表命令用在了字符串键上面等。 对于发生在 EXEC 执行之前的错误,客户端以前的做法是检查命令入队所得的返回值:如果命令入队时返回QUEUED ,那么入队成功;否则,就是入队失败。如果有命令在入队时失败,那么大部分客户端都会停止并取消这个事务。 从 Redis 2.6.5 开始,服务器会对命令入队失败的情况进行记录,并在客户端调用 EXEC 命令时,拒绝执行并自动放弃这个事务。 在 Redis 2.6.5 以前, Redis 只执行事务中那些入队成功的命令,而忽略那些入队失败的命令。而新的处理方式则使得在管道技术中包含事务变得简单,因为发送事务和读取事务的回复都只需要和服务器进行一次通讯即可。 至于那些在 EXEC 命令执行之后所产生的错误,并没有对它们进行特别处理: 即使事务中有某个/某些命令在执行时产生了错误, 事务中的其他命令仍然会继续执行。 五、例子演示 connect('127.0.0.1',6379); $result = array(); // 开启事务 $redis->multi(); // 添加指令到队列 $redis->set('book-name','Thinking in PHP!'); $redis->sAdd('tags','PHP','Programming','Thinking'); $bookname = $redis->get('book-name'); $tags = $redis->sMembers('tags'); // 执行事务 $redis->exec(); // 显示结果 echo '书名:'.$bookname.' 标签:'.$tags; ?> 结果: 答案来源于网络

问问小秘 2019-12-02 03:02:33 0 浏览量 回答数 0

问题

深入理解 Redis 主键失效原理及实现机制:报错

kun坤 2020-06-07 14:14:55 0 浏览量 回答数 1

回答

点击后disabled掉,回调回来再重置回来######前端不限制?######我觉得这个还是前端做限制会比较合适,如果后端的 话  我暂时想到的就是ip过滤  每个IP在指定的时间内只能访问几次    不过感觉这样有点浪费资源###### 需要前后端一起限制 1.前端限制,点击后disabled掉,回调回来或者超时再重置回来 2.后端,限制用户只能在一定时间内访问该接口一次,可以借助redis的字符串的类型的SETNX 命令。 请求进入在redis中计数,后续请求直接返回,查询redis有值就返回失败,处理完毕删除redis的值 ######这个怎么限制在一定时间内哪?######你的问题有两种理解方式 第一种:用户点击N次 然后后台排队按照点击次数,一次一次的执行;第二种:用户点击n次,只执行第一次点击,其余的都不执行; 如果是第二种:你只需要在后台设置一个变量 用这个值做判断就行了  后台在执行点击指令时 把他的值修改  防止第二次点击命令进来,然后执行完成后将值恢复。至于第一种 我对java没什么了解 但是我觉得应该可以利用类似列队的方式来解决######1.后台加锁机制 2.点击之后设置为disable,等到请求结束返回信息再设置为disable, ######后端可以编码限定请求频率,例如Guava的RateLimiter。或者通过Ngnix限制###### 加一个过滤器,每次请求到的时候给 session 里面设置一个时间戳,返回的时候 removeSession 中这个值,如果第二个请求来了判断 session 里面时间戳是否满足了时间间隔,如果不满足,就直接返回一个提示,提交太频繁 ######刚看是 app,这样的话就直接记录针对设备或账号设置一个最后请求的时间戳,然后对比,一样的道理,完全可以放内存里面,每次只为一个账号保留一个时间戳就行了,也用不了多大内存######我遇到这种问题都是最简单的方法, 存session个值, 当然一个用户换个浏览器就不好用了, 或者缓存 用户名和状态, 主要还是要前台限制, 如果是定时操作, 可以用settimeout代替用户操作######突然想到  每次请求返回一个只能使用一次的随机值  处理请求前先比对该值  不知道行不行

kun坤 2020-05-30 17:26:57 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档目前如果要暴露 TCP 协议的服务,需要您自行设置负载均衡实例或者公网 IP,并配置好主机端口与容器端口的映射(通过阿里云扩展标签lb 来实现)。 Note 如果要使用负载均衡实例,您需要购买一个新的负载均衡实例。多个服务不能共享使用同一个负载均衡实例,同时不能共享使用集群默认负载均衡实例。 适用场景: 4 层协议的负载均衡,自定义各服务的路由,在将传统架构迁移到容器架构过程中非容器集群的服务访问容器集群中的服务。 示例: 通过自定义负载均衡的方式来将容器集群内的 Redis 服务暴露给容器集群外的 Python 应用。 首先在负载均衡管理控制台负载均衡管理控制台 (单击页面右上角的创建负载均衡)购买创建一个用于路由的负载均衡实例。 本示例中选择的是公网实例,您可以根据自己的需要选择公网或者私网。 Note 由于负载均衡不支持跨地域(Region)部署,因此应选择与您所使用容器服务集群相同的地域。 返回负载均衡管理控制台,将购买创建的负载均衡实例命名为 slb_redis_app。容器服务能通过该名称来引用这个负载均衡实例。您也可以通过负载均衡实例 ID 来引用。 单击左侧导航栏中的 实例管理,选择实例所在的地域 > 选择所需实例 > 编辑实例的名称并单击 确定。 创建监听端口。 单击实例右侧的 管理,单击左侧导航栏中的 监听 > 添加监听 > 设置监听配置 。创建协议为 TCP,端口映射为 6379:6379。如下图所示。 登录容器服务管理控制台,选择一个已有集群,创建一个名称为 redis-demo 的应用,单击使用镜像创建。 有关如何创建应用,参见创建应用。 Note 由于负载均衡不支持跨地域(Region)部署,因此您所使用的容器服务集群需要和上边创建的负载均衡实例处于相同的地域。 选择 Redis 镜像并设置端口映射。 Note 此处 Redis 镜像只是开通了容器的 6379 端口,为了使创建的负载均衡路由到这个容器端口,您必须指定 Redis 镜像的主机端口:容器端口的映射。 在 端口映射中,指定主机端口为 6379,主机端口 6379 即为负载均衡实例绑定的后端主机端口,选择使用的协议为 TCP. 为了配置自定义负载均衡,需要让 Redis 服务知道使用的负载均衡实例的信息。您可以通过向服务注入一个标签来实现或者通过设置负载均衡路由配置。 向服务注入一个标签。本示例中,标签为 aliyun.lb.port_6379: tcp://slb_redis_app:6379。 标签格式如下,带 $ 的变量为占位符。 aliyun.lb.port_$container_port:$scheme://$[slb_name|slb_id]:$front_port $container_port 表示容器要暴露的端口。 $scheme表示负载均衡实例监听端口支持的协议,可能的值为 tcp、http、https、udp。 $[slb_name|slb_id] 表示可以填写负载均衡实例的名称或者 ID。 $front_port 表示负载均衡实例要暴露的前端端口。 更多详细信息,参见阿里云扩展标签lb。 在创建应用页面,单击负载均衡路由配置右侧的加号图标,设置要配置的负载均衡实例的信息,如下图所示。 该设置对应的标签内容为 aliyun.lb.port_6379: tcp://slb_redis_app:6379。 本示例中,路由到的容器端口为 6379,引用前面创建的负载均衡实例名称 slb_redis_app,与上面主机端口:容器端口的映射设置的 TCP 协议相呼应,本示例设置监听端口的协议为 TCP 协议,同时设置负载均衡的前端端口为 6379。 Note 本示例中,同时将负载均衡实例的前端端口、后端端口(即主机的端口)和容器端口均设置为 6379,您可以根据自己的需要设置不同的前端端口和主机端口。 单击创建,Redis 应用即开始创建了。Redis 应用在创建的过程中会自动将名称为 slb_redis_app 的负载均衡实例绑定到部署了 redis 镜像的后端主机。 当应用处于就绪状态后,登录负载均衡管理控制台,查看名为 slb_redis_app 的负载均衡实例的状态。 单击左侧导航栏中的实例管理,选择实例所在的地域 > 选择所需实例 > 单击实例右侧的管理 > 单击左侧导航栏中的服务器 > 后端服务器。 由健康状态可见,负载均衡已经正确地绑定到了 Redis 的后端。 您可以在负载均衡管理控制台 的实例管理页面查看负载均衡实例的 IP 地址,并使用命令行工具 telnet $Server_Load_Balancer_IP_address 6379 来检查端口的可访问性。 为了测试以上配置,在本地运行一个简单的 Python 应用来通过 slb_redis_app 负载均衡实例访问容器集群内的 Redis。 Note Redis 主机地址是负载均衡的 IP 地址。 app.pyfrom flask import Flask from redis import Redis app = Flask(__name__) redis = Redis(host='$Server_Load_Balancer_IP_address', port=6379) @app.route('/') def hello(): redis.incr('hits') return 'Hello World! I have been seen %s times.' % redis.get('hits') if __name__ == "__main__": app.run(host="0.0.0.0", debug=True)requirements.txtflask redisshell$ pip install -r requirements.txt $ python app.py Running on http://0.0.0.0:5000/ ## Press CTRL+C to quit Restarting with stat Debugger is active! Debugger pin code: 243-626-653 访问结果如下图所示。

2019-12-01 23:15:51 0 浏览量 回答数 0

回答

一万条数据不多,直接放队列,然后用LPOP操作就OK,因为Redis所有操作都是原子操作,所以多个线程同时对列表进行LPOP也没关系。下面是LPOP命令:`LPOPLPOP key`移除并返回列表key的头元素。 时间复杂度:O(1)返回值:列表的头元素。当key不存在时,返回nil。

落地花开啦 2019-12-02 01:49:37 0 浏览量 回答数 0

问题

Swarm 集群&nbsp;&nbsp;服务发现和负载均衡&nbsp;&nbsp;负载均衡路由

青蛙跳 2019-12-01 21:36:24 612 浏览量 回答数 0

问题

hiredis的执行命令的问题?报错

爱吃鱼的程序员 2020-06-06 15:05:54 0 浏览量 回答数 1

问题

如何设置键超时时间

云栖大讲堂 2019-12-01 21:29:32 1491 浏览量 回答数 0

问题

服务发现和负载均衡的负载均衡路由

反向一觉 2019-12-01 21:20:19 1699 浏览量 回答数 0

问题

Swarm mode 集群中服务发现和负载均衡的负载均衡路由

反向一觉 2019-12-01 21:22:35 1478 浏览量 回答数 0

问题

使用 Jedis 连接池模式容易遇到无法获取连接池的错误有哪些

云栖大讲堂 2019-12-01 21:20:52 1097 浏览量 回答数 0

回答

92题 一般来说,建立INDEX有以下益处:提高查询效率;建立唯一索引以保证数据的唯一性;设计INDEX避免排序。 缺点,INDEX的维护有以下开销:叶节点的‘分裂’消耗;INSERT、DELETE和UPDATE操作在INDEX上的维护开销;有存储要求;其他日常维护的消耗:对恢复的影响,重组的影响。 需要建立索引的情况:为了建立分区数据库的PATITION INDEX必须建立; 为了保证数据约束性需要而建立的INDEX必须建立; 为了提高查询效率,则考虑建立(是否建立要考虑相关性能及维护开销); 考虑在使用UNION,DISTINCT,GROUP BY,ORDER BY等字句的列上加索引。 91题 作用:加快查询速度。原则:(1) 如果某属性或属性组经常出现在查询条件中,考虑为该属性或属性组建立索引;(2) 如果某个属性常作为最大值和最小值等聚集函数的参数,考虑为该属性建立索引;(3) 如果某属性经常出现在连接操作的连接条件中,考虑为该属性或属性组建立索引。 90题 快照Snapshot是一个文件系统在特定时间里的镜像,对于在线实时数据备份非常有用。快照对于拥有不能停止的应用或具有常打开文件的文件系统的备份非常重要。对于只能提供一个非常短的备份时间而言,快照能保证系统的完整性。 89题 游标用于定位结果集的行,通过判断全局变量@@FETCH_STATUS可以判断是否到了最后,通常此变量不等于0表示出错或到了最后。 88题 事前触发器运行于触发事件发生之前,而事后触发器运行于触发事件发生之后。通常事前触发器可以获取事件之前和新的字段值。语句级触发器可以在语句执行前或后执行,而行级触发在触发器所影响的每一行触发一次。 87题 MySQL可以使用多个字段同时建立一个索引,叫做联合索引。在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中索引。具体原因为:MySQL使用索引时需要索引有序,假设现在建立了"name,age,school"的联合索引,那么索引的排序为: 先按照name排序,如果name相同,则按照age排序,如果age的值也相等,则按照school进行排序。因此在建立联合索引的时候应该注意索引列的顺序,一般情况下,将查询需求频繁或者字段选择性高的列放在前面。此外可以根据特例的查询或者表结构进行单独的调整。 86题 建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力。这些都和实际的表结构以及查询方式有关。 85题 存储过程是一组Transact-SQL语句,在一次编译后可以执行多次。因为不必重新编译Transact-SQL语句,所以执行存储过程可以提高性能。触发器是一种特殊类型的存储过程,不由用户直接调用。创建触发器时会对其进行定义,以便在对特定表或列作特定类型的数据修改时执行。 84题 存储过程是用户定义的一系列SQL语句的集合,涉及特定表或其它对象的任务,用户可以调用存储过程,而函数通常是数据库已定义的方法,它接收参数并返回某种类型的值并且不涉及特定用户表。 83题 减少表连接,减少复杂 SQL,拆分成简单SQL。减少排序:非必要不排序,利用索引排序,减少参与排序的记录数。尽量避免 select *。尽量用 join 代替子查询。尽量少使用 or,使用 in 或者 union(union all) 代替。尽量用 union all 代替 union。尽量早的将无用数据过滤:选择更优的索引,先分页再Join…。避免类型转换:索引失效。优先优化高并发的 SQL,而不是执行频率低某些“大”SQL。从全局出发优化,而不是片面调整。尽可能对每一条SQL进行 explain。 82题 如果条件中有or,即使其中有条件带索引也不会使用(要想使用or,又想让索引生效,只能将or条件中的每个列都加上索引)。对于多列索引,不是使用的第一部分,则不会使用索引。like查询是以%开头。如果列类型是字符串,那一定要在条件中将数据使用引号引用起来,否则不使用索引。如果mysql估计使用全表扫描要比使用索引快,则不使用索引。例如,使用<>、not in 、not exist,对于这三种情况大多数情况下认为结果集很大,MySQL就有可能不使用索引。 81题 主键不能重复,不能为空,唯一键不能重复,可以为空。建立主键的目的是让外键来引用。一个表最多只有一个主键,但可以有很多唯一键。 80题 空值('')是不占用空间的,判断空字符用=''或者<>''来进行处理。NULL值是未知的,且占用空间,不走索引;判断 NULL 用 IS NULL 或者 is not null ,SQL 语句函数中可以使用 ifnull ()函数来进行处理。无法比较 NULL 和 0;它们是不等价的。无法使用比较运算符来测试 NULL 值,比如 =, <, 或者 <>。NULL 值可以使用 <=> 符号进行比较,该符号与等号作用相似,但对NULL有意义。进行 count ()统计某列的记录数的时候,如果采用的 NULL 值,会被系统自动忽略掉,但是空值是统计到其中。 79题 HEAP表是访问数据速度最快的MySQL表,他使用保存在内存中的散列索引。一旦服务器重启,所有heap表数据丢失。BLOB或TEXT字段是不允许的。只能使用比较运算符=,<,>,=>,= <。HEAP表不支持AUTO_INCREMENT。索引不可为NULL。 78题 如果想输入字符为十六进制数字,可以输入带有单引号的十六进制数字和前缀(X),或者只用(Ox)前缀输入十六进制数字。如果表达式上下文是字符串,则十六进制数字串将自动转换为字符串。 77题 Mysql服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。 76题 在缺省模式下,MYSQL是autocommit模式的,所有的数据库更新操作都会即时提交,所以在缺省情况下,mysql是不支持事务的。但是如果你的MYSQL表类型是使用InnoDB Tables 或 BDB tables的话,你的MYSQL就可以使用事务处理,使用SET AUTOCOMMIT=0就可以使MYSQL允许在非autocommit模式,在非autocommit模式下,你必须使用COMMIT来提交你的更改,或者用ROLLBACK来回滚你的更改。 75题 它会停止递增,任何进一步的插入都将产生错误,因为密钥已被使用。 74题 创建索引的时候尽量使用唯一性大的列来创建索引,由于使用b+tree做为索引,以innodb为例,一个树节点的大小由“innodb_page_size”,为了减少树的高度,同时让一个节点能存放更多的值,索引列尽量在整数类型上创建,如果必须使用字符类型,也应该使用长度较少的字符类型。 73题 当MySQL单表记录数过大时,数据库的CRUD性能会明显下降,一些常见的优化措施如下: 限定数据的范围: 务必禁止不带任何限制数据范围条件的查询语句。比如:我们当用户在查询订单历史的时候,我们可以控制在一个月的范围内。读/写分离: 经典的数据库拆分方案,主库负责写,从库负责读。垂直分区: 根据数据库里面数据表的相关性进行拆分。简单来说垂直拆分是指数据表列的拆分,把一张列比较多的表拆分为多张表。水平分区: 保持数据表结构不变,通过某种策略存储数据分片。这样每一片数据分散到不同的表或者库中,达到了分布式的目的。水平拆分可以支撑非常大的数据量。 72题 乐观锁失败后会抛出ObjectOptimisticLockingFailureException,那么我们就针对这块考虑一下重试,自定义一个注解,用于做切面。针对注解进行切面,设置最大重试次数n,然后超过n次后就不再重试。 71题 一致性非锁定读讲的是一条记录被加了X锁其他事务仍然可以读而不被阻塞,是通过innodb的行多版本实现的,行多版本并不是实际存储多个版本记录而是通过undo实现(undo日志用来记录数据修改前的版本,回滚时会用到,用来保证事务的原子性)。一致性锁定读讲的是我可以通过SELECT语句显式地给一条记录加X锁从而保证特定应用场景下的数据一致性。 70题 数据库引擎:尤其是mysql数据库只有是InnoDB引擎的时候事物才能生效。 show engines 查看数据库默认引擎;SHOW TABLE STATUS from 数据库名字 where Name='表名' 如下;SHOW TABLE STATUS from rrz where Name='rrz_cust';修改表的引擎alter table table_name engine=innodb。 69题 如果是等值查询,那么哈希索引明显有绝对优势,因为只需要经过一次算法即可找到相应的键值;当然了,这个前提是,键值都是唯一的。如果键值不是唯一的,就需要先找到该键所在位置,然后再根据链表往后扫描,直到找到相应的数据;如果是范围查询检索,这时候哈希索引就毫无用武之地了,因为原先是有序的键值,经过哈希算法后,有可能变成不连续的了,就没办法再利用索引完成范围查询检索;同理,哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询(这种部分模糊查询,其实本质上也是范围查询);哈希索引也不支持多列联合索引的最左匹配规则;B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,在有大量重复键值情况下,哈希索引的效率也是极低的,因为存在所谓的哈希碰撞问题。 68题 decimal精度比float高,数据处理比float简单,一般优先考虑,但float存储的数据范围大,所以范围大的数据就只能用它了,但要注意一些处理细节,因为不精确可能会与自己想的不一致,也常有关于float 出错的问题。 67题 datetime、timestamp精确度都是秒,datetime与时区无关,存储的范围广(1001-9999),timestamp与时区有关,存储的范围小(1970-2038)。 66题 Char使用固定长度的空间进行存储,char(4)存储4个字符,根据编码方式的不同占用不同的字节,gbk编码方式,不论是中文还是英文,每个字符占用2个字节的空间,utf8编码方式,每个字符占用3个字节的空间。Varchar保存可变长度的字符串,使用额外的一个或两个字节存储字符串长度,varchar(10),除了需要存储10个字符,还需要1个字节存储长度信息(10),超过255的长度需要2个字节来存储。char和varchar后面如果有空格,char会自动去掉空格后存储,varchar虽然不会去掉空格,但在进行字符串比较时,会去掉空格进行比较。Varbinary保存变长的字符串,后面不会补\0。 65题 首先分析语句,看看是否load了额外的数据,可能是查询了多余的行并且抛弃掉了,可能是加载了许多结果中并不需要的列,对语句进行分析以及重写。分析语句的执行计划,然后获得其使用索引的情况,之后修改语句或者修改索引,使得语句可以尽可能的命中索引。如果对语句的优化已经无法进行,可以考虑表中的数据量是否太大,如果是的话可以进行横向或者纵向的分表。 64题 建立索引的时候一般要考虑到字段的使用频率,经常作为条件进行查询的字段比较适合。如果需要建立联合索引的话,还需要考虑联合索引中的顺序。此外也要考虑其他方面,比如防止过多的所有对表造成太大的压力。这些都和实际的表结构以及查询方式有关。 63题 存储过程是一些预编译的SQL语句。1、更加直白的理解:存储过程可以说是一个记录集,它是由一些T-SQL语句组成的代码块,这些T-SQL语句代码像一个方法一样实现一些功能(对单表或多表的增删改查),然后再给这个代码块取一个名字,在用到这个功能的时候调用他就行了。2、存储过程是一个预编译的代码块,执行效率比较高,一个存储过程替代大量T_SQL语句 ,可以降低网络通信量,提高通信速率,可以一定程度上确保数据安全。 62题 密码散列、盐、用户身份证号等固定长度的字符串应该使用char而不是varchar来存储,这样可以节省空间且提高检索效率。 61题 推荐使用自增ID,不要使用UUID。因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。总之,在数据量大一些的情况下,用自增主键性能会好一些。 60题 char是一个定长字段,假如申请了char(10)的空间,那么无论实际存储多少内容。该字段都占用10个字符,而varchar是变长的,也就是说申请的只是最大长度,占用的空间为实际字符长度+1,最后一个字符存储使用了多长的空间。在检索效率上来讲,char > varchar,因此在使用中,如果确定某个字段的值的长度,可以使用char,否则应该尽量使用varchar。例如存储用户MD5加密后的密码,则应该使用char。 59题 一. read uncommitted(读取未提交数据) 即便是事务没有commit,但是我们仍然能读到未提交的数据,这是所有隔离级别中最低的一种。 二. read committed(可以读取其他事务提交的数据)---大多数数据库默认的隔离级别 当前会话只能读取到其他事务提交的数据,未提交的数据读不到。 三. repeatable read(可重读)---MySQL默认的隔离级别 当前会话可以重复读,就是每次读取的结果集都相同,而不管其他事务有没有提交。 四. serializable(串行化) 其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格的,但是这样做势必对性能造成影响。所以在实际的选用上,我们要根据当前具体的情况选用合适的。 58题 B+树的高度一般为2-4层,所以查找记录时最多只需要2-4次IO,相对二叉平衡树已经大大降低了。范围查找时,能通过叶子节点的指针获取数据。例如查找大于等于3的数据,当在叶子节点中查到3时,通过3的尾指针便能获取所有数据,而不需要再像二叉树一样再获取到3的父节点。 57题 因为事务在修改页时,要先记 undo,在记 undo 之前要记 undo 的 redo, 然后修改数据页,再记数据页修改的 redo。 Redo(里面包括 undo 的修改) 一定要比数据页先持久化到磁盘。 当事务需要回滚时,因为有 undo,可以把数据页回滚到前镜像的状态,崩溃恢复时,如果 redo log 中事务没有对应的 commit 记录,那么需要用 undo把该事务的修改回滚到事务开始之前。 如果有 commit 记录,就用 redo 前滚到该事务完成时并提交掉。 56题 redo log是物理日志,记录的是"在某个数据页上做了什么修改"。 binlog是逻辑日志,记录的是这个语句的原始逻辑,比如"给ID=2这一行的c字段加1"。 redo log是InnoDB引擎特有的;binlog是MySQL的Server层实现的,所有引擎都可以使用。 redo log是循环写的,空间固定会用完:binlog 是可以追加写入的。"追加写"是指binlog文件写到一定大小后会切换到下一个,并不会覆盖以前的日志。 最开始 MySQL 里并没有 InnoDB 引擎,MySQL 自带的引擎是 MyISAM,但是 MyISAM 没有 crash-safe 的能力,binlog日志只能用于归档。而InnoDB 是另一个公司以插件形式引入 MySQL 的,既然只依靠 binlog 是没有 crash-safe 能力的,所以 InnoDB 使用另外一套日志系统,也就是 redo log 来实现 crash-safe 能力。 55题 重做日志(redo log)      作用:确保事务的持久性,防止在发生故障,脏页未写入磁盘。重启数据库会进行redo log执行重做,达到事务一致性。 回滚日志(undo log)  作用:保证数据的原子性,保存了事务发生之前的数据的一个版本,可以用于回滚,同时可以提供多版本并发控制下的读(MVCC),也即非锁定读。 二进 制日志(binlog)    作用:用于主从复制,实现主从同步;用于数据库的基于时间点的还原。 错误日志(errorlog) 作用:Mysql本身启动,停止,运行期间发生的错误信息。 慢查询日志(slow query log)  作用:记录执行时间过长的sql,时间阈值可以配置,只记录执行成功。 一般查询日志(general log)    作用:记录数据库的操作明细,默认关闭,开启后会降低数据库性能 。 中继日志(relay log) 作用:用于数据库主从同步,将主库发来的bin log保存在本地,然后从库进行回放。 54题 MySQL有三种锁的级别:页级、表级、行级。 表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般。 死锁: 是指两个或两个以上的进程在执行过程中。因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 死锁的关键在于:两个(或以上)的Session加锁的顺序不一致。 那么对应的解决死锁问题的关键就是:让不同的session加锁有次序。死锁的解决办法:1.查出的线程杀死。2.设置锁的超时时间。3.指定获取锁的顺序。 53题 当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性(脏读,不可重复读,幻读等),可能产生死锁。 乐观锁:乐观锁不是数据库自带的,需要我们自己去实现。 悲观锁:在进行每次操作时都要通过获取锁才能进行对相同数据的操作。 共享锁:加了共享锁的数据对象可以被其他事务读取,但不能修改。 排他锁:当数据对象被加上排它锁时,一个事务必须得到锁才能对该数据对象进行访问,一直到事务结束锁才被释放。 行锁:就是给某一条记录加上锁。 52题 Mysql是关系型数据库,MongoDB是非关系型数据库,数据存储结构的不同。 51题 关系型数据库优点:1.保持数据的一致性(事务处理)。 2.由于以标准化为前提,数据更新的开销很小。 3. 可以进行Join等复杂查询。 缺点:1、为了维护一致性所付出的巨大代价就是其读写性能比较差。 2、固定的表结构。 3、高并发读写需求。 4、海量数据的高效率读写。 非关系型数据库优点:1、无需经过sql层的解析,读写性能很高。 2、基于键值对,数据没有耦合性,容易扩展。 3、存储数据的格式:nosql的存储格式是key,value形式、文档形式、图片形式等等,文档形式、图片形式等等,而关系型数据库则只支持基础类型。 缺点:1、不提供sql支持,学习和使用成本较高。 2、无事务处理,附加功能bi和报表等支持也不好。 redis与mongoDB的区别: 性能:TPS方面redis要大于mongodb。 可操作性:mongodb支持丰富的数据表达,索引,redis较少的网络IO次数。 可用性:MongoDB优于Redis。 一致性:redis事务支持比较弱,mongoDB不支持事务。 数据分析:mongoDB内置了数据分析的功能(mapreduce)。 应用场景:redis数据量较小的更性能操作和运算上,MongoDB主要解决海量数据的访问效率问题。 50题 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。 49题 分区可以让Redis管理更大的内存,Redis将可以使用所有机器的内存。如果没有分区,你最多只能使用一台机器的内存。分区使Redis的计算能力通过简单地增加计算机得到成倍提升,Redis的网络带宽也会随着计算机和网卡的增加而成倍增长。 48题 除了缓存服务器自带的缓存失效策略之外(Redis默认的有6种策略可供选择),我们还可以根据具体的业务需求进行自定义的缓存淘汰,常见的策略有两种: 1.定时去清理过期的缓存; 2.当有用户请求过来时,再判断这个请求所用到的缓存是否过期,过期的话就去底层系统得到新数据并更新缓存。 两者各有优劣,第一种的缺点是维护大量缓存的key是比较麻烦的,第二种的缺点就是每次用户请求过来都要判断缓存失效,逻辑相对比较复杂!具体用哪种方案,可以根据应用场景来权衡。 47题 Redis提供了两种方式来作消息队列: 一个是使用生产者消费模式模式:会让一个或者多个客户端监听消息队列,一旦消息到达,消费者马上消费,谁先抢到算谁的,如果队列里没有消息,则消费者继续监听 。另一个就是发布订阅者模式:也是一个或多个客户端订阅消息频道,只要发布者发布消息,所有订阅者都能收到消息,订阅者都是平等的。 46题 Redis的数据结构列表(list)可以实现延时队列,可以通过队列和栈来实现。blpop/brpop来替换lpop/rpop,blpop/brpop阻塞读在队列没有数据的时候,会立即进入休眠状态,一旦数据到来,则立刻醒过来。Redis的有序集合(zset)可以用于实现延时队列,消息作为value,时间作为score。Zrem 命令用于移除有序集中的一个或多个成员,不存在的成员将被忽略。当 key 存在但不是有序集类型时,返回一个错误。 45题 1.热点数据缓存:因为Redis 访问速度块、支持的数据类型比较丰富。 2.限时业务:expire 命令设置 key 的生存时间,到时间后自动删除 key。 3.计数器:incrby 命令可以实现原子性的递增。 4.排行榜:借助 SortedSet 进行热点数据的排序。 5.分布式锁:利用 Redis 的 setnx 命令进行。 6.队列机制:有 list push 和 list pop 这样的命令。 44题 一致哈希 是一种特殊的哈希算法。在使用一致哈希算法后,哈希表槽位数(大小)的改变平均只需要对 K/n 个关键字重新映射,其中K是关键字的数量, n是槽位数量。然而在传统的哈希表中,添加或删除一个槽位的几乎需要对所有关键字进行重新映射。 43题 RDB的优点:适合做冷备份;读写服务影响小,reids可以保持高性能;重启和恢复redis进程,更加快速。RDB的缺点:宕机会丢失最近5分钟的数据;文件特别大时可能会暂停数毫秒,或者甚至数秒。 AOF的优点:每个一秒执行fsync操作,最多丢失1秒钟的数据;以append-only模式写入,没有任何磁盘寻址的开销;文件过大时,不会影响客户端读写;适合做灾难性的误删除的紧急恢复。AOF的缺点:AOF日志文件比RDB数据快照文件更大,支持写QPS比RDB支持的写QPS低;比RDB脆弱,容易有bug。 42题 对于Redis而言,命令的原子性指的是:一个操作的不可以再分,操作要么执行,要么不执行。Redis的操作之所以是原子性的,是因为Redis是单线程的。而在程序中执行多个Redis命令并非是原子性的,这也和普通数据库的表现是一样的,可以用incr或者使用Redis的事务,或者使用Redis+Lua的方式实现。对Redis来说,执行get、set以及eval等API,都是一个一个的任务,这些任务都会由Redis的线程去负责执行,任务要么执行成功,要么执行失败,这就是Redis的命令是原子性的原因。 41题 (1)twemproxy,使用方式简单(相对redis只需修改连接端口),对旧项目扩展的首选。(2)codis,目前用的最多的集群方案,基本和twemproxy一致的效果,但它支持在节点数改变情况下,旧节点数据可恢复到新hash节点。(3)redis cluster3.0自带的集群,特点在于他的分布式算法不是一致性hash,而是hash槽的概念,以及自身支持节点设置从节点。(4)在业务代码层实现,起几个毫无关联的redis实例,在代码层,对key进行hash计算,然后去对应的redis实例操作数据。这种方式对hash层代码要求比较高,考虑部分包括,节点失效后的代替算法方案,数据震荡后的自动脚本恢复,实例的监控,等等。 40题 (1) Master最好不要做任何持久化工作,如RDB内存快照和AOF日志文件 (2) 如果数据比较重要,某个Slave开启AOF备份数据,策略设置为每秒同步一次 (3) 为了主从复制的速度和连接的稳定性,Master和Slave最好在同一个局域网内 (4) 尽量避免在压力很大的主库上增加从库 (5) 主从复制不要用图状结构,用单向链表结构更为稳定,即:Master <- Slave1 <- Slave2 <- Slave3...这样的结构方便解决单点故障问题,实现Slave对Master的替换。如果Master挂了,可以立刻启用Slave1做Master,其他不变。 39题 比如订单管理,热数据:3个月内的订单数据,查询实时性较高;温数据:3个月 ~ 12个月前的订单数据,查询频率不高;冷数据:1年前的订单数据,几乎不会查询,只有偶尔的查询需求。热数据使用mysql进行存储,需要分库分表;温数据可以存储在ES中,利用搜索引擎的特性基本上也可以做到比较快的查询;冷数据可以存放到Hive中。从存储形式来说,一般情况冷数据存储在磁带、光盘,热数据一般存放在SSD中,存取速度快,而温数据可以存放在7200转的硬盘。 38题 当访问量剧增、服务出现问题(如响应时间慢或不响应)或非核心服务影响到核心流程的性能时,仍然需要保证服务还是可用的,即使是有损服务。系统可以根据一些关键数据进行自动降级,也可以配置开关实现人工降级。降级的最终目的是保证核心服务可用,即使是有损的。而且有些服务是无法降级的(如加入购物车、结算)。 37题 分层架构设计,有一条准则:站点层、服务层要做到无数据无状态,这样才能任意的加节点水平扩展,数据和状态尽量存储到后端的数据存储服务,例如数据库服务或者缓存服务。显然进程内缓存违背了这一原则。 36题 更新数据的时候,根据数据的唯一标识,将操作路由之后,发送到一个 jvm 内部队列中。读取数据的时候,如果发现数据不在缓存中,那么将重新读取数据+更新缓存的操作,根据唯一标识路由之后,也发送同一个 jvm 内部队列中。一个队列对应一个工作线程,每个工作线程串行拿到对应的操作,然后一条一条的执行。 35题 redis分布式锁加锁过程:通过setnx向特定的key写入一个随机值,并同时设置失效时间,写值成功既加锁成功;redis分布式锁解锁过程:匹配随机值,删除redis上的特点key数据,要保证获取数据、判断一致以及删除数据三个操作是原子的,为保证原子性一般使用lua脚本实现;在此基础上进一步优化的话,考虑使用心跳检测对锁的有效期进行续期,同时基于redis的发布订阅优雅的实现阻塞式加锁。 34题 volatile-lru:当内存不足以容纳写入数据时,从已设置过期时间的数据集中挑选最近最少使用的数据淘汰。 volatile-ttl:当内存不足以容纳写入数据时,从已设置过期时间的数据集中挑选将要过期的数据淘汰。 volatile-random:当内存不足以容纳写入数据时,从已设置过期时间的数据集中任意选择数据淘汰。 allkeys-lru:当内存不足以容纳写入数据时,从数据集中挑选最近最少使用的数据淘汰。 allkeys-random:当内存不足以容纳写入数据时,从数据集中任意选择数据淘汰。 noeviction:禁止驱逐数据,当内存使用达到阈值的时候,所有引起申请内存的命令会报错。 33题 定时过期:每个设置过期时间的key都需要创建一个定时器,到过期时间就会立即清除。该策略可以立即清除过期的数据,对内存很友好;但是会占用大量的CPU资源去处理过期的数据,从而影响缓存的响应时间和吞吐量。 惰性过期:只有当访问一个key时,才会判断该key是否已过期,过期则清除。该策略可以最大化地节省CPU资源,却对内存非常不友好。极端情况可能出现大量的过期key没有再次被访问,从而不会被清除,占用大量内存。 定期过期:每隔一定的时间,会扫描一定数量的数据库的expires字典中一定数量的key,并清除其中已过期的key。该策略是前两者的一个折中方案。通过调整定时扫描的时间间隔和每次扫描的限定耗时,可以在不同情况下使得CPU和内存资源达到最优的平衡效果。 32题 缓存击穿,一个存在的key,在缓存过期的一刻,同时有大量的请求,这些请求都会击穿到DB,造成瞬时DB请求量大、压力骤增。如何避免:在访问key之前,采用SETNX(set if not exists)来设置另一个短期key来锁住当前key的访问,访问结束再删除该短期key。 31题 缓存雪崩,是指在某一个时间段,缓存集中过期失效。大量的key设置了相同的过期时间,导致在缓存在同一时刻全部失效,造成瞬时DB请求量大、压力骤增,引起雪崩。而缓存服务器某个节点宕机或断网,对数据库服务器造成的压力是不可预知的,很有可能瞬间就把数据库压垮。如何避免:1.redis高可用,搭建redis集群。2.限流降级,在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。3.数据预热,在即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间。 30题 缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。一些恶意的请求会故意查询不存在的 key,请求量很大,对数据库造成压力,甚至压垮数据库。 如何避免:1:对查询结果为空的情况也进行缓存,缓存时间设置短一点,或者该 key 对应的数据 insert 了之后清理缓存。2:对一定不存在的 key 进行过滤。可以把所有的可能存在的 key 放到一个大的 Bitmap 中,查询时通过该 bitmap 过滤。 29题 1.memcached 所有的值均是简单的字符串,redis 作为其替代者,支持更为丰富的数据类型。 2.redis 的速度比 memcached 快很多。 3.redis 可以持久化其数据。 4.Redis支持数据的备份,即master-slave模式的数据备份。 5.Redis采用VM机制。 6.value大小:redis最大可以达到1GB,而memcache只有1MB。 28题 Spring Boot 推荐使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通过spring提供的@ImportResource来加载xml配置。例如:@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"}) 27题 Spring像一个大家族,有众多衍生产品例如Spring Boot,Spring Security等等,但他们的基础都是Spring的IOC和AOP,IOC提供了依赖注入的容器,而AOP解决了面向切面的编程,然后在此两者的基础上实现了其他衍生产品的高级功能。Spring MVC是基于Servlet的一个MVC框架,主要解决WEB开发的问题,因为 Spring的配置非常复杂,各种xml,properties处理起来比较繁琐。Spring Boot遵循约定优于配置,极大降低了Spring使用门槛,又有着Spring原本灵活强大的功能。总结:Spring MVC和Spring Boot都属于Spring,Spring MVC是基于Spring的一个MVC框架,而Spring Boot是基于Spring的一套快速开发整合包。 26题 YAML 是 "YAML Ain't a Markup Language"(YAML 不是一种标记语言)的递归缩写。YAML 的配置文件后缀为 .yml,是一种人类可读的数据序列化语言,可以简单表达清单、散列表,标量等数据形态。它通常用于配置文件,与属性文件相比,YAML文件就更加结构化,而且更少混淆。可以看出YAML具有分层配置数据。 25题 Spring Boot有3种热部署方式: 1.使用springloaded配置pom.xml文件,使用mvn spring-boot:run启动。 2.使用springloaded本地加载启动,配置jvm参数-javaagent:<jar包地址> -noverify。 3.使用devtools工具包,操作简单,但是每次需要重新部署。 用

游客ih62co2qqq5ww 2020-03-27 23:56:48 0 浏览量 回答数 0

问题

云监控预设监控项参考

反向一觉 2019-12-01 21:26:17 1278 浏览量 回答数 0

回答

public synchronized void insert() {     ... } 试试这个。######您好,请问 如果我不用这种同步的方法, 只用事务隔离可以解决吗###### 加synchronized比较简单暴力,性价比最好。更优的方式是添加流水单号,根据流水单号进行同步或者异步添加。但是需要实现很多内容。######简单暴力、好处是 Java 端当掉了并发的压力,数据库还是一个个进出,压力不会落到数据库上。哈哈哈######  transactionl###### 两次插入请求和事务没太大关系,上面的加synchronize关键字在一台机器上的时候算是一个办法,但不是可行的办法,这相当于把所有任务都串行了,浪费服务器资源。这种情况可以有几种处理办法: 1. 数据库加唯一索引,如果有唯一列可以标识的话 2. 两行重复在事务完成之后做一个删除判断,将id比较小的(大的也OK,只要逻辑一致)几条删掉,只保留一条 3. 加分布式锁,这也需要唯一标识来加锁 4. 不完美的解决办法,前端保证短时间内只发一次请求(正常用户没有问题,容易被hack,但可以挡正常流量,这应该是必须要做的)###### 引用来自“52iSilence7”的评论 两次插入请求和事务没太大关系,上面的加synchronize关键字在一台机器上的时候算是一个办法,但不是可行的办法,这相当于把所有任务都串行了,浪费服务器资源。这种情况可以有几种处理办法: 1. 数据库加唯一索引,如果有唯一列可以标识的话 2. 两行重复在事务完成之后做一个删除判断,将id比较小的(大的也OK,只要逻辑一致)几条删掉,只保留一条 3. 加分布式锁,这也需要唯一标识来加锁 4. 不完美的解决办法,前端保证短时间内只发一次请求(正常用户没有问题,容易被hack,但可以挡正常流量,这应该是必须要做的) 增加分布式锁,注意释放锁死锁情况。 楼上说的比较ID大小的方法仅限于ID是自增情况,如果是UUID不适用。  ######  事务和并发问题 事务和并发,这两个并不是一个对等的概念。 先给出简单解决方案,具体的实现在下文会给出。   第一种方式(推荐):   给数据添加唯一索引,这种方式能解决,但是会影响效率。   第二种方式:   如果是分布式项目,可以使用分布式锁,具体可以通过redis或者zookeeper来实现,   如果是单点项目,可以使用同步代码块来实现。   第三种方式(推荐):   使用insert where not exists 语句来限制插入。   第四种方式:   使用redis的`SETNX`方法来实现。     在具体业务中,我们更推荐第一种方式和第三种方式相结合的形式,但是大多数业务场景中,往往只采用第一种方式即可。   具体解决方案和思路。   在关系型数据库中(如MySql),一个事务可以是一条SQL语句,或者一组SQL语句。 其展现形式大致如下:   ``` BEGIN; /*开启事务*/ SQL 1; SQL 2; SQL 3; COMMIT;/ROLLBACK; /*提交或回滚*/ ```   他的具体表现是,上面一组SQL(SQL 1/SQL 2/SQL 3)在执行时,他们同时生效或者同时失败。   并发场景重现   如题所诉,假设`报名表`由下列字段构成   ``` CREATE TABLE `sign_up` (   `user_id` varchar(32) NOT NULL COMMENT '用户ID',   `create_time` datetime NOT NULL COMMENT '用户报名时间' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 ```   题中目前的操作应该大致如下:   ``` BEGIN; /*step1:从数据库获取当前用户是否已经报名*/ SELECT su.user_id,su.create_time FROM sign_up su WHERE user_id = ''; /*step2:如果用户未报名,则在数据库中插入数据*/ INSERT INTO sign_up values('',NOW()); COMMIT; ``` 此时代码本身是有漏洞的,当请求并发时,可能触发下列场景。   请求A: `SELECT su.user_id,su.create_time FROM sign_up su WHERE user_id = '123';` 请求B: `SELECT su.user_id,su.create_time FROM sign_up su WHERE user_id = '123';` 请求A: `INSERT INTO sign_up values('123',NOW());` 请求B: `INSERT INTO sign_up values('123',NOW());`   数据库在未添加唯一索引的场景下会插入两条数据,添加唯一索引的场景下则会报错`唯一索引冲突`。   此时虽然开启了事务,但是在整个执行过程中,如果没有开启唯一索引,SQL都是执行成功的,不会触发`ROLLBACK`; 如果开启了唯一索引,此时应该也就没有这个疑问了。   解决方案 针对这种问题,其实可以采取几种常见的方式来解决。 第一种方式: 在单点部署的工程中,可以通过对核心代码部分添加同步来解决,比如使用`synchronized`或者`ReentrantLock`来实现, 限制部分代码的并发访问,但是这样必然会降低该接口的效率,而且,在分布式工程内,该解决方法并不适用 ,所以不建议使用。   第二种方式: 通过分布式一致性锁来实现 针对第一种方案,通过分布式一致性锁取代常规同步块,进而实现在分布式工程中将并发转为同步。 分布式一致锁的实现方案有很多种,常见的有基于redis实现和基于zookeeper实现。   第三种方式:给数据库字段添加唯一索引 `ALTER TABLE sign_up ADD UNIQUE INDEX `user_id`(`user_id`);` 或者 `CREATE UNIQUE INDEX user_id ON sign_up(user_id); ` 这种方式通过在数据库端来限制表中不得同时存在同一用户的多条数据,这种方式实现比较简单,推荐使用,但是通过抛异常的形式来实现功能,会损失部分效率。   第四种方式: 使用`insert where not exists` 类型的语句来实现 ``` INSERT INTO sign_up (user_id, create_time) SELECT     '123', NOW() FROM     DUAL WHERE     NOT EXISTS (         SELECT             user_id         FROM             sign_up         WHERE             user_id = '123'     ); ```   这种方式,实现上将select 语句和insert语句合并到一起执行,避免了题中描述的并发问题,因为从实现上`insert`语句的执行依赖于`select`语句的查询结果 ,从根本上就避免了题中涉及到的并发问题,使用这种方式调用端可以根据`SQL`执行影响的行数来判断是否插入成功,进而执行对应的业务逻辑 ,这种方式普适性较强,推荐使用。   第五种方式,借助`redis`的`SETNX`方法来实现 ``` SETNX 是 ‘SET if Not eXists’的简称,命令格式大致如下:SETNX [key] [value]. 作用是:将指定的[key]的值设为[value],如果给定的key已经存在,则SETNX不做任何操作。 设置成功,该方法返回1,设置失败,该方法返回0. ``` 借助`SETNX`命令,我们可以将题中的`select`语句改为该方式,根据`SETNX`的返回值来执行相应的业务逻辑。 tips: 该方法需要注意redis的key值失效时间。   上诉五种方式都可以解决该问题。   问题产生的本质原因   下面再简单聊一下,并发和事务的问题。   事务有四大特性:A(原子性),C(一致性),I(隔离性),D(持久性)。   其中   - 原子性表示:事务所包含的所有操作,要么全部成功,要么全部失败。   - 一致性表示:事务执行前后必须处于一致性状态。   - 隔离性:当多个用户并发访问数据库的时候,多个并发线程相互隔离。   - 持久性:事务一旦被提交,对数据库的改变是永久性的,即使数据库系统遭遇故障也不会丢失提交的事务。   出现题中的问题,应该是混淆了原子性和隔离性的概念,原子性只是保证了事务中包含的操作要么同时成功,要么同时失败。 他并不会帮助我们处理业务代码中产生的并发问题,同理隔离性要求处理的是数据库并发,而不是业务并发。   在题中,业务代码内的两条SQL在没有配置唯一索引的场景下,并发时,并不会产生SQL执行失败的场景,两条语句默认都是成功的 ,这也就意味着事务最终是提交(`COMMIT`)的,进而导致数据库出现两条数据。   为了解决这种问题,我们的思路往往可以放在如何在业务层面将会出现并发问题的代码原子化,比如本文给出的解决方案,均是基于此而实现的。  ###### 加锁处理、唯一索引、基于redis防止重复提交###### 1.数据库的唯一索引 2.如果不是分布式部署的话上java锁 3.如果是分布式的话上基于redis的分布式锁 4.最好用lock锁 锁代码就可 没必要锁整个方法

kun坤 2020-06-07 22:25:21 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 您可以添加安全组规则,允许或禁止安全组内的ECS实例对公网或私网的访问: VPC网络:只需要设置出方向或入方向的规则,不区分内网和公网。专有网络(VPC)实例的公网访问通过私网网卡映射完成,所以,您在实例内部看不到公网网卡,在安全组里也只能设置内网规则。您设置的安全组规则同时对内网和公网生效。 经典网络:需要分别设置公网或内网的出方向或入方向规则。 安全组规则的变更会自动应用到安全组内的ECS实例上。 前提条件 您已经创建了一个安全组,具体操作,请参见 创建安全组。 您已经知道自己的实例需要允许或禁止哪些公网或内网的访问。 操作步骤 登录 云服务器ECS管理控制台。 在左侧导航栏中,选择 网络和安全 > 安全组。 选择地域。 找到要配置授权规则的安全组,在 操作 列中,单击 配置规则。 在 安全组规则 页面上,单击 添加安全组规则。 说明 如果您不需要设置ICMP、GRE协议规则,或者您想使用下表中列出的协议的默认端口,单击 快速创建规则。 每个安全组的入方向规则与出方向规则的总数不能超过100条。 协议 SSH telnet HTTP HTTPS MS SQL 端口 22 23 80 443 1433 协议 Oracle MySQL RDP PostgreSQL Redis 端口 1521 3306 3389 5432 6379 说明 各个参数配置说明,请参见第6步描述。 在弹出的对话框中,设置以下参数: 网卡类型: 如果是VPC类型的安全组,不需要选择这个参数。需要注意以下信息: 如果您的实例能访问公网,可以设置公网和内网的访问规则。 如果您的实例不能访问公网,只能设置内网的访问规则。 如果是经典网络的安全组,选择 公网 或 内网。 规则方向: 出方向:是指ECS实例访问内网中其他ECS实例或者公网上的资源。 入方向:是指内网中的其他ECS实例或公网上的资源访问ECS实例。 授权策略:选择 允许 或 拒绝。 说明 这里的 拒绝 策略是直接丢弃数据包,不给任何回应信息。如果2个安全组规则其他都相同只有授权策略不同,则 拒绝 授权生效,接受 授权不生效。 协议类型 和 端口范围:端口范围的设置受协议类型影响。下表是协议类型与端口范围的关系。 协议类型 端口范围 应用场景 全部 显示为-1/-1,表示不限制端口。不能设置。 可用于完全互相信任的应用场景。 全部ICMP 显示为-1/-1,表示不限制端口。不能设置。 使用 ping 程序检测实例之间的通信状况。 全部GRE 显示为-1/-1,表示不限制端口。不能设置。 用于VPN服务。 自定义TCP 自定义端口范围,有效的端口值是1 ~ 65535,端口范围的合法格式是开始端口/结束端口。即使是一个端口,也需要采用合法格式设置端口范围,比如:80/80表示端口80。 可用于允许或拒绝一个或几个连续的端口。 自定义UDP SSH 显示为22/22。 连接ECS实例后您能修改端口号,具体操作,请参见 服务器默认远程端口修改。 用于SSH远程连接到Linux实例。 TELNET 显示为23/23。 用于Telnet远程登录实例。 HTTP 显示为80/80。 实例作为网站或Web应用服务器。 HTTPS 显示为443/443。 实例作为支持HTTPS协议的网站或Web应用服务器。 MS SQL 显示为1433/1433。 实例作为MS SQL服务器。 Oracle 显示为1521/1521。 实例作为Oracle SQL服务器。 MySQL 显示为3306/3306。 实例作为MySQL服务器。 RDP 显示为3389/3389。 连接ECS实例后您能修改端口号,具体操作,请参见 服务器默认远程端口修改。 实例是Windows实例,需要远程桌面连接实例。 PostgreSQL 显示为5432/5432。 实例作为PostgreSQL服务器。 Redis 显示为6379/6379。 实例作为Redis服务器。 说明 公网出方向的STMP端口25默认受限,无法通过安全组规则打开,但是您可以 申请解封端口25。其他常用端口信息,请参见 ECS 实例常用端口介绍。 授权类型 和 授权对象:授权对象的设置受授权类型影响,以下是两者之间的关系。 授权类型 授权对象 地址段访问 填写单一IP地址或者CIDR网段格式,如:12.1.1.1或13.1.1.1/25。仅支持IPv4。如果填写0.0.0.0/0表示允许或拒绝所有IP地址的访问,设置时请务必谨慎。 关于CIDR格式介绍,请参见 ECS实例子网划分和掩码表示方法。 安全组访问 只对内网有效。授权本账号或其他账号下某个安全组中的实例访问本安全组中的实例,实现内网互通。 本账号授权:选择同一账号下的其他安全组ID。如果是VPC网络的安全组,必须为同一个VPC的安全组。 跨账号授权:填写目标安全组ID,以及对方账号ID。在 账号管理 > 安全设置 里查看账号ID。 因为安全组访问只对内网有效,所以,对VPC网络实例,安全组访问的规则仅适用于内网访问,不适用于公网访问。公网访问只能通过 地址段访问 授权。 说明 出于安全性考虑,经典网络的内网入方向规则,授权类型优先选择 安全组访问。如果选择 地址段访问,则只能授权单个IP地址,授权对象的格式只能是 a.b.c.d/32,仅支持IPv4,子网掩码必须是 /32。 优先级:1 ~ 100,数值越小,优先级越高。更多优先级信息,参见 ECS安全组规则优先级说明。 单击 确定,即成功地为指定安全组添加了一条安全组规则。 安全组规则一般是立即生效,但是也可能有稍许延迟。 查看安全组规则是否生效 假设您在实例里安装了Web服务,并在一个安全组里添加了一条安全组规则:公网入方向,允许所有IP地址访问实例的TCP 80端口。 Linux实例 如果是安全组中的一台Linux实例,按以下步骤查看安全组规则是否生效。 使用用户名密码验证连接 Linux 实例。 运行以下命令查看TCP 80是否被监听。netstat -an | grep 80如果返回以下结果,说明TCP 80端口已开通。tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN 在浏览器地址栏里输入 http://实例公网IP地址。如果访问成功,说明规则已经生效。 Windows实例 如果是安全组中的一台Windows实例,按以下步骤查看安全组规则是否生效。 使用软件连接Windows实例。 运行 命令提示符,输入以下命令查看TCP 80是否被监听。netstat -aon | findstr :80如果返回以下结果,说明TCP 80端口已开通。TCP    0.0.0.0:80           0.0.0.0:0              LISTENING       1172 在浏览器地址栏里输入 http://实例公网IP地址。如果访问成功,说明规则已经生效。 ECS安全组规则优先级说明 安全组规则的优先级可以设为1 ~ 100的任一个数值,数值越小,优先级越高。 ECS实例可以加入不同的安全组。无论是同一个安全组内或不同安全组之间,如果安全组规则互相矛盾,即协议类型、端口范围、授权类型、授权对象都相同,最终生效的安全组规则如下: 如果 优先级 相同,则 拒绝 授权规则生效,接受 授权规则不生效。 如果 优先级 不同,则优先级高的规则生效,与 授权策略 的设置无关。 相关文档 安全组FAQ 安全组 安全组默认规则 ECS安全组中规则的优先级执行匹配顺序说明 ECS安全组实践(一) ECS安全组实践(二) ECS安全组实践(三)

2019-12-01 22:57:07 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 您可以添加安全组规则,允许或禁止安全组内的ECS实例对公网或私网的访问: VPC网络:只需要设置出方向或入方向的规则,不区分内网和公网。专有网络(VPC)实例的公网访问通过私网网卡映射完成,所以,您在实例内部看不到公网网卡,在安全组里也只能设置内网规则。您设置的安全组规则同时对内网和公网生效。 经典网络:需要分别设置公网或内网的出方向或入方向规则。 安全组规则的变更会自动应用到安全组内的ECS实例上。 前提条件 您已经创建了一个安全组,具体操作,请参见 创建安全组。 您已经知道自己的实例需要允许或禁止哪些公网或内网的访问。 操作步骤 登录 云服务器ECS管理控制台。 在左侧导航栏中,选择 网络和安全 > 安全组。 选择地域。 找到要配置授权规则的安全组,在 操作 列中,单击 配置规则。 在 安全组规则 页面上,单击 添加安全组规则。 说明 如果您不需要设置ICMP、GRE协议规则,或者您想使用下表中列出的协议的默认端口,单击 快速创建规则。 每个安全组的入方向规则与出方向规则的总数不能超过100条。 协议 SSH telnet HTTP HTTPS MS SQL 端口 22 23 80 443 1433 协议 Oracle MySQL RDP PostgreSQL Redis 端口 1521 3306 3389 5432 6379 说明 各个参数配置说明,请参见第6步描述。 在弹出的对话框中,设置以下参数: 网卡类型: 如果是VPC类型的安全组,不需要选择这个参数。需要注意以下信息: 如果您的实例能访问公网,可以设置公网和内网的访问规则。 如果您的实例不能访问公网,只能设置内网的访问规则。 如果是经典网络的安全组,选择 公网 或 内网。 规则方向: 出方向:是指ECS实例访问内网中其他ECS实例或者公网上的资源。 入方向:是指内网中的其他ECS实例或公网上的资源访问ECS实例。 授权策略:选择 允许 或 拒绝。 说明 这里的 拒绝 策略是直接丢弃数据包,不给任何回应信息。如果2个安全组规则其他都相同只有授权策略不同,则 拒绝 授权生效,接受 授权不生效。 协议类型 和 端口范围:端口范围的设置受协议类型影响。下表是协议类型与端口范围的关系。 协议类型 端口范围 应用场景 全部 显示为-1/-1,表示不限制端口。不能设置。 可用于完全互相信任的应用场景。 全部ICMP 显示为-1/-1,表示不限制端口。不能设置。 使用 ping 程序检测实例之间的通信状况。 全部GRE 显示为-1/-1,表示不限制端口。不能设置。 用于VPN服务。 自定义TCP 自定义端口范围,有效的端口值是1 ~ 65535,端口范围的合法格式是开始端口/结束端口。即使是一个端口,也需要采用合法格式设置端口范围,比如:80/80表示端口80。 可用于允许或拒绝一个或几个连续的端口。 自定义UDP SSH 显示为22/22。 连接ECS实例后您能修改端口号,具体操作,请参见 服务器默认远程端口修改。 用于SSH远程连接到Linux实例。 TELNET 显示为23/23。 用于Telnet远程登录实例。 HTTP 显示为80/80。 实例作为网站或Web应用服务器。 HTTPS 显示为443/443。 实例作为支持HTTPS协议的网站或Web应用服务器。 MS SQL 显示为1433/1433。 实例作为MS SQL服务器。 Oracle 显示为1521/1521。 实例作为Oracle SQL服务器。 MySQL 显示为3306/3306。 实例作为MySQL服务器。 RDP 显示为3389/3389。 连接ECS实例后您能修改端口号,具体操作,请参见 服务器默认远程端口修改。 实例是Windows实例,需要远程桌面连接实例。 PostgreSQL 显示为5432/5432。 实例作为PostgreSQL服务器。 Redis 显示为6379/6379。 实例作为Redis服务器。 说明 公网出方向的STMP端口25默认受限,无法通过安全组规则打开,但是您可以 申请解封端口25。其他常用端口信息,请参见 ECS 实例常用端口介绍。 授权类型 和 授权对象:授权对象的设置受授权类型影响,以下是两者之间的关系。 授权类型 授权对象 地址段访问 填写单一IP地址或者CIDR网段格式,如:12.1.1.1或13.1.1.1/25。仅支持IPv4。如果填写0.0.0.0/0表示允许或拒绝所有IP地址的访问,设置时请务必谨慎。 关于CIDR格式介绍,请参见 ECS实例子网划分和掩码表示方法。 安全组访问 只对内网有效。授权本账号或其他账号下某个安全组中的实例访问本安全组中的实例,实现内网互通。 本账号授权:选择同一账号下的其他安全组ID。如果是VPC网络的安全组,必须为同一个VPC的安全组。 跨账号授权:填写目标安全组ID,以及对方账号ID。在 账号管理 > 安全设置 里查看账号ID。 因为安全组访问只对内网有效,所以,对VPC网络实例,安全组访问的规则仅适用于内网访问,不适用于公网访问。公网访问只能通过 地址段访问 授权。 说明 出于安全性考虑,经典网络的内网入方向规则,授权类型优先选择 安全组访问。如果选择 地址段访问,则只能授权单个IP地址,授权对象的格式只能是 a.b.c.d/32,仅支持IPv4,子网掩码必须是 /32。 优先级:1 ~ 100,数值越小,优先级越高。更多优先级信息,参见 ECS安全组规则优先级说明。 单击 确定,即成功地为指定安全组添加了一条安全组规则。 安全组规则一般是立即生效,但是也可能有稍许延迟。 查看安全组规则是否生效 假设您在实例里安装了Web服务,并在一个安全组里添加了一条安全组规则:公网入方向,允许所有IP地址访问实例的TCP 80端口。 Linux实例 如果是安全组中的一台Linux实例,按以下步骤查看安全组规则是否生效。 使用用户名密码验证连接 Linux 实例。 运行以下命令查看TCP 80是否被监听。netstat -an | grep 80如果返回以下结果,说明TCP 80端口已开通。tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN 在浏览器地址栏里输入 http://实例公网IP地址。如果访问成功,说明规则已经生效。 Windows实例 如果是安全组中的一台Windows实例,按以下步骤查看安全组规则是否生效。 使用软件连接Windows实例。 运行 命令提示符,输入以下命令查看TCP 80是否被监听。netstat -aon | findstr :80如果返回以下结果,说明TCP 80端口已开通。TCP    0.0.0.0:80           0.0.0.0:0              LISTENING       1172 在浏览器地址栏里输入 http://实例公网IP地址。如果访问成功,说明规则已经生效。 ECS安全组规则优先级说明 安全组规则的优先级可以设为1 ~ 100的任一个数值,数值越小,优先级越高。 ECS实例可以加入不同的安全组。无论是同一个安全组内或不同安全组之间,如果安全组规则互相矛盾,即协议类型、端口范围、授权类型、授权对象都相同,最终生效的安全组规则如下: 如果 优先级 相同,则 拒绝 授权规则生效,接受 授权规则不生效。 如果 优先级 不同,则优先级高的规则生效,与 授权策略 的设置无关。 相关文档 安全组FAQ 安全组 安全组默认规则 ECS安全组中规则的优先级执行匹配顺序说明 ECS安全组实践(一) ECS安全组实践(二) ECS安全组实践(三)

2019-12-01 22:57:07 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 您可以添加安全组规则,允许或禁止安全组内的ECS实例对公网或私网的访问: VPC网络:只需要设置出方向或入方向的规则,不区分内网和公网。专有网络(VPC)实例的公网访问通过私网网卡映射完成,所以,您在实例内部看不到公网网卡,在安全组里也只能设置内网规则。您设置的安全组规则同时对内网和公网生效。 经典网络:需要分别设置公网或内网的出方向或入方向规则。 安全组规则的变更会自动应用到安全组内的ECS实例上。 前提条件 您已经创建了一个安全组,具体操作,请参见 创建安全组。 您已经知道自己的实例需要允许或禁止哪些公网或内网的访问。 操作步骤 登录 云服务器ECS管理控制台。 在左侧导航栏中,选择 网络和安全 > 安全组。 选择地域。 找到要配置授权规则的安全组,在 操作 列中,单击 配置规则。 在 安全组规则 页面上,单击 添加安全组规则。 说明 如果您不需要设置ICMP、GRE协议规则,或者您想使用下表中列出的协议的默认端口,单击 快速创建规则。 每个安全组的入方向规则与出方向规则的总数不能超过100条。 协议 SSH telnet HTTP HTTPS MS SQL 端口 22 23 80 443 1433 协议 Oracle MySQL RDP PostgreSQL Redis 端口 1521 3306 3389 5432 6379 说明 各个参数配置说明,请参见第6步描述。 在弹出的对话框中,设置以下参数: 网卡类型: 如果是VPC类型的安全组,不需要选择这个参数。需要注意以下信息: 如果您的实例能访问公网,可以设置公网和内网的访问规则。 如果您的实例不能访问公网,只能设置内网的访问规则。 如果是经典网络的安全组,选择 公网 或 内网。 规则方向: 出方向:是指ECS实例访问内网中其他ECS实例或者公网上的资源。 入方向:是指内网中的其他ECS实例或公网上的资源访问ECS实例。 授权策略:选择 允许 或 拒绝。 说明 这里的 拒绝 策略是直接丢弃数据包,不给任何回应信息。如果2个安全组规则其他都相同只有授权策略不同,则 拒绝 授权生效,接受 授权不生效。 协议类型 和 端口范围:端口范围的设置受协议类型影响。下表是协议类型与端口范围的关系。 协议类型 端口范围 应用场景 全部 显示为-1/-1,表示不限制端口。不能设置。 可用于完全互相信任的应用场景。 全部ICMP 显示为-1/-1,表示不限制端口。不能设置。 使用 ping 程序检测实例之间的通信状况。 全部GRE 显示为-1/-1,表示不限制端口。不能设置。 用于VPN服务。 自定义TCP 自定义端口范围,有效的端口值是1 ~ 65535,端口范围的合法格式是开始端口/结束端口。即使是一个端口,也需要采用合法格式设置端口范围,比如:80/80表示端口80。 可用于允许或拒绝一个或几个连续的端口。 自定义UDP SSH 显示为22/22。 连接ECS实例后您能修改端口号,具体操作,请参见 服务器默认远程端口修改。 用于SSH远程连接到Linux实例。 TELNET 显示为23/23。 用于Telnet远程登录实例。 HTTP 显示为80/80。 实例作为网站或Web应用服务器。 HTTPS 显示为443/443。 实例作为支持HTTPS协议的网站或Web应用服务器。 MS SQL 显示为1433/1433。 实例作为MS SQL服务器。 Oracle 显示为1521/1521。 实例作为Oracle SQL服务器。 MySQL 显示为3306/3306。 实例作为MySQL服务器。 RDP 显示为3389/3389。 连接ECS实例后您能修改端口号,具体操作,请参见 服务器默认远程端口修改。 实例是Windows实例,需要远程桌面连接实例。 PostgreSQL 显示为5432/5432。 实例作为PostgreSQL服务器。 Redis 显示为6379/6379。 实例作为Redis服务器。 说明 公网出方向的STMP端口25默认受限,无法通过安全组规则打开,但是您可以 申请解封端口25。其他常用端口信息,请参见 ECS 实例常用端口介绍。 授权类型 和 授权对象:授权对象的设置受授权类型影响,以下是两者之间的关系。 授权类型 授权对象 地址段访问 填写单一IP地址或者CIDR网段格式,如:12.1.1.1或13.1.1.1/25。仅支持IPv4。如果填写0.0.0.0/0表示允许或拒绝所有IP地址的访问,设置时请务必谨慎。 关于CIDR格式介绍,请参见 ECS实例子网划分和掩码表示方法。 安全组访问 只对内网有效。授权本账号或其他账号下某个安全组中的实例访问本安全组中的实例,实现内网互通。 本账号授权:选择同一账号下的其他安全组ID。如果是VPC网络的安全组,必须为同一个VPC的安全组。 跨账号授权:填写目标安全组ID,以及对方账号ID。在 账号管理 > 安全设置 里查看账号ID。 因为安全组访问只对内网有效,所以,对VPC网络实例,安全组访问的规则仅适用于内网访问,不适用于公网访问。公网访问只能通过 地址段访问 授权。 说明 出于安全性考虑,经典网络的内网入方向规则,授权类型优先选择 安全组访问。如果选择 地址段访问,则只能授权单个IP地址,授权对象的格式只能是 a.b.c.d/32,仅支持IPv4,子网掩码必须是 /32。 优先级:1 ~ 100,数值越小,优先级越高。更多优先级信息,参见 ECS安全组规则优先级说明。 单击 确定,即成功地为指定安全组添加了一条安全组规则。 安全组规则一般是立即生效,但是也可能有稍许延迟。 查看安全组规则是否生效 假设您在实例里安装了Web服务,并在一个安全组里添加了一条安全组规则:公网入方向,允许所有IP地址访问实例的TCP 80端口。 Linux实例 如果是安全组中的一台Linux实例,按以下步骤查看安全组规则是否生效。 使用用户名密码验证连接 Linux 实例。 运行以下命令查看TCP 80是否被监听。netstat -an | grep 80如果返回以下结果,说明TCP 80端口已开通。tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN 在浏览器地址栏里输入 http://实例公网IP地址。如果访问成功,说明规则已经生效。 Windows实例 如果是安全组中的一台Windows实例,按以下步骤查看安全组规则是否生效。 使用软件连接Windows实例。 运行 命令提示符,输入以下命令查看TCP 80是否被监听。netstat -aon | findstr :80如果返回以下结果,说明TCP 80端口已开通。TCP    0.0.0.0:80           0.0.0.0:0              LISTENING       1172 在浏览器地址栏里输入 http://实例公网IP地址。如果访问成功,说明规则已经生效。 ECS安全组规则优先级说明 安全组规则的优先级可以设为1 ~ 100的任一个数值,数值越小,优先级越高。 ECS实例可以加入不同的安全组。无论是同一个安全组内或不同安全组之间,如果安全组规则互相矛盾,即协议类型、端口范围、授权类型、授权对象都相同,最终生效的安全组规则如下: 如果 优先级 相同,则 拒绝 授权规则生效,接受 授权规则不生效。 如果 优先级 不同,则优先级高的规则生效,与 授权策略 的设置无关。 相关文档 安全组FAQ 安全组 安全组默认规则 ECS安全组中规则的优先级执行匹配顺序说明 ECS安全组实践(一) ECS安全组实践(二) ECS安全组实践(三)

2019-12-01 22:57:08 0 浏览量 回答数 0

回答

详细解答可以参考官方帮助文档 您可以添加安全组规则,允许或禁止安全组内的ECS实例对公网或私网的访问: VPC网络:只需要设置出方向或入方向的规则,不区分内网和公网。专有网络(VPC)实例的公网访问通过私网网卡映射完成,所以,您在实例内部看不到公网网卡,在安全组里也只能设置内网规则。您设置的安全组规则同时对内网和公网生效。 经典网络:需要分别设置公网或内网的出方向或入方向规则。 安全组规则的变更会自动应用到安全组内的ECS实例上。 前提条件 您已经创建了一个安全组,具体操作,请参见 创建安全组。 您已经知道自己的实例需要允许或禁止哪些公网或内网的访问。 操作步骤 登录 云服务器ECS管理控制台。 在左侧导航栏中,选择 网络和安全 > 安全组。 选择地域。 找到要配置授权规则的安全组,在 操作 列中,单击 配置规则。 在 安全组规则 页面上,单击 添加安全组规则。 说明 如果您不需要设置ICMP、GRE协议规则,或者您想使用下表中列出的协议的默认端口,单击 快速创建规则。 每个安全组的入方向规则与出方向规则的总数不能超过100条。 协议 SSH telnet HTTP HTTPS MS SQL 端口 22 23 80 443 1433 协议 Oracle MySQL RDP PostgreSQL Redis 端口 1521 3306 3389 5432 6379 说明 各个参数配置说明,请参见第6步描述。 在弹出的对话框中,设置以下参数: 网卡类型: 如果是VPC类型的安全组,不需要选择这个参数。需要注意以下信息: 如果您的实例能访问公网,可以设置公网和内网的访问规则。 如果您的实例不能访问公网,只能设置内网的访问规则。 如果是经典网络的安全组,选择 公网 或 内网。 规则方向: 出方向:是指ECS实例访问内网中其他ECS实例或者公网上的资源。 入方向:是指内网中的其他ECS实例或公网上的资源访问ECS实例。 授权策略:选择 允许 或 拒绝。 说明 这里的 拒绝 策略是直接丢弃数据包,不给任何回应信息。如果2个安全组规则其他都相同只有授权策略不同,则 拒绝 授权生效,接受 授权不生效。 协议类型 和 端口范围:端口范围的设置受协议类型影响。下表是协议类型与端口范围的关系。 协议类型 端口范围 应用场景 全部 显示为-1/-1,表示不限制端口。不能设置。 可用于完全互相信任的应用场景。 全部ICMP 显示为-1/-1,表示不限制端口。不能设置。 使用 ping 程序检测实例之间的通信状况。 全部GRE 显示为-1/-1,表示不限制端口。不能设置。 用于VPN服务。 自定义TCP 自定义端口范围,有效的端口值是1 ~ 65535,端口范围的合法格式是开始端口/结束端口。即使是一个端口,也需要采用合法格式设置端口范围,比如:80/80表示端口80。 可用于允许或拒绝一个或几个连续的端口。 自定义UDP SSH 显示为22/22。 连接ECS实例后您能修改端口号,具体操作,请参见 服务器默认远程端口修改。 用于SSH远程连接到Linux实例。 TELNET 显示为23/23。 用于Telnet远程登录实例。 HTTP 显示为80/80。 实例作为网站或Web应用服务器。 HTTPS 显示为443/443。 实例作为支持HTTPS协议的网站或Web应用服务器。 MS SQL 显示为1433/1433。 实例作为MS SQL服务器。 Oracle 显示为1521/1521。 实例作为Oracle SQL服务器。 MySQL 显示为3306/3306。 实例作为MySQL服务器。 RDP 显示为3389/3389。 连接ECS实例后您能修改端口号,具体操作,请参见 服务器默认远程端口修改。 实例是Windows实例,需要远程桌面连接实例。 PostgreSQL 显示为5432/5432。 实例作为PostgreSQL服务器。 Redis 显示为6379/6379。 实例作为Redis服务器。 说明 公网出方向的STMP端口25默认受限,无法通过安全组规则打开,但是您可以 申请解封端口25。其他常用端口信息,请参见 ECS 实例常用端口介绍。 授权类型 和 授权对象:授权对象的设置受授权类型影响,以下是两者之间的关系。 授权类型 授权对象 地址段访问 填写单一IP地址或者CIDR网段格式,如:12.1.1.1或13.1.1.1/25。仅支持IPv4。如果填写0.0.0.0/0表示允许或拒绝所有IP地址的访问,设置时请务必谨慎。 关于CIDR格式介绍,请参见 ECS实例子网划分和掩码表示方法。 安全组访问 只对内网有效。授权本账号或其他账号下某个安全组中的实例访问本安全组中的实例,实现内网互通。 本账号授权:选择同一账号下的其他安全组ID。如果是VPC网络的安全组,必须为同一个VPC的安全组。 跨账号授权:填写目标安全组ID,以及对方账号ID。在 账号管理 > 安全设置 里查看账号ID。 因为安全组访问只对内网有效,所以,对VPC网络实例,安全组访问的规则仅适用于内网访问,不适用于公网访问。公网访问只能通过 地址段访问 授权。 说明 出于安全性考虑,经典网络的内网入方向规则,授权类型优先选择 安全组访问。如果选择 地址段访问,则只能授权单个IP地址,授权对象的格式只能是 a.b.c.d/32,仅支持IPv4,子网掩码必须是 /32。 优先级:1 ~ 100,数值越小,优先级越高。更多优先级信息,参见 ECS安全组规则优先级说明。 单击 确定,即成功地为指定安全组添加了一条安全组规则。 安全组规则一般是立即生效,但是也可能有稍许延迟。 查看安全组规则是否生效 假设您在实例里安装了Web服务,并在一个安全组里添加了一条安全组规则:公网入方向,允许所有IP地址访问实例的TCP 80端口。 Linux实例 如果是安全组中的一台Linux实例,按以下步骤查看安全组规则是否生效。 使用用户名密码验证连接 Linux 实例。 运行以下命令查看TCP 80是否被监听。netstat -an | grep 80如果返回以下结果,说明TCP 80端口已开通。tcp        0      0 0.0.0.0:80                  0.0.0.0:*                   LISTEN 在浏览器地址栏里输入 http://实例公网IP地址。如果访问成功,说明规则已经生效。 Windows实例 如果是安全组中的一台Windows实例,按以下步骤查看安全组规则是否生效。 使用软件连接Windows实例。 运行 命令提示符,输入以下命令查看TCP 80是否被监听。netstat -aon | findstr :80如果返回以下结果,说明TCP 80端口已开通。TCP    0.0.0.0:80           0.0.0.0:0              LISTENING       1172 在浏览器地址栏里输入 http://实例公网IP地址。如果访问成功,说明规则已经生效。 ECS安全组规则优先级说明 安全组规则的优先级可以设为1 ~ 100的任一个数值,数值越小,优先级越高。 ECS实例可以加入不同的安全组。无论是同一个安全组内或不同安全组之间,如果安全组规则互相矛盾,即协议类型、端口范围、授权类型、授权对象都相同,最终生效的安全组规则如下: 如果 优先级 相同,则 拒绝 授权规则生效,接受 授权规则不生效。 如果 优先级 不同,则优先级高的规则生效,与 授权策略 的设置无关。 相关文档 安全组FAQ 安全组 安全组默认规则 ECS安全组中规则的优先级执行匹配顺序说明 ECS安全组实践(一) ECS安全组实践(二) ECS安全组实践(三)

2019-12-01 22:57:06 0 浏览量 回答数 0
阿里云大学 云服务器ECS com域名 网站域名whois查询 开发者平台 小程序定制 小程序开发 国内短信套餐包 开发者技术与产品 云数据库 图像识别 开发者问答 阿里云建站 阿里云备案 云市场 万网 阿里云帮助文档 免费套餐 开发者工具 云栖号物联网 小程序开发制作 视频内容分析 企业网站制作 视频集锦 代理记账服务 2020阿里巴巴研发效能峰会 企业建站模板 云效成长地图 高端建站 云栖号弹性计算 阿里云云栖号 云栖号案例 云栖号直播