分布式架构
优点:
- 业务解耦
- 系统模块化,可重用化
- 提升系统并发量
- 优化运维部署效率
缺点:
- 架构复杂
- 部署多个子系统复杂
- 系统之间通信耗时
- 新人融入团队缓慢
- 调试复杂
设计原则:
- 异步解耦
- 幂等一致性
- 拆分原则
- 融合分布式中间件
- 容错高可用
为什么加入redis
速度极快。官方给出的数据是 10 万次 ops 的读写,这主要归功于这些数据都存在于内存中。由于 Redis 是开源的,当你打开源代码,就会发现 Redis 都是用 C 语言写的,C 语言是最接近计算机语言的代码,而且只有区区 5 万行,保证了 Redis 的速度。同时一个 Redis 只是一个单线程,其真正的原因还是因为单线程在内存中是效率最高的。
特性二,持久化。Redis 的持久化可以保证将内存中的数据每隔一段时间就保存于磁盘中,重启的时候会再次加载到内存。持久化方式是 RDB 和 AOF。
特性三,支持多种数据结构。分别支持哈希、集合、BitMaps,还有位图(多用于活跃用户数等统计)、HyperLogLog(超小内存唯一值计数,由于只有 12K,是有一定误差范围的)、GEO(地理信息定位)。
特性四,支持多种编程语言。支持Java、PHP、Python、Ruby、Lua、Nodejs。
特性五,功能丰富。如发布订阅、Lua 脚本、事务、Pipeline(管道,即当指令到达一定数量后,客户端才会执行)。
特性六,简单。不依赖外部库、单线程、只有 23000 行 Code。
特性七,主从复制。主节点的数据做副本,这是做高可用的基石。
特性八,高可用和分布式。Redis-Sentinel(v2.8)支持高可用,Redis-Cluster(v3.0)支持分布式。
—摘自知乎 2021.3.27
Redis 优点
- 为互联网和大数据而生
- 水平(横向)扩展方便高效
- 高性能读取(每秒达到10万次)
- 高可用
- 存数据,做缓存
NoSql常见的分类
- 键值对数据库:Redis, Memcache
- 列存储数据库:Hbase,Cassandra
- 文档型数据库:MongoDB , CouchDB
- 图形数据库: Neo4j, FlockDB
什么是分布式缓存
- 提升读取速度性能
- 分布式计算领域
- 跨服务器缓存
- 内存式缓存
什么是Redis
- Nosql
- 分布式缓存中间件
- key-value 存储
- 海量数据的存储访问
- 数据存储在内存里,读取更快
- 非关系型,分布式,开源,水平扩展
缓存方案对比-Ehcache
优点:
- 基于java开发
- 基于jvm缓存
- 简单,轻巧,方便
缺点:
- 集群不支持
- 分布式不支持
缓存方案对比-Memcache
优点:
- 简单的key-value存储
- 内存使用率较高
- 多核处理,多线程
缺点:
- 无法容灾
- 无法持久化
缓存方案对比-Redis
优点:
- 丰富的数据结构
- 持久化
- 主从同步,故障转移
- 内存数据库
缺点:
- 单线程,单核驱动
- 数据结构丰富
如何安装使用Redis
- https://redis.io/下载最新的安装包,本次使用
- 拷贝到Linux相关位置,解压redis-6.2.1.tar.gz
tar -zxvf redis-6.2.1.tar.gz
- 安装前置依赖,进入解压目录,并进行安装
yum install gcc-c++
- 进入目录进行安装
cd redis-6.2.1
make
ps:当出现如上描述表示已经安装成功
- 进行install
make install
- 进行配置
此配置暂留
cd /redis-6.2.1/utils
cp redis_init_script /etc/init.d
- 修改conf文件(以下指令是将redis移动并进行修改)
cd /redis-6.2.1
mkdir /usr/local/redis -p
cp redis.conf /usr/local/redis
cd /usr/local/redis
vi redis.conf
ps:此处修改为yes 表示是在后台运行
ps:此处为redis的工作空间目录,当修改为特定的目录后,手动mkdir 创建目录
ps:此处表示redis的调用为linux系统内调用,不能为外部调用,需要修改为0.0.0.0,这样就可以为外部调用,新版本的redis 按照以下配置。
# bind 127.0.0.1
protected-mode no
ps: 此处设置redis的密码,设置好以后conf的文件已经修改完毕
接下来回到启动脚本位置
/etc/init.d/
vi redis_init_script
此处的启动配置文件中,配置文件需要修改为我们设定好的配置文件,如下图所示
- 接下来启动redis
chmod 777 redis_init_script
./redis_init_script start
ps -ef | grep redis
ps:最后指令为验证redis是否启动
- 设置自启动,随系统自启动(添加以下配置,并进行设置)
chkconfig redis_init_script on
- 如何停止redis(添加以下配置,并使用以下指令)
./redis_init_script stop
redis的五大数据类型与16个库
- String redis的数据类型按照key value的形式进行保存
常用指令:
set key value // 设定键值对值,当key重复时进行覆盖操作
get key // 根据key值获得value
setNX key value // 设定值时,当key存在时,不进行设值,不存在时进行设置,返回为数值的操作
keys * // 查看库中的所有数据
ttl key // 该key 存在的时间,为-1时永久保存,-2为过期,过期时查询不到
EXPIRE key 时间 或者 set key value ex 时间 //设置数据的过期时间
APPEND key value //对已存在的key的value进行拼接
STRLEN key //查询value的长度
incr key //对该key的value进行累加
decr key // 对该key的value进行递减
INCRBY key 数值 //对该key的value进行数值增加
DECRBY key 数值 // 对该key的value进行数值减少
type key //查看该key的valur类型
getrange key 0 -1 //获取该key的value的部分字段
setrange key 1 特定值 //替换从下标开始的值
mset key1 value1 key2 value2 //设置多个key value
mget key1 key2 // 获取多个key的value值
msetnx //同mset只不过不能有任何一个key重复
select 数字(默认0-15,redis默认有16个库) // 选择index的库,每个库都是独立的
flushdb 或者 flushall //清除库中的所有数据
• hash 一般保存一个对象,表示形式为:key为对象名称, 值里面也是键值对的形式
hset key valueKey valueValue //设置对象,并设置对象的一个属性
hget key valueKey // 获取对象中属性的值
hmset key valueKey1 valueValue1 valueKey2 valueValue2 //设置对象,并设置对象的多个属性
hmget key valueKey1 valueKey2 //获取对象中多个属性的值。
hgetall key // 获取该对象的所有值
hlen key //查看该对象中的属性数量
hkeys key //查看对象中的所有属性key
hvals key //查看对象中的所有属性value值
HINCRBY key valueKey 增长数值 // 给对象的特定属性值进行增长
HINCRBYfloat key valueKey 增长数值(小数) // 给对象的特定属性值进行小数增长
HEXISTS key // 查看对象的valueKey是否存在,存在返回1,不存在返回0
HDEL key // *******此方法无法直接删除
HDEL key valueKey // 删除该对象的某个字段值• list 列表,数组 元素可重复 ,表示形式为:key为对象名称,值为数组 list1 [a,b,c,d]
lpush key value1 value2 //创建一个数组,并放值, 从左边开始放值
lrange key 0 -1 //查看列表的数据元素
rpush key value1 value2 //创建一个数组,并放值,从右边开始放
lpop key // 从左边开始拿掉一个元素
rpop key // 从右边开始拿掉一个元素
llen key // key的数组长度
lindex key index //查看下标下的元素
lset ley index value //修改下标对象的值
linsert key before value newValue //在特定的value的位置之前插入一个值
linsert key after value newValue //在特定的value的位置之后插入一个值
lrem key index value // 根据index删除对应下标value的值
ltrim key startIndex endIndex //截取对应下标范围之内的元素
del key //删除key所对应的数组• set 元素不可重复 ,表示形式为:key为对象名称,值为数组 set1[a,b,c,d]
sadd key value1 value2 //放置set元素,不重复
SMEMBERS key //查看存放的元素
scard key // 查看元素数量
sismember key value //查看当前元素是否存在,存在返回1,不存在返回0
srem set value // 删除value的值
spop key //拿出一个值
spop key 2 // 拿出两个值
SRANDMEMBER key 3 //随机获取三个值
smove key1 key2 value //将key1的值,移到key2里面
sdiff key1 key2 //找到key1与key2里面,key1不同的元素
sinter key1 key2 //找到key1里面与key2里面,相同的元素
sunion set1 set2 //并集,找到set1与set2里面相同的元素• zset sorted set 有序的set,会根据分数去进行排序
zadd key nx value1 nx value2 // 在zset里面放入元素,nx为分数 value为值
zrange key 0 -1 // 查询key所在的zset的value值
zrange key 0 -1 withscores // 查询key所在的zset的value值,并显示分数
zrank key value // 查询key下的value值的下标
zscore key value //查询key下的value的数值权重
zcard key //查看元素数量
zcount key startNumber endNumber // 查询范围数值权重的数量
zrangebyscore key startNumber endNumber withscores // 查询范围值权重之间的详细信息,包含等于
zrangebyscore key (startNumber (endNumber withscores // 查询范围值权重之外的详细信息,不包含等于
zrangebyscore key startNumber endNumber limit 1 2// 查询范围值权重之间的详细信息,包含等于,并且是范围之内的分页信息
zrem key value // 删除key下的某个元素
SpringBoot整合redis
- 引入redis的整合包
- 引入redis的相关配置
spring:
redis:
database: 0 #使用默认16个库中的哪一个库
host: 172.21.9.161 #redis的连接url
port: 6379 #端口号
password : 123456 #密码
Redis的发布(pub)与订阅(sub)
订阅方使用以下指令,此时处于监听模式,一直在监听
SUBSCRIBE food1 food2 // 订阅了美食1 美食二
批量订阅方使用以下指令,此时处于监听模式,一直在监听
PSUBSCRIBE food* // 订阅了所有food开始的事件
发布方指令
PUBLISH food1 fish //发布方发布消息,订阅方就会收到消息
结果如上图所示
redis可以做消息队列,但是不介意做消息通知,设计的单一性,使得redis专人做专事的特性