一、什么是 Redis ?
Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用
ANSI C
语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value
数据库。
二、Redis 的特性
- 速度快
- 所有数据都存放在内存中
- C语言实现
- 单线程架构
- 基于键值对的数据结构服务器
- 支持字符串、哈希、列表、集合、有序集合、BitMaps(位图)、HyperLogLog(超小内存唯一值计数)、GEO(地理信息定位)
- 功能丰富
- 发布订阅、Lua脚本、事务、pipeline
- 简单稳定
- 源码少,早期版本只有 2 万行左右,3.0 版本之后增加了集群特性,代码增至 5 万行左右
- 单线程模型
- 不依赖操作系统中的类库
- 客户端语言多
- 支持 Java、php、python、ruby、lua、nodeJS…
- 持久化
- Redis 所有数据保存在内存当中,对数据的更新将异步地保存到磁盘上。
- 主从复制
- 支持主从复制,后面文章介绍
- 高可用、分布式
- Redis-Sentinel 支持高可用,后面文章介绍
- Redis-Cluster 支持分布式,后面文章介绍
三、Redis 典型使用场景
Redis 可以做什么
- 缓存
- 缓存机制几乎在所有的大型网站都有使用,合理地使用缓存
不仅可以加快数据的访问速度,而且能够有效的降低后端数据源的压力
。Redis 提供了键值过期时间设置,并且也提供了灵活控制最大内存和内存溢出后的淘汰策略
。
- 排行榜
- Redis 提供了
列表和有序集合数据结构
,合理使用可以很方便地构建各种排行榜系统。比如按照热度排行的微博热搜、百度热搜等。
- 计数器
- 比如微博的转发数、评论数、点赞数等,为了保证数据的实时性,每一次都要做加 1 的操作,如果并发量很大对于传统关系型数据的性能是一种挑战。Redis
天然支持计数功能而且计数的性能也非常好
,是计数器系统的重要选择。
- 社交网络
- 例如粉丝数、观众数、共同关注、时间轴列表等等,由于
社交网站访问量通常比较大
,而且传统关系型数据库不太适合保存这种类型的数据,Redis 提供的数据结构可以相对比较容易地实现这些功能
。
- 消息队列系统
- Redis
提供了发布订阅功能和阻塞队列的功能
,轻量级的消息队列系统,一些对于消息队列功能不是有很强要求的系统的时候,就可以使用它来实现。
Redis 不可以做什么
- 从
数据规模角度
看,因为 Redis 数据都是放在内存中的,数据量非常大并不适合 Redis 的使用场景。 - 从
数据冷热角度
看,热数据指频繁操作的数据,反之为冷数据。如果将冷数据放内存,那对于内存是一种浪费,将热数据放入内存可以加速读写,也可降低后端负载。
四、为什么单线程还能这么快
通常来说,单线程处理能力要比多线程差,那 Redis 的单线程架构为什么还能这么快?
纯内存访问
,Redis 将所有数据放在内存中。非阻塞 I/O
,Redis 使用 epoll 作为 I/O多路复用技术
的实现,不在网络 I/O 上浪费过多时间。- 单线程
避免了线程切换和竞态产生的消耗
。
单线程要注意的问题
- 因为是单线程,同一时间只运行一条命令,所以它
拒绝长(慢)命令
,单线程对于每个命令的执行时间是有要求的。如果命令执行过长,会造成其他命令的阻塞,对于 Redis 这种高性能的服务来说是致命的。
来源:《Redis 开发与运维》第 1 章 初识 Redis