Redis

1.什么是NoSql?

NoSql意思是Not Only Sql,不仅仅是sql。在没有出现nosql之前我们用的都是关系型数据库,但关系型数据库应对动态的网站还是显得有些吃力,所以出现了Nosql。用来与关系型数据库相辅相成,提高网站效率。

2.Redis是干嘛的?

Redis是一种内存型数据库,能存储数据,取数据速度快。比如可以做数据库缓存,验证码,分布式session共享,数据过期等等。 

3.Redis的几种数据类型

string,list,set,zset,hash。

string就是key->value。

list就是key->java中的list。

set就是key->java中的set。

zset就是key->java中的set,每个元素必须携带一个分数,会按分数自动排序。

hash就是key->java中的hashmap。

4.Redis的持久化机制:快照模式(RDB模式),AOF模式

1.快照模式(RDB模式):redis默认开启RDB模式,RDB模式是保存当前时刻redis的数据与状态到一个dump.rdb文件中,数据持久化到磁盘中,默认保存在redis文件夹首层(可自己指定)。

  • 客户端开启RDB持久化:SAVE命令BGSAVE命令

          SAVE命令:SAVE命令之后,redis线程只被用来处理创建快照,后面的命令被阻塞。 

          BGSAVE命令:BGSAVE命令后,redis处理任务的线程(父线程)使用fork算法创建一个子线程专门来处理快照的生成。父线程继续处理客户端请求,在下一个写请求来临之前父子线程共享内存,当写请求到达时子线程只占用少量内存用于处理快照的生成。

  •  服务端配置触发创建快照阈值

          redis.conf中打开snapshot(rdb)并且设置了save就能触发快照。多少秒内有多少条修改。如save 900 1,900秒内有一个key被修改就能出发快照。

RDB模式的缺点:保存数据并不是最安全的,是有破绽的。比如redis服务器刚好触发了快照创建,然后我们修改了几个值,在下一次快照创建之前redis宕机了,那我们修改的数据就丢失了。 

2.AOF模式(append only file):AOF模式默认没有开启。将客户端对redis数据的所有写操作的命令追加到一个appendonly.aop文件中。当redis宕机了,只要重新读取aof文件,就能恢复之前的数据。

开启AOF:设置redis.conf文件中 appendonly yes 开启持久化。

日志追加频率:always,everysec,no

  • always:谨慎使用。每有一条redis写命令都会追加。虽然保证了数据的安全,但大量操作磁盘io会大大降低redis的速度。
  • everysec推荐使用。也是我们开启AOF模式之后默认的频率。每秒追加一次redis在这一秒内的所有写操作。保证redis处理速度的前提下,提高保证一下数据安全。即使系统奔溃也是丢失一秒内的数据。
  • no:不推荐。追加时机交给当前操作系统,我们无法预测他追加的时机,所以 不确定因素很多。

AOF模式的缺点:虽然AOF模式能保证数据的安全,但不断记录写操作的话,久而久之我们的appendonly.aof文件必然会越发庞大,而且有很多冗余的写指令,浪费磁盘内存。

RDB模式和AOF模式可以同时开启,但redis会优先使用AOF模式。

解决AOF的缺陷:AOF文件重写REWRITE。

解决AOF的缺陷:AOF文件重写REWRITE。根据当前redis的快照,推出全部写命令追加到新的appendonly.aof中替换原来的appendonly.aof文件。

appendonly.aof文件重写的触发机制:

  • 客户端触发:BGREWRITEAOF命令
  • 服务器配置方式自动触发:redis.conf配置文件中auto-aof-rewrite-percentage ,auto-aof-rewrite-min-size的值。如果设置auto-aof-rewrite-percentage值为100和auto-aof-rewrite-min-size 64mb,并且启用的AOF持久化时,那么当AOF文件体积大于64M,并且AOF文件的体积比上一次重写之后体积大了至少一倍(100%)时,会自动触发,如果重写过于频繁,用户可以考虑将auto-aof-rewrite-percentage设置为更大

重写原理(不会阻塞redis的服务):

1.redis线程(父线程)调用fork算法创建一个子线程,子线程根据redis当前状态创建快照,往临时文件中写入重建数据库状态的命令。

2.父线程继续处理客户端的命令,除了把写命令追加到原来的appendonly.aof文件中,还把写命令追加到一个缓存中。这样就能保证如果子线程重写失败的话不会出现问题。

3.当子线程把快照的内容全部追加到临时文件时,通知父线程,然后父线程把缓存的命令也追加到临时文件中。

4.现在父进程可以使用临时文件替换老的aof文件,并重命名,后面收到的写命令也开始往新的aof文件中追加。

5.springboot操作redis

1.引入spring-boot-starter-date-redis依赖场景(自动配置)。

2.自动创建一个StringRedisTemplate<String,String>一个,一个RedisTemplate<Object,Object>对象。默认的RedisTemplate<Object,Object>对象,其实不符合我们的要求,我们希望的是RedisTemplate<String,Object>对象。所以可以自己创建一个RedisTemplate<String,Object>对象,设置他的序列化方式,我们创建了springboot就不帮我们创建了。

3.springboot配置文件中配置redis主机端口等。

4.使用StringRedisTemplate,RedisTemplate封装好的方法操作redis。

6.redis做mybatis二级缓存

1.创建类,实现 org.apache.ibatis.cache.Cache 接口,且提供一个接受 String 参数作为 id 的构造器。在put,get,clear方法中操作redis。

2.mapper文件中加入cacahe标签。<cache type="com.zhaojisu.redis.RedisCache"/>

3.查询到达时,先去redis中找有没有get,没有再去数据库中查。查到了返回给service层并且将放入加入redis缓存put。当对该DAO进行DML时,自动调用clear方法清空缓存。

7.redis主从复制,哨兵模式,集群

  • 主从复制:主从架构主节点用来处理命令,从节点仅仅用来同步数据无法解决master节点出现故障后的服务转移。

       

  • 哨兵机制sentinel:一个或多个哨兵可以实时监控多个主节点及其下面的从节点的状态,当主节点出现故障,自动选举一个可用的从节点,升级为主节点,处理命令。哨兵机制就是能应对故障的主从架构。  缺点:1.不能减轻单节点的压力,依然是一个节点在工作。2.单节点的内存和磁盘空间有限。
  • 集群模式:Redis在3.0后开始支持Cluster(模式)模式,目前redis的集群支持节点的自动发现,支持slave-master选举和容错,支持在线分片(sharding shard )等特性。redis集群至少需要6个节点,因为redis官方推荐我们主节点的个数是奇数个,所以主节点至少是3个。主节点下也应该有从节点,所以从节点也是3个。

       搭建集群成功后会给主节点们分配各自对应的哈希槽。redis一共有16384个哈希槽,分         配给主节点。当写命令来时根据key的值进行CRC16算法,得到哈希槽的位置,交给对           应的主节点,从节点备份数据。当某个主节点出现故障会自动选举他的一个从节点顶             替。如果这个主节点的从节点都出现故障,那么集群就会失效。

       CRC16算法的特点:

       1.对集群模式下的所有key进行crc16计算,得到的结果保持在0-16383之间。

       2.同一个key进行多次crc16计算,结果不变。

       3.不同key进行crc16计算,结果可能相同。           

8.redis结合springboot分布式session管理

redis的session管理是利用spring提供的session管理解决方案,将一个应用session交给Redis存储,整个应用中所有session的请求都会去redis中获取对应的session数据。

@EnableRedisHttpSession 注解开启session管理。

9.redis为什么速度这么快?

1.redis是在内存中运行的,内存的读写速度远大于磁盘读写速度。

2.redis是单线程处理命令的,省去了线程切换耗费的时间。不需要考虑锁。

3.redis采用epoll作为非阻塞的io多路复用技术的实现,来监听多个socket。事件处理器是单线程的,所以redis是单线程的,一次只能处理一个事件但处理速度非常快。

4.redis速度的上限却决于内存大小和宽带。

10.缓存击穿,缓存雪崩是什么,怎么解决?

缓存击穿:压力直接穿过缓存,到达数据库。sql查一个数据库中没有的数据,此时缓存就利用不上,因为数据库查不到。所以来到数据库查。如果这是个恶意请求,连续发很多很多,那么数据库面临的压力就变得很大,可能导致数据库挂起,崩溃。

缓存击穿怎么解决?mybatis其实帮我们解决了,当某条sql查一个数据库中没有的数据,数据库返回空集,mybatis会把空集也放入缓存。这样如果同一条sql到达也能利用到缓存。即使是恶意请求,使用不同的无用值,也能缓解一下数据库压力。

缓存雪崩:通常我们会给缓存设置有效时间,当大部分缓存或缓存全部突然失效,大量压力到达数据库。极端时会导致数据库挂起,崩溃。

缓存雪崩怎么解决?给不同业务设置不同的有效时间,避免多个业务的缓存同时失效。

11.redis事务 

redis通过multi开启事务,进入组队阶段,命令会被顺序的加入队列。

exec后才会执行事务中的命令。redis保证事务是严格按顺序执行的不会被其他命令打断。

如果在把命令压入队列的过程中报错,则整个队列中的命令都不会执行,执行结果报错。

discard取消组队。

redis不保证事务的原子性,当事务中有命令出错不会进行回滚,继续执行后面的命令

为了保证数据的安全性,在开启事务之前可以先watch key [key …]等于给key加上乐观锁。如果被监控的key在本事务之外有修改时,则本事务所以指令都不会被执行。当使用WATCH命令时,如果事务执行中止,那么EXEC命令就会返回一个Null值。

redis利用watch与事务配合使用保证“原子性”。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值