一、redis集群
单台redis有读写的瓶颈,容量的瓶颈,单点故障的问题。所以需要用集群来解决。
1.1 主从模式(读写分离)
主:提供可以读和写操作,
从:可以提供读操作。
这种模式下有角色之分,主从模式本质是数据库备份方案,可以把数据备份多份,在多个地方保存。
全量同步:节点初始化的时候(发送持久化文件)
增量同步:节点初始化完成(发送的命令)
1.2 哨兵模式
哨兵主要解决是单点故障问题,它可以对Master进行心跳监控,master宕机后可以从Slave中选举一个出来做Master。
哨兵如何选举的?
- 单台哨兵认为master宕机了是主管下线,多台redis认为master宕机了才是客观下线。
- 要从哨兵中选举出一个Leader出来,由这个哨兵来选举Master。
- Master选举优先看偏移量,再看优先级,最后看runId
1.3 Cluster模式
Cluster模式是五中心的,每个节点都是平等的,都可以进行读写操作。所以这里解决了redis的读写和容量的瓶颈。
Redis内存有16384个hash槽(保存数据的地方),它会把这些hash槽平均的分配给每个节点。在操作key时通过一个CRC16(算法)%16348=hash槽,再看这个hash槽被分配到了那个redis的实例,然后做对一的保存。
RedisCluster模式可以整个任何一个节点继续搭建主从
二、redis的淘汰机制
2.1 为什么有淘汰机制?
首先内存是有上限的,其次缓存中保存的都是一些热数据,一般来讲这些数据都是有周期性,可能过段时间就"冷"了。而它还在redis中把保存,此时就是有浪费空间了,需要把这些“冷”数据及时的从redis中删除,从而释放空间来保存更多的数据。
任何一个内存数据库都是有淘汰机制的。
2.2 淘汰机制算法
LRU:淘汰掉最长时间没有被访问的(最后一次访问的时间)。
LFU:淘汰最近很少使用的(key使用的频率)
RANDOM:随机(随便删除一个key)
TTL:过期时间
2.3 配置
三、redis做缓存服务器
减轻MySQL的压力
1、先查询缓存
2、redis没有然后再去查询数据库
有了缓存必然会出现一致性的问题。数据在Redis中保存了,MySQL中也保存了一份。修改这个数据的时候改完MySQL,删除Redis。这个问题安全(数据不一致)和性能(redis)问题
四、缓存穿透
缓存没有,数据库中也没有,比如查询一个不存在或者已经删除的数据。
使用默认值来解决,设置过期时间。
五、缓存击穿
缓存中没有,数据中有。并发的情况下多个请求同时到redis中没有查询到,所以最终到了MyQL中。
使用锁来解决这个问题。同时多个请求过来,锁机制保证了只能有一个线程拿到锁,其他的线程只能等待,拿到锁的线程先去缓存中查询,没有去MySQL中查询,查完后放到Redis中,把数据返回,释放锁。其他线程会抢到锁,进去从redis中就肯定能查询到。
六、RestTemplate
- 发送一个请求调用远程接口。
- Java这里最底层的就是URL(Java网络编程包)