分布式架构

优点:

  • 业务解耦
  • 系统模块化,可重用化
  • 提升系统并发量
  • 优化运维部署效率

缺点:

  • 架构复杂
  • 部署多个子系统复杂
  • 系统之间通信耗时
  • 新人融入团队缓慢
  • 调试复杂

设计原则:

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

为什么加入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

redis解决重复下单 redis去重复队列_redis解决重复下单

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

redis解决重复下单 redis去重复队列_java_02

ps:此处修改为yes 表示是在后台运行

redis解决重复下单 redis去重复队列_Redis_03

ps:此处为redis的工作空间目录,当修改为特定的目录后,手动mkdir 创建目录

redis解决重复下单 redis去重复队列_redis_04

ps:此处表示redis的调用为linux系统内调用,不能为外部调用,需要修改为0.0.0.0,这样就可以为外部调用,新版本的redis 按照以下配置。

# bind 127.0.0.1
protected-mode no

redis解决重复下单 redis去重复队列_redis解决重复下单_05

ps: 此处设置redis的密码,设置好以后conf的文件已经修改完毕

接下来回到启动脚本位置

/etc/init.d/
vi redis_init_script

redis解决重复下单 redis去重复队列_Redis_06

此处的启动配置文件中,配置文件需要修改为我们设定好的配置文件,如下图所示

redis解决重复下单 redis去重复队列_Redis_07

  • 接下来启动redis
chmod 777 redis_init_script
./redis_init_script start
ps -ef | grep redis

ps:最后指令为验证redis是否启动

  • 设置自启动,随系统自启动(添加以下配置,并进行设置)

redis解决重复下单 redis去重复队列_redis_08

chkconfig redis_init_script on
  • 如何停止redis(添加以下配置,并使用以下指令)

redis解决重复下单 redis去重复队列_redis_09

./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

    1. 引入redis的整合包

    redis解决重复下单 redis去重复队列_redis解决重复下单_10

    1. 引入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去重复队列_缓存_11

    结果如上图所示

    redis可以做消息队列,但是不介意做消息通知,设计的单一性,使得redis专人做专事的特性