顶级架构师学习——第十六阶段:Linux下mysql、tomcat以及redis部署

哦豁,开学了,这是我现在的森情——♪(^∀^●)ノ

才怪!!!

我寒假还没玩够呢!

不过...刚开学没有课 (*’ー’*)

好了好了,今天学习的主要内容是linux虚拟机的安装以及linux的一些基本操作还有mysql、tomcat、redis 的部署。

目录

一、Linux概述

二、Linux的安装

三、Linux的基本命令

四、软件部署

五、Redis入门

扫描二维码关注公众号,回复: 5441217 查看本文章

一、Linux概述

Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境。Linux是由Linus Torvalds(林纳斯·托瓦兹)起初开发的,由于源代码的开放性,现在已经衍生出了千上百种不同的Linux系统。

Linux系统的应用非常广泛,不仅可以长时间的运行我们编写的程序代码,还可以安装在各种计算机硬件设备中,比如手机、平板电脑、路由器等。尤其在这里提及一下,我们熟知是Android程序最底层就是运行在linux系统上的。

Linux根据市场需求不同,基本分为两个方向:

  1. 图形化界面版:注重用户体验,类似window操作系统,但目前成熟度不够
  2. 服务器版:没有好看的界面,是以在控制台窗口中输入命令操作系统的,类似于DOS,是我们架设服务器的最佳选择

Linux根据原生程度,又分为两种:

  1. 内核版本:在Linus领导下的内核小组开发维护的系统内核的版本号
  2. 发行版本:一些组织或公司在内核版基础上进行二次开发而重新发行的版本

Linux发行版本不同,又可以分为n多种,如我们常见的Ubuntu、Redhat、CentOS等等,这里就不再一一列举。

二、Linux的安装

我们使用VMWare来安装CentOS,这个在公司当中使用的是比较多的!

一步步教?辣是不阔能滴!安装这个只是傻瓜式安装,全部next就好了~~

三、Linux的基本命令

服务器版的Linux安装完毕了,但没有图形化界面,我们只能通过控制台去操作系统,我们就要使用类似DOS命令的Linux命令去操作系统,那么下面我们就进行Linux的命令的学习。虽然Linux本身的命令很多,但是我们经常使用的大概就下面这些个,如果有遗漏的...大家就原谅我,在评论补充好了{{{(>_<)}}}

1、目录切换命令

window中通过图形化界面和鼠标可以任意切换需要进入的目录,但Linux必须通过cd命令切换目录。但在学习cd命令之前,我们有必要分清Linux的目录结构:

 

想去哪个目录的话:cd 全路径名,或者是在本目录下的子文件夹:cd xxx/xxx...,然后返回上一级目录的话使用:cd .. 

2、目录的增删改查

增加目录    mkdir 目录名称

删除目录    rm [-rf] 目录  -r表示递归删除文件夹,-f表示不用询问确定删除文件或文件夹  这个命令对目录和文件通用

修改名称    mv 目录名称 新目录名称

移动目录    mv 目录名称 目录的新位置  这个命令相当于剪切

拷贝目录    cp -r 目录名称 目录拷贝的目标位置  -r表示递归拷贝目录

查看目录    ls [-al] 父目录  -a表示查看隐藏文件,-l表示查看文件详细信息ls -l也可以直接简写成ll,效果是一样的

查找目录    find 目录名称 查找的名称(用单引号括起来,可以使用*通配,如*test*表示任意包含test名称的目录)

3、文件的增删改查

创建文件    touch 文件名称

删除文件    rm 文件名称

修改文件    vim 文件名称  这里使用了vim编辑器,我们使用vim编辑器进入文件后,按 i 进入编辑模式,这时我们可以使用键盘将我们的光标移动到要修改的位置,修改完成之后按Esc返回命令模式,这时可以输入 :wq 保存并退出文件,如果你不想保存修改,那么可以使用 :q! 强制退出且不保存

查看文件    cat/more/less/tail 文件名称  使用cat查看文件,只能显示最后一屏文件内容;使用more查看文件,可以显示百分比,回车可以向下一行, 空格可以向下一页,q可以退出查看;使用less查看文件,可以使用键盘上的PgUp和PgDn向上 和向下翻页,q结束查看;使用tail -10 查看/etc/sudo.conf文件的后10行,Ctrl+C结束,注意:命令 tail -f 文件可以对某个文件进行动态监控,例如tomcat的日志文件,会随着程序的运行,日志会变化,可以使用tail -f catalina-2016-11-11.log 监控件的变化

4、操作压缩文件

打包并压缩文件    tar -zcvf 打包压缩后的文件名 要打包压缩的文件(可以是文件夹,如/test/*表示当前路径下test文件夹内所有的文件)  这里文件的前后位置与我们通常使用的顺序有所不同,要小心!Linux中的打包文件一般是以.tar结尾的,压缩的命令一般是以.gz结尾的。而一般情况下打包和压缩是一起进行的,打包并压缩后的文件的后缀名一般.tar.gz。-z表示调用gzip压缩命令进行压缩,-c表示打包文件,-v显示运行过程,-f指定文件名

解压压缩包    tar [-xvfC] 压缩文件名  -x表示解压,-C表示制定解压位置,如 tar -zxf xxx.tar.gz -C /test表示将xxx.tar.gz解压到/test根目录下

5、常用其他命令

显示当前位置    pwd

搜索命令    grep 要搜索的字符串 要搜索的文件 --color(高亮显示字符串在文件中的位置)

管道命令    |  将前一个命令的输出作为本次命令的输入

查看系统当前运行的进程    ps -ef

杀死进程    kill -9 进程pid

查看网卡信息    ifconfig

查看连接    ping 目标ip地址

查看端口使用    netstat -ano

修改文件或目录权限    chmod xxx 文件名  读、写、使用分别用4、2、1表示,第一个数字表示文件所有人的权限,第二个数字表示文件所有人所在组的组内成员的权限,第三个数字表示其他所有人的权限,如 chmod 777 xxx.txt 表示所有人对xxx.txt都有读、写、和使用权。也可以一个个修改权限,如chmod u=rwx,g=rw,o=r aaa.txt,表示 aaa.txt 的权限为属主有全部权限,属主所在的组有读写权限,其他用户只有读的权限

四、软件部署

???

1、JDK

这个最简单——yum install java

2、mysql

悄悄告诉你,CentOS本来就有自己的mysql,当然你想装一个也ok

为了方便起见,我们将mysql加到系统服务中并设置开机启动:

  1.加入到系统服务:chkconfig --add mysql

  2.自动启动:chkconfig mysql on

然后设置远程登录:

  1.grant all privileges on *.* to 'root' @'%' identified by 'root';

  2.flush privileges;

开启了远程登录,那么就要打开对外的端口:

  1./sbin/iptables -I INPUT -p tcp --dport 3306 -j ACCEPT    开放3306端口,修改端口号也可以开放其他端口

  2./etc/rc.d/init.d/iptables-save    这里将修改永久保存到防火墙中

3、tomcat

下载一个tomcat的linux版本,用tar -zxf xxxx解压之后就能用,启动文件是/bin/startup.sh,相应的配置可以去config文件里头改。相应的端口开放跟前面的开放端口步骤一样,只要改个端口号就行!

4、redis

我们从网上下载linux版本的redis,解压到文件夹里,如果没有安装gcc编译器的话,需要先使用yum install gcc-c++安装,然后进入解压目录,我们会看到文件列表下面有Makefile文件,那么我们在这里直接输入命令 make 让系统帮我们编译redis,编译完成后就能进入 bin 目录使用redis了。redis-server 是服务器,redis-cli 是客户端。

redis-server redis.conf    按照指定配置文件启动服务器

redis-cli -h ip地址 -p 端口    按照指定ip地址通过指定端口连接redis服务器

我们将redis.conf文件中的daemonize从false修改成true表示后台启动。

五、Redis入门

1、Redis简介

  ·  关于关系型数据库和nosql数据库

关系型数据库是基于关系表的数据库,最终会将数据持久化到磁盘上,而nosql数据库是基于特殊的结构,并将数据存储到内存的数据库。从性能上而言,nosql数据库要优于关系型数据库,从安全性上而言关系型数据库要优于nosql数据库,所以在实际开发中一个项目中nosql和关系型数据库会一起使用,达到性能和安全性的双保证。

  ·  为什么要使用Redis

互联网三高架构:高并发、高性能、高可用

1.高并发 High Performance 对数据库高并发读写的需求

web2.0网站要根据用户个性化信息来实时生成动态页面和提供动态信息,所以基本上无法使用动态页面静态化技术,因此数据库并发负载非常高,往往要达到每秒上万次读写请求。关系数据库应付上万次SQL查询还勉强顶得住,但是应付上万次SQL写数据请求,硬盘IO就已经无法承受了。其实对于普通的BBS网站,往往也存在对高并发写请求的需求,例如网站的实时统计在线用户状态,记录热门帖子的点击次数,投票计数等,因此这是一个相当普遍的需求。

2.高性能 Huge Storage 对海量数据的高效率存储和访问的需求

类似 Facebook, twitter, Friendfeed这样的SNS网站,每天用户产生海量的用户动态,以 Friendfeed为例,一个月就达到了2.5亿条用户动态,对于关系数据库来说,在一张25亿条记录的表里面进行SQL查询,效率是极其低下乃至不可忍受的。再例如大型web网站的用户登录系统,例如腾讯,盛大,动辄数以亿计的帐号,关系数据库也很难应付。

3.高可扩展和高可用 High Scalability && High Availability 对数据库的高可扩展性和高可用性的需求

在基于web的架构当中,数据库是最难进行横向扩展的,当一个应用系统的用户量和访问量与日俱增的时候,你的数据库却没有办法像 web server和 app server那样简单的通过添加更多的硬件和服务节点来扩展性能和负载能力。对于很多需要提供24小时不间断服务的网站来说,对数据库系统进行升级和扩展是非常痛苦的事情,往往需要停机维护和数据迁移,为什么数据库不能通过不断的添加服务器节点来实现扩展呢?

NOSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。

2、使用java操作redis

为了使用java操作redis,我们需要使用到jedis.jar和common-pool.jar这两个jar包,可以直接去网上下载来着,版本的话随便高兴啦~

下面给个测试程序吧~

import org.junit.Test;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisTest {

	// 通过java程序访问redis数据库	
	@Test
	// 获得单一的jedis对象操作数据库
	public void test1() {
		
		// 1、获得连接对象
		Jedis jedis = new Jedis("192.168.186.131", 6379);
		
		// 2、获得数据
		String username = jedis.get("username");
		System.out.println(username);
		
		// 3、存储
		jedis.set("addr", "北京");
		System.out.println(jedis.get("addr"));		
	}	
	
	// 通过jedis的pool获得jedis连接对象
	@Test
	public void test2() {
		// 0、创建池子的配置对象
		JedisPoolConfig poolConfig = new JedisPoolConfig();
		poolConfig.setMaxIdle(30);//最大闲置个数
		poolConfig.setMinIdle(10);//最小闲置个数
		poolConfig.setMaxTotal(50);//最大连接数
		
		// 1、创建一个redis的连接池
		JedisPool pool = new JedisPool(poolConfig, "192.168.186.129", 6379);
		
		// 2、从池子中获取redis的连接资源
		Jedis jedis = pool.getResource();
		
		// 3、操作数据库
		jedis.set("xxx","yyyy");
		System.out.println(jedis.get("xxx"));
		
		// 4、关闭资源
		jedis.close();
		pool.close();		
	}
	
}
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;

public class JedisPoolUtils {
	
	private static JedisPool pool = null;
	
	static{		
		// 加载配置文件
		InputStream in = JedisPoolUtils.class.getClassLoader().getResourceAsStream("redis.properties");
		Properties pro = new Properties();
		try {
			pro.load(in);
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		// 获得池子对象
		JedisPoolConfig poolConfig = new JedisPoolConfig();
		poolConfig.setMaxIdle(Integer.parseInt(pro.get("redis.maxIdle").toString()));//最大闲置个数
		poolConfig.setMinIdle(Integer.parseInt(pro.get("redis.minIdle").toString()));//最小闲置个数
		poolConfig.setMaxTotal(Integer.parseInt(pro.get("redis.maxTotal").toString()));//最大连接数
		pool = new JedisPool(poolConfig,pro.getProperty("redis.url") , Integer.parseInt(pro.get("redis.port").toString()));
	}

	// 获得jedis资源的方法
	public static Jedis getJedis() {
		return pool.getResource();
	}
	
	public static void main(String[] args) {
		Jedis jedis = getJedis();
		System.out.println(jedis.get("xxx"));
	}
		
}
// redis.properties文件
redis.maxIdle=30
redis.minIdle=10
redis.maxTotal=100
redis.url=192.168.186.131
redis.port=6379

3、数据类型

redis是一种高级的key-value的存储系统

其中的key是字符串类型,尽可能满足如下几点:

  1. key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低查找 效率
  2. key不要太短,如果太短会降低key的可读性
  3. 在项目中,key最好有一个统一的命名规范(根据企业的需求)

其中value 支持五种数据类型:

  1. 字符串型 string
  2. 字符串列表 lists
  3. 字符串集合 sets
  4. 有序字符串集合 sorted sets
  5. 哈希类型 hashs

4、常用命令

1.存储字符串

字符串类型是Redis中最为基础的数据存储类型,它在Redis中是二进制安全的,这 便意味着该类型可以接受任何格式的数据,如JPEG图像数据或Json对象描述信息等。 在Redis中字符串类型的Value最多可以容纳的数据长度是512M。

它的数据格式就像下面这张图:

  1. set key value:设定key持有指定的字符串value,如果该key存在则进行覆盖操作。总是返回”OK”
  2. get key:获取key的value。如果与该key关联的value不是String类型,redis 将返回错误信息,因为get命令只能用于获取String value;如果该key不存在,返回null。
  3. getset key value:先获取该key的值,然后在设置该key的值。
  4. incr key:将指定的key的value原子性的递增1.如果该key不存在,其初始值 为0,在incr之后其值为1。如果value的值不能转成整型,如hello,该操作将执 行失败并返回相应的错误信息。
  5. decr key:将指定的key的value原子性的递减1.如果该key不存在,其初始值 为0,在incr之后其值为-1。如果value的值不能转成整型,如hello,该操作将执 行失败并返回相应的错误信息。
  6. incrby key increment:将指定的key的value原子性增加increment,如果该 key不存在,器初始值为0,在incrby之后,该值为increment。如果该值不能转成 整型,如hello则失败并返回错误信息。
  7. decrby key decrement:将指定的key的value原子性减少decrement,如果该key不存在,器初始值为0,在decrby之后,该值为decrement。如果该值不能转成整型,如hello则失败并返回错误信息。
  8. append key value:如果该key存在,则在原有的value后追加该值;如果该 key 不存在,则重新创建一个key/value。

2.存储lists类型

在Redis中,List类型是按照插入顺序排序的字符串链表。和数据结构中的普通链表一样,我们可以在其头部(left)和尾部(right)添加新的元素。在插入时,如果该键并不 存在,Redis将为该键创建一个新的链表。与此相反,如果链表中所有的元素均被移除,那么该键也将会被从数据库中删除。List中可以包含的最大元素数量是 4294967295。

从元素插入和删除的效率视角来看,如果我们是在链表的两头插入或删除元素,这将 会是非常高效的操作,即使链表中已经存储了百万条记录,该操作也可以在常量时间内完成。然而需要说明的是,如果元素插入或删除操作是作用于链表中间,那将会是非常低效的。相信对于有良好数据结构基础的开发者而言,这一点并不难理解。

  1. lpush key value1 value2 ...:在指定的key所关联的list的头部插入所有的 values,如果该key不存在,该命令在插入的之前创建一个与该key关联的空链 表,之后再向该链表的头部插入数据。插入成功,返回元素的个数。
  2. rpush key value1、value2 …:在该list的尾部添加元素。
  3. lrange key start end:获取链表中从start到end的元素的值,start、end可 为负数,若为-1则表示链表尾部的元素,-2则表示倒数第二个,依次类推…
  4. lpushx key value:仅当参数中指定的key存在时(如果与key管理的list中没 有值时,则该key是不存在的)在指定的key所关联的list的头部插入value。
  5. rpushx key value:在该list的尾部添加元素。
  6. lpop key:返回并弹出指定的key关联的链表中的第一个元素,即头部元素。
  7. rpop key:从尾部弹出元素。
  8. rpoplpush resource destination:将链表中的尾部元素弹出并添加到头部。
  9. llen key:返回指定的key关联的链表中的元素的数量。
  10. lset key index value:设置链表中的index的脚标的元素值,0代表链表的头元素,-1代表链表的尾元素。
  11. lrem key count value:删除count个值为value的元素,如果count大于0,从头向尾遍历并删除count个值为value的元素,如果count小于0,则从尾向头遍历并删除。如果count等于0,则删除链表中所有等于value的元素。
  12. linsert key before|after pivot value:在pivot元素前或者后插入value这个元素。

3.存储sets类型

在Redis中,我们可以将Set类型看作为没有排序的字符集合,和List类型一样,我们也可以在该类型的数据值上执行添加、删除或判断某一元素是否存在等操作。需要说明的是,这些操作的时间是常量时间。Set可包含的最大元素数是4294967295。

和List类型不同的是,Set集合中不允许出现重复的元素。和List类型相比,Set类型在功能上还存在着一个非常重要的特性,即在服务器端完成多个Sets之间的聚合计算操作,如unions、intersections和differences。由于这些操作均在服务端完成, 因此效率极高,而且也节省了大量的网络IO开销。

它的数据结构与List相似。

  1. sadd key value1、value2 …:向set中添加数据,如果该key的值已有则不会重复添加。
  2. smembers key:获取set中所有的成员。
  3. scard key:获取set中成员的数量。
  4. sismember key member:判断参数中指定的成员是否在该set中,1表示存在,0表示不存在或者该key本身就不存在。
  5. srem key member1、member2 …:删除set中指定的成员。
  6. srandmember key:随机返回set中的一个成员。
  7. sdiff sdiff key1 key2:返回key1与key2中相差的成员,而且与key的顺序有关,即返回差集。
  8. sdiffstore destination key1 key2:将key1、key2相差的成员存储在destination上。
  9. sinter key[key1,key2 …]:返回交集。
  10. sinterstore destination key1 key2:将返回的交集存储在destination上。
  11. sunion key1 key2:返回并集。
  12. sunionstore destination key1 key2:将返回的并集存储在destination上。

4.存储sortedset

Sorted-Sets 和 Sets 类型极为相似,它们都是字符串的集合,都不允许重复的成员出现在一个Set中。它们之间的主要差别是 Sorted-Sets 中的每一个成员都会有一个分数(score)与之关联,Redis正是通过分数来为集合中的成员进行从小到大的排序。然 而需要额外指出的是,尽管 Sorted-Sets 中的成员必须是唯一的,但是分数(score) 却是可以重复的。

在 Sorted-Set 中添加、删除或更新一个成员都是非常快速的操作,其时间复杂度为集合中成员数量的对数。由于 Sorted-Sets 中的成员在集合中的位置是有序的,因此, 即便是访问位于集合中部的成员也仍然是非常高效的。事实上,Redis 所具有的这一特征在很多其它类型的数据库中是很难实现的,换句话说,在该点上要想达到和 Redis 同样的高效,在其它数据库中进行建模是非常困难的。

它的数据结构也与List相似。

  1. zadd key score member score2 member2 … :将所有成员以及该成员的分数存放到sorted-set中。
  2. zcard key:获取集合中的成员数量。
  3. zcount key min max:获取分数在[min,max]之间的成员。
  4. zincrby key increment member:设置指定成员的增加的分数。
  5. zrange key start end [withscores]:获取集合中脚标为start到end的成员,[withscores]参数表明返回的成员包含其分数。
  6. zrangebyscore key min max [withscores] [limit offset count]:返回分数在[min,max]的成员并按照分数从低到高排序。[withscores]:显示分数;[limit offset count]:offset,表明从脚标为offset的元素开始并返回count个成员。
  7. zrank key member:返回成员在集合中的位置。
  8. zrem key member [member …]:移除集合中指定的成员,可以指定多个成员。
  9. zscore key member:返回指定成员的分数。

5.存储hash

Redis 中的 Hashes 类型可以看成具有 String Key 和 String Value 的 map 容器。所以该类型非常适合于存储值对象的信息。如 Username、Password 和 Age 等。如果 Hash 中包含很少的字段,那么该类型的数据也将仅占用很少的磁盘空间。每一个 Hash  可以存储4294967295个键值对。

  1. hset key field value:为指定的key设定field-value对(键值对)。
  2. hgetall key:获取key中的所有field-value对。
  3. hget key field:返回指定的key中的field的值。
  4. hmset key fields:设置key中的多个field-value。
  5. hmget key fields:获取key中的多个field的值。
  6. hexists key field:判断指定的key中的field是否存在。
  7. hlen key:获取key所包含的field的数量。
  8. hincrby key field increment:设置key中field的值增加increment。
  9. hdel key field [field ...]:删除一个或多个字段,返回被删除个数。

6.通用操作

  1. keys pattern:获取所有与 pattern 匹配的 key,返回所有与该 key 匹配的 keys。* 表示一个或任意多个字符,? 表示任意一个字符。
  2. del key1 key2 ... :删除指定key。
  3. exists key:判断key是否存在,1为存在,0表示不存在。
  4. rename key newkey:重命名key为newkey。
  5. expire key:为key设置超时时间,单位为秒。
  6. ttl key:获取key剩余的超时时间,-1表示未设置超时时间,-2表示超时不存在。
  7. type key:获取key的类型,不存在返回none。

5、特性

1.多数据库

一个redis实例有16个数据库,下标0到15,默认使用的是0号数据库。

  1. select num:选择第num个数据库连接。
  2. move key num:将key剪切到num号数据库中。

2.服务器命令

  1. ping:测试连接是否存活。
  2. echo:在命令行打印信息。
  3. quit:退出连接。
  4. dbsize:返回当前数据库中key的数量。
  5. info:获取服务器信息和统计。
  6. flushdb:删除当前使用的数据库的所有key。
  7. flushall:删除所有数据库中的key。

3.消息订阅与发布

  1. subscribe channel:订阅频道,当有人在频道内发言时将收到信息。
  2. psubscribe pattern ...:同时订阅多个与pattern匹配的频道,可以使用*和?。
  3. publish channel message:在频道中发布消息。

4.事务

redis的事务与我们知道的mysql的事务有所不同,它在redis中的地位相当于一个批处理事件。

比如,我们使用mutil开启事务,每输入一个命令都会将这个命令压入一个等待执行的队列当中,输入exec后按照顺序执行命令,但是在这里,执行成功的命令依旧成功,执行失败的命令对其没有影响,而不是想mysql的事务那样会使整个事务失败。或者使用discard回滚事务,即当前等待执行的队列当中所有的命令全部不执行。

redis 的事务具有如下特征:

5.持久化

Redis的持久化有两种方式,RDB方式和AOF方式,可以单独使用其一也可以同时使用。

这里来简单说一下:

Redis默认使用的是RDB持久化,该机制是指在指定的时间间隔内将内存中的数据集快照写入磁盘。一旦使用该方式,那么中国redis数据库将只包含一个文件,这对于文件备份而言是十分完美的,当系统出现灾难性故障时,我们可以很容易的恢复数据。相比于AOF持久化,如果数据集很大,它仅需分叉(fork)出子进程,之后由子进程完成持久化工作,可以极大的避免IO操作,因此它的效率会更高,但是与此同时也会有一个问题,它可能会引起整个服务器无法提供服务整整数百毫秒!然而,如果你想最大的保持数据避免丢失,那么这个策略就不是一个很好的选择,因为如果再备份过程中出现系统宕机的现象,那么所有未保存的数据将全部丢失。

快照的参数配置,这里给个示例:save 900 1  表示,900秒(15分钟)内至少有1个key发生变化,则dump内存快照。在这里,可以有多个参数来配合使用。

AOF的优势是数据更加安全,由于写入日志文件采用append方式,即使服务器宕机也不会出现数据丢失的现象。如果日志过大,redis可以自动启用rewrite机制,即在不断增添数据到旧磁盘文件中时,也同时创建一个文件记录哪些修改命令在此期间被执行。对于相同数量的数据集而言,AOF文件通常大于RDB文件。

可以在redis配置文件中启用AOF,即修改appendonly no为appendonly yes,同时也可以修改appendfsync always总是(everysec每秒、no从不)策略。

如果我们不小心误操作了flushall删除了所有数据库当中的文件,这时或许还可以抢救一下:立即关闭redis服务器,不要保存数据(shutdown nosave),编辑aof文件,删除最后一行的flushall命令,重启服务。如果运气好,是可以恢复数据的!

6、小结

Redis的应用场景很多,这里就不再举例了,如果有机会实习的话,一定牢牢把握,实践才能出真知!


今天就先到这里,一看都快九点了...效率真低的说!!!

欢迎大家到我们的公众号:落饼枫林,留言,交流学习经验~

我是小昶,我们明天再见!或许后天?!

PS:是个实战案例哟!

猜你喜欢

转载自blog.csdn.net/qq_39391192/article/details/87914197