分布式缓存所有分布式系统都可以访问,本地缓存只能当前jvm才能访问。
IO多路复用指多个channel或者网络IO,共用一个或者少量线程来处理。
为什么使用多路复用,是因为与用户网络传输是需要等待的,IO操作不能直接返回。所以使用IO多路复用来解决这个问题,防止一个IO阻塞影响其他IO的读取。
安全,因为是单线程的。Redis使用单线程,可以避免上下文切换,效率最高。避免了线程切换、加锁等资源消耗。
因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。
Redis支持多个数据库,并且每个数据库的数据是隔离的不能共享,并且基于单机才有,如果是集群就没有数据库的概念。
Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。
MySQL与Redis一致性解决同步问题
全量同步:就是每天定时(避开高峰期)或者采用一个周期实现将数据拷贝到一个地方也就是Rdb存储。
增量同步:比如采用对行为的操作实现对数据的同步,也就是AOF。
全量与增量的比较:增量同步比全量同步更加消耗服务器的内存,但是能够更加的保证数据的同步。
Redis提供了两种持久化的机制,分别为RDB、AOF实现,RDB采用定时(全量)持久化机制,但是服务器因为某种原因宕机后可能数据会丢失,AOF是基于数据日志操作实现的持久化,所以AOF采用增量同步的方案。
Redis已经帮助我默认开启了rdb存储。当两种方式同时开启时,数据恢复Redis会优先选择AOF恢复。
如果内存空间用满,就会自动驱逐老的数据。根据配置的内存淘汰策略来驱逐老数据。
总共六种
通过redis.conf文件来修改redis的淘汰策略。
利用key的有效时间来实现,当key失效之后会有个监听事件,通过失效监听事件的方法来修改订单状态。
支持
Multi 开启事务
EXEC 提交事务
Watch 可以监听一个或者多个key,在提交事务之前是否有发生了变化 如果发生边了变化就不会提交事务,没有发生变化才可以提交事务,版本号码,乐观锁
Discard 取消提交事务
注意:Redis官方是没有提供回滚方法, 只提供了取消事务。
答:
答:
Redis实现分布式锁基于SetNx命令,因为在Redis中key是保证是唯一的。所以当多个线程同时的创建setNx时,只要谁能够创建成功谁就能够获取到锁。
Set 命令 每次set时,可以修改原来旧值;
SetNx命令 每次SetNx检查该 key是否已经存在,如果已经存在的话不会执行任何操作。返回为0 如果已经不存在的话直接新增该key。
1:新增key成功, 0: 失败
答:给锁(key)设置一个有效期避免死锁的现象。
答:单个Redis如果因为某种原因宕机的话,可能会导致Redis服务不可用,可以使用主从复制实现一主多从,主节点负责写的操作,从节点负责读的操作,主节点会定期将数据同步到从节点中,保证数据一致性的问题。
1.Redis从节点向主节点建立socket连接
2.Redis采用全量或者增量的形式将数据同步给从节点
全量复制:一般用于在初次的复制场景(从节点与主节点第一次建立)
增量复制:网络出现问题,从节点再次连接主节点时,主节点补发缺少的数据,每次数据增量同步
如果主节点存在了问题,整个Redis环境是不可以实现写的操作
答:相关配置Redis.conf
# replicaof
slaveof 192.168.212.160 6379 #主节点的服务器
masterauth 123456
info replication
如果主节点存在了问题,整个Redis环境是不可以实现写的操作,需要人工更改配置变为主操作。
如何解决该问题:使用哨兵机制可以帮助解决Redis集群主从选举策略。
单个哨兵会向主的master节点发送ping的命令,如果master节点没有及时的响应,哨兵会认为该master节点为“主观不可用状态”会发送给其他都哨兵确认该Master节点是否不可用,当前确认的哨兵节点数>=quorum(可配置),会实现重新选举。
哨兵机制只能解决master选举的问题,不能解决主从复制的问题。
缓存穿透是指使用不存在的key进行大量的高并发查询,导致缓存无法命中,每次请求都要都要穿透到后端数据库查询,使得数据库的压力非常大,甚至导致数据库服务压死;
解决方案:
在高并发的情况下,当一个缓存key过期时,因为访问该key请求较大,多个请求同时发现缓存过期,因此对多个请求同时数据库查询、同时向Redis写入缓存数据,这样会导致数据库的压力非常大;
解决方案:
缓存雪崩指缓存服务器重启或者大量的缓存集中在某个时间段失效,突然给数据库产生了巨大的压力,甚至击垮数据库的情况。
解决思路:防止多个key在同一时刻失效,对不用的数据使用不同的失效时间,加上随机数。
答:哨兵集群方式、RedisCluster集群。
主节点只有一个,每个节点都保存全量同步数据,冗余的数据比较多;其次只能允许有一个主的节点,属于中心化的集群。
主节点只有一个,每个节点都保存全量同步数据,冗余的数据比较多;
采用hash槽的概念,预先分配16384个卡槽,并且将该卡槽分配给具体服务的节点;通过key进行crc16(key)%16384 获取余数,余数就是对应的卡槽的位置,一个卡槽可以存放多个不同的key,从而将读或者写转发到该卡槽的服务的节点。 最大的优点:动态扩容、缩容。
新增一个主节点
新增一个从节点
通过redis-cli --cluster add-node命令添加到集群中去,之后再分配卡槽 cluster slots /usr/redis/bin/redis-cli --cluster add-node 192.168.212.163:7007 192.168.212.163:7000 --cluster-slave --cluster-master-id 5d94171eb34ed4396bf5b9db8efaab4d96d0cf10
执行命令分配卡槽,执行该命令后填写分配卡槽的数量,再之后选择数据卡槽分配的规则。
/usr/redis/bin/redis-cli --cluster reshard 192.168.212.163:7000
就是RedisCluster的分片原理,根据key的hash值的不同分配到不同的卡槽(节点)。