一、Redis 简介
Redis
是一种基于键值对 (key-value) 的远程内存数据库,他不仅性能强劲,而且还具有复制特性以及未解决问题而生的独一无二的数据模型。与很多内存数据库不同的是,Redis
提供了5种不同类型的数据结构,格式各样的问题都可以很自然地映射到这些数据结构上。Redis
的数据结构致力于帮助用户解决问题,而不像其他数据库那样,要求用户扭曲问题来适应数据库。
Redis
会将所有的数据库存放在内存中,所以他的读写性能非常惊人。不仅如此,它还可以将内存的数据利用RDB
(快照)和 AOF
(日志追加)的形式保存到硬盘上。除了这些他还提供了数据过期、发布订阅、事务、流水线、Lua脚本等附加功能。
二、Redis 特性
1、速度快
Redis
执行命令的速度非常快,官方给出的数据,在正常情况下读写性能可以达到10万/秒。造成Redis
如此之快的速度,主要以下几点:
-
Redis
是以 键值对的方式把数据存储在内存中 -
Redis
是使用C
语言实现,执行速度相对更快 -
Redis
使用单线程架构模式,防止了多线程中线程切换和竞争问题。
扩展知识:
Redis
是单线程,
主要是指Redis
的网络I/O
和键值对读写是由一个线程来完成的,这也是Redis
对外提供键值存储服务的主要流程。但Redis
的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。- 为什么单线程还能这么快?
- 所有的数据都以键值对方式存在内存中,查找数据快。
- 非阻塞 I/O,Redis 使用
epoll
作为I/O
多路复用技术的实现,在网络I/O
浪费时间很少。- 单线程避免了线程切换和竞态产生的消耗
- 单线程存在的问题
在单线程中命令是按顺序执行的,如果某个命令执行过长,会造成其他命令阻塞,所以Redis
是面向快速执行场景的数据库。
2、丰富的数据类型和额外功能
- 数据类型
Redis
提供了 字符串、哈希、列表、集合、有序集合 5种数据类型,同时在字符串的基础上还演变出了 位图(Bitmaps)、HyperLogLog 和 GEO(地理信息定位) 等多种数据类型。 - 额外功能
- 提供了键过期功能,可以用来实现缓存
- 提供了发布订阅功能,可以用来实现消息系统
- 支持
Lua
脚本功能,可以利用Lua
创造出新的Redis
命令 - 通过了简单的事务功能,能在一定程度上保证事务特性
- 提供了流水线 ( Pipeline )功能,这样可以批量传输命令,减少网络开销。
3、持久化
通常情况下,数据存储在内存中是不安全的,一点出现故障,服务重启或者断电,内存中的数据就可能会丢失。Redis
提供了 RDB
和 AOF
两种持久化方式,这样可以使数据保存到磁盘中,保证数据的持久化,数据不会丢失。
4、高可用和分布式
- 主从复制
Redis
提供了主从复制功能,实现了多个相同数据的Redis
副本。 - 高可用
Redis
可以通过哨兵机制,实现高可用功能 - 分布式
Redis
从 3.0 版本提供了分布式实现Redis Cluster
, 它提供了高可用、读写和容量的扩展。
三、Redis 使用场景
1、可以做什么
- 缓存:
Redis
提供了键值过期设置,并且还提供了灵活控制最大内存和内存溢出后的淘汰策略。 - 排行榜系统:
Redis
提供了列表和有序集合数据类型,合理的使用可以很方便的构建排行榜系统。 - 计数器应用:
Redis
天然支持计数功能而且计数的性能非常好。 - 社交网络:
Redis
的集合和有序集合的交集、并集和差集操作,可以比较容易地实现,赞/踩、粉丝、共同好友/喜好、推送等社交网站必备功能。 - 消息队列系统:
Redis
提供的发布订阅功能和阻塞队列功能,可以实现简单的消息队列。
2、不可用做什么
- 大规模数据
我们知道Redis
的数据是存在内存中的,虽然现在内存足够便宜,如果使用Redis
存储大规模数据的话,经济成本还是相当高的。 - 冷数据
如果把不经常用的冷数据存放到Redis
中,基本上是对于内存的一种浪费。但是存储一些热数据,可以加快数据的读写,可以减轻后端存储的负载。