经常会听到人说redis,或者基于redis实现秒杀,对于没有大型项目经验或者没有使用redis的人来说,redis为什么可以这样流行,它的机制是什么样子的,它又可以适用哪些领域,在没学习前,一直都是一头雾水。
1 背景:随着业务规模,用户人数增长,在大型项目中,对数据库的访问也是与日俱增,给数据库带来了很大的压力。在了解redis之前,要先了解下常规的程序访问数据库的过程。
如果两个进程想要通过网络进行连接并且进行通行,最简单的最通用的就是socket编程。关于socket编程,后续会单独写一篇。这里简单来说,就是需要建立TCP连接,由应用程序和数据库共同商量使用应用层协议。来进行数据的操作。这个应用层协议是很复杂的,比如三次握手,四次挥手。这个过程是相当复杂的,不同的数据库,遵循的协议也不同。
回到正题上来,这种传统的数据查询方式已经无法面对当前的业务需求,因此需要一种更为高效的查询模式来提高效率。大家都知道,在内存中操作数据中比访问数据库提高了好几个量级。既可以缓解数据库服务器的压力,也可以提高数据的访问速度。
2 概述:redis是一个开源的,先进的key_value持久化产品。通常被称为数据结构服务器。
值类型有 字符串(String)、哈希(Map)、列表(List)、集合(Sets) 和有序集合(Sorted sets)。
从这些类型可以看出来,它可以完成 字符串追加、增加Hash里面的值、添加元素到列表、计算集合的交集、并集、差集,或者是有序集合中排名等。因为Redis是一个内存型数据库。而且还可以帮数据持久化到磁盘中。redis是使用ANSIC写的。
(1)String类型
最常见的类型,可以包含任何数据,比如jpg或者序列化的对象。最大上限是1GB字节。
(2)Hash类型
Hash是一个String类型的filed和value映射表。最适合存储对象。相当于将每个对象的每个字段存成单个string类型。将对象存储在hash类型中会占用更少的内存,并且可以更方便的存取整个对象。
(3)List类型
链表结构。每个子元素都是string类型的双向链表。可以获取一个范围内所有值。操作中key就是链表的名字。
(4)Set类型
一个无序集合,会通过hash table实现,会随着添加或者删除自动调整大小。取并集、交集、差集。
(5)Sorted Set类型
在set的基础上增加了一个顺序。顺序可以指定,每次指定后,会自动按照新的值调整顺序。可以理解为一列存value,一列存value
3 主从复制
redis也支持主从复制。可以将数据同步到多台从库上,可以优化读取性能。这里先简单了解下,和Mysql一样支持主从复制。
4 Redis持久化
一般redis会将数据存储在内存中或者虚拟内存中,但是他也支持数据持久化功能,比如将内存中得数据持久化到磁盘。如果意外断电,数据也不会丢失。
(1)RDB快照持久化
默认是shnapshotting方式持久化,是将内存中的数据以快照的方式写入到二进制文件中,默认文件名是dump.rdb。是使用一个主线程来处理所有客户端的请求,会阻塞所有的客户端请求,另外每次都是完整写入,数据量比较大时,写入操作也会多,可能会影响性能。而且快照机制是一定间隔执行一次,如果意外当机,只会保存最后一次快照机制的数据。
(2)AOF方式持久化
AFO方式持久化,是将redis执行过的所有写指令记录下来。下次启动时,将写指令从头到尾执行一边,就可以实现数据恢复
(3)混合模式
4.0后开始支持混合模式,开始的数据以RDB的格式进行存储,因此只会占用少量空间。之后的命令会以AOF的方式进行数据追加,这样可以减少数据丢失的风险,提高数据恢复的速度。
心有所向,日复一日,必有精进。
玉衡星-刻晴