本文为redis学习笔记的第一篇文章,主要从感性层面来认识一下这个开发中的宠儿,无论是什么应用,只要有点用户量的,不上redis是不可能的。作为当今最优秀的缓存中间件,没有理由不去深入了解它!

一、redis是什么

redis很快,官方宣称QPS(每秒查询率)达10万。

Redis是一个开源的使用ANSI C语言编写、支持网络、单进程单线程可基于内存亦可持久化、一个高性能的key-value数据库。

简而言之,就是一个缓存数据库,基于内存,也可以持久化,速度贼快,几乎所有互联网公司都在使用。

有的初学者可能看到数据库这个字眼,就把他归类于mysql之类,其实不是,mysql是一种关系型数据库,是存在磁盘中的。核心的数据是一定要落地到mysql之类的数据库中的。redis其实使用最多的功能是缓存,既然能存东西,那么必然也有数据库的功能,但是有可能会造成数据的缺失。所以,数据一定是要落入数据库才保险,redis可以作为缓存,缓存热点数据或者只读数据,提高性能并保护数据库。

二、为什么要用redis

好了,我们已经知道它是一个高性能的缓存中间件。那么必然一大功能是作为缓存使用。那为什么要用缓存呢?直接从数据库查不就行了码?

在实际的业务场景中,用户量一上来,数据库是吃不消的。数据库是性能的一大瓶颈,如果不采取措施,用户的操作将卡在数据库处理这一块,最终可能导致不可用。

那么,此时,加入缓存,比如商城首页有很多很多内容,这些内容不可能经常变化,至少也要两三天吧?所以,可以将这些数据放到redis中,用户进商城之后,数据直接从redis中获取即可。速度极快,提高了用户的体验。

既然是缓存,那么必定会存在数据不一致的情况,所以缓存最适合于读多写少的情况,当然啦,要修改缓存肯定是可以的,但是要注意热点key的问题,比如微博最火的一片新闻,此时有几百万人再看,你却要修改一下,肯定是要注意点什么东西才行的,后续的文章会讲到如何处理热点key修改的问题。

三、Redis与其他key-value存储有什么不同

这里先简单说说,后面会有文章详细比价一下。

  • 多样的数据结构和原子性操作

Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。redis中的单个命令都是原子性的,什么是原子性,就是该命令不可分割。

  • 运行于内存+持久化于磁盘

Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问

注:我们要知道,对于磁盘的顺序访问速度是远大于随机访问的。这种在硬盘上顺序追加效率很高。

四、redis特点

  • 速度快: 基于内存,这是快的最主要原因。
  • 持久化: 可以同步或异步保存到磁盘中
  • 多种数据结构: 除了五种基本数据类型,还支持位图、HyperLogLogGEO
  • 支持多种编程语言客户端javapythonrubyLua
  • 功能丰富: 可以实现发布-订阅,支持事务、Lua脚本
  • 简单: 不依赖与外部库、单线程模型
  • 主从复制: 主服务器同步数据到从服务器,是高可用的基础
  • 高可用、分布式: 高可用:redis-Sentinel(v2.8版本);分布式:redis-cluster(v3.0版本)

五、redis典型应用场景

  • 缓存系统:这个就不多说了,redis作为高速缓存是其主要存在价值。
  • 计数器:因为是原子操作incr+单线程,作为计数器永远不会出错
  • 消息队列系统:数据结构list可以实现这种生产者-消费者模式的消息队列。
  • 排行榜:有序集合sorted set就可以实现
  • 社交网络redis与社交网络就是一家,非常方便用set就能实现诸如共同好友这些功能。

六、redis优势

  • 缓存管理:可以在必要时将无效的旧数据从内存中删除,为新数据腾出新的空间
  • 提供更大的灵活性redis支持多种类型,并且采用key-value 的形式存储,keyvalue的大小限制都是512Mb,与编码无关,所以数据安全。但是memcached限制key最大为250字节,value为1MB,况且只支持String类型。
  • redis提供主从复制:实现高可用的cache系统,支持集群中多个服务器之间的数据同步。
  • 数据持久化redis可以通过两种方式将数据进行持久化,一定程度上规避缓存中的数据不稳定的问题,也可以在重启服务器时最快的恢复缓存中所需的数据,提高了效率的同时减轻了主数据库系统的开销。

与传统的Memcached相比,优势还是很大的,两者的具体对比我会在后续的文章中详细说明。这里注意存在即合理,Memcached也有不可替代的适用场景:

  • 存储一些粒度比较小的静态数据,比如一些html片段,Memcached便是我们更好的选择。相对于redis而言,Memcached的元数据metadata更小些,所以相对来讲对于数据存储管理的性能更高,额外开销更小。
  • Memcached的特点:Memcached唯一支持的数据类型是String,所以更适合存储只读数据,因为字符串并不会因为额外的处理造成额外的开销。毕竟Memcached每次更新一个对象时,都需要重复执行下面的操作:获取整个字符串->反序列化为对象->修改其中的值->再次序列化该对象->在缓存中将整个字符串替换为新字符串。这样一来,更新存储数据就会有更高的消耗,可能就不是我们的最佳选择了。

七、总结

只要记住redis三个关键字:快、持久化、高可用和分布式