入门Redis概述
1 )选择Redis是因为其高性能
- 因为 Redis 它数据存储的机制是存在内存中的,减少了传统关系数据库的磁盘IO
- 它是单线程的保证了原子性,它还提供了事务,锁等相关的机制
2 )Redis 环境安装配置
- linux 或 docker 环境
3 )Redis 的并发下的模式演进
- 并发在十万以下的时候,Redis提供了单机单节点模式
- 官方测试的数据: 读取每秒11万次,写入每秒8万1, 所以性能是非常高的
- 当并发上来了,10万 到 20万左右的时候,使用 Redis 提供到读写分离, 主从模式
- 在这种模式下,主节点肯定要保持高可用的,Redis 提供了哨兵监控机制
- 为了降低各节点之间存储数据的压力,Redis 提供了集群模式
4 )了解微服项目的构建以及springboot应用的开发
- 我们围绕着项目来打通Redis任督二脉的,以项目作为驱动
- 在项目中实现 Redis 各种应用场景:实现缓存,保证缓存中的数据一致性等等
5 )理论准备
- 理论作为基石,需要了解缓存相关中间件,(Redis, Memcache 和 Ehcache) 的比较
- 对 Redis 的基本理解,Redis 它的定位是什么?解决了什么问题?
- 微服务相关的概念,最终是以微服务项目作为驱动开发的
5 )实际操作
- 在linux环境中安装 Redis,包括了解它的一些配置信息,每一个配置项都代表什么意思
- 以及把 Redis 作为开机自启项加入到系统服务当中,它的启动, 停止该如何去操作
- Redis 的基本命令
- 数据库表结构的设计
- Redis 作为一款 nosql 数据库, 肯定不能百分百替代关系数据库的
- 在一般项目中都是 Redis 和 mysql 组合,而 Redis 都是作为缓存层而存在
- 它最终缓存的是关系数据库中的数据
- SpringBoot & SpringCloud项目搭建
- 通过一个微服务的项目,也可以使用 go-micro 或 其他
- 这里了解 SpringBoot & SpringCloud 类似的微服务项目环境如何搭建
Redis 如何支撑 10w+ QPS
1 ) Redis 特点
- 内存数据库,速度快,也支持数据的持久化。
- Redis不仅仅支持简单的key-value类型的数据,同时还提供Lists、Hashes、Sets、Sorted Sets 等多种数据结构的存储
- Redis支持数据的备份(master-slave)与集群(分片存储),以及拥有哨兵监控机制
- 支持事务
2 ) 优势
- 性能极高-Redis能读的速度是110000次/s,写的速度是81000次/s
- 丰富的数据类型-Redis支持 Strings、Lists、Hashes、Sets、Sorted Sets 等数据类型操作
- 原子操作-Redis的所有操作都是原子性的,同时Redis还支持对几个操作合并后的原子性执行(事务)
- 丰富的特性-Redis还支持 publish/subscribe,通知,key 过期等特性
3 ) Redis、Memcached、Ehcache 的区别
Ehcache | Memcached | Redis | |
---|---|---|---|
最新版本 | 2017年2月 3.3.0 | 2018年7月 1.5.9 | 2018年7月 5.0 Beta |
许可证 | 开源免费 | 开源免费 | 开源免费 |
实现语言 | Java | C | C |
服务器系统 | Java | FreeBSD、Linux、OSX、Unix、Windows | FreeBSD、Linux、OSX、Unix、Windows |
数据类型 | 支持 | 不支持 | 支持多种:string、hash、list、set、sorted set等 |
客户端语言 | Java | .Net、C、C++、ColdFusion、Erlang、Java、Lisp、Lua、Ocaml、Perl、PHP、Python、Ruby | C、C#、C++、D、Erlang、Go、Haxe、Java、Node.js、Lisp、Lua、MatLab、Objective-C、Pascal、Perl、PHP、R、Ruby、Scala、Swift、Visual Basic 等 30十多种 |
- 在分布式的情况下, 用 Ehcache,就不能很好的去实现分布式项目之间缓存的同步共享的问题
- Memcached 对于数据类型比较单一,存在一些瓶颈
- 最终通过比较,还是选择 Redis
- 这三个中间件都可以应用于缓存,但目前市面上使用Redis的场景会更多,更广泛,其原因是:Redis性能高、原子操作、支持多种数据类型,主从复制与哨兵监控,持久化操作等
4 ) Redis的高并发
- 官方的bench-mark数据:测试完成了50个并发执行100000个请求, 设置和获取的值是一个256字节字符串
- 结果:读的速度是110000次/s,写的速度是81000次/s。redis尽量少写多读,符合缓存的适用要求
- 单机redis支撑万级,如果10万+可以采用主从复制的模式
4.1.原理
- Redis是纯内存数据库,所以读取速度快。
- Redis使用的是非阻塞10,10多路复用,减少了线程切换时上下文的切换和竞争。
- Redis采用了单线程的模型,保证了每个操作的原子性,也减少了线程的上下文切换和竞争。
- Redis存储结构多样化,不同的数据结构对数据存储进行了优化加快读取的速度。
- Redis采用自己实现的事件分离器,效率比较高,内部采用非阻塞的执行方式,吞吐能力比较大。
4.2. Redis的单线程
选择单线程原因
- 不需要各种锁的性能消耗
- 单线程多进程集群方案
- CPU消耗
优劣对比
单进程单线程优势
- 代码更清晰,处理逻辑更简单
- 不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗
- 不存在多进程或者多线程导致的切换而消耗CPU
单进程单线程弊端
- 无法发挥多核CPU性能,不过可以通过在单机开多个Redis实例来完善
4.3 IO多路复用技术
redis 采用网络10多路复用技术来保证在多连接的时候,系统的高吞吐量
- 举个现实生活的例子,从左边水龙头流向右边,传统的模式下,需要建立5个管子,如下
- 而在 IO 多路复用模式下,只需要建立一根管子让左侧水龙头分别与这根管子相连即可,如下
- 最终目的,都是要提高系统的吞吐量,而提高吞吐量就是为了快速的写入和读取
- 它拥有这些特性才能保证 Redis 在高并发的场景下,仍然是拥有非常高的性能的