学习Redis的历程一

  •  什么是Redis 

  • Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。
  • Redis简单说明

  • redis是单线程的,基于内存操作。Redis能读的速度是110000次/s,写的速度是81000次/s
  • Redis 数据类型

  • redis有五种数据类型,分别是字符串(string),哈希(hash),列表(list),集合(set),有序集合(sorted set)。

 

  • Redis事务

  • redis事务的实质就是一组命令的集合。一个事务中所有命令都被序列化,按顺序执行。具有一次性,有序性,排他性。
  • 单个redis命令具有原子性,但是事务中没有。
  • 使用事务的一般步骤分为:开启事务,命令入队,执行事务。
  • 执行事务的时候如果是编译性报错(代码报错,命令报错),那么事务不会正常执行,如果是运行报错(比如对数据的不合理处理),那么只是单个命令不会执行成功,其他正确的命令是会正常执行的。
  • multi  开始事务
  • discard 取消事务  
  • exec 执行事务。
  • watch 监控
  • 我们可以通过watch命令实现一个类似乐观锁的操作。即我们默认数据不会出现问题,只有在更新数据时进行判断,这期间是否有改动过数据(在MySQL中通过version字段),如果数据变化了,那么执行就会失败,一般适用于读操作比较多的场景。比如:通过watch监视某个key后,在一个线程中执行事务(事务中会访问到监视的key对应的值),而另一线程在事务执行前修改了所监视的key对应的值,那么事务就回执行失败。

 

  • Redis持久化

  • Redis持久化有RDB和AOF两种模式。
  • RDB
  • 在指定间隔时间内将内存中的数据集快照写入磁盘,恢复时将快照文件直接读到内存中。redis会fork一个子进程来持久化,会先把数据写入到一个临时文件中,等持久化过程结束了,在把该文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这确保了极高的性能。如果恢复数据量比较大且对数据完整性要求不是很高,那么推荐用RDB。
  • RDB触发情况
  • 在满足save条件下,会触发
  • 在执行flushall命令也会触发
  • 在退出redis是时也会产生RDB文件
  • 缺点:
  • 需要一定时间间隔进行操作,如果在不满足save条件下宕机数据可能会丢失。
  • fork进程会占用一定内存空间。
  • AOF
  • 即append only file。以日志的形式记录每个操作,将redis执行过的所有指令都记录下来,读的操作不会记录。redis启动之处,会通过读取该文件构建新的数据,也就是redis启动的时候把.aof文件中的操作执行一次来实现数据的恢复。如果这个aof文件有问题,被修改过,那么redis是启动不了的,需要我们自己去修复这个文件。redis提供了一个工具redis-check-aof,我们可以通过命令redis-check-aof --fix appendonly.aof 进行修复。当AOF文件大于配置所设置的大小的时,会fork一个进程来重写aof文件,使aof文件不会过大,一般来说aof是可以无限增加的,所以AOF文件会越来越大。
  • 缺点:
  • 相对于数据文件来说,AOF远远大于RDB,修复数据也比RDB慢。
  • AOF运行效率比RDB慢。
  •  

 

  • 同时开启两种持久化方式时
  • 在这种情况下,当redis重启的时候会优先载入AOF文件来恢复原始的数据,因为通常情况下,AOF文件保存的数据要比RDB文件保存的数据要完整
  • 数据不实时,同时使用两者服务器重启也只会找AOF文件,建议使用RDB备份,因为AOF在不断变化不好备份。
  • 性能方面
  •  因为RDB文件只用作后备用途,建议在slave上持久化RDB文件,而且只要15分钟备份一次就够了,只保留save 900 1这条规则。
  •  如果只使用AOF,优点是在最恶劣的情况下丢失的数据也不会超过两秒,启动脚本比较简单只load自己的aof文件就可以了,代价一是带来了持续的IO,二是AOF最后将重写过程产生的新数据写到新文件造 成的阻塞几乎是不可避免的。在硬盘许可情况下,应该尽量减少AOF rewrite的频率,AOF重写的基础大小默认值64M太小了,可以设置到 5G以上,默认超过原大小100%大小重写可以改到适当的数值。
  •  如果不使用AOF 仅靠Master-Slave Repllcation 实现高可用性也可以,能省掉一大笔IO,也减少了重写时带来的系统波动,代价是如果Master
  •   /Slave 同时倒掉(断电),会丢失十几分钟的数据,启动脚本也要比较两个Master/Slave中的RDB文件,使用最新的那个。

 

  • Redis发布订阅

  • 有三个角色:发布者,发布系统,订阅者。
  • 订阅者订阅一个频道,当发布者发布消息时订阅者就可以收到。
  • 订阅某个频道后,redis-server里面维护了一个字典,字典的key就是频道,value是一个链表,链表里面就是各个订阅者,遍历这个表,把信息发给各个订阅者。

 

  • Redis主从复制

  • 主从复制,读写分离。80%的压力都是读操作。一台主机可以有多台从机,一台从机只有一台主机。
  • 一般情况下,每台服务器都是主服务器,服务器身份的修改可以通过命令修改,也可以在配置中 replication相关位置修改。
  • 主机负责写,从机负责读,主机中所有信息和数据都会被从机保存,主机断了后,从机中依然能获取到主机写的信息,主机重新连接后,写的信息从机依然能获取到。
  • 如果是命令行生成的从机,断开后再连接时默认是主机,主要变为从机后,依然能从主机中获得所有数据。
  • 原理
  • 从机成功连接到主机后,会发送一个sync的命令到主机,主机接到命令后,会启动存盘进程,同时收集所有修改数据的命令,在后台进程执行完毕之后,主机将所有的数据发送给从机,完成一次数据同步。
  • 全量复制:从机接收到主机的数据后,将其存盘并加载到内存中。
  • 增量复制:主机将新增修改数据的命令依次发给从机,以此完成数据同步。

 

  • 哨兵模式

  • 哨兵是一个独立的进程,哨兵通过发送命令,等待redis服务器响应,从而监控运行的多个redis服务。如果当初始设定主机的宕机后后,自动通过一个/多个哨兵从从机中选出一个新的主机。
  • 优点:
  •     哨兵集群,基于主从复制模式,所有的主从配置优点,它全有
  •     主从可以切换,故障可以转移,系统的可用性会更高
  •     哨兵模式就是主从模式的升级,手动到自动,更加健壮。
  • 缺点:
  •     redis不好在线扩容,集群容量一旦达到上限,在线扩容就十分麻烦
  •     实现哨兵模式的配置其实是很麻烦的,选择性太高。

 

  • Redis缓存穿透和雪崩

  • 缓存穿透
  • 当单个用户查询一个数据的时候,如果在缓存层找不到,那么就会去持久层数据库查找,如果持久层数据库也没有,那么查询失败。如果多个用户出现这种情况的时候就会给服务器造成很大的压力,出现缓存穿透。
  • 解决办法:
  • 布隆过滤器:布隆过滤器是一种数据结构,对所有可能查询的数据以hash的方式存储,先在控制层进行校验,如果不符合则丢弃,这样就避免了对底层存储系统查询的压力。
  •  
  • 缓存空对象:当存储层不命中后,即使返回的空对象也存储起来,同时会设置一个过期时间,之后再查找这个数据时,就回从缓存中取,保护了后端数据源。这种方式缺点:如果空值能被缓存起来,那么就会需要新的空间新的键去存储这些空值。
  • 即使设置了过期时间,缓存层和存储层还是会有一段时间窗口不一致,对于需要保持一致性的业务会有影响。
  •  
  • 缓存击穿
  • 即当某个热点数据在缓存失效的瞬间,大量请求并发访问,那么就会击穿缓存,去访问数据库来查询新的数据并回写到缓存,从而使数据库压力过大。
  • 解决方法:
  • 1.把热点数据设置永不过期。从缓存层面来看,热点数据不过期,所以不会出现数据过期后访问数据库问题。但是会占用内存,且redis内存满了后会去清理一些数据。
  • 2.加互斥锁。保证每个key在同一时间只有一个线程去查询后端服务,其他线程没有获得分布式锁的权限,需要等待。这种操作把压力转移到分布式锁,对锁的考验比较大。
  •  
  • 缓存雪崩
  • 即在某一时刻缓存中大量数据失效或者redis宕机。
  • 解决方法:
  • redis高可用。即多增几台redis服务器,其中一台挂掉后其他的服务器还可以使用(异地多活)。
  • 限流降级。即缓存失效后通过加锁或者队列的方式来控制同一时刻对访问数据库并且会写数据到缓存的线程数量,比如同一时刻只有一条线程。
  • 数据预热。在正式部署的时候,先把可能访问的数据访问一遍,这样就回将大量数据加载到缓存中。在即将高并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让失效的时间尽量均匀。

 

  • Redis.conf 中一些配置

  •  绑定的IP
  •   是否是保护模式,yes表示是,no表示不是
  •  端口
  •  密码,需要在这里设置密码的话把#去掉,然后把foobared改成要设置的密码
  •   是否是以守护进程的方式运行,yes表示是,no表示不是
  •  如果以后台的方式运行,就需要指定一个pid文件
  •  rdb的文件名,可以用于指定生成的rdb文件名(默认是dump),也可用于更换数据库,即停掉redis服务器后,修改配置中的这个rdb名字,启动redis服务器的时候就会读取对应名字的RDB文件。
  •  RDB文件存放路径
  • 这个就是RDB持久化时间间隔的一些设置
  • 第一条表示如果900s内,如果至少有一个key进行了修改,就进行持久化操作
  • 第二条表示如果300s内,如果至少10key进行了修改,就进行持久化操作
  • 第三条表示如果60s内,如果至有10000个key进行了修改,就进行持久化操作
  •  
  •   aof是否开启,yes表示是,no表示不是
  •  aof文件名
  • 这个是把操作命令写入AOF文件的设置
  • # appendfsync always   每次修改都sync,消耗性能
  • #appendfsync everysec 每秒执行一次sync,可能会丢失这一秒的数据
  • # appendfsync no 不执行sync,操作系统自己同步数据,速度最快
  •  如果AOF文件大于64M,那么就重写

 

  • 其他

  • 关系型数据库
  • 即一对一,一对多,多对多等关系模型,关系模型常见模型是二维表格模型,是表,行,列。比如Mysql。
  • 非关系型数据库(Nosql)
  • 列模型数据库 :Hbase 
  • 键值型 :Redis,MemcacheDB,
  • 文档类型 :MongoDB
  • MongoDB是bson格式,和json一样。是一个基于分布式存储的数据库,C++编写,主要用来处理大量的文档。
  • 是一个介于关系型数据库和非关系型数据库的中间产品,是非关系型数据库中功能最丰富,最像关系型数据库的。
  • 图关系数据库:Neo4j,Infogrid

知识参考https://www.bilibili.com/video/BV1S54y1R7SB?from=search&seid=1965327555807395680

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值