Java架构专家

单体服务

大型网站架构演进

01
02
03
04
05
06
读写分离注意数据同步
07
分库分表(数据接近千万级,使用分布式主键),注意数据同步
08
09
10
11

所需要具备的技术栈与能力

微服务 + 搜索 + 日志处理 + 分库分表 + 优化

把控团队
系统分解与模块拆分
指导与培训
沟通与协调能力
抽象,举例,画图
软技能(项目管理/谈判)

单体架构设计与项目开发

springboot2.x
功能开发
个人中心
上线部署

前后端分离
分层架构

技术选型
后端
springboot
前端
jquery/vue

考虑因素
切合业务
社区活跃度
团队技术水平
版本更新迭代周期
试错精神
安全性
成功案例
开源精神

前后端分离开发模式

早期传统 web 开发
12

前后端单页面交互, mvvm 开发模式
13

项目分层设计原则
项目拆分与聚合
maven 聚合项目

父子模块相互依赖后需要进行安装(install)

数据库建模工具
www.pdman.cn

数据库外键
性能影响
热更新
降低耦合度
数据库分库分表

数据库配置
hikariCP
mybatis

mybatis 逆向生成工具

restflu web service
通信方式
信息传递
无状态
独立性
get -> /getOrder?id=1001
post -> /saveOrder
put -> /modifyOrder
delete -> deleteOrder?id=1001

可修改:
Editor -> code style -> inspections -> incorrect injection point autowiring in Spring bean compoments
Editor -> code style -> inspections -> Non recommended ‘field’ injections

service 注意事务

- 事务传播 - Propagation
- REQUIRED: 使用当前的事务,如果当前没有事务,则自己新建一个事务,子方法是必须运行在一个事务中的;
- 如果当前存在事务,则加入这个事务,成为一个整体。
- 举例:领导没饭吃,我有钱,我会自己买了自己吃;领导有的吃,会分给你一起吃。
- SUPPORTS: 如果当前有事务,则使用事务;如果当前没有事务,则不使用事务。
- 举例:领导没饭吃,我也没饭吃;领导有饭吃,我也有饭吃。
- MANDATORY: 该传播属性强制必须存在一个事务,如果不存在,则抛出异常
- 举例:领导必须管饭,不管饭没饭吃,我就不乐意了,就不干了(抛出异常)
- REQUIRES_NEW: 如果当前有事务,则挂起该事务,并且自己创建一个新的事务给自己使用;
- 如果当前没有事务,则同 REQUIRED
- 举例:领导有饭吃,我偏不要,我自己买了自己吃
- NOT_SUPPORTED: 如果当前有事务,则把事务挂起,自己不使用事务去运行数据库操作
- 举例:领导有饭吃,分一点给你,我太忙了,放一边,我不吃
- NEVER: 如果当前有事务存在,则抛出异常
- 举例:领导有饭给你吃,我不想吃,我热爱工作,我抛出异常
- NESTED: 如果当前有事务,则开启子事务(嵌套事务),嵌套事务是独立提交或者回滚;
- 如果当前没有事务,则同 REQUIRED。
- 但是如果主事务提交,则会携带子事务一起提交。
- 如果主事务回滚,则子事务会一起回滚。相反,子事务异常,则父事务可以回滚或不回滚。
- 举例:领导决策不对,老板怪罪,领导带着小弟一同受罪。小弟出了差错,领导可以推卸责任。

springboot 自动装配可以不在启动类加 @EnableTransactionManagement

电商项目核心功能

用户注册与登录
整合 swagger2
controller
Bo

cros

账号密码
邮箱验证
手机验证

cookie 与 session
cookie
以键值对的形式存储信息在浏览器
cookie 不能跨域,当前及父级域名可以取值
cookie 可以设置有效期
cookie 可以设置 path
session
基于服务器内存的缓存(非持久化), 可保存请求会话
每个 session 通过 sessionid 来区分不同请求
session 可设置过期时间
session 也是以键值对形式存在的

设置完 session,请求回返回 sessionid 给前端

整合 log4j
排除 springboot 自带的日志
手动加依赖

aop 切面拦截统计 service 调用时间

打印 sql 语句

简历
自我介绍+工作经历+项目经历+学历背景
自我介绍中要增加核心优势,放 github/博客链接
工作经历中重点的是项目内容,要参考技术挑战和项目对业务的影响程度

首页商品推荐

商品详情与评论渲染

分页插件
PageHelper

数据脱敏工具

商品的搜索与分页

分类设计与实现

购物车与订单
刷新购物车的相关数据
收货地址功能
订单实现流程
聚合支付中心(企业)

微信与支付宝支付

微信支付
用户 -> 微信客户端 -> 商户后台系统 -> 微信支付系统
调统一下单 api,返回预支付 code_url(2 个小时有效)
将链接生成二维码
异步通知商户结果(提供接口),告知支付通知接收情况(反馈)

前端 headers 携带信息

netapp

前端 js 轮询查询支付结果

支付宝支付

定时任务扫描关闭过期订单

映射本地静态资源,实现 webmvcconfigurer 的 addResourceHandlers 方法

文件上传大小限制

spring:
  servlet:
    multipart:
      max-file-size: 512000     # 文件上传大小限制为500kb
      max-request-size: 512000  # 请求大小限制为500kb

手动更新订单状态
http://localhost:8088/myorders/deliver?orderId=190827F2R9A6ZT2W

用户中心
订单管理
评价管理

云服务器部署上线

云服务器购买
安装 jdk
安装 tomcat
安装 mariaDB
打包 springboot

部署 tomcat 发布前端

内网互通(云服务器同地域)
4 核 8g/16g
8 核 32g
16 核 64g

centos7.x

java 环境检查安装
查询
rpm -qa | grep java -i
删除
rpm -e --nodeps xxx

下载解压 java

添加环境变量
vi /etc/profile

export JAVA_HOME=/usr/java/jdk1.9.0_191
export CLASSPATH=.:%JAVA_HOME%/lib/dt.jar:%JAVA_HOME%/lib/tools.jar
export PATH= P A T H : PATH: PATH:JAVA_HOME/bin

source /etc/profile

域名/二级域名

下载安装 mariadb (官方文档)
https://mariadb.org

grant all privileges on *.* to 'root'@'%' identified by 'xxx';
flush privileges;

修改项目配置
单体项目打包发布

cookie 异常问题

vi context.xml

<CookieProcessor
  className="org.apache.tomcat.util.http.LegacyCookieProcessor"
/>

单体架构总结
1,mvc 框架(springboot 多模块)
2,文件上传处理
3,事务管理
4,配置梳理
5,war 包发布

nginx

安装
nginx.org
download

安装依赖环境

1,安装 gcc 环境
yum install gcc-c++
2,安装 PCRE 库,用于解析正则表达式
yum install -y pcre pcre-devel
3,zlib 压缩和解压缩依赖
yum install -y zlib zlib-devel
4,ssl 安全的加密套接字协议层,用于 http 安全传输,也就是 https
yum install -y openssl openssl-devel

tar -zxvf nginx-1.16.1.tar.gz
创建临时目录
mkdir /var/temp/ngin -p
进入根目录,创建 makefile 文件

./configure \
--prefix=/usr/local/nginx \
--pid-path=/var/run/nginx/nginx.pid \
--lock-path=/var/lock/nginx.lock \
--error-log-path=/var/log/nginx/error.log \
--http-log-path=/var/log/nginx/access.log \
--with-http_gzip_static_module \
--http-client-body-temp-path=/var/temp/nginx/client \
--http-proxy-temp-path=/var/temp/nginx/proxy \
--http-fastcgi-temp-path=/var/temp/nginx/fastcgi \
--http-uwsgi-temp-path=/var/temp/nginx/uwsgi \
--http-scgi-temp-path=/var/temp/nginx/scgi

进入根目录
make
make install

进入/usr/local/nginx/sbin,启动
./nginx

停止
./nginx -s stop
重新加载
./nginx -s reload

显示默认首页过程解析

nginx.conf 配置文件讲解

nginx 的进程模型

master 进程: 主进程
worker 进程: 工作进程

可以修改 worker_processes 数量添加 worker 进程
可以设置为内核数-1

进入/usr/local/nginx/sbin,检查 nginx 配置
./nginx -t

nginx 处理 web 请求机制

异步非阻塞处理请求

events {
  # 默认使用epoll
  use epoll;
  # 每个worker允许连接的客户端最大连接数
  worker_connections 10240;
}

nginx 配置结构与指令语法

main 全局配置
event 配置工作模式以及连接数
http http模块相关配置
  server 虚拟主机配置,可以有多个
    localtion 路由规则,表达式
    upstream 集群,内网服务器

nginx 核心配置文件

可以设置 worker 的用户权限
user root;

日志级别
debug/info/notice/warn/error/crit

http 模块
  include 包含模块
  defaule_type application/octet-stream 默认的类型
  日志格式和路径
  #log_format main '$remote_addr - ';
  #access_log logs/access.log main

sendfile 默认打开,发送文件传输
#tcp_nopush 数据包累积到一定大小之后再发送

keepalive_timeout 65; 存活超时时间

gzip 压缩后传输,消耗性能

nginx.pid 打开失败以及失败的解决方案

./nginx -h

问题一: “/var/run/nginx/nginx.pid” failed (2:No such file or directory)
mkdir /var/run/nginx
问题二: invalid PID number “” in “/var/run/nginx/nginx.pid”
./nginx -c /usr/local/nginx/conf/nginx.conf

nginx 常用的命令

./nginx -s stop 暴力停止
./nginx -s quit 优雅停机
./nginx -V 查看版本和配置路径信息

nginx 日志切割

通常以天作为单位切割
在/usr/local/nginx/sbin 下创建 cut_my_log.sh

下面以分为单位

#!/bin/bash
LOG_PATH="/var/log/nginx"
RECORD_TIME=$(date -d "yesterday" +%Y-%m-%d+%H:%M)
PID=/var/run/nginx/nginx.pid
mv ${LOG_PATH}/acess.log ${LOG_PATG}/access.${RECORD_TIME}.log
mv ${LOG_PATH}/error.log ${LOG_PATH}/error.${RECORD_TIME}.log
#向nginx主进程发送信号,用于重新打开日志文件
kill -USR1 `cat $PID`

赋予权限
chmod +x cut_my_log.sh

定时切割
yum install crontabs
crontab -l
crontab -e

每一分钟
分/时/日/月/星期/年(可选)

*/1 * * * * /usr/local/nginx/sbin/cut_my_log.sh

每天晚上 23:59

59 23 * * *

每日凌晨 1 点

0 1 * * *

重启定时任务
service crond restart
其他
service crond start
service crond stop
service crond reload

使用 nginx 为静态资源提供服务

前端打包后,ngxin 指定 index 页面入口

server {
  listen 90;
  server_name lcoalhost;
  location / {
    root /home/foodie-shop;
    index index.html;
  }

  location /xxx {
    root /home;
  }

  location /static {
    alias /home/xxx;
  }
}

使用 gzip 压缩来提升请求效率

开启 gzip 压缩功能,提高传输效率,节约带宽
gzip on;

限制最小压缩,小于 1 字节文件不会压缩
gzip_min_length 1;

定义压缩的级别(压缩比,文件越大,压缩越多,但是 cpu 使用会越多)
gzip_comp_level 3;

定义压缩文件的类型
gzip_types xxx;
类型有下面这些
text/plain application/javascript application/x-javascript text/css
application/xml text/javascript application/x-httpd-php image/jpeg
image/gif image/png application/json

location 的匹配规则解析

精确匹配

location = / {
}

正则表达式

location ~* \.(GIF|png|bmp|jpg|jpeg) {
  root /home;
}

以某个字符路径开头请求

location ^~ /xxx/img {
  root /home;
}

dns 域名解析

充当反向代理服务器

使用 SwitchHosts 模拟本地域名解析访问

127.0.0.1 localhot promote.cache-dns.local # 虚拟主机名
::1 localhost promote.cache-dns.local # 虚拟主机名

nginx 的跨域

浏览器拒绝跨站点访问

jsonp/springboot cors/nginx

server {
  #允许跨域请求的域, *代表所有
  add_header 'Access-Control-Allow-Orgin' *;
  #允许带上cookie请求
  add_header 'Access-Control-Allow-Credentials' 'true';
  #允许请求的方法,比如GET/POST/PUT/DELETE
  add_header 'Access-Control-Allow-Methods' *;
  #允许请求的header
  add_header 'Access-Control-Allow-Headers' *;
}

Nginx 中配置静态资源防盗链

server {
  #对源站点验证
  valid_referer *.xxx.com;
  #非法引入会进入下面的判断
  if($invalid_referer) {
    return 404;
  }
}

nginx 的模块化体系

nginx.core
  http
    event module
    phase handler
    output filter
    upstream
    load balancer
    extent module
  mail

nginx 负载均衡

四层负载均衡
ip+端口 进行转发请求
F5 硬件负载均衡
LVS
haproxy
nginx

七层负载均衡
基于 http 的 url 或者 ip 转发请求
nginx
haproxy
apache

dns 地域负载均衡

nginx 集群搭建

nginx
tomcat1
tomcat2
tomcat3

upstram tomcats {
    server 192.168.1.173:8080;
    server 192.168.1.174:8080;
    server 192.168.1.175:8080;
}

server {
    listen 80;
    server_name www.tomcats.com;
    location / {
        proxy_pass http://tomcats;
    }
}

使用 jmater 测试单节点与集群的并发异常

下载地址
https://jmeter.apache.org/

windows 双击 jmeter.bat
mac 双击 jmeter
可以修改语言 选项 -> 选择语言

1,添加线程组 -> 线程组添加取样器(http 请求)
填写协议/服务器地址/端口/方法
添加聚合报告/查看结果树/用表格查看结果

异常率控制在 20%

负载均衡(反向代理服务器)

轮询(默认)
加权轮询(数值越小权重越小)

upstram tomcats {
    server 192.168.1.173:8080 weight=1;
    server 192.168.1.174:8080 weight=2;
    server 192.168.1.175:8080 weight=5;
}

upstream 指令参数

max_conns 最大并发连接数

upstram tomcats {
    server 192.168.1.173:8080 max_conns=2;
    server 192.168.1.174:8080 max_conns=2;
    server 192.168.1.175:8080 max_conns=2;
}

slow_start
只支持权重,只支持商业版
server 192.168.1.173:8080 weight=6 slow_start=60s;

down
配置之后表示不可用

backup
表示备用机器

max_fails
最大失败数,达到了就认为下线了
fail_timeout
达到最大失败数后,多少时间后尝试去请求失败的机器
server 192.168.1.173:8080 max_fails=2 fail_timeout=1s;

keepalive
吞吐量,设置长连接

upstram tomcats {
    server 192.168.1.173:8080 max_conns=2;
    server 192.168.1.174:8080 max_conns=2;
    server 192.168.1.175:8080 max_conns=2;

    keepalive 32;
}
server {
    location / {
      proxy_http_version 1.1;
      proxy_set_header Connection "";
    }
}

ip_hash
服务器发生异常不能直接移除配置,可以标记为 down
内网不变动,原因是 hash(192.168.x) ip 只有前三位参与运算
问题: 节点变动,会话丢失,缓存请求不到

upstram tomcats {
    ip_hash;
    server 192.168.1.173:8080;
    server 192.168.1.174:8080;
    server 192.168.1.175:8080;
}

一致性哈希算法
顺时针就近原则,减少用户影响

url_hash
url 变化后 hash 值不一样,请求的服务器就不一样
hash(url) % node_counts

upstram tomcats {
    hash $request_uri;
    server 192.168.1.173:8080;
    server 192.168.1.174:8080;
    server 192.168.1.175:8080;
}

least_conn
请求最小连接数的服务器

upstram tomcats {
    least_conn;
    server 192.168.1.173:8080;
    server 192.168.1.174:8080;
    server 192.168.1.175:8080;
}

nginx 控制浏览器缓存

304 状态 被 nginx 缓存

expires

  location /static {
    alias /home/xxx;
    # expires 10s;
    # expires @22h30m;
    # expires -1; # 提前过期
    # expires epoch; # 不设置过期
    # expires off; # nginx不设置不显示,浏览器使用默认缓存机制
    # expires max; # 最大值
  }

proxy_cache_path 设置缓存保存的目录
keys_zone 设置共享内存以及占用的空间大小
max_size 设置缓存大小
inactive 超过此时间,则缓存自动清理
use_temp_path 关闭临时目录
proxy_cache_path /usr/local/nginx/upstream_cache keys_zone=mycache:5m max_size=1g inactive=30s use_temp_path=off;

server {
    # 开启并且使用缓存
    proxy_cache mycache;
    # 缓存校验控制
    proxy_cache_valid 200 304 24h;
}

ssl 证书
config 目录添加 nginx crt/key
增加安装配置
–with-http_ssl_module

server {
    listen 443;
    server_name localhost;
    添加官网配置
    ssl open;
    ssl_certificate xxx.crt;
    ssl_certificate_key xxx.key;
    ssl_session_cache share:SSL:1m;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
}

动静分离
前端项目部署到 nginx

部署到云服务器
域名映射到服务器
前端修改接口服务地址(去掉端口号)

支付中心接口修改

nginx 高可用 ha
nginx 主备(硬件配置需要一样)
keepalived 基于 VRRP 协议(虚拟路由冗余协议)

keepalived 安装
虚拟 ip
master ip
backup ip

下载 keepalived-2.0.18.tar.gz 后解压

./configure --prefix=/usr/local/keepalived --sysconf=/etc
make && make install

/etc/keepalived/keepalived.conf

如果报错 libnl/libnl-3 dev
yum -y install libnl libnl-devel

配置 keepalived
/etc/keepalived

global_defs {
   
  #路由id: 当前安装keepalived节点主机的标识符,全局唯一
  router_id keep_171
}

vrrp_instance VI_1 {
   
  # 当前节点状态,MASTER/BACKUP
  state MASTER
  # 当前实例绑定的网卡
  interface eth0
  # 保证主备节点一致
  virtual_router_id 51
  # 选举优先级,备机设置成80
  priority 100
  # 主备之间同步检查的时间间隔,默认1s
  advert_int 1
  # 认证授权的密码,防止非法节点的进入,节点都一样
  authentication {
   
    auth_type PASS
    auth_pass 111
  }
  # 追踪nginx脚本
  track_script {
   
    check_nginx_alive
  }
  # 虚拟ip
  virtual_ipaddress {
   
      192.168.1.161
  }
  # 下面的删除
}

192.168.1.171 www.171.com
192.168.1.172 www.172.com
192.168.1.161 www.ha.com (绑定虚拟 ip)

启动
进入/usr/local/keepalived/sbin/
./keepalived

注册为系统服务
cp init.d/keepalived /etc/init.d/
cp sysconfig/keepalived /etc/sysconfig/
systemctl daemon-reload
systemctl start keepalived.service

keepalived 配置 nginx 自动重启
cd /etc/keepalived/
vi check_nginx_alive_or_not.sh

#!/bin/bash
A='ps -C nginx --no-header |wc -l'
#判断nginx是否宕机,如果宕机了,尝试重启
if [$A -eq 0];then
  /usr/local/nginx/sbin/nginx
  sleep 3
  if[$A -eq 0];then
    killall keepalived
  fi
fi

chmod +x check_nginx_alive_or_not.sh

配置文件添加

vrrp_script check_nginx_alive {
   
  script "/etc/keepalived/check_nginx_alive_or_not.sh"
  interval 2 # 每隔两秒
  weight 10 # 如果脚本运行失败,则权重+10
}

keepalived 双主热备
dns 轮询两个虚拟 ip

LVS(linux virtual system)

ipvs
负载均衡调度器

工作模式
nat(类似 nginx)
tun(ip 隧道, 相应通过服务直接返回(暴露到公网),不经过 lvs 返回)
dr(经过路由(vip)返回)

服务器与 ip 约定
lvs:
dip: 192.168.1.151
vip: 192.168.1.150

nginx1
rip: 192.168.1.171
vip: 192.168.1.150
nginx2
rip: 192.168.1.172
vip: 192.168.1.150

lvs 服务器
虚拟机需要关闭网络管理器
systemctl stop NetworkManager
systemctl disable NetworkManager

cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens33:1
vi ifcfg-ens33:1
BOOTPROTO=“static”
DEVICE=“ens33:1”
ONBOOT=“yes”
IPADDR=192.168.1.150
NETMASK=255.255.255.0

service network restart

安装 ipvsadm
yum install ipvsadm
ipvsadm -Ln

nginx1/nginx2 服务器
cd /etc/sysconfig/network-scripts/
cp ifcfg-lo ifcfg-lo:1
vi ifcfg-lo:1
DEVICE=“lo:1”
IPADDR=192.168.1.150
NETMASK=255.255.255.255
NETWORK=127.0.0.0
BROADCAST=127.255.255.255
ONBOOT=“yes”
NAME=loopback

ifup lo

设置 arp
请求: 0
响应: 2

nginx1/nginx2 服务器
vi /etc/sysctl.conf
net.upv4.conf.all.arp_ignore = 1
net.ipv4.conf.default.arp_ignore = 1
net.ipv4.conf.lo.arp_ignore = 1
net.ipv4.conf.all.arp_announce = 2
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2

sysctl -p

route add -host 192.168.1.150 dev lo:1
route -n

echo “route add -host 192.168.1.150 dev lo:1” >> /etc/rc.local

使用 ipvsadm 配置集群规则
lvs 服务器
ipvsadm -A -t 192.168.1.150:80 -s rr
ipvsadm -Ln

ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.171:80 -g
ipvsadm -a -t 192.168.1.150:80 -r 192.168.1.172:80 -g

ipvsadm -E -t 192.168.1.150:80 -s rr -p 5
ipvsadm --set 1 1 1

搭建 keepalived+lvs+nginx 高可用集群负载
lvs 主备

global_defs {
   
  router_id LVS_151
}

vrrp_instance VI_1 {
   
  state MASTER
  interface ens33
  virtual_router_id 41
  priority 100
  advert_int 1
  authentication {
   
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress {
   
    192.168.1.150
  }
}
# 配置集群地址访问的IP+端口, 端口和nginx保持一致
virtual_server 192.168.1.150 80 {
   
    # 健康检查时间,单位 秒
    delay_loop 6
    # 配置负载均衡的算法,默认是轮询
    lb_kind DR
    # 设置会话持久化的事件
    persistence_timeout 5
    # 协议 -t
    protocol TCP
    # 负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
    real_server 192.168.1.171 80 {
   
        # 轮询的默认权重配比设置为1
        weight 1
        # 设置健康检查
        connect_port 80
        # 超时时间 2s
        connect_timeout 2
        # 重试次数
        nb_get_retry 2
        # 间隔时间 3s
        delay_before_retry 3
    }
    real_server 192.168.1.172 80 {
   
        # 轮询的默认权重配比设置为1
        weight 1
        # 设置健康检查
        connect_port 80
        # 超时时间 2s
        connect_timeout 2
        # 重试次数
        nb_get_retry 2
        # 间隔时间 3s
        delay_before_retry 3
    }
}
global_defs {
   
  router_id LVS_152
}

vrrp_instance VI_1 {
   
  state BACKUP
  interface ens33
  virtual_router_id 41
  priority 50
  advert_int 1
  authentication {
   
      auth_type PASS
      auth_pass 1111
  }
  virtual_ipaddress {
   
    192.168.1.150
  }
}
# 配置集群地址访问的IP+端口, 端口和nginx保持一致
virtual_server 192.168.1.150 80 {
   
    # 健康检查时间,单位 秒
    delay_loop 6
    # 配置负载均衡的算法,默认是轮询
    lb_kind DR
    # 设置会话持久化的事件
    persistence_timeout 5
    # 协议 -t
    protocol TCP
    # 负载均衡的真实服务器,也就是nginx节点的具体的真实ip地址
    real_server 192.168.1.171 80 {
   
        # 轮询的默认权重配比设置为1
        weight 1
        # 设置健康检查
        connect_port 80
        # 超时时间 2s
        connect_timeout 2
        # 重试次数
        nb_get_retry 2
        # 间隔时间 3s
        delay_before_retry 3
    }
    real_server 192.168.1.172 80 {
   
        # 轮询的默认权重配比设置为1
        weight 1
        # 设置健康检查
        connect_port 80
        # 超时时间 2s
        connect_timeout 2
        # 重试次数
        nb_get_retry 2
        # 间隔时间 3s
        delay_before_retry 3
    }
}

主从复制高可用 Redis 集群

分布式架构优点
业务解耦
系统模块化,可重用化
提升系统并发量
优化运维部署效率

分布式架构缺点
架构复杂
部署多个子系统复杂
系统之间通信耗时

设计原则
异步解耦
幂等一致性
拆分原则
融合分布式中间件
容错高可用

nosql 常见分类
键值数据库 redis
列存储数据库 hbase
文档型数据库 mongodb
图形数据库 neo4j

redis 安装
解压
tar -zxvf redis-5.0.5.tar.gz
yum install gcc-c++
make
make install

cd utils
cp redis_init_script /etc/init.d
cp redis.conf /usr/local/redis
修改 daemonize yes
修改 dir /usr/local/redis/workspace
新增文件夹/usr/local/redis/workspace
修改 bind 0.0.0.0
修改 requirepass xxx

修改/etc/init.d/redis_init_script
CONF=“/usr/local/redis/redis.conf”

chmod 777 redis_init_script
./redis_init_script start

跟随系统自启动

#chkconfig: 22345 10 90
#description: Start and Stop redis

chkconfig redis_init_script on

命令行使用
redis-cli
auth xxx

redis-cli -a xxx ping

redis_init_script stop 命令加上 -a “xxx”

springboot 整合 redis 实战

redis 的线程模型

redis 整合 springboot

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-redis</artifactId>
</dependency
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

星月IWJ

曾梦想杖键走天涯,如今加班又挨

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值