wordpress数据库设计

那些年使用WordPress踩过的坑,用WordPress要慎重

不得不说wordpress在国内的推广是非常的到位,虽然国内很多广告都直接从国外网站扒过来的,但是还是越来越多站长喜欢选择傻瓜式的 WordPress 作为网站的程序选择,但是,很多站长都是没有实战经验的,基本都是道途听说,认为 WordPress 怎么怎么好,又方便又简单,装个主题装个插件还不是顺手点一下鼠标的事情。

WordPress做个人博客网站的确很适合,但是如何你认为它是万能的,那基本就是踩坑的开始了,所以在这里我必须劝告所有即将做网站的站长同行们,如果你想长期做网站或商业类型网站,切忌使用 WordPress 作为你的程序选择。

WordPress 作为一个博客程序,开始设计的理念就是为写个人博客的人群准备的,而网站不同,网站是为了更高的点击率,更多的文章是很有必要的。试想,你见过谁写博客写过一万十万甚至百万级别的文章,除非这人脑有问题吧,大多数能达到以万来计数的文章篇数级别的 WordPress ,基本都采集来的垃圾站想做广告联盟赚取广告费。

作为一名过来人,也许你没经历过我的苦恼,也许你认为我在哗众取宠,但是这个可是事实,我的网站萝卜网,以及小X的网站异次元系列(异次元),都是用独立服务器托管的,每天PV大概在20万上下,这几天和小X交流,发现他也遇到了我的问题,那就是 WordPress 一旦达到这个访问量,文章数目又多的情况下,已经很难用一台服务器支撑了。

经过我御用技术员 WooDragon 的几天研究,瓶颈出在 MySQ查询语句没有经过任何优化,大量的查询,大量的数据库频繁写入写出,导致了大量的硬盘写入写出,直接的结果,就是导致内存爆满,CPU狂飙,服务器负载高得不能再高,然后,访问前台后台都奇慢无比,每天都像大姨妈似的就在某些访问人数多的时候出现这种情况。

在官方的 WordPress 优化建议页面(Link #1 #2)上,官方也有这么一条:

In high-traffic situations, many simultaneous connections to the database can cause excessive load on the server. In this case, connections to the server may not complete, causing the typical “Connection timed out” response in the visitor‘s browser.

连官方都承认高访问情况下,并发大的时候出问题是不能避免的,那么又有什么好的解决方法呢?

我发现国外用 WordPress 做得很大的网站比比皆是,经过几天的研究,我发现几乎他们都是用了多台服务器做负载均衡(Load Balanced Servers),那可是活生生的美元呀,这对于国内的中小网站来说,确实是一笔很大很大的成本。

同样的访问量,就拿萝卜网来说,每天1万左右的IP,如果是英文站,我可以很悠闲自得的购买 Load Balanced Servers ,然后花钱雇佣服务器管理员来解决这些问题。但是在国内,国内的IDC中,本身懂 Linux 服务器的就很少(好的都去大网站大公司了),懂 Load Balanced Servers 的更少,除非每天的流量实在太大,大到你认为在国内购买 Load Balanced Servers 都绰绰有余的地步。

杯具,纯粹的杯具,所以我的观点是:

1、 WordPress 只是一个博客程序,而不是内容管理系统(CMS),当初设计的时候就是为个人博客而设计,网上把wordpress说成万能程序的真是误导新人不浅。

2、 WordPress 每更新一个版本,就显得越来越臃肿,不禁让我想到了那只肥肥的国内企鹅。

3、 如果你是做中文站的,尽快摆脱 WordPress 吧,后台各种操作习惯老实说和国人习惯真心不太搭调。

4、数据稍微一多,你会发现网站各种卡顿,服务器cpu刷刷的往上升,如果访问量再大一点,你就明白龟速是什么样的,关于大数据下的优化和缓存、分表分库这些功能wordpress都没有。

如果你只是搭建个人博客网站,wordpress的确很适合,功能简单,没有国内cms系统那么多复杂的功能,安装一两个插件也可以弥补一些功能上不足。

如果你计划做一个商业性质的网站,尽量避免用 WordPress ,推荐用国内的成熟的CMS,比如PageAdmin、帝国、Discuz等等,这里不推荐dedecms,虽然功能很不错,但是安全性不好,很容易被挂马,所以也建议大家如果没有二开能力建议慎用。

MySQL启动多实例

MySQL是一款流行的开源数据库。我们在开发过程中常常会用到读写分离,分库分表,区分开发环境与预生产环境。如果只有一台机器能用,在做预演时就需要用到多实例。

多实例启动数据库有三种方式:

在不同虚拟机中运行,隔离运行环境。这种方式的缺点是开销大。在Docker中运行MySQL镜像。和虚拟机类似,运行环境隔离,但开销比虚拟机小很多。如果使用源或编译的方式安装的数据库,就需要配置MySQL多实例。

在生产环境下,数据库建议运行在物理机中。本章主要介绍第三种方式,配置MySQL多实例。

初始化数据库

数据库安装完成后,使用mysqld命令初始化数据库。

mysqld --initialize-insecure --datadir=/home/mysql/3307/data --user=mysql;mysqld --initialize-insecure --datadir=/home/mysql/3308/data --user=mysql;mysqld --initialize-insecure --datadir=/home/mysql/3309/data --user=mysql;

参数说明:

–initialize-insecure
对于Mysql 5.7.6以后的5.7系列版本,Mysql使用mysqld –initialize或mysqld –initialize-insecure命令来初始化数据库。前者会生成一个随机密码,在error.log的输出日志查找“A temporary password is generated for”可以看到。后者使用空密码。但是安装Mysql时默认使用的是前一个命令,这个命令也会生成一个随机密码,该密码保存在了Mysql的日志文件中。
–datadir
指定数据库存储目录
–user
指定数据库用户,注意该用户应对datadir目录有读写权限

在Ubuntu Server中可能会初始化失败,提示:mysqld: Can’t create directory ‘/home/mysql/3307/data/’ (Errcode: 17 – File exists)

这是因为Ubuntu Server从18.04开始引入AppArmor。

AppArmor是一个Linux系统安全应用程序,类似于Selinux,AppArmor默认安全策略定义个别应用程序可以访问系统资源和各自的特权,如果不设置服务的执行程序,即使你改了属主属组并0777权限,也是对服务起不到作用。

编辑AppArmor配置文件:

vi /etc/apparmor.d/usr.sbin.mysqld

找到“Allow data dir access”,把自己要指定的MySQL数据库目录加到列表就可以了。

重启AppArmor服务:systemctl restart apparmor

再执行初始化数据库命令。

配置多实例
MySQL自带了mysqld_multi工具运行多个实例。

新建文件 /etc/mysql/mysql.conf.d/mysqld_multi.cnf ,内容如下:

[mysqld_multi]mysqld = /usr/bin/mysqld_safemysqladmin = /usr/bin/mysqladminuser = root#password = # nextcloud[mysqld3307]user = mysqlpid-file = /home/mysql/3307/mysqld.pidsocket = /home/mysql/3307/mysqld.sockport = 3307datadir = /home/mysql/3307/datalc-messages-dir = /usr/share/mysqlskip-external-lockingbind-address = 0.0.0.0key_buffer_size = 16Mmax_allowed_packet = 16Mthread_stack = 192Kthread_cache_size = 8myisam-recover-options = BACKUPquery_cache_limit = 1Mquery_cache_size = 16Mexpire_logs_days = 10max_binlog_size = 100Minnodb_buffer_pool_size = 1Ginnodb_io_capacity = 4000# wordpress[mysqld3308]user = mysqlpid-file = /home/mysql/3308/mysqld.pidsocket = /home/mysql/3308/mysqld.sockport = 3308datadir = /home/mysql/3308/datalc-messages-dir = /usr/share/mysqlskip-external-lockingbind-address = 0.0.0.0key_buffer_size = 16Mmax_allowed_packet = 16Mthread_stack = 192Kthread_cache_size = 8myisam-recover-options = BACKUPquery_cache_limit = 1Mquery_cache_size = 16Mexpire_logs_days = 10max_binlog_size = 100Minnodb_buffer_pool_size = 1Ginnodb_io_capacity = 4000innodb_io_capacity = 4000[mysqld3309]user = mysqlpid-file = /home/mysql/3309/mysqld.pidsocket = /home/mysql/3309/mysqld.sockport = 3309datadir = /home/mysql/3309/datalc-messages-dir = /usr/share/mysqlskip-external-lockingbind-address = 0.0.0.0key_buffer_size = 16Mmax_allowed_packet = 16Mthread_stack = 192Kthread_cache_size = 8myisam-recover-options = BACKUPquery_cache_limit = 1Mquery_cache_size = 16Mexpire_logs_days = 10max_binlog_size = 100Minnodb_buffer_pool_size = 1Ginnodb_io_capacity = 4000

配置说明:

配置多实例,每个实例命名为mysqld*,这里我三个实例配置分别对应[mysql3307],[mysql3308],[mysql3309]。

启动实例

执行:

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start

如果需要启动指定的实例,可以在start后面跟上参数,使用实例名:

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start 3307

启动指定多个实例:

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql start 3307,3308查看状态

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql report 关闭实例

执行(也可以关闭指定实例,和start用法一样)

mysqld_multi --defaults-file=/etc/mysql/mysql.conf.d/mysqld_multi.cnf --user=mysql stop

我在执行stop命令时,实例未关闭。网上遇到该问题的人有改mysqld_multi.cnf脚本的,我试过,加上参数-s后直接报错。有说是因为权限问题,需要授权:grant shutdown on . to ‘username’@’localhost’ identified by ‘password’。我用的root用户启动,试过用mysqladmin去执行关闭,是可以成功的。

mysqladmin -h127.0.0.1 -P3309 -uroot shutdown

除非注明,否则均为"攻城狮·正"原创文章,请注明出处。

本文链接:

2020春招必备:MySQL(20)与Redis(20),不看答案能答对几道?

2020年开头相比往年的确是一个非常特殊的鼠年,全国上下齐心协力为武汉加油!!加油加油!!

相信有很多朋友跟我一样被困家中,不敢出门,感觉像是要发霉了,止步于家里的大门。虽如此,但是“金三银四”的春招是不会止步的,时间不等人,现在已是2月中旬啦。今天,小编给大家出些MySQL与Redis面试高频必备题,MySQL(20)与Redis(20),两个凑在一起,组个“20 20”,试试不看答案你能答对几道??

先来看看MySQL(20)

1.1 什么是MySQL?怎么学习?

MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,关系数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。

很多朋友不知道怎么一步一步的学习MySQL,下面就先给大家看看MySQL的一个学习路线大纲图:

(这里为了方便展示,给大家看的是截图,如需下载xmind原图已经Redis的学习路线大纲图可以直接 后台 私信 “春招” 免费领取)

MySQL学习路线大纲图

1.2 MySQL(20)高频必备题目与答案解析(先不要看答案哟~)

(1)事务四大特性(ACID)原子性、一致性、隔离性、持久性?

答案解析:

原子性(Atomicity)

· 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。

一致性(Consistency)

· 事务开始前和结束后,数据库的完整性约束没有被破坏。比如A向B转账,不可能A扣了钱,B却没收到。

隔离性(Isolation)

· 隔离性是当多个用户并发访问数据库时,比如操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

同一时间,只允许一个事务请求同一数据,不同的事务之间彼此没有任何干扰。比如A正在从一张银行卡中取钱,在A取钱的过程结束前,B不能向这张卡转账。

关于事务的隔离性数据库提供了多种隔离级别,稍后会介绍到。 ? 持久性(Durability)

持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。

(2)事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL默认是哪个级别?(3)MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别?

答案解析:

3.1 MySQL存储引擎MyISAM与InnoDB如何选择

MySQL有多种存储引擎,每种存储引擎有各自的优缺点,可以择优选择使用:MyISAM、InnoDB、MERGE、MEMORY(HEAP)、BDB(BerkeleyDB)、EXAMPLE、FEDERATED、ARCHIVE、CSV、BLACKHOLE。

虽然MySQL里的存储引擎不只是MyISAM与InnoDB这两个,但常用的就是两个。

两种存储引擎的大致区别表现在:

· InnoDB支持事务,MyISAM不支持,这一点是非常之重要。事务是一种高级的处理方式,如在一些列增删改中只要哪个出错还可以回滚还原,而MyISAM就不可以了。

· MyISAM适合查询以及插入为主的应用。

· InnoDB适合频繁修改以及涉及到安全性较高的应用。

· InnoDB支持外键,MyISAM不支持。

· 从MySQL5.5.5以后,InnoDB是默认引擎。

· InnoDB不支持FULLTEXT类型的索引。

· InnoDB中不保存表的行数,如select count(*) from table时,InnoDB需要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可。注意的是,当count(*)语句包含where条件时MyISAM也需要扫描整个表。

· 对于自增长的字段,InnoDB中必须包含只有该字段的索引,但是在MyISAM表中可以和其他字段一起建立联合索引。

· DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的 删除,效率非常慢。MyISAM则会重建表。

· InnoDB支持行锁(某些情况下还是锁整表,如 update table set a=1 where user like '%lee%'。

3.2关于MySQL数据库提供的两种存储引擎,MyISAM与InnoDB选择使用:

· INNODB会支持一些关系数据库的高级功能,如事务功能和行级锁,MyISAM不支持。

· MyISAM的性能更优,占用的存储空间少,所以,选择何种存储引擎,视具体应用而定。

· 如果你的应用程序一定要使用事务,毫无疑问你要选择INNODB引擎。但要注意,INNODB的行级锁是有条件的。在where条件没有使用主键时,照样会锁全表。比如DELETE FROM mytable这样的删除语句。

· 如果你的应用程序对查询性能要求较高,就要使用MyISAM了。MyISAM索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。MyISAM拥有全文索引的功能,这可以极大地优化LIKE查询的效率。

有人说MyISAM只能用于小型应用,其实这只是一种偏见。如果数据量比较大,这是需要通过升级架构来解决,比如分表分库,而不是单纯地依赖存储引擎。

现在一般都是选用innodb了,主要是MyISAM的全表锁,读写串行问题,并发效率锁表,效率低,MyISAM对于读写密集型应用一般是不会去选用的。

3.3 MEMORY存储引擎

MEMORY是MySQL中一类特殊的存储引擎。它使用存储在内存中的内容来创建表,而且数据全部放在内存中。这些特性与前面的两个很不同。

每个基于MEMORY存储引擎的表实际对应一个磁盘文件。该文件的文件名与表名相同,类型为frm类型。该文件中只存储表的结构。而其数据文件,都是存储在内存中,这样有利于数据的快速处理,提高整个表的效率。值得注意的是,服务器需要有足够的内存来维持MEMORY存储引擎的表的使用。如果不需要了,可以释放内存,甚至删除不需要的表。

MEMORY默认使用哈希索引。速度比使用B型树索引快。当然如果你想用B型树索引,可以在创建索引时指定。

注意,MEMORY用到的很少,因为它是把数据存到内存中,如果内存出现异常就会影响数据。如果重启或者关机,所有数据都会消失。因此,基于MEMORY的表的生命周期很短,一般是一次性的。

(4)MySQL的MyISAM与InnoDB两种存储引擎在,事务、锁级别,各自的适用场景?(5)查询语句不同元素(where、jion、limit、group by、having等等)执行先后顺序?(6)什么是临时表,临时表什么时候删除?

临时表可以手动删除:

DROP?TEMPORARY?TABLE?IF?EXISTS?temp_tb;

临时表只在当前连接可见,当关闭连接时,MySQL会自动删除表并释放所有空间。因此在不同的连接中可以创建同名的临时表,并且操作属于本连接的临时表。

创建临时表的语法与创建表语法类似,不同之处是增加关键字TEMPORARY,如:

CREATE?TEMPORARY?TABLE?tmp_table ( NAME?VARCHAR?(10) NOT?NULL,time?date?NOT?NULL);select?* from?tmp_table;(7)MySQL B+Tree索引和Hash索引的区别?(8)sql查询语句确定创建哪种类型的索引?如何优化查询?(9)聚集索引和非聚集索引区别?

答案解析:

聚合索引(clustered index) / 非聚合索引(nonclustered index)

根本区别

聚集索引和非聚集索引的根本区别是表记录的排列顺序和与索引的排列顺序是否一致。

9.1聚集索引

聚集索引表记录的排列顺序和索引的排列顺序一致,所以查询效率快,只要找到第一个索引值记录,其余就连续性的记录在物理也一样连续存放。聚集索引对应的缺点就是修改慢,因为为了保证表中记录的物理和索引顺序一致,在记录插入的时候,会对数据页重新排序。

聚集索引类似于新华字典中用拼音去查找汉字,拼音检索表于书记顺序都是按照a~z排列的,就像相同的逻辑顺序于物理顺序一样,当你需要查找a,ai两个读音的字,或是想一次寻找多个傻(sha)的同音字时,也许向后翻几页,或紧接着下一行就得到结果了。

9.2非聚集索引

非聚集索引制定了表中记录的逻辑顺序,但是记录的物理和索引不一定一致,两种索引都采用B+树结构,非聚集索引的叶子层并不和实际数据页相重叠,而采用叶子层包含一个指向表中的记录在数据页中的指针方式。非聚集索引层次多,不会造成数据重排。

非聚集索引类似在新华字典上通过偏旁部首来查询汉字,检索表也许是按照横、竖、撇来排列的,但是由于正文中是a~z的拼音顺序,所以就类似于逻辑地址于物理地址的不对应。同时适用的情况就在于分组,大数目的不同值,频繁更新的列中,这些情况即不适合聚集索引。

(10)有哪些锁(乐观锁悲观锁),select 时怎么加排它锁?(11)非关系型数据库和关系型数据库区别,优势比较?(12)数据库三范式,根据某个场景设计数据表?(13)数据库的读写分离、主从复制,主从复制分析的 7 个问题?(14)使用explain优化sql和索引?(15)MySQL慢查询怎么解决?

答案解析:

· slow_query_log 慢查询开启状态。

· slow_query_log_file 慢查询日志存放的位置(这个目录需要MySQL的运行帐号的可写权限,一般设置为MySQL的数据存放目录)。

· long_query_time 查询超过多少秒才记录。

(16)什么是 内连接、外连接、交叉连接、笛卡尔积等?(17)mysql都有什么锁,死锁判定原理和具体场景,死锁怎么解决?(18)varchar和char的使用场景?(19)mysql 高并发环境解决方案?

答案解析:

MySQL 高并发环境解决方案 分库 分表 分布式 增加二级缓存。。。。。

需求分析:互联网单位 每天大量数据读取,写入,并发性高。

· 现有解决方式:水平分库分表,由单点分布到多点数据库中,从而降低单点数据库压力。

· 集群方案:解决DB宕机带来的单点DB不能访问问题。

· 读写分离策略:极大限度提高了应用中Read数据的速度和并发量。无法解决高写入压力。

(20)数据库崩溃时事务的恢复机制(REDO日志和UNDO日志)?

注意:由于篇幅原因,这里就不全部一一给出答案了,题目+答案解析都已整理成Word文档如下:

(Redis也整理成了相关的Word文档,需要这两份完整版答案的 私信 “春招” 即可免费领取!!!)

MySQL(20)题目+答案解析

接下来就是Redis(20)

2.1 什么是Redis?怎么学习?

Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。

Redis怎么学习?给大家分享一下Redis的学习路线大纲图(xmind):

Redis的学习路线大纲图

2.2 Redis(20)高频必备题目与答案解析(记得先不要看答案哟~)

(1)为什么要用 redis /为什么要用缓存(高性能、高并发)

答案解析:

主要从“高性能”和“高并发”这两点来看待这个问题。

高性能

假如用户第一次访问数据库中的某些数据。这个过程会比较慢,因为是从硬盘上读取的。将该用户访问的数据存在数 缓

存中,这样下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当 快。

如果数据库中的对应数据改变的之后,同步改变缓存中相应的数据即可!

高并发

直接操作缓存能够承受的请求是远远大于直接访问数据库的,所以我们可以考虑把数据库中的部分数据转移到缓存中

去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。

(2)为什么要用 redis 而不用 map/guava 做缓存?(3)redis 常见数据结构以及使用场景分析(String、Hash、List、Set、Sorted Set)(4)Redis和memcached的区别?(5)redis 内存淘汰机制(MySQL里有2000w数据,Redis中只存20w的数据,如何保证Redis中的数据都是热点数据?)(6)redis 持久化机制(怎么保证 redis 挂掉之后再重启数据可以进行恢复)(7)Redis设置过期时间?

答案解析:

Redis中有个设置时间过期的功能,即对存储在redis数据库中的值可以设置一个过期时间。作为一个缓存数据库,这

是非常实用的。如我们一般项目中的token或者一些登录信息,尤其是短信验证码都是有时间限制的,按照传统的数据库处理方式,一般都是自己判断过期,这样无疑会严重影响项目性能。

我们setkey的时候,都可以给一个expiretime,就是过期时间,通过过期时间我们可以指定这个key可以存活的时间。

如果假设你设置了一批key只能存活1个小时,那么接下来1小时后,期删除+惰性删除。

通过名字大概就能猜出这两个删除方式的意思了。

定期删除:redis默认是每隔100ms就随机抽取一些设置了过期时间的key,检查其是否过期,如果过期就删除。

注意这里是随机抽取的。为什么要随机呢?你想一想假如redis存了几十万个key,每隔100ms就遍历所有的设置过期时间的key的话,就会给CPU带来很大的负载! 惰性删除:定期删除可能会导致很多过期key到了时间并没有被删除掉。所以就有了惰性删除。假如你的过期key,靠定期删除没有被删除掉,还停留在内存里,除非你的系统去查一下那个key,才会被redis给删除掉。这就是所谓的惰性删除,也是够懒的哈!

(8)Redis 常见异常及解决方案(缓存穿透、缓存雪崩、缓存预热、缓存降级)(9)分布式环境下常见的应用场景(分布式锁、分布式自增 ID)(10)Redis 集群模式(主从模式、哨兵模式、Cluster 集群模式)(11)如何解决 Redis 的并发竞争 Key 问题?(12)如何保证缓存与数据库双写时的数据一致性?

答案解析:

你只要用缓存,就可能会涉及到缓存与数据库双存储双写,你只要是双写,就一定会有数据一致

性的问题,那么你如何解决一致性问题?

一般来说,就是如果你的系统不是严格要求缓存+数据库必须一致性的话,缓存可以稍微的跟数据库偶尔有不一致的情况,最好不要做这个方案,读请求和写请求串行化,串到一个内存队列里去,这样就可以保证一定不会出现不一致的情况串行化之后,就会导致系统的吞吐量会大幅度的降低,用比正常情况下多几倍的机器去支撑线上的一个请求。

(13)Redis 有哪几种数据淘汰策略?(14)一个字符串类型的值能存储最大容量是多少?(15)Redis集群方案应该怎么做?都有哪些方案?(16)Redis集群方案什么情况下会导致整个集群不可用?

答案解析:

有A,B,C三个节点的集群,在没有复制模型的情况下,如果节点B失败了,那么整个集群就会以为缺少5501-11000这个范围的槽而不可用。

(17)Redis 支持的 Java 客户端都有哪些?官方推荐用哪个?(18)Redis 集群的主从复制模型是怎样的?(19)Redis 中的管道有什么用?(20)Redis 有哪些适合的场景?

答案解析:

(1)会话缓存(Session Cache)

最常用的一种使用 Redis 的情景是会话缓存(sessioncache),用 Redis 缓存会话比其他存储(如

Memcached)的优势在于:Redis 提供持久化。当维护一个不是严格要求一致性的缓存时,如果用户的购物车信息全部丢失,大部分人都会不高兴的,现在,他们还会这样吗?

幸运的是,随着 Redis 这些年的改进,很容易找到怎么恰当的使用 Redis 来缓存会话的文档。甚至广为人知的商业平台 Magento 也提供 Redis 的插件。

(2)全页缓存(FPC)

除基本的会话 token 之外,Redis 还提供很简便的 FPC 平台。回到一致性问题,即使重启了 Redis 实

例,因为有磁盘的持久化,用户也不会看到页面加载速度的下降,这是一个极大改进,类似 PHP 本地

FPC。再次以 Magento 为例,Magento 提供一个插件来使用 Redis 作为全页缓存后端。

此外,对 WordPress 的用户来说,Pantheon 有一个非常好的插件 wp-redis,这个插件能帮助你以最快速度加载你曾浏览过的页面。

(3)队列

Reids 在内存存储引擎领域的一大优点是提供 list 和 set 操作,这使得 Redis 能作为一个很好的消息队列平台来使用。Redis 作为队列使用的操作,就类似于本地程序语言(如 Python)对 list 的 push/pop

操作。

如果你快速的在 Google 中搜索“Redis queues”,你马上就能找到大量的开源项目,这些项目的目的

就是利用 Redis 创建非常好的后端工具,以满足各种队列需求。例如,Celery 有一个后台就是使用

Redis 作为 broker,你可以从这里去查看。

(4)排行榜/计数器Redis 在内存中对数字进行递增或递减的操作实现的非常好。集合(Set)和有序集合(SortedSet)也使得我们在执行这些操作的时候变的非常简单,Redis 只是正好提供了这两种数据结构。

所以,我们要从排序集合中获取到排名最靠前的 10 个用户–我们称之为“user_scores”,我们只需要像

下面一样执行即可:

当然,这是假定你是根据你用户的分数做递增的排序。如果你想返回用户及用户的分数,你需要这样执

行:ZRANGE user_scores 0 10 WITHSCORES

Agora Games 就是一个很好的例子,用 Ruby 实现的,它的排行榜就是使用 Redis 来存储数据的,你可以在这里看到。

(5)发布/订阅

最后(但肯定不是最不重要的)是 Redis 的发布/订阅功能。发布/订阅的使用场景确实非常多。我已看见人们在社交网络连接中使用,还可作为基于发布/订阅的脚本触发器,甚至用 Redis 的发布/订阅功能来建立聊天系统!

篇幅原因,这里Redis也不一一列出答案,同MySQL一样已整理成Word文档

Redis(20)题目+答案解析

最后总结

今天小编要说的MySQL(20)与Redis(20)就是这些了,另外还有整理MySQL与Redis学习大全,如下所示,免费分享大家一起学习,祝春招顺利!!!

有需要这份大全资料的朋友注意啦:

转发+转发+转发+私信 “春招”!!免费领取!!小编会一一回复大家!!

MySQL与Redis学习大全