目录
[高可用(High Availability)和分布式 (Distributed):](#高可用(High Availability)和分布式 (Distributed):)
前言
Redis是一种基于键值对 (key-value)的NoSQL 数据库,与很多键值对数据库不同的是,Redis中的值可以由字符串、哈希、列表、集合、有序集合、位图等多种数据结构和算法组成,能够满足特别多的使用场景。又因为Redis会将所有数据都放在内存中 ,所以它的读写性能非常惊人。不仅于此,Redis还可以将内存的数据利用快照和日志的形式保存到硬盘上,在发生类似断电宕机的时候,内存中的数据不会丢失。
Redis的诞生
2008年,Redis的作者Salvatore Sanfilipp在开发一个叫做LLOOGG的网站的时候,需要一个高性能的队列功能,最开始他使用的是MySQL,但是后来发现怎么优化SQL语句,网站的性能都上不去,于是自己打造了一个专属的数据库,这就是Redis的前身。
Redis特性
一下是关于Redis的8个重要特性:
速度快:
正常情况下,Redis执行命令的速度非常快,官网给出的读写性能可以达到10w条 / 秒
- Redis的所有数据都是存放在内存中的
- Redis是用C语言实现的,距离OS更近,执行速度相对更快点
- Redis使用了单线程,预防了多线程会产生的竞争问题
- Redis在6.0版本引入了多线程机制,但主要也是在处理网络IO,并不涉及数据命令
层级 | 速度 |
---|---|
L1 cache reference | 0.5ns |
Branch mispredict | 5ns |
L2 cache reference | 7ns |
Mutex lock/unlock | 25ns |
Main memory reference | 100ns |
Compress 1 K bytes with Zippy | 3000ns |
Send 2 K bytes over 1 Gbps network | 20000ns |
Read 1 MB sequentially from Memory | 250000ns |
Round trip within same datacenter | 500000ns |
基于键值对的数据结构:
正如前言所说,Redis中基于键值对的数据结构,类似于C++里的map、Java里的map、Python里的dict等等,这种存储方式的查找的时间复杂度可以认为是O(1)
丰富的功能:
- 提供键值过期功能,可以用来实现缓存
- 提供发布订阅功能,可以用来实现消息系统
- 支持Lua脚本功能,可以利用Lua创造出新的Redis命令
- 提供简单的事务功能,能在一定程度上保证事务的特性
- 提供了流水线(Pipeline)功能,这样客户端能将一批命令一次传输到Redis,减少网络开销
简单稳定:
这主要体现在三个方面:
第一点:早期的Redis版本代码大概只有2w行左右,3.0版本由于添加了集群特性,增加到5w行左右,相对于很多NoSQL数据库来说代码量相对少很多,这也就意味着很多普通的开发人员就能够吃透它
第二点:Redis使用单线程模型,这样不仅使得Redis服务端处理模型变得简单,而且也使得客户端开发变得简单。
第三点:Redis不需要依赖于操作系统中的类库,Redis自己实现了事件处理的相关功能
简单的同时Redis具有相当的稳定性,在大量使用过程中,很少出现因为Redis本身Bug导致宕机的情况
客户端语言多:
Redis提供了简单的TCP通信协议,很多编程语言可以很方便的接入到Redis。又由于Redis收到社区和各大公司的广泛认可,所以支持Redis客户端语言的也非常多,几乎涵盖了主流的变成语言,例如:C、C++、Java、PHP等
持久化:
通常数据放在内存中使很不安全的,因为内存只要一掉电,那么所有保存在内存中的数据就消失了,因此Redis也提供了持久化的方法,将内存中的数据能够保存到硬盘当中,这里持久化可以使用RDB 或 AOF 的策略
主从复制(Replication):
Redis提供了复制功能,实现了多个相同数据的Redis副本,复制功能是分布式Redis的基础
高可用(High Availability)和分布式 (Distributed):
Redis提供了高可用实现的Redis哨兵(Redis Sentinel),能够保证Redis结点的故障发现和故障自动转移。也提供了Redis集群,是真正的分布式实现,提供了高可用、读写和容量的拓展性
Redis可以做什么
首先我们要知道Redis 是把数据存储在内存上,所以不应该让他保存大量的用户数据
缓存:
大型的网站往往都会使用缓存机制,合理使用缓存能够加快数据的访问速度,而且能够有效的缓解后端数据源的压力。同时Redis提供了键值对过期时间,并且也能领过控制最大内存和内存溢出过后的淘汰策略。
消息队列:
消息队列可以说是大型网站的必备基础组件,因为其具有业务解耦、非实施业务削峰等特性。Redis提供了发布订阅功能和阻塞队列功能,虽然和专业的比起来不够强大,但是对于一般的消息队列他能够满足
排行榜:
就是像微博热搜top100 那样子类型的排行榜,Redis提供了列表和有序集合的结构,合理使用这些数据结构能够很方便的构造出各种排行榜系统
计数器应用:
例如视频的播放次数、点赞、点踩、收藏之类的,每次点赞都是对其数据做加1的操作。这种次数十分频繁的事情对于传统关系型数据库的性能是一种挑战,Redis天然支持计数功能并且性能也非常好,可以说是计数器系统的重要选择
Redis不能做什么
每个技术都有自己的应用场景,Redis并不是万金油~~
Redis的数据是存放在内存中的,如果数据量非常大,例如每天有几千万的用户行为数据,使用Redis来存储的话基本就是一个无底洞,这是挑战内存极限的活
数据也分为冷数据和热数据,如果将冷数据放在Redis中的话,基本上就是一种对内存资源的浪费,而热资源放在Redis中的话就能够很好的加快用户的读取效率,可以大大减轻后端存储的负载
结尾总结
Redis是一门基于KV的NoSQL数据库,它把数据存储在内存上的策略能够达到非常高的读写速度,但同样也有局限性,需要结合实际场景来使用