目录
写在前面:
想必在写项目的过程中,我们很多时候都会用到redis,那么redis到底是个啥玩意儿?今天我们就来浅浅聊一下吧。
盛赞Redis
什么是redis?redis实际上是一种基于键值对的(key-value)NoSQL数据库。redis中的值可以是String、hash、list、set、zset等多种数据结构和算法组成,因此可以满足很多的应用场景。另外,redis还可以将内存中的数据保存到硬盘上,这样,如果突然断电或系统发生故障,redis可以保证数据不会丢失。
Redis特性
那么redis都有哪些特性呢?
1、速度快。
为啥redis执行起来速度那么快?首先,redis的数据是保存在内存中的。其次,redis底层是基于C语言实现的。然后,redis使用的是单线程架构,这样就避免了多线程的竞争或者死锁问题的出现。最后,不得不说一下redis的源码了,redis的源码可以说是集性能与优雅于一身。大家可以阅读下, 看看到底有多优雅。
2、基于键值对的数据结构服务器。
redis提供了五种数据结构:字符串、哈希、列表、集合、有序集合。
3、丰富的功能
键过期功能,可以用来实现缓存;发布订阅功能,可以用来实现消息系统;支持Lua脚本功能,可以利用其创造出新的redis命令;简单的事务功能,能在一定程度上保证事务特性;流水线功能,客户可以一次性的把一批功能传给redis,节省了网络的开销。
4、简单稳定
首先,是因为redis的源码很少,redis最初的版本的源码只有两万行,慢慢发展到现在已经是五万行了,其实也不算多,所以这一点对于开发人员是很友好的,便于阅读和理解。其次,redis使用的是单线程模型。最后,redis并不依赖于操作系统中的类库。从以上三点来看,redis是比较简单的,但是这并不代表redis不稳定。
5、客户端语言多
支持redis的语言有Java、PHP、python,C++等。
6、持久化
一般来看,数据放在内存中是不安全的,一旦发生断电或其他故障,数据就有可能丢失。因此,redis提供了两种持久化的方式:AOF和RDB。可以将数据从内存中保存到硬盘中,这样就实现了数据的持久性。
7、主从复制
redis提供了复制功能,复制功能是分布式的基础。
redis使用场景
redis可以做什么?
1、缓存
几乎所有的大型网站都在使用缓存设计。缓存不仅可以加快数据的访问速度,还能有效减轻后端的压力。redis提供了键值过期时间设置,还提供了灵活控制最大内存和内存溢出后的淘汰策略。合理的使用缓存可以很好的为一个网站保驾护航。
2、排行榜系统
redis的数据结构中有列表和有序集合,这些可以帮助构建排行榜系统。
3、计数器应用
比如在csdn上,我们可以任意的浏览免费博客,如果点进去了,那么浏览量就会加一。除此之外,我们还可以给博客点赞、收藏,这样的操作实际上都是计数操作。redis天然支持计数功能,而且性能也非常好。
4、社交网络
社交性质的网站通常访问量比较大, 而且传统的关系型数据库不太适合保存这种类型的数据,但是redis可以。
5、消息队列系统
redis提供了发布订阅功能和阻塞队列的功能。
redis不可以做什么?
我们首先要明确的一点就是,redis并不是完美的。有的问题适合用redis来解决,但是同样的,有些问题并不适合用redis来解决。至于哪些问题适合用于redis哪些问题不适合用于redis,可以从数据规模和数据冷热两方面来分析。
有的数据规模大,有的数据规模小,通过前面我们知道,redis的数据是放在内存中,在这种情况下,如果redis的数据量过大,那么经济成本是相当高的。
站在数据冷热的角度来看待这个问题,数据分为冷数据和热数据。热数据需要我们频繁的操作,冷数据不需要。对于视频来说,视频信息就是热数据,而用户的观看视频的记录就是冷数据。而redis适合存放热数据,如果长期存放冷数据,实际上是对于内存的一种浪费。
关于用好redis的两点建议
1、不要把redis当作黑盒使用
虽然redis是一种键值型的NoSQL数据库,但并不意味着redis就是get、set等大量的重复操作,开发人员不仅要会使用一些常用的API,还要深入理解redis的底层原理,应该把redis当成白盒来看待,要深知redis的逻辑结构。在公司内人员空缺时,开发人员也极其有可能会担任运维的角色。客观来看,实际这是一把双刃剑。好处就是,开发人员有更多的机会可以深入了解redis;而坏处就是,如果开发人员对于redis底层原理并不熟悉,操作失误,容易造成线上事故。
2、阅读源码
作为开发人员,我们不仅要能会用某一开发工具,我们还要深入到底层源码的研究。这样,不仅我们可以更好地掌握的一门开发工具,还有利于提高我们的编程水平。因为我们在阅读源码的过程中,实际上相当于在跟工具的开发者交流,和读书的道理是一样的。
本章重点回顾
1)redis的七个特性:速度快,基于键值对的数据库、丰富的功能、简单稳定、客户端语言多、持久化、主从复制
2)redis并不完美,有些场景是不适合用redis来开发的。
3)开发运维结合以及阅读源码时学好redis的重要方法。