初识 Redis

什么是 Redis ?

Redis(全称:Remote Dictionary Server 远程字典服务)是一个开源的使用ANSI C语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库。(百度百科)

Redis 的特性

速度快、持久化、多种数据结构、支持多种编程语言、功能丰富、简单、主从复制和高可用、分布式。

1.速度快

  • 数据存在内存中
  • C语言实现
  • 单线程

2.持久化(断电不丢失数据)

  • Redis所有数据保存在内存当中,对数据的更新将异步地保存到磁盘上。

3.多种数据结构

  • 支持字符串、哈希、列表、集合、有序集合、BitMaps(位图)、HyperLogLog(超小内存唯一值计数)、GEO(地理信息定位)

4.支持多种编程语言

  • Java、php、python、ruby、lua、nodeJS…

5.功能丰富

  • 发布订阅、Lua脚本、事务、pipeline

6.简单

  • 23000 lines of C code
  • 不依赖外部库
  • 单线程模型

7.主从复制

支持主从复制,后面文章介绍

8.高可用、分布式

  • Redis-Sentinel(V2.8)支持高可用,后面文章介绍
  • Redis-Cluster(V3.0)支持分布式,后面文章介绍

Redis 典型使用场景

缓存系统、计数器、消息队列系统、排行榜、社交网络、实时系统

1.缓存系统

访问 mysql 数据库时间代价是很大的,对于很多不常更新但是又常常访问的数据,我们可以利用 Redis 作为一级缓存,请求先会访问缓存中,如果有数据就直接返回,如果缓存没有,就需要查询 mysql 数据库,同时把数据缓存到 Redis 中。这样做就是利用了 Redis 的访问速度快的原理。

2.计数器

比如微博的转发数、评论数、点赞数等
初识 Redis

3.消息队列系统

轻量级的消息队列系统,对于一些对于消息队列功能不是很强求的系统的时候,就可以使用类似 Redis 实现。

4.排行榜

像百度热搜、微博热搜等等
初识 Redis

5.社交网络

想很多社交媒体的功能,都可以用 Redis 实现,例如粉丝数、观众数、共同关注、时间轴列表等等。

6.实时系统

比如垃圾邮件处理系统、过滤器,可以使用位图来实现过滤器的功能。

Redis 单线程问题讨论

上面提到 Redis 速度快的其中一个原因是单线程,多线程不应该比单线程更快吗,这是怎么回事?

  • 官方FAQ表示,因为Redis是基于内存的操作,CPU不是Redis的瓶颈,Redis的瓶颈最有可能是机器内存的大小或者网络带宽。既然单线程容易实现,而且CPU不会成为瓶颈,那就顺理成章地采用单线程的方案了。

  • redis 核心就是,如果我的数据全都在内存里,我单线程的去操作就是效率最高的。为什么呢,因为多线程的本质就是 CPU 模拟出来多个线程的情况,这种模拟出来的情况就有一个代价,就是上下文的切换,对于一个内存的系统来说,它没有上下文的切换就是效率最高的。redis用单个CPU绑定一块内存的数据,然后针对这块内存的数据进行多次读写的时候,都是在一个CPU上完成的,所以它是单线程处理这个事。在内存的情况下,这个方案就是最佳方案。 —— 阿里沈询

单线程要注意的问题

  • 一次只运行一条命令
  • 拒绝长(慢)命令