Redis初识
1. 认识 Redis
1.1 用途:
用于存储数据,内存中存储
定义变量不就是在内存中存储数据,为什么还要使用Redis:
Redis在分布式系统中可以发挥其功能,如果是单机程序,直接通过变量存储数据的方式比Redis更优
进程具有隔离性,进程间的通信基于网络,Redis就是基于网络,可以把自己内存中的变量给别的进程,甚至在别的主机的进程进行使用
1.2 Redis主要可以用作:
- 数据库
- 缓存数据
- 消息队列
用作数据库:
MySQL是最常用的数据库,最大的问题在于访问速度比较慢,在很多互联网产品中,对于性能要求是很高的,Redis作为数据库使用可以快很多,但和MySQL相比,最大的劣势是存储空间有限
用作缓存:
如何使存储空间大而且访问速度快?
典型的案例是把Redis 和 MySQL 结合起来使用
“二八原则” 20%的热点数据能够满足80%的访问需求
缺点:系统的复杂程度大大提高,而且如果数据发生修改,还涉及到 Redis 和MySQL 之间的数据同步问题
用作消息队列:
Redis最初是用来作为一个“消息中间件”的“消息队列”
分布式系统下的生产者消费者模型
当前很少会直接使用Redis作为消息中间件使用
1.3 Redis特性
1.3.1 在内存中存储数据
MySQL主要通过“表”的方式来存储组织数据,成为“关系型数据库”
Redis主要通过“键值对”的方式来存储组织数据,称为“非关系型数据库”
key 都是 string
value 则可以是上述的这些数据结构
1.3.2 可编程性
针对Redis的操作,可以直接通过简单的交互式命令进行操作,也可以通过一些脚本的方式,批量进行一些操作
1.3.3 可扩展性
可以在Redis原有的功能上进行扩展,Redis提供了一组API
1.3.4 持久化
Redis把数据存储在内存上,内存的数据是很容易丢失的(进程退出/重启)Redis会把数据存储在硬盘上,内存为主,硬盘为辅(硬盘相当于对内存的数据备份了一下)如果Redis重启了,就会在重启时加载硬盘中的备份数据,使Redis的内存恢复到重启前的状态
1.3.5 支持集群
Redis作为一个分布式系统中的中间件,能够支持集群是很关键的,这个水平拓展,类似于分库分表,一个Redis能存储的数据是有限的,引入多个主机,部署多个Redis节点,每个Redia存储数据的一部分
1.3.6 高可用
冗余 / 备份
Redis自身也是支持“主从”结构的,从节点就相当于主节点的备份
1.3.7 访问速度快
1. Redis数据在内存中,就比访问硬盘的数据库要快很多
2. Redis核心功能都是比较简单的逻辑,核心功能都是比较简单的操作内存的数据结构
3. 从网络角度上,Redis使用IO多路复用的方式(使用一个线程管理多个socket)
4. Redis使用单线程模型,减少了不必要的线程之间的竞争开销
5. (待考量)Redis使用C语言开发(MySQL也是C语言开发的)
1.3.8 功能丰富
除了提供5种数据结构,Redis还提供了许多额外的功能:
1. 提供了键过期功能,可以用来实现缓存
2. 提供了发布订阅功能,可以用来实现消息系统
3. 支持 Lua 脚本功能,可以利用Lua 创造出新的Redis命令
4. 提供了简单是事务功能,能在一定程度上保证事务特性
5. 提供了流水线功能,这样客户端能将一批命令一次性传到Redis,减少网络的开销
1.3.9 客户端语言多
Redis提供了简单的TCP通信协议,很多编程语言可以很方便地接入到Redis,并且由于Redis收到社区和各大公司的广泛认可,所以支持Redis的了护短语言非常多,几乎涵盖了主流的编程语言
1.4 Redis使用场景
数据库
大多数情况下,考虑到数据库存储,有限考虑的是“大”,但是仍然有一些场景,考虑的是“快”
缓存 / 会话存储
消息队列
分布式系统来说,服务器和服务器之间,有时候也需要使用到生产这消费者模型,如果当前场景中,对于消息队列的功能依赖不是很多,并且不想引入额外的依赖了,Redis可以作为一个选择
1. 缓存
缓存机制几乎所有大型网站都有使用,合理使用缓存不仅可以加速数据的访问速度,而且能有效降低后端数据源的压力。Redis提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略。可以这么说,一个合理的缓存设计能够为一个网站的稳定保驾护航。
2. 排行榜系统
排行榜系统几乎存在于所有的网站,例如按照热度排名的排行榜,按照时发布的排行榜,按照各种复杂维度计算出的排行榜,Redis提供了列表和有序集合的结构,合理使用这些数据结构可以很方便的构建各种排行榜系统。
3. 计数器应用
计数器在网站中的作用至关重要,例如视频网站有播放数、电商网站有浏览数,为了保证数据的实时性,每一次播放和浏览都要做加1的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis天然支持技术功能且技术的性能也非常好,可以说是计数系统的重要选择。
4. 社交网路
赞/踩、分析、共同好友/喜好、推送、下拉刷新等是社交网络的必备功能,由于社交网站访问量通常比较大,而且传统的关系型数据库不太适合保存这种类型的数据,Redis提供的数据结构可以相比较容易地实现这些功能。
5. 消息队列系统
消息队列系统可以说是一个大型网站的必备基础组件,因为其具有业务解耦,非实时业务削峰等特性。Redis提供了发布订阅功能和阻塞队列的功能,虽然和专业的消息队列还不够强大,但是对于一般的消息队列功能基本可以满足
Redis不能做的事是:存储大规模数据
Redis的快是相对于MySQl这样的关系型数据库,但如果直接和内存中的操作变量相比,就没有优势了,甚至更慢
单机系统用一个Redis来存,还是直接在内存中搞一个hash map
使用hash map 是直接操作内存
使用Redis 是先通过网络,再操作内存
2. Reids操作
Redis也是一个客户端-服务器 机构的程序
Redis 客户端和服务器可以在同一个主机上,也可以在不同的主机上
Redis的客户端也有很多种形态:
1. 自带了命令行客户端
redis-cli
2. 图形化界面的客户端(桌面系统,web程序)
向这样图形化程序,依赖windows系统,在实际工作中用来办公的windows系统,连接到服务器可能会有很多限制
3. 基于Redis 的api 自行开发客户端