持续创作,加速成长!这是我参与「掘金日新计划 · 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客户端支持Java
,PHP
,Python
,C
,C++
,NodeJs
等主流开发语言。
1.6 持久化
Redis同时也支持将缓存的数据持久化到磁盘永久保存,当服务停止重启后,可以读取磁盘数据而重新读取数据支持服务。Redis支持两种持久化方式,RDB和AOF,之后我们会详细研究。
1.7 主从复制
为了保证Redis的高可用,Redis支持了主从复制功能,可以保存多个数据副本,这也是分布式的基础。
1.8 高可用和分布式
Redis在2.8版本之后提供了高可用实现Redis Sentinel,实现了单节点的故障发现和故障自动转移,保证了整个服务的高可用。在3.0版本之后,则是提供了分布式的实现Redis Cluster,提供了高可用,并支持读写和容量的扩展。
2 使用场景
2.1 缓存
缓存机制是Redis的最基本的功能了,缓存机制现在大大小小的程序中都有使用,合理地使用缓存不仅可以加快数据的访问速度,而且能够有效地降低后端数据源的压力。
像我们之前做的人事管理系统,打卡历史记录,工资配置等不常修改的数据,统统都放进了缓存中,经常访问,读取速度快,数据库还没有这部分数据的压力,简直是系统的福音。
一般请求会先访问Redis缓存,当缓存中有数据时,直接返回,当没有数据的时候,则会查询数据库,并保存一份到缓存中。
2.2 排行榜系统
几乎所有的系统中都有排行榜系统,像掘金的热榜,作者榜等,redis提供了列表和有序集合的数据结构,能很好的支持和构建各种排行榜系统。
2.3 计数器
计数器也是使用很广泛的,比如掘金文章的阅读,点赞,收藏等。其实是很简单的+1操作,但是若是全部放到数据库中,则是一部分很大的性能开销。Redis天然支持数据计数功能是计数系统的首要选型。
2.4 社交
在社交网络中,赞/踩,粉丝,共同好友,共同喜好,同城好友等功能访问量大而且数据间关联性强,对于每个用户来说都是一个不同的数据,传统的数据库并不适合保存这种类型的数据,redis中的数据结构刚好比较容易实现这些功能。
2.5 消息队列
消息队列则是各个系统间通信的重要组件,Redis提供的发布订阅功能则可以实现简单的消息队列。虽比不上专业的MQ应用,但对于一般的消息队列功能基本可以满足。
这就是基本的一些功能和介绍,其实在我们实际应用中Redis作为计数器和缓存和分布式锁更多一点。今天是redis篇的开始,我们之后会详细研究。