讨伐Redis

本文是学习Redis时做的知识点整理。

Redis

学习Redis,或者说学习任何东西,都有两个核心的问题:

1. 它是什么?

2. 它能做什么?

知道了Redis是什么,就容易理解Redis为什么要提供它提供的那些功能;

知道了Redis能做什么,以后遇到能用Redis的场合,你总是能通过各种方式做到。

1 Redis是什么?

Redis:Remote Dictionary Server,远程字典服务器。

是完全开源免费的,用C语言编写的,遵守BSD协议,是一个高性能的(key/value)分布式内存数据库,基于内存运行并支持持久化的NoSQL数据库,是当前最热门的NoSQL数据库之一,也被人们称为数据结构服务器。

关键信息:

1. Redis是分布式数据库

2. Redis是内存数据库

3. Redis是NoSQL数据库

1.1 Redis是分布式数据库

分布式数据库:位于不同地点的许多计算机通过网络互相连接,共同组成的一个逻辑上集中、物理上分布的大型数据库。

分布式数据库的两个要点:

● CAP定理

● BASE理论

1.1.1 数据库事务的ACID特性

A:Atomicity,原子性。

整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。

C:Consistency,一致性。

事务必须始终保持系统处于一致的状态,不管在任何给定的时间并发事务有多少。

I:Isolation,隔离性。

隔离状态执行事务,使它们好像是系统在给定时间内执行的唯一操作。如果有两个事务,运行在相同的时间内,执行相同的功能,事务的隔离性将确保每一事务在系统中认为只有该事务在使用系统。

D:Durability,持久性。

在事务完成以后,该事务对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

1.1.2 CAP定理

CAP定理:一个分布式系统不可能同时满足一致性[Consistency],可用性[Availability],和分区容错性[Partition tolerance]这三个基本要求,最多只能同时满足其中的两项。

C:Consistency,一致性。

数据在多个副本之间是否能够保持一致的特性。

系统的一个数据更新成功之后,如果所有用户都能够读取到最新的值,该系统就被认为具有强一致性。

A:Availability,可用性。

系统提供的服务必须一直处于可用的状态,对于用户的每一个操作请求总是能够在有限的时间内返回结果。

P:Partition tolerance,分区容错性。

分布式系统在遇到任何网络分区故障的时候,仍然对外提供满足一致性和可用性的服务。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

在分布式系统中,分区容错性是必须实现的,所以我们只能在一致性和可用性之间进行权衡。

对一致性的让步:

很多web实时系统对读一致性的要求很低,有些场合对写一致性的要求也不高,允许实现最终一致性。

对可用性的让步:

对很多web应用来说,并不需要特别高的实时性。比如发布者发布一条消息后,过几秒甚至十几秒,订阅者才看到这条动态,也是完全可以接受的。

BASE理论是对CAP中一致性和可用性的权衡的结果。

1.1.3 BASE理论

BASE是基本可用[Basically Available]、软状态[Soft state]、最终一致[Eventually consistent]三个术语的缩写。

BASE理论的核心思想是:即使无法做到强一致性,但每个应用都可以根据自身业务特点,采用适当的方式来使系统达到最终一致性。

1.2 Redis是内存数据库

内存数据库:顾名思义,就是将数据保存在内存中的数据库。因为内存读写数据的速度要远大于磁盘,所以内存数据库的性能远高于传统的磁盘数据库。

内存有一个特性就是,一旦断电,所有的数据都会被清空,所以数据持久化对内存数据库而言非常重要。

Redis支持数据的持久化,可以将内存中的数据保留在磁盘中,系统重启时再次加载使用。

Redis提供了两种持久化策略:RDB和AOF。

1.2.1 RDB

RDB,Redis DataBase:在指定的时间间隔下,将内存中的数据集快照(Snapshot快照)写入磁盘。恢复数据时,将快照文件直接读到内存中。

Redis复制一个与当前进程完全一样的进程,作为当前进程的子进程,这个过程称为fork。

Redis会fork一个子进程来进行数据持久化,这个子进程会先将数据写入一个临时文件,待持久化过程结束后,再用这个临时文件替换上一次的持久化文件。

持久化文件的默认名称为:dump.rdb。

整个过程中,主进程不进行任何IO操作,这就确保了极高的性能。

RDB持久化的触发机制:

● 条件触发

● 指令触发

条件触发:

在以下三件事 任一件发生时,RDB持久化触发:

● 900秒以内,至少有1个key被改动;

● 300秒以内,至少有10个key被改动;

● 60秒以内,至少有10000个key被改动。

以上参数均可以在配置文件中进行修改。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

指令触发:

save:阻塞其它进程,进行RDB持久化。

bgsave:在后台异步进行RDB持久化。

RDB策略的优势在于:适合大规模的数据恢复,对数据完整性和一致性的要求不高。

劣势在于:如果Redis意外宕机,会丢失最后一次快照后的所有修改。

1.2.2 AOF

AOF,Append Only File:以日志的形式,将Redis执行过的所有写指令记录下来,只允许追加新文件但不可以对已保存的文件进行修改。恢复数据时,Redis会读取日志文件重新构建数据。

AOF持久化文件的默认名称为:appendonly.aof。

AOF策略在Redis中是默认不启用的,需要通过修改配置文件开启。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

AOF持久化的触发机制:

默认每秒执行一次,如果在一秒内宕机,数据丢失。

通过修改配置文件,可以设置三种不同的AOF策略:

● always:同步持久化,即每次发生数据变更 都会被立即记录到磁盘。

● everysec:出厂默认设置,异步操作,每秒记录一次。

● no:从不。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

如果AOF持久化进行时发生系统错误,导致aof文件被写入了异常数据,进一步导致恢复数据时报IO异常,可以通过修复指令对损坏的aof文件进行修复。

修复命令:

redis-check-aof --fix 文件名

AOF采用文件追加的方式,产生的文件会越来越大,为了避免产生的aof文件占用太多存储空间,Redis增加了Rewrite机制。

Rewrite:重写,当aof文件的大小超过了设定的阈值时,Redis会对aof文件的内容进行压缩,只保留可以恢复数据的最小指令集。

重写过程中Redis并没有读取旧的aof文件,而是fork出一条子进程,将内存中当前数据集用命令的方式重写,类似于快照。

Rewrite的触发机制:

● 条件触发

● 指令触发

条件触发:

当aof文件的大小超过了设定的阈值时,Rewrite发生。

Rewrite的阈值默认为以下两个条件同时满足:

  • [aof文件的大小]超出[上一次rewrite后的文件大小]的大小,达到[上一次rewrite后的文件大小]的100%
  • aof文件大于64M

以上参数均可以在配置文件中进行修改。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

指令触发:

bgrewriteaof:在后台异步进行重写。

1.2.3 同时开启RDB和AOF

RDB和AOF两种策略可以同时存在。

在同时开启了RDB和AOF的情况下,当Redis重启时会优先载入aof文件来恢复数据,因为通常aof文件保存的数据集要比rdb文件更完整。

性能建议:

因为rdb文件只用作后备用途,建议只在slave上持久化rdb文件,而且只保留“15分钟备份一次”的规则就够了。

如果启用了AOF,好处是在最恶劣的情况下丢失的数据也不会超过两秒,恢复数据时只需要载入aof文件即可,代价是带来了持续的IO。AOF rewrite过程中产生的新数据写入新文件造成的阻塞几乎是不可避免的,所以只要硬盘许可,应尽量减少AOF rewrite的频率。另外AOF rewrite的默认阈值64M太小了,可以设到5G以上。

如果不启用AOF,仅靠Master-Slave Replication实现高可用性也可以,能省掉一大笔IO开销,同时也减少了AOF rewrite带来的系统波动,但如果Master和Slave同时倒掉,会丢失十几分钟的数据,在这种情况下启动脚本时,要比较Master和Slave中的rdb文件,载入较新的那个。

1.3 Redis是NoSQL数据库

NoSQL数据库:Not Only SQL,泛指非关系型数据库,区别于关系型数据库,它们不保证关系数据的ACID特性。

NoSQL有如下优点:

● 易扩展。NoSQL数据库的种类繁多,但它们都有一个共同点:去掉了关系型数据库的关系型特性。因为数据之间无关系,所以非常容易扩展,因此NoSQL数据库在架构的层面上可扩展性很强。

● 高性能。NoSQL数据库都具有非常高的读写性能,在大数据量下同样表现优秀,这得益于它的无关系性,数据库结构简单。

Redis是NoSQL数据库,它的数据格式符合NoSQL数据库数据格式的特征:

NoSQL数据库无需事先为要存储的数据建立字段,随时可以存储自定义的数据格式。

Redis的数据格式

Redis的基本数据格式是键值对:key-value。

Redis的五大数据类型:string、hash、list、set、zset。

● string:字符串。Redis中所有的key都是string类型的数据。string类型是二进制安全的,意思是Redis的string可以包含任何数据,比如jpg图片或者序列化的对象。

● hash:哈希。hash是一个键值对集合,适合用于存储对象。

● list:列表。list的底层实际上是链表。

● set:set集合。set是string类型的无序集合,不允许重复的成员,通过HashTable实现。

● zset:sorted set,有序集合。zset和set一样也是string类型元素的集合,且不允许重复的成员,不同的是每个元素都会关联一个double类型的分数,Redis通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数可以重复。

2 Redis能做什么?

redis有什么用-常见问题-PHP中文网

Redis的所有操作都是通过指令完成的。由此我们很容易想到:Redis提供了什么命令,就能够实现什么功能。

根据命令集,Redis能够完成的比较重要的功能有:

● 数据操作

● 支持事务

● 消息的订阅和发布

● 主从复制

2.1 数据操作

2.1.1 基本操作命令

keys *        查看当前所有key

20210201123254596.png

set        设值

get        取值(当value不为string类型时报错)

20210201123513123.png

mset        批量设值

mget        批量取值

20210201131136709.png

setnx        不覆盖设值

20210201131420602.png

exists        判断key是否存在

20210201123739213.png

del        删除key

20210201125752286.png

type        查看数据类型(因为key的数据类型一定是string,所以返回的是value的数据类型)

20210201124521688.png

ttl        查看key的剩余存活时间(-1永久存活,-2不存在的key)

2021020113025659.png

expire        设置key的存活时间(单位:秒)

20210201130527988.png

setex        设值时设置key的存活时间

20210201131724370.png

select        切换到其它库(默认0)

20210201125117341.png

move        移动key到其它库

20210201125432107.png

flushall        清空所有库(慎用)

20210201124754126.png

2.1.2 string的相关操作

strlen        获取字符串长度

20210201132030119.png

append        增补字符串

2021020113222213.png

getrange        截取字符串

20210201132449513.png

setrange        从某个坐标开始部分替换字符串

20210201132651685.png

incr        自增

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

incrby        等差递增

decrby        等差递减

2021020113302616.png

2.1.3 hash的相关操作

hset        设值

hget        取值

hmset        批量设值

hmget        批量取值

hgetall        获取全部信息

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

hkeys        获取所有key

hvals        获取所有value

hexists        判断是否存在key

hdel        删除

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

hincrby        自增

20210201144700560.png

2.1.4 list的相关操作

lpush        左侧入栈

rpush        右侧入栈

lrange        从某个坐标开始查看list(-1表示全部)

lindex        查看某个坐标的值

lset        设置某个坐标的值

20210201133546577.png

2021020113434683.png

20210201134618808.png

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

lpop        左侧出栈

20210201133758985.png

rpop        右侧出栈

20210201133833851.png

llen        查看list长度

20210201134827267.png

linsert        插入

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

lrem        删除(1个3,2个3,3个1)

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

ltrim        截取

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

2.1.5 set的相关操作

sadd        添加元素(自动去重)

smembers        展示set中所有成员

sismember        判断是否为set成员

scard        查看set集合成员个数

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

spop        随机弹出成员

srem        删除成员

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

srandmember        随机取出n个值

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

两set集合关系:

sunion        并集

sinter        交集

sdiff        差集

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

smove        移动成员

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

2.1.6 zset的相关操作

zadd        添加成员

zrange        查看zset中的成员

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

 zrangebyscore        按分数筛选(加括号表示不包括)

20210201145728316.png

zscore        获取分数

20210201150027152.png

zrem        删除成员(不演示)

zrevrange        按分数排名

zrevrank        获取某个成员的分数排名

20210201150240241.png

20210201150417425.png

2.2 支持事务

事务本质是一组命令的集合。把一组命令放入一个队列中,一次性、顺序性、排他性地执行。

2.2.1 Redis事务命令

multi        事务开始

exec        执行事务

20210201163706782.png

discard        事务取消

20210201163908559.png

事务在编译时遇到错误:(整个事务失败)

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

事务在运行时遇到错误:(事务成功)

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

watch        监视key(如果在事务执行之前监视的key被其它命令改动,事务取消)

执行exec会将之前加的监控锁全部取消。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

unwatch        取消对所有key的监视

20210201165949944.png

2.2.2 Redis事务的特性

● 单独的隔离操作

事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的请求打断。

● 没有隔离级别的概念(因为是NoSQL)

因为事务提交前任何指令都不会被实际执行,也就不存在“事务内的查询要看到事务里的更新,事务外的查询不能看到事务里的更新”的问题。

● 不保证原子性

Redis同一个事务中如果有一条命令执行失败,其后的命令仍然会被执行,没有回滚。

2.3 消息的订阅和发布

消息的订阅和发布:进程间的一种通信模式,发送者(pub)发送消息,订阅者(sub)接收消息。

假如三个客户端client1、client2、client3 订阅了频道channel1。

当有新消息发送给频道channel1时,这条消息会被分别发送给订阅它的三个客户端client1、client2、client3。

subscribe        订阅频道

unsubscribe        退订频道

publish        将消息发送到指定的频道

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

psubscribe        订阅符合条件的多个频道(通配符*)

punsubscribe        退订符合条件的所有频道

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

2.4 主从复制

主从复制:即master/slaver机制,主机数据更新后根据配置和策略,自动同步到备机,master以写为主,slave以读为主。

主从复制可以用来实现读写分离、容灾恢复等。

2.4.1 多节点搭建

在一台虚拟机上搭建3个节点。

1. 拷贝多个redis.conf文件。

每个节点需要一个配置文件。为搭建3个节点,这里我把redis.conf文件复制了3份:

20210202105050731.png

2. 依次修改每个配置文件。

20210202110251240.png

配置文件修改细节:

指定端口(3个配置文件依次设为6379、6380、6381)

20210202105434176.png

开启daemonize yes

20210202105805953.png

pidfile名称(与端口号对应)

20210202105625771.png

log文件名字(与端口号对应)

20210202105739890.png

dump.rdb名字(与端口号对应)

20210202105906105.png

3. 依次启动3个节点。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

2.4.2 主从复制命令

主从复制原则:配从不配主。

slaveof        成为某节点的从节点

slaveof no one        不再是任何节点的从节点

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

info replication        查看节点信息

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

读写分离的体现:主写从读。

成为其它节点的从节点后,该节点不能再写入:

2021020212155615.png

shutdown        节点关闭

主节点关闭后,从节点原地待命,主节点重启后与其它节点的主从关系不变。

从节点关闭并重启后,不再是其它节点的从节点。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

2.4.3 主从复制原理

slave每次连接master时都全量复制master的数据,之后master对数据进行修改时,slave对改动进行增量复制。

slave变更master时(除非自己成为master),之前的数据会被清空,然后全量复制新master的数据。

主从复制的缺点在于复制延时。由于所有的写操作都是先在master上操作,然后同步更新到slave,所以从master同步到slave会有一定的延迟,当系统繁忙时,延迟问题会更加严重。

2.4.4 主从复制策略

常见的主从复制策略有:

● 一主二仆

● 薪火相传

● 反客为主

一主二仆:一个master对应两个slave。

薪火相传:一个master的slave同样可以接收其它节点的连接和同步请求,成为其它节点的master。这么做可以减轻第一个master的写压力。

反客为主:即slaveof no one,使当前节点不再是其它节点的slave,自己成为master。

2.4.5 哨兵模式

哨兵模式:后台监控master。当master发生故障时,所有slave会进行投票选举,从slave中选出新的master。

1. 配置哨兵。

在redis.conf所在目录下新建sentinel.conf文件(文件名称不能出错)。

20210202132907500.png

sentinel.conf文件内容:

sentinel monitor 自定义的被监控数据库名称 127.0.0.1 6379 1

    最后的数字1表示master挂掉后slave选举时得到1票的slave成为主机。

示例:

20210202132828300.png

一组sentinel能同时监控多个master。

2. 启动哨兵。

20210202133555722.png

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

3. 关闭master,选举出新的master。

(127.0.0.1:6381成为新的master)

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

4.重启之前的master,之前的master自动成为新master的slave。

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

3.Redis的安装、使用和调优

3.1 Redis的安装

官网:https://redis.io/

Redis基本上都是在Linux操作系统中安装和应用。

Linux安装:

1. 从官网下载Redis,把压缩包(我下载到的版本是redis-6.0.10.tar.gz)放到Linux系统的/opt/目录下。

如果你是在电脑上安装了Linux系统的虚拟机,并且把压缩包下载到了Windows系统的主机上,可以参考下面链接文章将压缩包上传到虚拟机。

Windows与Linux之间互传文件的方法_网络资源是无限的-CSDN博客_windows传文件到linux

如果无法连接本地主机网络和虚拟机网络,可以参考下面链接文章。

如何使用Xshell连接VMware上的Linux虚拟机 - shireenlee - 博客园

2. 进入/opt/目录,解压Redis压缩包redis-6.0.10.tar.gz,解压完成后/opt/目录下出现目录redis-6.0.10。

tar -zxvf redis-6.0.10.tar.gz

3. 进入redis-6.0.10目录,执行make命令(输入make,回车),安装Redis。

如果此时报错:structredisServer没有名为XXXX的成员,可以参考下面链接文章。

Linux环境下安装redis报错structredisServer没有名为XXXX的成员_羽毛的博客-CSDN博客

4. make完成后执行make install命令(输入make install,回车)。

5. 查看默认安装目录/usr/local/bin/。

20210128130155202.png

3.2 Redis的使用

1. 在Redis的安装路径下,可以找到Redis配置文件redis.conf(建议备份这个文件)。

20210129110613231.png

2. 修改redis.conf。

vi redis.conf

找到如图所示的内容,将daemonize(守护进程)改为yes。

20210201154802530.png

按i键进入编辑模式,修改完成后按Esc键退出编辑模式,输入:wq保存退出。

3. 启用redis服务。

redis-server

4. 启用redis客户端。

redis-cli

5. ping。

20210201155648151.png

3.3 Redis调优

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

20210129125642800.png

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQyMDgyMTYx,size_16,color_FFFFFF,t_70

 

视频链接:

尚硅谷超经典Redis教程,redis实战,阳哥版从入门到精通_哔哩哔哩_bilibili

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值