Nginx前驱学习

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拥有两个主从结点时,理论上性能提升了两倍。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值