NGINX笔记
缓存主要分为分布式缓存和本地缓存。
分布式缓存无论单台或者多台都可以正常启用。
Redis和Memcached有什么区别
存储方式不同:memcache断电后会挂掉,数据不能超过内存大小;Redis有部分存在磁盘上,这样能保证数据的持久性
数据支持类型:Redis有复杂的数据类型;Memcached对数据类型支持相对简单
存储值大小:Redis最大可以达到512mb,memcache只有1mb
总结:通常情况下,如果是单机Spring项目,会直接使用Spring Cache作为本地换吨,如果是分布式、环境一般会使用Redis
Redis
不同项目操作的是同一个Redis,因此Redis对于整个项目来说是全局(分布式)的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z2TkJZgl-1603180347878)(屏幕截图 2020-10-18 151230.jpg)]
常见的缓存写法
首先xxxApplication下(xxx为你的项目名),开启缓存@EnableCaching
第二步在service包下,具体操作缓存,@Service下,具体写@Cacheable(cacheNames,key)
写具体要实现的业务逻辑代码
最后一步在controller包下,写映射RequestMapping("/cache"),例如到“cache”下。
@RestController控制返回形式,相当于Controller+ResponseBody
使用缓存时,先@Autowired Service层下的类,再@RequestMapping映射到不同地方。
Demo2Application
package com.example.demo2;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
@EnableCaching
@SpringBootApplication
public class Demo2Application {
public static void main(String[] args) {
SpringApplication.run(Demo2Application.class, args);
}
}
Service层
package com.example.demo2.service;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
//操作缓存
@Service
public class UserService {
@Cacheable(cacheNames ="user",key="#id" )
public String getUser(int id){
System.out.println("进入缓存");
return "userId:"+id;
}
}
Controller层
package com.example.demo2.controller;
import com.example.demo2.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
//使用缓存
@RequestMapping("/cache")
@RestController
public class UserController {
//引入缓存类
@Autowired
UserService service;
@RequestMapping("/get")
public String getUser(int id){
return service.getUser(id);
}
}
Redis数据类型和使用
Redis有5大基础数据类型:
String——字符串类型
Hash——字典类型
List——列表类型
Set——集合类型
ZSet——有序集合类型
最常用的是字符串和字典类型。
String类型
Redis中保存key1为hello,通过get方法获取key1值
示例:set key1 hello
get key1
其他示例:set key1 hello ex 5(代表设置过期时间为5秒)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1NhZZdwP-1603180347880)(C:\Users\67099\Desktop\Spring学习笔记\屏幕截图 2020-10-18 161704.jpg)]
字符串的常见使用场景:
-
存放用户登录信息
-
存放文章详情和列表信息
-
存放和累计网页的统计信息
字典类型
字典类型又被散列类型或者是哈希表类型,它是将一个键值(key)和一个特殊的hash表关联起来
Map<String,Map<String,String>>结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Abw6PWx-1603180347883)(C:\Users\67099\Desktop\Spring学习笔记\屏幕截图 2020-10-18 162848.jpg)]
列表类型
lpush list 1 2 3
lpop
集合类型
sadd myset v1 v3 v2 v3
smembers set1
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3zLVjkki-1603180347884)(C:\Users\67099\Desktop\Spring学习笔记\屏幕截图 2020-10-18 165126.jpg)]
有序集合
zadd z1 30 xiaoming 40 xiaoli 50 laowang
zrange z1 0 -1
0 -1 就代表遍历
使用场景:学生成绩排名;粉丝列表,根据关注的先后时间排序
持久化
数据从内存保存到磁盘的过程,目的是为了防止数据丢失。Redis支持持久化,而Memcached不支持。
Redis持久化的方式有一下3种:
-
快照方式(Redis Database)
-
文件追加方式(Append Only File)
-
混合持久化方式(结合两者优点)
持久化策略设置
config set aof-use-rdb-preamble yes
RDB优点
-
RDB的内容为二进制的数据,占用内存更小,更紧凑,更适合作为备份文件
-
RDB对灾难恢复非常有用,它是一个紧凑的文件,可以更快的传输到远程服务器进行Redis服务回复;
-
RDB可以更大程度的提高Redis的运行速度,因为每次持久化时的Redis都会fork()一个子进程,进行数据持久化到磁盘,Redis主进程并不会执行磁盘I/O等操作
-
与AOF格式的文件相比,RDB文件可以更快的重启
RDB缺点
-
因为RDB只能保存某个时间间隔的数据,如果中途Redis服务被意外终止了,则会丢失一段时间的Redis数据。
-
RDB需要经常fork()才能使用子进程将其持久化在磁盘上。如果数据集很大,fork()可能很耗时,并且如果数据集很大且CPU性能不佳,则可能导致Redis停止为客户端服务几毫秒甚至一秒钟
AOF优点
- AOF持久化保存的数据更加完整,AOF提供了三种保存策略:每次操作保存、每秒钟保存一次、跟随系统的持久化策略保存,其中每秒保存一次,从数据的安全性和性能两方面考虑是一个不错的选择,也是AOF默认的策略,即使发生了意外事件,最多只会丢失1s中的数据
- AOF采用的是命令追加的写入方式,所以不会出现文件损坏的问题,即使由于某些意外原因,导致了最后操作的持久化数据写入了一半,也可以通过redis-check-aof工具轻松的修复
- AOF持久化文件,非常容易理解和解析,它是把所有Redis键值操作命令,以文件的方式存入了磁盘。即使不小心使用flushall命令删除了所有键值信息,只要使用AOF文件,删除最后的flushall命令,重启Redis即可回复之前误删的数据。
AOF缺点
-
对于相同的数据集来说,AOF文件要大于RDB文件
-
在Redis负载比较高的情况下,RDB比AOF性能更好
-
RDB使用快照的形式来持久化整个Redis数据,而
混合持久化
-
开头为RDB的格式,使得Redis更快的启动,同时结合AOF的优点,降低了大量数据丢失的风险。-
-
AOF文件中添加了RDB格式的内容,使得AOF文件的可读性变得很差
-
兼容性差,如果开启混合持久化,那么此混合持久化AOF文件,就不能用在Redis 4.0版本之前。
常见面试题
缓存雪崩
短时间内,大量缓存过期。
这样相当于直接访问数据库了,对数据库造成很大的影响,那么如何解决这个问题呢?
-
加锁排队
起到缓冲的作用,防止大量的请求;缺点是增加了系统的响应时间,降低了系统的吞吐量
-
随机化过期时间
为了避免缓存同时过期,可在设置缓存时添加随机事件,这样就可以极大的避免大量的缓存同时失效。
-
设置二级缓存
二级缓存指的时除了Redis本身的缓存,再设置一层缓存(本地缓存)
缓存穿透
查询数据库和缓存都无数据,数据库查询无数据,因此每次都会击中数据库。
解决方案:无论数据库是否返回数据,每次都把结果存储在缓存中,将空结果的缓存时间设置的短一些。
缓存击穿
某个热点缓存,在某一时刻突然失效
解决方案:
加锁排队
设置永不过期
缓存预热
实现预热的实现思路有一下三种:
1、把需要缓存的方法写在系统初始化的方法中,这样系统在启动的时候就会自动的加载数据并缓存数据
2、把需要缓存的方法挂载到某个页面或后端接口上,手动触发缓存预热
3、设置定时任务,定时自动进行缓存预热。
主从同步
-
【动漫acg】还在想象,盾娘举着盾叫你master的场景吗,学了主从同步,master和slave的羁绊就更深了,是的咱们学习的就是这个养成游戏?
-
基本知识
主节点(master),节点(slave) -
基本工作
从主节点做操作添加删除等工作,其他从结点做读取工作。(除主从,还可以从从)
-
主从复制优缺点
主从同步的优点:性能();高可用(主节点发生问题,可以迅速把从结点提升为主结点);防止数据丢失(当主服务器磁盘坏了,其他从服务器还保留着相关的数据)
主从同步的缺点:主节点奔溃之后,需要人工干预才能恢复Redis的正常使用。 -
哨兵模式
哨兵可以用来监控主从同步服务器结点,并在主从服务器出现问题的时候实现自动容灾恢复。
-
Redis集群(Redis3.0以后抛弃主从同步和哨兵模式来实现Redis多机运jiao行)
Redis Cluster 是无代理模式去中心化的运行模式,客户端发送的绝大数命令会直接交给相关结点,这样大部分情况请求无需转发与单机Redis服务器的性能非常接近。
如果当Redis Cluster拥有两个主从结点时,理论上性能提升了两倍。