分布式阶段的主要内容
- 分布式缓存中间件 Redis
- 分布式会话与单点登录
- 分布式搜索引擎 Elasticsearch
- 分布式文件系统
- 分布式消息队列
- 分布式锁
- 数据库读写分离与分库分表
- 数据库表全局唯一主键 id 设计
- 分布式事务与数据一致性
- 接口幂等设计与分布式限流
本文主要内容
分布式架构概述
什么是分布式架构?
- 不同的业务(功能模块)分散部署在不同的服务器
- 每个子系统负责一个或多个不同的业务模块
- 服务之间可以相互交互与通信
- 分布式系统设计对用户透明
- 可以发展为集群分布式系统架构
分布式架构优点
- 业务解耦
- 系统模块化、可重用化
- 提升系统并发量
- 优化运维部署效率
分布式架构缺点
- 架构复杂
- 部署多个子系统复杂
- 系统之间通信耗时
- 新人带入团队缓慢
- 调试复杂
设计原则
- 异步解耦
- 幂等一致性
- 拆分原则
- 融合分布式中间件
- 容错高可用
LVS+Nginx实现高可用集群中的架构有一个缺点是服务端对数据库的请求并不存在“屏障”,这样数据库在高并发时会承担巨大的压力,而缓存中间件如Redis可以很好地解决这一问题。
Nosql 和分布式缓存
什么是 NoSql?
- Not Only Sql
- 传统项目使用纯数据库
- 为互联网和大数据而生
- 水平(横向)扩展方便高效
- 高性能读取
- 高可用
- 存数据、做缓存
NoSql 常见分类
- 键值对数据库:Redis, Memcache
- 列存储数据库 :Hbase, Cassandra
- 文档型数据库:MongoDB, CouchDB
- 图形数据库:Neo4J, FlockDB
分布式缓存及Redis 简介
什么是分布式缓存?
- 提升读取速度性能
- 分布式计算领域
- 为数据库降低查询压力
- 跨服务器缓存
- 内存式缓存
什么是Redis?
- NoSql
- 分布式缓存中间件
- key-value 存储
- 提供海量数据存储访问
- 数据存储在内存里,读取更快
- 非关系型、分布式、开源、水平扩展
缓存方案对比
Ehcache
优点:
- 基于 Java 开发
- 基于 JVM 缓存
- 简单、轻巧、方便
缺点:
- 集群不支持
- 分布式不支持
Memcache
优点:
- 简单的 key-value 存储
- 内存使用比较高
- 多核处理、多线程
缺点:
- 无法容灾
- 无法持久化
Redis
优点:
- 丰富的数据结构
- 持久化
- 主从同步、故障转移
- 内存数据库
缺点:
- 单线程
- 单核
安装和使用
安装
下载地址:https://redis.io/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
wget http://download.redis.io/releases/redis-5.0.7.tar.gz tar -zxvf redis-5.0.7.tar.gz cd redis-5.0.7/ yum install gcc-c++ -y make && make install cp utils/redis_init_script /etc/init.d/ mkdir /usr/local/redis cp redis.conf /usr/local/redis/ cd /usr/local/redis/ mkdir persistent # 目录名可自定义 vi redis.conf # 修改配置 daemonize yes dir /usr/local/redis/persistent bind 0.0.0.0 # 可在本地之外访问 requirepass passwd_xxx # 密码 # 修改相应行命令添加所设置密码,用于执行 stop 命令 $CLIEXEC -a passwd_xxx -p $REDISPORT shutdown cd /etc/init.d/ vi redis_init_script CONF="/usr//local/redis/redis.conf" # 启动服务 ./redis_init_script start # 开机自启动 chkconfig redis_init_script on |
客户端使用
1 2 3 4 5 6 7 8 9 |
redis-cli # 进入客户端 auth passwd_xxx # requirepass后所设置的密码 set name alanhou # 设置键值 get name # 获取所设置的值 del name # 删除name # Ctrl + C 或输入 exit退出 /etc/init.d/redis_init_script stop # 停止服务 redis-cli -a passwd ping # 查看服务是否存活 |
Redis 的数据类型
注:方括号中为可选项
默认类型为string
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
KEYS * # 查看当前所有的键 KEYS a* # 查看所有以 a 开始的键 KEYS *e # 查看所有以 e 结束的键 TYPE value1 # 查看指定键的类型 SETNX key1 value1 # 在键不存在时设置值,存在则不设置 TTL value1 # 查看键的过期时间,-1表示无限久,-2表示过期 EXPIRE key1 xxx # 设置过期时间,xxx 为多少秒 SET key1 value1 ex xxx # 在设置值时设置过期时间,xxx 为多少秒 APPEND key1 value2 # 拼接 STRLEN key1 # 查看长度 SET key1 value1 # value1为数值 INCR key1 # 累加 DECR key1 # 递减 INCRBY key1 value2 # 以数值 value2累加 DECRBY key1 value2 # 以数值 value2递减 GETRANGE key1 start end # 以下标start 和 end 截取 key1的值 SETRANGE key1 offset value2 # 从下标 offset 开始以 value2替换原值 MSET key1 value1 key2 value2... # 设置多个键值对 MGET key1 key2... # 获取多个键的值 MSETNX key1 value1 key2 value2... # 设置多个键值对(对已存在的不重复设置) SELECT index # index为0到15之间的值,因为 Redis 默认有16个库,可在这些库之间进行切换,在配置文件中有相关配置,默认使用的为0号库 FLUSHDB # 清除当前库的所有内容 FLUSHALL # 清除所有库的内容 |
hash
1 2 3 4 5 6 7 8 9 10 11 12 |
HSET key field1 value1 # 设置字段值,当前测试也可像 HMSET 那样设置多个字段值,key 为所设置的对象名称 HGET key field # 获取字段值 HMSET key field1 value1 field2 value2... # 设置多个字段值 HMGET key field1 field2... # 获取多个字段值 HGETALL key # 获取 key 中的所有字段值 HLEN key # 包含的字段数 HKEYS key # 打印 key 中的所有字段 HVALS key # 打印 key中的所有值 HINCRBY key field1 value2 # 对field1进行数值 value2的累加 HINCRBYFLOAT key field1 value2 # 对field1进行浮点值 value2的累加 HEXISTS key field1 # 查看字段是否存在 HDEL key field1 # 删除字段 |
list
1 2 3 4 5 6 7 8 9 10 11 |
LPUSH list1 value1 value2... # 从 list1左侧开始插入元素,不存在则创建一个 list LRANGE list1 0 -1 # 查看 list1中的所有元素,也可指定相应下标 RPUSH list2 value1 value2... # 从 list2右侧开始插入元素,不存在则创建一个 list LPOP list1 # 从左侧开始取出值,取出后从list中删除 RPOP list1 # 从右侧开始取出值,取出后从list中删除 LLEN list1 LINDEX list1 2 # 下标为2的元素 LSET list1 index value # 将下标为 index 的值替换为 value LINSERT list1 BEFORE value1 value # 在 value1之前插入值 value,与 BEFORE 对应的是 AFTER LREM list1 count value # 删除 count 个值为 value 的元素 LTRIM list1 start stop # 截取下标为 start 和 stop 之间的元素并替换 list1 |
set
set会进行去重操作
1 2 3 4 5 6 7 8 9 10 11 |
SADD set1 value1 value2... # 创建或添加元素 SMEMBERS set1 # 查看元素 SCARD set1 # 查看有多少个元素 SISMEMBER set1 value1 # 判断set1中是否存在 value1元素 SREM set1 value1 ... # 删除元素 SPOP set1 [count] # 随机删除 count 个元素,不指定 count 默认为1个 SRANDMEMBER set1 [count] # 随机取 count 个元素,不指定 count 默认为1个 SMOVE set1 set2 value1 # 将 set1中的元素 value1移动到 set2中 SDIFF set1 set2 # set1中包含但 set2中不包含的元素(差集) SINTER set1 set2 # set1和 set2中共同包含的元素(交集) SUNION set1 set2 # set1及 set2中包含的元素(并集) |
zset
有序 set
1 2 3 4 5 6 7 8 |
ZADD zset1 score1 value1 score2 value2... # 创建或添加zset,scorex为分值 ZRANGE zset1 0 -1 [WITHSCORES] # 指定开始和结束下标显示 zset1中的值, 0 -1表示显示所有值 ZRANK zset1 value1 # 查看指定值的下标 ZSCORE zset1 value1 # 查看指定值的分数 ZCARD zset1 # 查看元素总数 ZCOUNT zset1 min max # min和max为所指定的分值,最终显示在这两个分数(含)间的元素个数,若要不包含 min 或 max,只需在前面加括号即可,如(20,下同 ZRANGEBYSCORE zset1 min max [WITHSCORES] [LIMIT offset count] # 显示 min和 max 分值之间的元素(及分数) ZREM zset1 value1... # 删除指定的一个或多个元素 |
常见问题
1、(error) MISCONF Redis is configured to save RDB snapshots, but it is currently not able to persist o
1 |
config set stop-writes-on-bgsave-error no |