前言

Redis是目前最为流行的NoSQL数据库,不仅是当代程序员必备技能之一,也是如今面试的高频问题,那么到底什么是Redis,它的主要特点是什么?为什么要使用Redis,以及Redis的使用场景有哪些?这些都是今天我们所要讨论和学习的问题!

1.1 Redis的定义和特点

1.什么是Redis?

  • Redis(Remote Dictionary Server ),即远程字典服务,是免费开源的,并且使用ANSI C语言编写;
  • 它支持网络、可基于内存亦可持久化的日志型、Key-Value>数据库,并提供多种语言的API
  • 是当下最热门的NoSQL数据库之一,也被人们称为结构化数据库

2. Redis的主要特点是什么?

  • Redis是一个Key-Value存储系统

1.它支持存储的Value类型很丰富,包括String (字符串)、List (链表)、Set (集合)、ZSet(sorted set – 有序集合) 和 Hash(哈希类型);

2.这些数据类型都支持push (出栈) / pop (入栈)、add (添加) / remove (移除) 及取交集并集和差集及更丰富的操作,而且这些操作都是**原子性**的;

3.在此基础上,Redis支持各种不同方式的排序

  • Redis是一个高性能的Key-Value数据库

1.Redis很大程度补偿了MemCached这类Key-Value存储的不足,在部分场景可以对关系型数据库起到很好的补充作用

2.它同时支持Java、C/C++、C#,PHP,JavaScript等多种语言平台,使用起来很方便

  • Redis支持主从同步

1.与MemCached一样,为了保证效率数据都是缓存在内存中,区别Redis会周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,并且在此基础上实现了master-slave(主从)同步

2.数据可以从主服务器向任意数量的从服务器上同步,从服务器可以是关联其他从服务器的主服务器,这使得Redis可执行单层树复制,存盘可以有意无意的对数据进行写操作;

3.由于完全实现了发布/订阅机制,使得从数据库在任何地方同步树时,可订阅一个频道并接收主服务器完整的消息发布记录,同步对读取操作的可扩展性和数据冗余很有帮助!

1.2 Redis的使用原因和适用场景

1.为什么要使用Redis?

  • 解决应用服务器的CPU和内存压力;
  • 减少磁盘的IO的读操作,减轻IO压力;
  • 传统的关系型数据库的扩展性不强,难以改变表结构

2.Redis的主要适用场景

2-1 内存存储
  • 进行内存存储,实现数据持久化

由于在内存中数据是断电即失的,因此数据持久化很重要 (例如RDB和AOF),而Redis周期性的把更新的数据写入磁盘或者把修改操作写入追加的记录文件,所以Redis很适合用于内存存储

2-2 缓存数据
  • 用于高速缓存,提高应用访问速度

如今越来越多的中大型网站都在使用缓存,因为合理的使用缓存不仅能够提升网站的访问速度,还能大大降低数据库的压力;

Redis提供了键过期功能,也提供了灵活的键淘汰策略,所以Redis用在需要缓存的场合十分合适

2-3 排行榜
  • 实现排行榜功能,统计网站热门信息

如今很多网站都有排行榜应用,例如淘宝的热门商品排行CSDN的热门博客排行B站的热门视频排行等,而Redis提供的ZSet有序集合数据类型,刚好能够实现各种复杂的排行榜应用

2-4 计数器
  • 用于计数器,统计数据浏览量

计数器在大多数网站都有应用,例如淘宝商品的浏览量CSDN博客的点击量B站视频的播放量等;

为了保证数据的实时性每次浏览都要加1,特别是并发访问量高时,如果每次都要请求数据库进行操作,对数据库无疑是巨大的挑战和压力;

Redis中提供的incr命令可以实现计数器功能,并且在内存中操作性能高,非常适用于这些计数场景

2-5 分布式会话
  • 适用于分布式会话,管理Session信息

集群模式中,在应用较少的情况下,一般使用容器自带的Session复制功能就能满足需求;而在应用较多、相对复杂的系统中,一般都会搭建以Redis等内存数据库为中心的Session服务Session不再由容器管理,而是由Session服务及内存数据库管理

2-6 分布式锁
  • 使用分布式锁技术,控制资源的并发访问

**分布式**成为了如今最火的技术之一,有很多互联网公司也开始陆续使用分布式技术,但分布式技术带来新的技术挑战:对同一个资源的并发访问

例如==全局ID、修改库存和限时秒杀等应用场景==,在并发量较低的情况,可以使用数据库的悲观锁、乐观锁来实现;但在并发量高的情况下,仍然利用数据库锁来控制资源的并发访问,显然是不太理想的,会 大大影响数据库的性能

而我们可以使用Redis的setnx功能来编写分布式的锁,如果设置返回1,则说明获取锁成功,否则获取锁失败,实际应用中要考虑更多的细节

2-7 消息系统
  • 充当消息队列系统,实现发布订阅功能

消息队列是大型网站必用的中间件,例如RabbitMQ、ActiveMQ、Kafka等流行的消息队列中间件,主要用于业务解耦、流量削峰及异步处理实时性低的业务

由于Redis完全实现了发布 / 订阅 以及阻塞队列功能,使得**从数据库在任何地方同步树时,可订阅一个频道接收主服务器完整的消息发布记录**,从而实现一个简单的消息队列系统,当然Redis的此功能还是不能跟专业的**消息中间件**相比

2-8 社交网络
  • 适用于社交网络,实现点赞关注等功能

在具有社交功能的网站中,例如B站中,我们可以在评论区进行点赞或者踩,也可以关注我们喜欢的UP主,或者被其他兴趣爱好相同的站友所关注,甚至我们可能还会和其他的站友拥有共同的好友;

社交型网站的访问量通常来说会比较大,加之社交网络中错综复杂的人际关系,传统的关系型数据库显然不适合存储这种类型的数据,而Redis中提供

的Hash、集合等数据结构能够很方便的处理这些数据