A. redis2.2和redis2.8的区别
根据Redis 两个版本的测试结果对比得出以下结论
一、Redis 2.6主从同步在网络闪断的情况下会自动开启新的端口进行重新链,同时会进行一下操作:
1、断开链接的从会向主发送SYNC命令
2、然后主fork进程导出rdb文件发送到从
3、从接收到完整的数据后,清空Redis内数据然后在从RDB中恢复
但是根据测试结果发现以下问题:
1、多个主从关系同时断开的时候,主导出RDB文件时,会占用大量内存
2、从接收到完整数据后,恢复数据的时候,会清空数据,这时候由于Redis数据量很大,目前10G左右内存恢复速度大约1分钟左右,这一分钟内,很多请求无法获取数据
3、在从RDB恢复数据的过程中,部分请求会被阻塞,导致请求超时(目前报警无法获取数据根次有关)
二、Redis 2.8.8 没有发现以上问题,因为Redis 2.8链接闪断重新连接后,从会从断开之前的主从同步进度开始继续同步,不会有全量恢复的问题
三、Redis 2.8 和 Redis 2.6 在进行save操作的时候,save过程中所有的请求都会被阻塞,导致前端请求失败,所以不要再查询的从上进行save操作
根据以上得出建议:
1、Redis 升级到 2.8 以上,保证数据主从同步时候的可用性
2、不要直接在Redis从或主上进行save操作,可以按王彬的建议在关键节点增加新的从用于save备份使用
3、建议优化Redis存储,单个端口存储数据不要过大,这样可以保证单个端口挂掉数据数据时候的速度,和影响面积
Redis 2.8和SSDB性能对比
SSDB 1.6.8.6
顺序写 : 1.645 ms/op 59.4 MB/s
随机写 : 1.679 ms/op 58.2 MB/s
顺序读 : 1.286 ms/op 75.9 MB/s
随机读 : 1.225 ms/op 79.7 MB/s
rpush : 1.546 ms/op 63.2 MB/s
lpop : 1.303 ms/op 74.9 MB/s
Redis 2.8.8
顺序写 : 1.617 ms/op 60.4 MB/s
随机写 : 1.214 ms/op 80.4 MB/s
顺序读 : 1.156 ms/op 84.5 MB/s
随机读 : 1.153 ms/op 84.7 MB/s
rpush : 1.222 ms/op 79.9 MB/s
lpop : 1.153 ms/op 84.7 MB/s
分类一:键值数据库
Redis, Voldemort, Oracle BDB,国内的ssdb
分类二:列存储数据库
Cassandra, HBase
分类三:文档型数据库
CouchDB, MongoDb,国内的SequoiaDB
分类四:图形(Graph)数据库
Neo4J, InfoGrid, Infinite Graph
C. vb题len("right("student",5)")
一、Len:求字符串的长度,返回 Long,其中包含字符串内字符的数目,或是存储一变量所需的字节数。
语法
Len(string | varname)
Right是取指定数量的字符。返回 Variant (String),其中包含从字符串右边取出的指定数量的字符。
语法
Right(string, length)
二、如同:yp314311所说的一样,Dim a(9)As Intger 共有10个元素,VB数组是以0为默认下标的,从0到9一共10个。
三、用Unload来卸载手动创建的控件,哈,没试过,不过应该不行吧!你试试喽。
四、用VB程序代码建立一个数据连接(D:\DATABASE\STUDENT.MDB)并打开连接,这里有几种方法,你试下。
第一种:
Dim rsAccess As Recordset
Dim ConnAccess As New Connection
Dim StrSQLAccess As String
Dim i As Integer
DBSeaverPath="D:\DATABASE"
ConnAccess.Open "PROVIDER=Microsoft.Jet.OLEDB.4.0;Data Source=" + DBSeaverPath + IIf(Len(DBSeaverPath) > 3, "\" &
"STUDENT.MDB;", "STUDENT.MDB;") + " Jet OLEDB:Database Password=;"
StrSQLAccess = "Select * from Users order by id asc"
Set rsAccess = New Recordset
rsAccess.Open StrSQLAccess, ConnAccess, adOpenStatic, adLockOptimistic
If rsAccess.RecordCount = 0 Then End
'Do While Not rsAccess.EOF
' ComboUserName.AddItem rsAccess!Username '此处调用
' rsAccess.MoveNext
'Loop'
rsAccess.Close
Set rsAccess = Nothing
ConnAccess.Close
Set ConnAccess = Nothing
第二种:
Dim strSQL As String
Dim OldWs As Workspace, mainDb As Database, TableMain As Recordset
Condata = "D:\DATABASE\STUDENT.MDB"
SaveSetting App.EXEName, "Data", "Path", Condata
ConStr = ";UID=" & ";PWD="
Set OldWs = DBEngine.Workspaces(0)
Set mainDb = OldWs.OpenDatabase(Condata, False, False, ConStr)
'mainDb.Execute "delete Users"' '此为删除
Set TableMain = mainDb.OpenRecordset("select * from Users" & strSearchString)
TableMain.LockEdits = False
'Do Until TableMain.EOF
' If Not IsNull(TableMain("UserName").Value) Then
' UserNameText.AddItem TableMain("UserName").Value
' End If
'TableMain.MoveNext
'Loop
TableMain.Close
Set TableMain = Nothing
mainDb.Close
Set mainDb = Nothing
第三种:
'这是直接用控件,在窗体是放一个DATA控件再直接用,方便!
strSQL = "select * from Users order by id asc"
Data1.DatabaseName = "D:\DATABASE\STUDENT.MDB"
Data1.RecordSource = strSQL
Data1.Refresh
第四种:
'“工程”菜单中选择“引用”菜单选择“Microsoft DAO 3.51 Object Library”项'
Public AcessDB As Database
Dim TableMain As RecordSet
Public Sub OpenDatabase ( )
Dim sConeect As String
SConnect = ";PWD =; UID ="
Set AcessDB = Nothing
Set AcessDB = WorksPaces (0 ).OpenDatabase ("D:\DATABASE\STUDENT.MDB",False,sConnect)
End Sub
Set TableMain = AcessDB.OpenRecordSet ( "Users",dbOpenSnapshot )
'Do While Not TableMain.EOF
' ComboUserName.AddItem TableMain!Username '此处调用
' TableMain.MoveNext
'Loop
AcessDB.Close
Set AcessDB = Nothing
TableMain.Close
Set TableMain = Nothing
五、WITH语句主要用在控件对像多属性设置时,在一个单一对象或一个用户定义类型上执行一系列的语句。具体说明如下:
语法
With object
[statements]
End With
With 语句的语法具有以下几个部分:
描述
object 必要参数。一个对象或用户自定义类型的名称。
statements 可选参数。要执行在 object 上的一条或多条语句。
说明
With 语句可以对某个对象执行一系列的语句,而不用重复指出对象的名称。例如,要改变一个对象的多个属性,可以在 With 控制结构中加上
属性的赋值语句,这时候只是引用对象一次而不是在每个属性赋值时都要引用它。下面的例子显示了如何使用 With 语句来给同一个对象的几
个属性赋值。
With MyLabel
.Height = 2000
.Width = 2000
.Caption = "This is MyLabel"
End With
注意 当程序一旦进入 With 块,object 就不能改变。因此不能用一个 With 语句来设置多个不同的对象。
可以将一个 With 块放在另一个之中,而产生嵌套的 With 语句。但是,由于外层 With 块成员会在内层的 With 块中被屏蔽住,所以必须在
内层的 With 块中,使用完整的对象引用来指出在外层的 With 块中的对象成员。
重点 一般来说,建议您不要跳入或跳出 With 块。如果在 With 块中的语句被执行,但是 With 或 End With 语句并没有执行,则一个包含对
该对象引用的临时变量将保留在内存中,直到您退出该过程。
参考:Visual Basic 语言参考-函数速查
D. 如何使用SSDB的zscan命令
SSDB(LevelDB 服务器, NoSQL 存储方案)的 zscan 是最强大的一条命令, 因为它操作的是 zset(sorted set) 数据类型, 只需要一条 zscan 命令就能直接地表达业务逻辑, "所写即所想". 例如, 获取用户的未读消息列表, 获取按上架时间排序的商品列表, 获取微博 timeline...
zset 可以理解为关系数据库里具有两个字段的表, 一个字段是 key, UNIQUE 索引, 也即数据的唯一标识; 另一个字段是浮点型 score, 每一个 key 对应的排序权重值. 在关系数据库中, 要分页遍历数据, 就要执行类似的一条 SQL 查询:
select * from table order by score, key limit start, size
每一次查询都会进行排序, 性能非常低. 而 SSDB 的 zset 中的数据是已经排好序的, 读取时不需要进行排序. zscan 的命令原型为:
zscan name key_start score_start score_end limit
- name: 列表的标识
- key_start: 分页遍历列表时, 上一次遍历到的最大(score)的一条数据 key
- score_start: 上一次遍历到的数据的排序权重值最大值
- score_end: 想要遍历的数据的排序权重值最大值
- limit: 分页返回一次的数据条数
假设购物网站中有这样的一个商品表:
id, title, price, update_time
展示商品列表时, 有时需要按价格 price 排序, 有时需要按更新时间 update_time 排序, 用 SSDB 怎么解决? 那就需要建两个 zset:
#zset 1
key = id
score = price
#zset 2
key = id
score = update_time
这就是 NoSQL 的常用设计模式, 将带有 N 字段的关系数据库表分解成 N-1 个每个只有 2 个字段的数据库表, 这样每个表对应一个 SSDB 的 zset.
E. jmeter 控制台有summary,输出文件没有
一、配置java环境 1:先查看系统32/64: uname -a 根据系统的版本去Oracle官网下载jdk,下载后安装jdk即可。 2:配置JAVA环境变量: vi /etc/profile 追加如下内容: JAVA_HOME=/opt/jdk1.6.0_20 PATH=$JAVA_HOME/bin:$PATH CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/tools.jar export JAVA_HOME export PATH export CLASSPATH 其中的JAVA_HOME为jdk的安装路径 3:验证 echo $PATH 或者 java -version 二、安装resin 下载resin后,解压运行安装脚本: ./resin.sh console。然后在自己pc上访问 server ip:port 看到resin默认欢迎页面即说明安装成功。之后把在web项目的war包拷进 ren目录下的webapps 文件夹内,即可在外网访问服务器上的web项目了。 三、 安装jmeter 下载:同样在jemeter官网下载 对应的安装包,解压后执行:./jmeter -n -t ../ssdb_test.jmx -l ../log.jtl 命令说明: a.-n 参数说明不用验证是否安装了图形库 b. .jmx文件可以在windows环境下的用jmeter图形化生成,涉及参数以及测试结果的.csv文件路径可以直接 用notepad++ vi 等修改.jmx文件,确保其相对于.jmx文件路径正确。 c.log.jtl 保存测试结果 既然没装图形界面库,那么测试结果.jtl文件就只能在windows下用jmeter来查看了。执行效果如下: [@zjm_44_250 bin]# ./jmeter -n -t ../ssdb_test.jmx -l ../log.jtl Creating summariser <summary> Created the tree successfully using ../ssdb_test.jmx Starting the test @ Mon Dec 29 18:43:20 CST 2014 (1419849800772) Waiting for possible shutdown message on port 4445 summary = 100 in 0.3s = 289.9/s Avg: 105 Min: 3 Max: 285 Err: 0 (0.00%) Tidying up ... @ Mon Dec 29 18:43:21 CST 2014 (1419849801734) ... end of run 最后,执行命令:/home/apache-jmeter-2.8/bin/jmeter -n -t download.jmx -l log.jtl linux下最好输全路径,不然可能报bash:jeter:command not found,找不到执行文件错误,参数介绍如下: -n This specifies JMeter is to run in non-gui mode -t [name of JMX file that contains the Test Plan]. -l [name of JTL file to log sample results to]. -r Run all remote servers specified in JMeter.properties (or remote servers specified on command line by overriding properties) The script also lets you specify the optional firewall/proxy server information: -H [proxy server hostname or ip address] -P [proxy server port]
F. Redis,SSDB,Memcache和MongoDB的区别
额,说一下个人意见:mongodb,一般用来存储比较大的数据,一般都是实时的,缓存成html没多大意义 memacahe 确实是缓存到内存的,但是不是一直在内存中,会通过机制存储到磁盘中,生成一个文档,可是设置隔多少时间存储一次
G. nosql数据库有哪些
分类一:键值数据库
Redis,
Voldemort,
Oracle
BDB,国内的ssdb
分类二:列存储数据库
Cassandra,
HBase
分类三:文档型数据库
CouchDB,
MongoDb,国内的SequoiaDB
分类四:图形(Graph)数据库
Neo4J,
InfoGrid,
Infinite
Graph
H. 架构高可用高并发系统的设计原则
通过学习《亿级流量网站架构核心技术》及《linux就该这么学》学习笔记及自己的感悟:架构设计之高可用高并发系统设计原则,架构设计包括墨菲定律、康威定律和二八定律三大定律,而系统设计包括高并发原则、高可用和业务设计原则等。
架构设计三大定律
墨菲定律 – 任何事没有表面看起来那么简单 – 所有的事都会比预计的时间长 – 可能出错的事情总会出错 – 担心某种事情发生,那么它就更有可能发生
康威定律 – 系统架构师公司组织架构的反映 – 按照业务闭环进行系统拆分/组织架构划分,实现闭环、高内聚、低耦合,减少沟通成本 – 如果沟通出现问题,应该考虑进行系统和组织架构的调整 – 适合时机进行系统拆分,不要一开始就吧系统、服务拆分拆的非常细,虽然闭环,但是每个人维护的系统多,维护成本高 – 微服务架构的理论基础 – 康威定律https://yq.aliyun.com/articles/8611– 每个架构师都应该研究下康威定律http://36kr.com/p/5042735.html
二八定律 – 80%的结果取决于20%的原因
系统设计遵循的原则
1.高并发原则
无状态
无状态应用,便于水平扩展
有状态配置可通过配置中心实现无状态
实践: Disconf、Yaconf、Zookpeer、Consul、Confd、Diamond、Xdiamond等
拆分
系统维度:按照系统功能、业务拆分,如购物车,结算,订单等
功能维度:对系统功能在做细粒度拆分
读写维度:根据读写比例特征拆分;读多,可考虑多级缓存;写多,可考虑分库分表
AOP维度: 根据访问特征,按照AOP进行拆分,比如商品详情页可分为CDN、页面渲染系统,CDN就是一个AOP系统
模块维度:对整体代码结构划分Web、Service、DAO
服务化
服务化演进: 进程内服务-单机远程服务-集群手动注册服务-自动注册和发现服务-服务的分组、隔离、路由-服务治理
考虑服务分组、隔离、限流、黑白名单、超时、重试机制、路由、故障补偿等
实践:利用Nginx、HaProxy、LVS等实现负载均衡,ZooKeeper、Consul等实现自动注册和发现服
消息队列
目的: 服务解耦(一对多消费)、异步处理、流量削峰缓冲等
大流量缓冲: 牺牲强一致性,保证最终一致性(案例:库存扣减,现在Redis中做扣减,记录扣减日志,通过后台进程将扣减日志应用到DB)
数据校对: 解决异步消息机制下消息丢失问题
数据异构
数据异构: 通过消息队列机制接收数据变更,原子化存储
数据闭环: 屏蔽多从数据来源,将数据异构存储,形成闭环
缓存银弹
用户层:
DNS缓存
浏览器DNS缓存
操作系统DNS缓存
本地DNS服务商缓存
DNS服务器缓存
客户端缓存
浏览器缓存(Expires、Cache-Control、Last-Modified、Etag)
App客户缓存(js/css/image…)
代理层:
CDN缓存(一般基于ATS、Varnish、Nginx、Squid等构建,边缘节点-二级节点-中心节点-源站)
接入层:
Opcache: 缓存PHP的Opcodes
Proxy_cache: 代理缓存,可以存储到/dev/shm或者SSD
FastCGI Cache
Nginx+Lua+Redis: 业务数据缓存
Nginx为例:
PHP为例:
应用层:
页面静态化
业务数据缓存(Redis/Memcached/本地文件等)
消息队列
数据层:
NoSQL: Redis、Memcache、SSDB等
MySQL: Innodb/MyISAM等Query Cache、Key Cache、Innodb Buffer Size等
系统层:
CPU : L1/L2/L3 Cache/NUMA
内存
磁盘:磁盘本身缓存、dirtyratio/dirtybackground_ratio、阵列卡本身缓存
并发化
2.高可用原则
降级
降级开关集中化管理:将开关配置信息推送到各个应用
可降级的多级读服务:如服务调用降级为只读本地缓存
开关前置化:如Nginx+lua(OpenResty)配置降级策略,引流流量;可基于此做灰度策略
业务降级:高并发下,保证核心功能,次要功能可由同步改为异步策略或屏蔽功能
限流
目的: 防止恶意请求攻击或超出系统峰值
实践:
恶意请求流量只访问到Cache
穿透后端应用的流量使用Nginx的limit处理
恶意IP使用Nginx Deny策略或者iptables拒绝
切流量
目的:屏蔽故障机器
实践:
DNS: 更改域名解析入口,如DNSPOD可以添加备用IP,正常IP故障时,会自主切换到备用地址;生效实践较慢
HttpDNS: 为了绕过运营商LocalDNS实现的精准流量调度
LVS/HaProxy/Nginx: 摘除故障节点
可回滚
发布版本失败时可随时快速回退到上一个稳定版本
3.业务设计原则
防重设计
幂等设计
流程定义
状态与状态机
后台系统操作可反馈
后台系统审批化
文档注释
备份
4.总结
先行规划和设计时有必要的,要对现有问题有方案,对未来有预案;欠下的技术债,迟早都是要还的。
本文作者为网易高级运维工程师