耳熟能详的Redis都能做什么?

119 阅读5分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

Redis的全称是REmote Directionary Server,即远程字典服务。我准备开一系列文章将Redis从基础到使用,运维,以及高级玩法等齐齐浅尝一遍,若有疏漏,烦请不吝赐教。

1 Redis的特性

1.1 速度快

使用Redis的最主要的原因,肯定是速度快。作为一个缓存型数据库,redis执行命令的速度是非常快的。官方给出的读写性能是10万/秒。这对于我们大部分系统来说,都是一个望尘莫及的速度。

1.2 键值对

Redis是基于键值对构建的数据库,与其他键值对不同的是,Redis中的值不仅可以是字符串,还可以是具体的数据结构,目前支持的有字符串哈希列表集合有序集合位图(Bitmaps)HyperLogLog。并在3.2版本中加入了有关地理信息定位的功能

1.3 功能丰富

除了支持的数据结构丰富外,redis还有丰富的功能比如:

  • 可以设置键值的过期时间,这对缓存的支持是很友好的。不会让过多的过期数据占用内存。
  • 发布订阅的功能,这个功能则可以实现消息系统,则与MQ的功能相似
  • 支持Lua脚本,可以使用Lua脚本操作redis,这极大的扩展了Redis的操作性。
  • 事务功能 在一定程度上可以保证事务特性,即原子性,一致性,隔离性,持久性
  • PipeLine功能,可以批量传入命令,以供Redis执行,这样可以极大的减少网络开销,提升redis服务的性能

1.4 简单稳定

简单则是体现在三方面

  • 源码少,仅有5万行,这对于一个程序员来说,读完轻轻松松。
  • 单线程模型 Redis是单线程模型,不存在线程争抢资源的问题,同时服务端处理模型也随之变得很简单。
  • 不需要依赖操作系统中的类库,redis自己实现了事件处理的相关功能 稳定则是经过长久的实践得来的,几乎不会发生由于Redis自身的bug而导致宕机的情况。

1.5 客户端支持的语言众多

Redis客户端支持JavaPHPPythonCC++NodeJs等主流开发语言。

1.6 持久化

Redis同时也支持将缓存的数据持久化到磁盘永久保存,当服务停止重启后,可以读取磁盘数据而重新读取数据支持服务。Redis支持两种持久化方式,RDBAOF,之后我们会详细研究。

1.7 主从复制

为了保证Redis的高可用,Redis支持了主从复制功能,可以保存多个数据副本,这也是分布式的基础。

1.8 高可用和分布式

Redis在2.8版本之后提供了高可用实现Redis Sentinel,实现了单节点的故障发现和故障自动转移,保证了整个服务的高可用。在3.0版本之后,则是提供了分布式的实现Redis Cluster,提供了高可用,并支持读写和容量的扩展。

2 使用场景

2.1 缓存

缓存机制是Redis的最基本的功能了,缓存机制现在大大小小的程序中都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力

像我们之前做的人事管理系统,打卡历史记录,工资配置等不常修改的数据,统统都放进了缓存中,经常访问,读取速度快,数据库还没有这部分数据的压力,简直是系统的福音。

image.png 一般请求会先访问Redis缓存,当缓存中有数据时,直接返回,当没有数据的时候,则会查询数据库,并保存一份到缓存中。

2.2 排行榜系统

几乎所有的系统中都有排行榜系统,像掘金的热榜作者榜等,redis提供了列表有序集合的数据结构,能很好的支持和构建各种排行榜系统。

image.png

2.3 计数器

计数器也是使用很广泛的,比如掘金文章的阅读点赞收藏等。其实是很简单的+1操作,但是若是全部放到数据库中,则是一部分很大的性能开销。Redis天然支持数据计数功能是计数系统的首要选型

2.4 社交

在社交网络中,赞/踩粉丝共同好友共同喜好同城好友等功能访问量大而且数据间关联性强,对于每个用户来说都是一个不同的数据,传统的数据库并不适合保存这种类型的数据,redis中的数据结构刚好比较容易实现这些功能。

image.png

2.5 消息队列

消息队列则是各个系统间通信的重要组件,Redis提供的发布订阅功能则可以实现简单的消息队列。虽比不上专业的MQ应用,但对于一般的消息队列功能基本可以满足。

这就是基本的一些功能和介绍,其实在我们实际应用中Redis作为计数器和缓存和分布式锁更多一点。今天是redis篇的开始,我们之后会详细研究。