redis、mysql、tcp/ip

11 篇文章 0 订阅
6 篇文章 0 订阅
一、redis
1、Redis本质上是一个Key-Value类型的内存数据库,很像memcached,整个数据库统统加载在内存当中进行操作,定期通过异步操作把数据库数据flush到硬盘上进行保存。因为是纯内存操作,Redis的性能非常出色,每秒可以处理超过 10万次读写操作,是已知性能最快的Key-Value DB。Redis的主要缺点是数据库容量受到物理内存的限制,不能用作海量数据的高性能读写,因此Redis适合的场景主要局限在较小数据量的高性能操作和运算上。




2setget其实不如hashset节省内存
用get/set方式使用Redis
作为一个key value存在,很多开发者自然的使用set/get方式来使用Redis,实际上这并不是最优化的使用方法。尤其在未启用VM情况下,Redis全部数据需要放入内存,节约内存尤其重要。


假如一个key-value单元需要最小占用512字节,即使只存一个字节也占了512字节。这时候就有一个设计模式,可以把key复用,几个key-value放入一个key中,value再作为一个set存入,这样同样512字节就会存放10-100倍的容量。
这就是为了节约内存,建议使用hashset而不是set/get的方式来使用Redis




3、备份使用aof代替snapshot
Redis有两种存储方式,默认是snapshot方式,实现方法是定时将内存的快照(snapshot)持久化到硬盘,这种方法缺点是持久化之后如果出现crash则会丢失一段数据。因此在完美主义者的推动下作者增加了aof方式。aof即append only mode,在写入内存数据的同时将操作命令保存到日志文件,在一个并发更改上万的系统中,命令日志是一个非常庞大的数据,管理维护成本非常高,恢复重建时间会非常长,这样导致失去aof高可用性本意。另外更重要的是Redis是一个内存数据结构模型,所有的优势都是建立在对内存复杂数据结构高效的原子操作上,这样就看出aof是一个非常不协调的部分。
其实aof目的主要是数据可靠性及高可用性,在Redis中有另外一种方法来达到目的:Replication。由于Redis的高性能,复制基本没有延迟。这样达到了防止单点故障及实现了高可用。




4. Memcache与Redis的区别都有哪些?
1)、存储方式
Memecache把数据全部存在内存之中,断电后会挂掉,数据不能超过内存大小。
Redis有部份存在硬盘上,这样能保证数据的持久性。
2)、数据支持类型
Memcache对数据类型支持相对简单。
Redis有复杂的数据类型。
3),value大小
redis最大可以达到1GB,而memcache只有1MB
4)关于速度上
这个我没有真实其测试过,但是之前看过文章说在100K以下数据量,读写redis会快与memcache,但是数据量超过100K的情况下redis性能不如memcache,
由于Redis只使用单核,而Memcached可以使用多核,所以在比较上,平均每一个核上Redis在存储小数据时比Memcached性能更高。而在100k以上的数据中,Memcached性能要高于Redis,虽然Redis最近也在存储大数据的性能上进行优化,但是比起Memcached,还是稍有逊色。说了这么多,结论是,无论你使用哪一个,每秒处理请求的次数都不会成为瓶颈。




5、redis锁有两种方式
1)setnx
2)事务watch、multi、exec(redis事务不支持回滚,官方解释:认为redis在执行事务不会出错,除非是程序中的罗逻辑错误,如果是程序逻辑错误就应该在开发、测试阶段就已经解决了,所以他们不提供事务回滚)


二、mysql
1)、MySQL的复制原理以及流程、基本原理流程,3个线程以及之间的关联;
答案:
  1. 主:binlog线程——记录下所有改变了数据库数据的语句,放进master上的binlog中;
  2. 从:io线程——在使用start slave 之后,负责从master上拉取 binlog 内容,放进 自己的relay log中;
  3. 从:sql执行线程——执行relay log中的语句;


2)MySQL中myisam与innodb的区别,至少5点
答案:
  (1)、问5点不同;
  1>.InnoDB支持事物,而MyISAM不支持事物
  2>.InnoDB支持行级锁,而MyISAM支持表级锁
  3>.InnoDB支持MVCC, 而MyISAM不支持
  4>.InnoDB支持外键,而MyISAM不支持
  5>.InnoDB不支持全文索引,而MyISAM支持。
  (2)、innodb引擎的4大特性
  插入缓冲(insert buffer),二次写(double write),自适应哈希索引(ahi),预读(read ahead)
  (3)、2select count(*)哪个更快,为什么
  myisam更快,因为myisam内部维护了一个计数器,可以直接调取,innodb要去实时统计


  MVCC:多版本控制

  全文索引:
    在MySQL中创建全文索引之后,现在就该了解如何使用了。众所周知,在数据库中进行模糊查询是使用LIKE关键字进行查询,例如:
    SELECT * FROM article WHERE content LIKE '%查询字符串%'
    那么,我们使用全文索引也是这样用的吗?当然不是,我们必须使用特有的语法才能使用全文索引进行查询。例如,我们想要在article表的title和content列中全文检索指定的查询字符串,可以如下编写SQL语句:
    SELECT * FROM article WHERE MATCH(title, content) AGAINST('查询字符串')
    强烈注意:MySQL自带的全文索引只能用于数据库引擎为MyISAM的数据表,如果是其他数据引擎,则全文索引不会生效。此外,MySQL自带的全文索引只能对英文进行全文检索,目前无法对中文进行全文检索。如果需要对包含中文在内的文本数据进行全文检索,我们需要采用Sphinx(斯芬克斯)/Coreseek技术来处理中文。本站将会在后续文章中对Sphinx以及Coreseek进行介绍。
    备注1:目前,使用MySQL自带的全文索引时,如果查询字符串的长度过短将无法得到期望的搜索结果。MySQL全文索引所能找到的词的默认最小长度为4个字符。另外,如果查询的字符串包含停止词,那么该停止词将会被忽略。
    备注2:如果可能,请尽量先创建表并插入所有数据后再创建全文索引,而不要在创建表时就直接创建全文索引,因为前者比后者的全文索引效率要高。






  3)MySQL中varchar与char的区别以及varchar(50)中的50代表的涵义
  (1)、varchar与char的区别
  char是一种固定长度的类型,varchar则是一种可变长度的类型(char定义20,存了10个实际也是占了20,varchar根据实际内容来计算存储省空间,但查询速度char会快一些)
  (2)、varchar(50)中50的涵义
  最多存放50个字符,varchar(50)和(200)存储hello所占空间一样,但后者在排序时会消耗更多内存,因为order by col采用fixed_length计算col长度(memory引擎也一样)
  (3)、int20)中20的涵义
  int(M) M表示最大显示宽度。最大有效显示宽度是255。显示宽度与存储大小或类型包含的值的范围无关。 
  在 int(M) 中,M 的值跟 int(M) 所占多少存储空间并无任何关系。 int(1)、int(4)、int(10) 在磁盘上都是占用 4 bytes 的存储空间。 
  说白了,除了显示给用户的方式有点不同外,int(M) 跟 int 数据类型是相同的。
  如果int的值为10 
  int10)显示结果为0000000010 
  int3)显示结果为010 
  就是显示的长度不一样而已,但都是占用四个字节的空间
  (4)、mysql为什么这么设计
  对大多数应用没有意义,只是规定一些工具用来显示字符的个数;int(1)和int(20)存储和计算均一样;




  4、MySQL数据库cpu飙升到500%的话他怎么处理?
  (1)、没有经验的,可以不问;
  (2)、有经验的,问他们的处理思路。
  列出所有进程  show processlist  观察所有进程  多秒没有状态变化的(干掉)
  查看超时日志或者错误日志 (做了几年开发,一般会是查询以及大批量的插入会导致cpu与i/o上涨,,,,当然不排除网络状态突然断了,,导致一个请求服务器只接受到一半,比如where子句或分页子句没有发送,,当然的一次被坑经历)




  5、sql优化
  1)explain后的每个字段代表的意思:
    select_type 
    示查询中每个select子句的类型(简单OR复杂)
    a. SIMPLE:查询中不包含子查询或者UNION
    b. 查询中若包含任何复杂的子部分,最外层查询则被标记为:PRIMARY
    c. 在SELECT或WHERE列表中包含了子查询,该子查询被标记为:SUBQUERY
    d. 在FROM列表中包含的子查询被标记为:DERIVED(衍生)用来表示包含在from子句中的子查询的select,mysql会递归执行并将结果放到一个临时表中。服务器内部称为"派生表",因为该临时表是从子查询中派生出来的
    e. 若第二个SELECT出现在UNION之后,则被标记为UNION;若UNION包含在FROM子句的子查询中,外层SELECT将被标记为:DERIVED
    f. 从UNION表获取结果的SELECT被标记为:UNION RESULT
    SUBQUERY和UNION还可以被标记为DEPENDENT和UNCACHEABLE。
    DEPENDENT意味着select依赖于外层查询中发现的数据。
    UNCACHEABLE意味着select中的某些 特性阻止结果被缓存于一个item_cache中。


    type
    表示MySQL在表中找到所需行的方式,又称“访问类型”,常见类型如下:
    ALL(全表扫描,explain select * from t1), 
    index(以索引的顺序进行全表扫描,优点是不用排序,缺点是还要全表扫描,explain select id from t1),  
    range(索引范围扫描,对索引的扫描开始于某一点,返回匹配值域的行。in、between、or、<、>等,explain select * from t1 where id between 1 and 4), 
    ref(使用非唯一索引扫描或者唯一索引的前缀扫描,返回匹配某个单独值的记录行,explain select * from t1 where name='yayun';), 
    eq_ref(类似ref,区别就在使用的索引是唯一索引,对于每个索引键值,表中只有一条记录匹配,简单来说,就是多表连接中使用primary key或者 unique key作为关联条件,>explain select t1.name from t1, t2 where t1.id=t2.id;), 
    const、system(当MySQL对查询某部分进行优化,并转换为一个常量时,使用这些类型访问。如将主键置于where列表中,MySQL就能将该查询转换为一个常量,explain select * from ( select * from t1 where id=1)b1;  注:system是const类型的特例,当查询的表只有一行的情况下,使用system), 
    NULL(MySQL在优化过程中分解语句,执行时甚至不用访问表或索引,例如从一个索引列里选取最小值可以通过单独索引查找完成,explain select * from t1 where id = (select min(id) from t2))
    从上到下,性能从最差到最好
    possible_keys 
    指出MySQL能使用哪个索引在表中找到行,查询涉及到的字段上若存在索引,则该索引将被列出,但不一定被查询使用
    key
    显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL
    key_len
    表示索引中使用的字节数,可通过该列计算查询中使用的索引的长度,在不损失精确性的情况下,长度越短越好
    ref
    表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 
    Extra
    包含不适合在其他列中显示但十分重要的额外信息






  2)profile的意义以及使用场景;
  查询到 SQL 会执行多少时间, 并看出 CPU/Memory 使用量, 执行过程中 Systemlock, Table lock 花多少时间等等






  3)索引以及联合索引的优化
  参考文章:https://www.cnblogs.com/softidea/p/5977860.html


  MySql在建立索引优化时需要注意的问题
  设计好MySql的索引可以让你的数据库飞起来,大大的提高数据库效率。设计MySql索引的时候有一下几点注意:
  1,创建索引
  对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加
  索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。
  但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。
  2,复合索引
  比如有一条语句是这样的:select * from users where area=’beijing’ and age=22;
  如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效
  率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age,salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。
  因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。
  3,索引不会包含有NULL值的列
  只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。
  4,使用短索引
  对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。
  5,排序的索引问题
  mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。
  6,like语句操作
  一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like “%aaa%” 不会使用索引而like “aaa%”可以使用索引。
  7,不要在列上进行运算
  select * from users where YEAR(adddate)
  8,不使用NOT IN和操作
  NOT IN和操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id3则可使用id>3 or id


三、tcp/ip协议
  参考文章:https://www.cnblogs.com/roverliang/p/5176456.html
          http://blog.csdn.net/samantha_wang/article/details/44241607

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
RedisMySQL一起作为单机的存储引擎时,读写过程通常包括以下几个步骤: 1. 客户端连接Redis服务器。客户端通过TCP/IP协议连接Redis服务器,并进行身份验证。 2. 客户端发送Redis命令。客户端向Redis服务器发送命令,包括读取和写入操作。 3. Redis服务器执行命令。Redis服务器根据接收到的命令执行相应的操作,包括读取和写入数据。 4. Redis服务器将结果返回给客户端。Redis服务器将执行结果返回给客户端,客户端进行相应的处理。 5. 当涉及到MySQL时,客户端可能需要将数据从Redis导入到MySQL中进行持久化存储,或者从MySQL中读取数据到Redis中进行缓存。 6. 客户端连接MySQL服务器。客户端通过TCP/IP协议连接MySQL服务器,并进行身份验证。 7. 客户端发送SQL命令。客户端向MySQL服务器发送SQL命令,包括查询、插入、更新、删除等操作。 8. MySQL服务器解析SQL命令。MySQL服务器对接收到的SQL命令进行解析,包括语法分析、词法分析等操作。 9. MySQL服务器执行SQL命令。MySQL服务器根据解析后的结果执行SQL命令,并返回执行结果。 10. MySQL服务器将结果返回给客户端。MySQL服务器将执行结果返回给客户端,客户端进行相应的处理。 在RedisMySQL一起作为单机存储引擎的环境下,Redis通常用作缓存层,MySQL用作持久化存储层。Redis可以提高读取性能,同时MySQL可以保证数据的持久化。当数据在Redis中过期或失效时,Redis会从MySQL中重新读取数据进行更新。这样可以充分利用Redis的高速读取性能,同时又不会影响数据的完整性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值