IT小栈

  • 主页
  • Java基础
  • RocketMQ
  • Kafka
  • Redis
  • Shiro
  • Spring
  • Spring Boot
  • Spring Cloud
  • 资料链接
  • 关于
所有文章 友链

IT小栈

  • 主页
  • Java基础
  • RocketMQ
  • Kafka
  • Redis
  • Shiro
  • Spring
  • Spring Boot
  • Spring Cloud
  • 资料链接
  • 关于

Redis简单介绍

2020-04-18

提到缓存我们第一时间可能想到的就是Redis,其实缓存框架有很多如Memcache、阿里的Tair、Ehcache等。Ehcache对分布式方面支持的不好,多个节点不能同步;Tair的应用没有这么广泛;Memcache是一个典型的内存型缓存,当然也可借助第三方组件MemcacheDB实现持久化,只支持简单的key-value存储,不支持枚举,不支持持久化和复制等功能。

1、简单介绍

Redis是一款免费开源基于ANSIC语言编写的,BSD(BSD协议是五大开源协议的一种,它允许使用者在使用产品的基础上,可以对源代码进行修改和重新发布,并且可以发布为商业软件)许可的,日志型key-value存储组件,它的所有数据结构都存在内存中,可以用作缓存、数据库和消息中间件。

Redis 是 Remote dictionary server 即远程字典服务的缩写,一个 Redis 实例可以有多个存储数据的字典,客户端可以通过 select 来选择字典即 DB 进行数据存储。

2、版本说明

Redis借鉴了Linux操作系统对于版本号的命名规则:版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发版本。所以我们在生产环境通常选取偶数版本的Redis,如果对于某些新的特性想提前了解和使用,可以选择最新的奇数版本

3、Redis特性

3.1、高性能

同为key-value存储组件,Memcached只能支持二进制字节块这一种数据类型。而Redis的数据类型却丰富的多,它具有8种核心数据类型,每种数据类型都有一系列操作指令对应。Redis 性能很高,单线程压测可以达到 10~11w 的 QPS。

Redis 一般被看作单进程/单线程组件,因为 Redis 的网络 IO 和命令处理,都在核心进程中由单线程处理。Redis 基于 Epoll 事件模型开发,可以进行非阻塞网络 IO,同时由于单线程命令处理,整个处理过程不存在竞争,不需要加锁,没有上下文切换开销,所有数据操作都是在内存中操作,所以 Redis 的性能很高,单个实例即可以达到 10w 级的 QPS。核心线程除了负责网络 IO 及命令处理外,还负责写数据到缓冲,以方便将最新写操作同步到 AOF、slave。

3.2、持久化

虽然 Redis 所有数据的读写操作,都在内存中进行,但也可以将所有数据进行落盘做持久化。Redis 提供了 2 种持久化方式。

  • 快照方式,将某时刻所有数据都写入硬盘的 RDB 文件

  • 追加文件方式,即将所有写命令都以追加的方式写入硬盘的 AOF 文件中

生产环境下Redis 一般会同时使用两种方式,通过开启 appendonly 及关联配置项,将写命令及时追加到 AOF 文件,同时在每日流量低峰时,通过 bgsave 保存当时所有内存数据快照。

3.3、lua脚本

Lua是一个高效、简洁、易扩展的脚本语言,可以方便的嵌入其他语言中使用。Redis自2.6版本开始支持Lua。通过支持 client 端自定义的 Lua 脚本,Redis 可以减少网络开销,提升处理性能,还可以把脚本中的多个操作作为一个整体来操作,实现原子性更新。

3.4、事务

Redis还支持事务,在multi指令后,指定多个操作,然后通过exec指令一次性执行,中途如果出现异常,则不执行所有命令操作,否则,按顺序一次性执行所有操作,执行过程中不会执行任何其他指令。

3.5、集群

Redis 还支持 Cluster 特性,可以通过自动或手动方式,将所有 key 按哈希分散到不同节点,在容量不足时,还可以通过 Redis 的迁移指令,把其中一部分 key 迁移到其他节点。

3.6、丰富的数据类型

作为缓存组件,Redis的最大优势是支持丰富的数据类型。目前,Redis支持8种核心数据类型,包括string、list、set、sortedset、hash、bitmap、geo、hyperloglog。

3.7、热备

Redis支持master-slave的复制功能。当Redis的slave部署并设置完毕后,slave会和master建立连接,进行全量同步。第一次建立连接,或者长时间断开连接后,缺失的指令超过master复制缓冲区的大小,都需要先进行一次全量同步。全量同步时,master会启动一个子进程,将数据库快照保存到文件中,然后将这个快照文件发给 slave,同时将快照之后的写指令也同步给 slave。全量同步完成后,如果 slave 短时间中断,然后重连复制,缺少的写指令长度小于 master 的复制缓冲大小,master 就会把 slave 缺失的内容全部发送给 slave,进行增量复制。

Redis的master可以挂载多个slave,同时slave还可以继续挂载slave(一般不这样使用,一般是一主多从),通过这种方式,可以有效减轻master的压力,同时在master挂掉后,可以在 slave 通过 slaveof no one 指令,使当前 slave 停止与 master 的同步,转而成为新的 master。

4、使用场景

4.1、缓存数据

数据缓存是最容易想到的,最常用,对经常需要查询且变动不是很频繁的数据,常称作热点数据。

4.2、分布式锁

分布式锁是控制分布式系统或不同系统之间共同访问共享资源的一种锁实现,如果不同的系统或同一个系统的不同主机之间共享了某个资源时,往往需要互斥来防止彼此干扰来保证一致性。

4.3、消息订阅

相当于消息订阅系统,比如Kafka、RocketMQ等。对于简单的消息订阅的使用不用再额外引入专业的MQ组件,增加使用维护成本。如果对数据有较高一致性要求时,还是建议使用MQ)

4.4、访问限流

在高并发场景下有三把利器保护系统:缓存、降级、和限流。提到限流就不得不提到令牌桶算法,也就是说我们每访问一次请求的时候,可以从Redis中获取一个令牌,如果拿到令牌了,那就说明没超出限制,而如果拿不到,则结果相反。漏斗算法,Redis 4.0提供了一个限流Redis模块,名称为redis-cell,该模块提供漏斗算法,并提供原子的限流指令。

4.5、计数器

比如统计点击率、点赞率,redis具有原子性,可以避免并发问题

5、Redis 部署方式

5.1、主从模式

​ 在需要扩展读请求的时候,或者在需要写入临时数据的时候,用户可以通过设置额外的Redis从服务器来保存数据集的副本。在接收到主服务器发送的数据初始副本之后,客户端每次向主服务器进行写入时,从服务器都会实时地得到更新。在部署好主从服务器之后,客户端就可以向任意一个从服务器发送读请求了,而不必再像之前一样,总是把每个读请求都发送给主服务器。

5.2、哨兵模式

​ 在主从模式下如果Master宕机,需要手动重启Master节点或者手动切换主节点来完成系统恢复,这在生产环境中是有问题的。Redis在2.6版本开始提供的了哨兵模式,到Redis的2.8版本以后该模式正式稳定。Sentinel(哨兵)进程监控Redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用。

5.3、集群模式

5.3.1、国产集群方案-Codis

Codis 是 Redis 集群方案之一,令我们感到骄傲的是,它是中国人开发并开源的,来自前豌豆荚中间件团队。Codis是一个代理中间件,当客户端向Codis发送指令时,Codis负责将指令转发到后面的redis来执行,并将结果返回给客户端。一个Codis实例可以连接多个redis实例,也可以启动多个codis实例来支撑,每个codis节点都是对等的,这样可以增加整体的QPS需求,还能起到容灾功能。

5.3.2、官方集群方案-Cluster

Redis Cluster是Redis的分布式解决方案,在Redis 3.0版本正式推出的,有效解决了Redis分布式方面的需求。当遇到单机内存、并发、流量等瓶颈时,可以采用Cluster架构达到负载均衡的目的。Redis-Cluster采用无中心结构,每个节点保存数据和整个集群状态,每个节点都和其他所有节点连接。

本文作者: 顾 明 训
本文链接: https://www.itzones.cn/2020/04/18/Redis简单介绍/
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!
  • redis 简介
  • redis

扫一扫,分享到微信

微信分享二维码
Redis整体数据存储说明
Redis集群模式安装部署
  1. 1. 1、简单介绍
  2. 2. 2、版本说明
  3. 3. 3、Redis特性
    1. 3.1. 3.1、高性能
    2. 3.2. 3.2、持久化
    3. 3.3. 3.3、lua脚本
    4. 3.4. 3.4、事务
    5. 3.5. 3.5、集群
    6. 3.6. 3.6、丰富的数据类型
    7. 3.7. 3.7、热备
  4. 4. 4、使用场景
    1. 4.1. 4.1、缓存数据
    2. 4.2. 4.2、分布式锁
    3. 4.3. 4.3、消息订阅
    4. 4.4. 4.4、访问限流
    5. 4.5. 4.5、计数器
  5. 5. 5、Redis 部署方式
    1. 5.1. 5.1、主从模式
    2. 5.2. 5.2、哨兵模式
    3. 5.3. 5.3、集群模式
      1. 5.3.1. 5.3.1、国产集群方案-Codis
      2. 5.3.2. 5.3.2、官方集群方案-Cluster
© 2020 IT小栈
载入天数...载入时分秒... || 本站总访问量次 || 本站访客数人次
Hexo Theme Yilia by Litten
  • 所有文章
  • 友链

tag:

  • jvm
  • Java基础
  • kafka HW
  • kafka Leader Epoch
  • kafka
  • kafka位移主题
  • kafka位移提交
  • kafka副本机制
  • kafka ISR
  • zookeeper
  • kafka消息丢失
  • kafka日志存储
  • kafka Log Clean
  • kafka Log Compaction
  • kafka消费位移设置
  • kafka Rebalance
  • kafka分区算法
  • kafka生产者拦截器
  • kafka SASL/SCRAM
  • kafka ACL
  • redis
  • redis Ziplist
  • redis Hashtable
  • redis LinkedList
  • redis QuickList
  • redis intset
  • redis String
  • redis SDS
  • redis SkipList
  • redisDb
  • redisServer
  • redis 简介
  • Redis Cluster
  • 主从同步
  • RocketMQ高可用HA
  • 事务消息
  • 内存映射
  • MMAP
  • 同步刷盘
  • 异步刷盘
  • 消息存储文件
  • RocketMQ安装
  • 延迟消息
  • RocketMQ入门
  • 推拉模式
  • PushConsumer
  • 消费结果处理
  • rebalance
  • RocketMQ权限控制
  • RocketMQ ACL
  • 消息过滤
  • 消息重试
  • 消费位置
  • 集群消费
  • 广播消费
  • 运维命令
  • shiro源码分析
  • shiro入门
  • IOC和DI
  • Spring创建Bean
  • Bean生命周期
  • Sping属性注入
  • 异常
  • SpringMVC
  • springCloud
  • Eureka

    缺失模块。
    1、请确保node版本大于6.2
    2、在博客根目录(注意不是yilia根目录)执行以下命令:
    npm i hexo-generator-json-content --save

    3、在根目录_config.yml里添加配置:

      jsonContent:
        meta: false
        pages: false
        posts:
          title: true
          date: true
          path: true
          text: false
          raw: false
          content: false
          slug: false
          updated: false
          comments: false
          link: false
          permalink: false
          excerpt: false
          categories: false
          tags: true
    

  • 我的OSCHINA
  • 我的CSDN
  • 我的GITHUB
  • 一生太水