单体服务
大型网站架构演进
读写分离注意数据同步
分库分表(数据接近千万级,使用分布式主键),注意数据同步
所需要具备的技术栈与能力
微服务 + 搜索 + 日志处理 + 分库分表 + 优化
把控团队
系统分解与模块拆分
指导与培训
沟通与协调能力
抽象,举例,画图
软技能(项目管理/谈判)
单体架构设计与项目开发
springboot2.x
功能开发
个人中心
上线部署
前后端分离
分层架构
技术选型
后端
springboot
前端
jquery/vue
考虑因素
切合业务
社区活跃度
团队技术水平
版本更新迭代周期
试错精神
安全性
成功案例
开源精神
前后端分离开发模式
早期传统 web 开发
前后端单页面交互, mvvm 开发模式
项目分层设计原则
项目拆分与聚合
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