文章目录
1、分布式架构概述
本阶段规划
- 分布式缓存中间件Redis
- 分布式会话与单点登录
- 分布式搜索引擎ElasticSearch
- 分布式文件系统
- 分布式消息队列
- 分布式锁
- 数据库读写分离与分库分表
- 数据库表全局唯一主键ID设计
- 分布式事务与数据一致性
- 接口幂等设计与分布式限流
什么是分布式架构
- 不同的业务(功能模块)分散部署在不同的服务器
- 每个子系统负责一个或者多个不同的业务模块
- 服务之间可以相互交互与通信
- 分布式系统设计对用户透明
- 可以发展为集群分布式系统架构
单体架构与分布式架构 对比
单体架构:模块之间的耦合度比较高
分布式架构:模块解耦
分布式架构优点
- 业务解耦
- 系统模块化,可重用化
- 提升系统并发量
- 优化运维部署效率
分布式架构缺点
- 架构复杂
- 部署多个子系统复杂
- 系统之间通信耗时
- 新人融入团队缓慢
- 调试复杂
设计原则
- 异步解耦(消息队列)
- 幂等一致性
接口幂等性就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用。
主要针对增加、修改操作 - 拆分原则
- 融合分布式中间件
redis、mq等 - 容错高可用
2、为何引入Redis
现有架构的弊端
现有架构:Nginx -->Tomcat -->数据库 。
引入缓存(加一个屏障)提高数据库的性能,提高读的性能,提高吞吐量。
电商系统读写二八原则
3、什么是NoSql?
NoSql
- Not Nnly Sql
- 传统项目使用纯数据库
- 为互联网和大数据而生
- 水平(横向)扩展方便高效
普通数据库能达到500w数据左右,单表达到300w,就要考虑扩容。
NoSql优点
- 高性能读取(每秒10w)
- 高可用(集群)
- 存数据、做缓存
NoSql常见分类
- 键值对类型 Redis、Memcache
- 列存储数据库 Hbase、Cassandra
- 文档行数据库 MongoDB、CouchDB
- 图形数据库 Neo4J、FlockDB
Redis、Memcache、MongoDB是国内使用最多的三种NoSql
4、什么是分布式缓存,什么是Redis?
什么是分布式缓存
- 提升读取速度性能
- 分布式计算领域
- 为数据库降低查询压力
- 跨服务器缓存
- 内存式缓存
什么是Redis
- NoSql
- 分布式缓存中间件
- key-value存储
- 提供海量数据存储访问
- 数据存储在内存里,读取更快
- 非关系型、分布式、开源、水平扩展
5、分布式缓存方案与技术选型:Redis VS Memcache VS Ehcache
缓存方案对比 - Ehcache
EhCache 是一个纯Java的进程内缓存框架
- 优点:
- 基于java开发
- 基于JVM缓存
- 简单、轻巧、方便
- 缺点:
- 集群不支持
- 分布式不支持
适合单应用
缓存方案对比 - Memcache
- 优点:
- 简单的key-value存储
- 内存使用率比较高
- 多核处理、多线程
- 缺点:
- 无法容灾
- 无法持久化
缓存方案对比 - Redis
- 优点
- 丰富的数据结构
- 持久化
- 主从同步、故障转移
- 内存数据库
- 缺点:
- 单线程(大数据量慢)
- 单核(多核处理器无法充分利用CPU)
Redis与Memcache区别
- 持久化
- Memcache 不能持久化
- Redis 可以持久化
- 存储数据结构
- Memcache 数据结构比较单一,只能存string类型
- Redis 数据结构多样化,可以存多张数据结构
6、安装与配置Redis(Linux)
下载
官网:https://redis.io/download/
选择下载稳定(Stable)版本,不稳定版本可以尝鲜,不推荐生产环境使用
上传至Linux
使用FileZilla上传安装包至Linux服务器,
安装Redis
1、解压redis
tar -zxvf redis-5.0.14.tar.gz
2、安装gcc编译环境,如果已安装,会提示nothing to do
yum install gcc-c++
3、进入redis-5.0.14
目录,进行安装,执行完毕后安装成功
# 编译
make
# 安装
make install
配置redis
1、在utils下,拷贝 redis_init_script
文件到/etc/init.d/
目录,目的是要把redis作为开机自启动
cp redis_init_script /etc/init.d/
2、创建/usr/local/redis/
,用于存放配置文件。拷贝redis核心配置文件 redis.conf
文件到 /usr/local/redis/目录下。
# 创建
mkdir /usr/local/redis/
# 拷贝
cp redis.conf /usr/local/redis/
3、修改核心配置文件redis.conf
输入 /dae按回车键可快速搜索到daemonize
vim /usr/local/redis/redis.conf
- 修改 daemonize no ==> daemonize yes
目的是为了让redis启动在linux后台运行 - 修改redis工作目录: dir ./ ==> dir /usr/local/redis/working
建议修改为/usr/local/redis/working
,名称随意 - 修改绑定IP:bind 127.0.0.1 ==> bind 0.0.0.0
代表可以远程连接,不受IP限制 - 设置密码: requirepass imooc
默认是没有的,一定要设置 - 设置端口:port 6379
默认端口时6379,可不修改
4、修改启动脚本
- 设置REDISPORT
REDISPORT=6379
与 [redis.conf] 的port 6379
端口号需一致 - 设置PIDFILE
PIDFILE=/var/run/redis_${REDISPORT}.pid
与 [redis.conf] 的pidfile /var/run/redis_6379.pid
需一致 - 设置CONF
修改为核心配置文件实际路径CONF="/usr/local/redis/redis.conf"
5、为redis启动脚本添加执行权限,随后运行启动redis。
# 为redis启动脚本添加执行权限。777:可读可写可执行权限
chmod 777 redis_init_script
# 启动执行脚本
./redis_init_script start
6、检查redis进程
# 查找redis进程
ps -ef | grep redis
7、设置redis开机自启动
修改执行脚本redis_init_script,添加如下内容
#chkconfig: 22345 10 90
#description: Start and Stop redis
随后执行如下操作
chkconfig redis_init_script on
重启后服务器(虚拟机)后,再看进程
# 重启后服务器(虚拟机)后
reboot
# 查找redis进程
ps -ef | grep redis
8、Redis命令行客户端基本使用
redis-cli 是Redis命令行客户端。
# 启动redis命令工具
redis-cli
# 新创建Linux连接,查看redis进程
ps -ef|grep redis
redis-cli内部命令:
# 认证密码,用于检测给定的密码和配置文件中的密码是否相符
auth imooc
# 相当于新增一个键值对 name为key, xxx为value
set name xxx
# 根据key删除键值对
del name
# 根据key获取值
get name
#退出客户端
ctrl+c
redis-cli外部命令:
# 用于测试客户端与Redis连接是否正常的PING命令, 只要连接正常,会收到PONG回复。
redis-cli ping
# (一定要 -a 密码否则没有权限)
redis-cli -a imooc ping
# 停止redis
./redis_init_script stop
# 查看redis进程
执行./redis_init_script stop
报 NOAUTH Authentication required.
,需要修改redis_init_script脚本
$CLIEXEC -p $REDISPORT shutdown => $CLIEXEC -a "imooc" -p $REDISPORT shutdown
9、Redis的命令行客户端
redis-cli -a password shutdown:关闭redis
./redis_init_script stop:关闭redis
redis-cli:进入到redis客户端
auth pwd:输入密码
set key value:设置缓存
get key:获得缓存
del key:删除缓存
redis-cli -a password ping:查看是否存活
10、Redis数据类型 - string
string 字符串
最简单的字符串类型键值对缓存,也是最基本的
key相关
- keys *:查看所有的key(不建议在生产上使用,有性能影响)
- keys *e
- keys a*
- type key:key类型
string类型
-
get/set/del:查询/设置/删除
-
set rekey data:设置已经存在的key,会覆盖
-
setnx rekey data:设置已经存在的key,不会覆盖
-
set key value ex time:设置带过期时间的数据
-
expire key:设置过期时间
-
ttl key:查看剩余时间,-1永不过期,-2国企
-
append key:合并字符串
-
strlen key:字符串长度
-
incr key:累加1
-
decr key:累减1
-
incrby key num:累加给定数值
-
decrby key num:累减给定数值
-
getrange key start end:截取数据,end=-1代表到最后
-
setrange key start newdata:从start位置开始替换数据
-
mset:连续设值
-
mget:连续取值
-
msetnx:连续设置,如果存在则不设置
其他
- select index:切换数据库,总共默认16个
- flushdb:删除当前下边db中的数据
- flushall:删除所有db中的数据
redis.conf核心配置:database 16
12、Redis数据类型 - hash
hash
类似map,存储结构化数据结构,比如存储一个对象(不能有嵌套对象)
使用
- hset key property value:
- hset user name imooc
创建一个user对象,这个对象中包含name属性,name值为imooc
- hset user name imooc
- hget key property:获得对象中属性值
- hmset:设置对象中的多个键值对
- hmset user age 18 sex man
- hmsetnx:设置对象中的多个键值对,存在则不添加
- hmsetnx user age 18 sex man
- hmget:获得对象中的多个属性
- hmget user age phone
- hgetall user:获得整个对象的内容
- hlen user:获取对象属性个数
- hexists user age:判断属性是否存在
- hkeys user:获得所有属性
- hvals user:获得所有值
- hdel user:删除对象
- hdel user key:删除对象的某个属性
- hincrby user gae 2:累加属性
- hincrbyfloat user age 2.2:累加属性
14、Redis的数据类型 - list
list
list是简单的字符串列表,按照插入顺序排序(允许元素重复)。
使用
-
lpush userList 1 2 3 4 5:构建一个list,从左边开始存入数据,相当于栈从左入栈,左侧是栈顶
-
rpush userList 1 2 3 4 5:构建一个list,从右边开始存入数据,相当于栈从右侧入栈,右侧是栈顶
-
lrange list start end:获得key中 [start,stop] 范围的数据
-
lpop:从左侧开始拿出一个数据
-
rpop:从右侧开始拿出一个数据
-
pig cow sheep chicken duck
-
llen list:list长度
-
lindex list index:获取list下标的值
-
lset list index value:把某个下标的值替换
-
linset list before/after value:插入新的值
-
lrem list num value:删除几个相同数据
-
ltrim list start end:截取值,替换原来的list
16、Redis的数据类型 - set
set
Set是string类型的无序集合(不允许元素重复)。
集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。
使用
-
SADD key member1 [member2] :向集合添加一个或多个成员
-
SMEMBERS key:返回集合中的所有成员
-
SCARD key:获取集合的成员数
-
SISMEMBER key member:判断 member 元素是否是集合 key 的成员
-
SREM key member1 [member2]:移除集合中一个或多个成员
-
SPOP key:移除并返回集合中的一个随机元素
-
SRANDMEMBER key [count]:返回集合中一个或多个随机数
-
SMOVE source destination member:将 member 元素从 source 集合移动到 destination 集合
-
SDIFF key1 [key2]:返回给定所有集合的差集
-
SINTER key1 [key2]:返回给定所有集合的交集
-
SUNION key1 [key2]:返回所有给定集合的并集
17、Redis的数据类型 - zset
sorted set
sorted set:排序的set,可以去重可以排序,比如根据用户积分做排名,积分作为set的一个数值,根据数值可以做排序。set中的每一个member都带有一个分数。
使用
-
zadd zset 10 value1 20 value2 20 value3:设置member和对应的分数
-
zrange zset 0 -1:查看所有set中的内容
-
zrange zset 0 -1 withscores:都带有分数
-
zrank zset value:获得对应的下标
-
zscore zset value:获得对应的分数
-
zcard zset:统计个数
-
zcountzset 分数1 分数2:统计个数
-
zrangebyscore zset 分数1 分数2:查询分数之间的member(包含分数1 分数2)
-
zrangebyscore zset (分数1 (分数2:查询分数之间的member(不包含分数1 和分数2)
-
zrangebyscore zset 分数1 分数2 limit start end:查询分数之间的member(不包含分数1 分数2),获得的结果集再次根据下标区间做查询
-
zrem zset value:删除member
Redis 命令参考
Redisdoc官网:http://redisdoc.com/index.html