一、Redis 简介

Redis 是一种基于键值对 (key-value) 的远程内存数据库,他不仅性能强劲,而且还具有复制特性以及未解决问题而生的独一无二的数据模型。与很多内存数据库不同的是,Redis 提供了5种不同类型的数据结构,格式各样的问题都可以很自然地映射到这些数据结构上。Redis 的数据结构致力于帮助用户解决问题,而不像其他数据库那样,要求用户扭曲问题来适应数据库。

Redis 会将所有的数据库存放在内存中,所以他的读写性能非常惊人。不仅如此,它还可以将内存的数据利用RDB(快照)和 AOF (日志追加)的形式保存到硬盘上。除了这些他还提供了数据过期、发布订阅、事务、流水线、Lua脚本等附加功能。

二、Redis 特性

1、速度快

Redis 执行命令的速度非常快,官方给出的数据,在正常情况下读写性能可以达到10万/秒。造成Redis如此之快的速度,主要以下几点:

  • Redis 是以 键值对的方式把数据存储在内存中
  • Redis 是使用 C语言实现,执行速度相对更快
  • Redis 使用单线程架构模式,防止了多线程中线程切换和竞争问题。

扩展知识:

  1. Redis是单线程,
    主要是指Redis 的网络 I/O和键值对读写是由一个线程来完成的,这也是Redis 对外提供键值存储服务的主要流程。但 Redis 的其他功能,比如持久化、异步删除、集群数据同步等,其实是由额外的线程执行的。
  2. 为什么单线程还能这么快?
  • 所有的数据都以键值对方式存在内存中,查找数据快。
  • 非阻塞 I/O,Redis 使用epoll 作为I/O 多路复用技术的实现,在网络I/O浪费时间很少。
  • 单线程避免了线程切换和竞态产生的消耗
  1. 单线程存在的问题
    在单线程中命令是按顺序执行的,如果某个命令执行过长,会造成其他命令阻塞,所以Redis是面向快速执行场景的数据库。

2、丰富的数据类型和额外功能

  • 数据类型
    Redis 提供了 字符串、哈希、列表、集合、有序集合 5种数据类型,同时在字符串的基础上还演变出了 位图(Bitmaps)、HyperLogLog 和 GEO(地理信息定位) 等多种数据类型。
  • 额外功能
  • 提供了键过期功能,可以用来实现缓存
  • 提供了发布订阅功能,可以用来实现消息系统
  • 支持Lua 脚本功能,可以利用Lua 创造出新的Redis命令
  • 通过了简单的事务功能,能在一定程度上保证事务特性
  • 提供了流水线 ( Pipeline )功能,这样可以批量传输命令,减少网络开销。

3、持久化

通常情况下,数据存储在内存中是不安全的,一点出现故障,服务重启或者断电,内存中的数据就可能会丢失。Redis提供了 RDBAOF 两种持久化方式,这样可以使数据保存到磁盘中,保证数据的持久化,数据不会丢失。

4、高可用和分布式

  • 主从复制
    Redis 提供了主从复制功能,实现了多个相同数据的Redis 副本。
  • 高可用
    Redis 可以通过哨兵机制,实现高可用功能
  • 分布式
    Redis 从 3.0 版本提供了分布式实现 Redis Cluster, 它提供了高可用、读写和容量的扩展。

三、Redis 使用场景

1、可以做什么

  • 缓存:Redis 提供了键值过期设置,并且还提供了灵活控制最大内存和内存溢出后的淘汰策略。
  • 排行榜系统:Redis 提供了列表和有序集合数据类型,合理的使用可以很方便的构建排行榜系统。
  • 计数器应用:Redis 天然支持计数功能而且计数的性能非常好。
  • 社交网络:Redis 的集合和有序集合的交集、并集和差集操作,可以比较容易地实现,赞/踩、粉丝、共同好友/喜好、推送等社交网站必备功能。
  • 消息队列系统:Redis 提供的发布订阅功能和阻塞队列功能,可以实现简单的消息队列。

2、不可用做什么

  • 大规模数据
    我们知道Redis的数据是存在内存中的,虽然现在内存足够便宜,如果使用Redis 存储大规模数据的话,经济成本还是相当高的。
  • 冷数据
    如果把不经常用的冷数据存放到Redis中,基本上是对于内存的一种浪费。但是存储一些热数据,可以加快数据的读写,可以减轻后端存储的负载。