2021-08-05

Redis

概述

Redis 是什么?

Redis(Remote Dictionary Server),远程字典服务。
是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
区别的是redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步。在这里插入图片描述

免费和开源!是当下最热门的NoSQL技术之一!也被人们称之为结构化数据库。

Redis能干嘛?

1.内存存储,持久化。内存中是断电即失,所以说持久化很重要
2.效率高,可用于高速缓存
3.发布订阅系统
4.计时器,计数器
5.。。。。。

特性

1.多样的数据类型
2.持久化
3.集群
4.事务

官网

1.中文网:http://www.redis.cn/
2.英文网:https://redis.io/
3.下载:见官网
在这里插入图片描述

Linux 安装

1.下载安装包
2.tar -axvf redis.tar.gz
3.redis解压目录下执行make和make install
4.redis默认安装路径:/usr/local/bin
5.修改.redis.conf ,改成后台启动 daemonize yes
6.启动 redis-server redis.conf(路径)
7.使用redis-cli测试连接:
在这里插入图片描述8.关闭redis服务
在这里插入图片描述

基础知识

redis默认有16个数据库
在这里插入图片描述使用的时候默认使用第0个数据库,可以使用select命令来切换使用哪一个数据库。
常用命令:
select No(0~15) : 选择使用哪个数据库
keys * : 查看当前库中所有的key
flushdb : 清空当前数据库
flushall :清楚全部数据库内容
exists key : 查询健是否存在
move key 1 : 移除数据库1中的key
expire key 时间 :key在某段时间后过期
type key :查看key的类型

Redis是单线程的

Redis是基于内存操作的,CPU不是redis性能瓶颈,Redis的瓶颈是根据机器的内存和网络带宽。

Redis为什么单线程这么快?

1.误区1:高性能服务器一定是多线程的?
2.误区2:多线程(CPU上下文切换)一定比单线程效率高
CPU>内存>硬盘
核心:redis是将所有的数据全部放在内存中,所以说使用单线程去操作效率就是最高的,多线程(CPU上下文切换:耗时操作),对内存系统来说,如果没有上下文切换效率就是最高的。多次读写都是在一个CPU上的,在内存情况下,这个就是最佳方案!

Redis五大数据类型

Redis-Key

String

字符串类型。
set key value :设置值
get key :获取key的value
append key value : 扩展字符串内容,key不存在的话想当于set
strlen key : 获取字符串长度
incrby key step : 给key的value加上step
decrby key step :给key的value 减step
getrange key start end :截取闭区间的value值
setrange key offset value :替换指定位置开始的字符串

List

列表类型。
lpush key value :向list中插入一个值到list头部(此时list可以理解为栈的模型)
rpush key value:向list中插入一个值到list尾部
lpop key :移除list中第一个元素
rpop key :移除list中最后一个元素
lindex key index : 通过index获取list中值

Set

Hash

Zset

三种特殊数据类型

geospatial

hyperloglog

bitmaps

事务

事务本质:一组命令的集合!一个事务中的所有命令都会被序列化,在事务执行过程中,会按照顺序执行。
一次性 顺序性 排他性,执行一系列的命令。
------队列 set set set 执行----------

Redis事务没有隔离级别的概念。
所有的命令在事务中,并没有被执行!只有发起执行命令的时候才会执行。
Redis单条命令保证原子性的,但是事务不保证原子性。要么同时成功,要么同时失败,原子性。
Redis事务:
1.开启事务(multi)
2.命令入队
3.执行事务(exec)
4.取消事务(discard)

编译型异常:命令有错误时,事务中所有命令都不会被执行。
在这里插入图片描述
运行时异常:如果事务队列中存在语法性错误,那么在执行命令时,其他命令可以正常执行,语法性错误的命令抛出异常。
在这里插入图片描述

监控!Watch

悲观锁:
很悲观,认为什么时候都会出问题,无论做什么都会加锁。
乐观锁:
1.很乐观,认为什么时候都不会出问题,所以不会加锁。更新数据时去判断一下,在此期间是否有人修改过这个数据。
2.获取version
3.更新的时候比较version
同时打开两个redis客户端,A客户端监视一个值,然后在事务中修改这个值。B客户端中也去对同一个值修改。结果是A客户端中的事务执行异常。redis中使用watch相当于使用乐观锁的效果。
(watch相当于获取当前版本,unwatch相当于放弃当前锁版本)

Redis.conf 详解

1.单位

在这里插入图片描述 配置文件 unit单位 大小写不敏感

2.包含

在这里插入图片描述可以包含其他的配置文件,类似c语言包含头文件,makefile中包含其他的文件

3.网络

bind 127.0.0.1 #绑定的IP
port 6379 #绑定的端口号

4.通用GENERAL

daemonize yes #是否以守护进程的方式运行
pidfile /var/run/redis_6379.pid #如果以后台的方式运行,需要指定一个pid文件
loglevel notice #日志等级设置
logfile “” #指定日志文件名,默认标准输出
databases 16 #默认数据库数量

4.快照SNAPSHOTTING

持久化,在规定的时间内,执行了多少次操作,则会持久化到文件(.rdb .aof)
redis是内存数据库,如果没有持久化,断电即失。

save 3600 1 #如果3600s内有一个key进行了修改,就进行持久化操作
save 300 100
save 60 10000

stop-writes-on-bgsave-error yes #持久化操作如果出现错误,继续工作
rdbcompression yes #是否压缩 rdb文件
rdbchecksum yes #保存rdb文件时,进行错误的检查校验
dir ./ #rdb文件的保存目录
dbfilename dump.rdb #rdb文件名

5.REPLICATION 复制

6.SECURITY 安全

config set requirepass “123456” #设置密码

7.CLIENTS 限制

maxclients 10000 #客户端最大连接数量
maxmemory #最大内存容量
maxmemory-policy noeviction #内存满了之后处理策略

8.APPEND ONLY MODE aof配置

appendonly no #默认是不开启aof模式的,默认使用rdb的方式持久化
appendfilename “appendonly.aof” #持久化的文件的名字
appendfsync everysec #每秒执行一次同步

Redis持久化

RDB(Redis DataBase)

什么是RDB?
在指定的时间间隔内将内存中的数据集体写入磁盘中,即上文提到的Snapshot快照,它恢复时是将快照文件直接读到内存里。

在这里插入图片描述开启RDB持久化方式很简单,客户端可以通过向Redis服务器发送save或bgsave命令让服务器生成rdb文件,或者通过服务器配置文件指定触发RDB条件。每次执行都会将所有redis内存快照到一个新的rdb文件里,并覆盖原有rdb快照文件。
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化的过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何I/O操作的,这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加高效。RDB缺点是最后一次持久化后的数据可能丢失(断电)。Redis.conf默认使用RDB方式持久化。
总结来说就是三个步骤:
1.生成临时rdb文件,并写入数据。
2.完成数据写入,用临时文件替代正式rdb文件。
3.删除原来的db文件。

AOF(Append Only File)

什么是AOF?
与RDB存储某个时刻的快照不同,AOF持久化方式会记录客户端对服务器的每一次写操作命令,并将这些写操作以追加的方式保存到以后缀为aof文件中,在Redis服务器重启时,会加载并运行aof文件的命令,以达到恢复数据的目的。

AOF保存的是 appendonly.aof
在这里插入图片描述 1.在重写期间,由于主进程依然在响应命令,为了保证最终备份的完整性;因此它依然会写入旧的AOF file中,如果重写失败,能够保证数据不丢失。
2.为了把重写期间响应的写入信息也写入到新的文件中,因此也会为子进程保留一个buf,防止新写的file丢失数据。
3.重写是直接把当前内存的数据生成对应命令,并不需要读取老的AOF文件进行分析、命令合并。
4.不管是RDB还是AOF都是先写入一个临时文件,然后通过 rename 完成文件的替换工作。

从持久化中恢复数据

数据的备份、持久化做完了,我们如何从这些持久化文件中恢复数据呢?如果一台服务器上有既有RDB文件,又有AOF文件,该加载谁呢?

其实想要从这些文件中恢复数据,只需要重新启动Redis即可。我们还是通过图来了解这个流程:

在这里插入图片描述

Redis订阅发布

Redis 发布订阅 (pub/sub) 是一种消息通信模式:发送者 (pub) 发送消息,订阅者 (sub) 接收消息。

Redis 客户端可以订阅任意数量的频道。

下图展示了频道 channel1 , 以及订阅这个频道的三个客户端 —— client2 、 client5 和 client1 之间的关系:
在这里插入图片描述当有新消息通过 PUBLISH 命令发送给频道 channel1 时, 这个消息就会被发送给订阅它的三个客户端:
在这里插入图片描述测试:
客户端A订阅频道 wjw:
在这里插入图片描述客户端B在wjw频道上发布消息“are you ok?”
在这里插入图片描述

Redis主从复制

一、Master&Slave是什么?

也就是我们所说的主从复制,主机数据更新后根据配置和策略,自动同步到备机的master/slaver机制,Master以写为主,Slave以读为主。

二、它能干嘛?

  读写分离,容灾恢复

三、怎么玩?
1、配从(库)不配主(库);
2、从库配置:slaveof [主库IP] [主库端口];
补充:每次slave与master断开后,都需要重新连接,除非你配置进redis.conf文件;键入info replication 可以查看redis主从信息。
3、修改配置文件细节操作
- 拷贝多个redis.conf文件
- 指定端口 : port 6379
- 开启daemonize yes :后台运行
- Pid文件名字 :/var/run/redis_6379.pid
- Log文件名字 :logfile “6379.log”
- Dump.rdb名字 :dump6379.rdb
4、常配主从关系
形式一: 一主二仆
在这里插入图片描述 一个Master,两个Slave,Slave只能读不能写;当Slave与Master断开后需要重新slave of连接才可建立之前的主从关系;Master挂掉后,Master关系依然存在,Master重启即可恢复

形式二:薪火相传
在这里插入图片描述 上一个Slave可以是下一个Slave的Master,Slave同样可以接收其他slaves的连接和同步请求,那么该slave作为了链条中下一个slave的Master,如此可以有效减轻Master的写压力。如果slave中途变更转向,会清除之前的数据,重新建立最新的。

  • 反客为主
    当Master挂掉后,Slave可键入命令 slaveof no one使当前redis停止与其他Master redis数据同步,转成Master redis。

四、复制原理
1、Slave启动成功连接到master后会发送一个sync命令;
2、Master接到命令启动后的存盘进程,同时收集所有接收到的用于修改数据集命令,在后台进程执行完毕之后,master
将传送整个数据文件到slave,以完成一次完全同步;
3、全量复制:而slave服务在数据库文件数据后,将其存盘并加载到内存中;
4、增量复制:Master继续将新的所有收集到的修改命令依次传给slave,完成同步;
5、但是只要是重新连接master,一次完全同步(全量复制)将被自动执行。

Redis哨兵模式

主从切换技术的方法是:当主服务器宕机后,需要把一台从服务器切换为主服务器,这就需要人工干预,费时费力,还会造成一段时间内服务不可用。这不是一种推荐方式,更多时候我们考虑哨兵模式。即上文提到的“反客为主“的自动版,能够后台监控主机是否故障,如果发生了故障能够根据投票数自动将从库转换为主库。

哨兵模式是一种特殊的模式,首先Redis提供了哨兵的命令,哨兵是一个独立的进程,作为进程,它会独立运行。其原理是哨兵通过发送命令,等待Redis服务器响应,从而监控运行的多个Redis实例。
在这里插入图片描述这里的哨兵有两个作用

1.通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器。
2.当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,
  让它们切换主机。

然而一个哨兵进程对Redis服务器进行监控,可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
在这里插入图片描述用文字描述一下故障切换(failover)的过程。假设主服务器宕机,哨兵1先检测到这个结果,系统并不会马上进行failover过程,仅仅是哨兵1主观的认为主服务器不可用,这个现象成为主观下线。当后面的哨兵也检测到主服务器不可用,并且数量达到一定值时,那么哨兵之间就会进行一次投票,投票的结果由一个哨兵发起,进行failover操作。切换成功后,就会通过发布订阅模式,让各个哨兵把自己监控的从服务器实现切换主机,这个过程称为客观下线。这样对于客户端而言,一切都是透明的。

测试:一主二从状态
使用步骤:
1、在Master对应redis.conf同目录下新建sentinel.conf文件,名字绝对不能错;

   2、配置哨兵,在sentinel.conf文件中填入内容:
         sentinel monitor 被监控数据库名字(自己起名字) ip port 1

3、启动哨兵模式:
命令键入:redis-sentinel /myredis/sentinel.conf

小结:
1)、如果master节点断开,这时候就会在从节点中随机选择一个作为新的主节点。
2)、如果之前断开的主节点再次恢复连接,哨兵模式下,只能沦为新的主节点的从节点。

Redis缓存穿透和雪崩

未完待续。。。。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个数据可以使用Python进行解析和处理。可以按照以下步骤进行: 1. 将数据分割成每个数据项。 ``` data_items = data.split(',') ``` 2. 对于每个数据项,将其按#分割成四个小项,并存储到一个列表中。 ``` data_list = [] for item in data_items: item_list = item.split('#') data_list.append(item_list) ``` 3. 对于每个小项,进行相应的类型转换。 ``` for item in data_list: item[0] = int(item[0]) # 题号转换为整数 item[1] = datetime.datetime.strptime(item[1], '%Y-%m-%d %H:%M:%S') # 时间转换为datetime类型 if item[2] != '': # 操作类型转换为整数 item[2] = int(item[2]) item[3] = str(item[3]) # 科目转换为字符串类型 ``` 4. 可以按照需要对数据进行进一步处理,如按照题号、时间等进行排序、筛选等操作。 完整的Python代码如下: ``` import datetime data = '''1#2021-05-18 14:31:55##初级会计实务,2#2021-05-18 14:31:57#12#初级会计实务,2#2021-05-18 14:32:08##初级会计实务,3#2021-05-18 14:32:09#12#初级会计实务,4#2021-05-18 14:32:34#12#初级会计实务,4#2021-05-18 14:32:45##初级会计实务,5#2021-05-18 14:32:46#12#初级会计实务,5#2021-05-18 14:32:57##初级会计实务,6#2021-05-18 14:33:00#12#初级会计实务,7#2021-05-18 14:33:44#12#初级会计实务,7#2021-05-18 14:34:42##初级会计实务,8#2021-05-18 14:34:43#12''' # 将数据分割成每个数据项 data_items = data.split(',') # 对于每个数据项,将其按#分割成四个小项,并存储到一个列表中 data_list = [] for item in data_items: item_list = item.split('#') data_list.append(item_list) # 对于每个小项,进行相应的类型转换 for item in data_list: item[0] = int(item[0]) # 题号转换为整数 item[1] = datetime.datetime.strptime(item[1], '%Y-%m-%d %H:%M:%S') # 时间转换为datetime类型 if item[2] != '': # 操作类型转换为整数 item[2] = int(item[2]) item[3] = str(item[3]) # 科目转换为字符串类型 print(data_list) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值