Redis数据库解析,读懂直接去见面试官

上一篇,我们简单了解过NoSQL数据库下文档型数据库MongoDB,今天我们来介绍下NoSQL数据库下一款缓存数据库Redis。谈到Redis,应该没有一个技术开发者会否认,在当今的技术架构中,Redis已然成为使用最广泛的缓存,它支持复杂的数据结构,支持持久化,支持主从集群,支持高可用……

在介绍Redis之前,我们不妨先简要的了解下缓存。随着互联网的普及,信息内容愈加复杂,用户数量和访问数量不断增加,所以我们的应用服务器和数据库服务器所做的工作也就越来越多,然而服务器的工作能力是有限的,数据库每秒处理请求的次数也是有限的,进而有效利用有限资源来实现最大限度的吞吐量成为急需解决的问题。那么我们就可以考虑引入缓存,实现每一个请求都可以通过缓存完成高效处理工作。

所谓缓存,就是如果数据没有发生本质的话,我们就无需去数据库中查询,而直接就可以通过内存读取数据,这样就可以大大降低数据库的读写次数,工作效率能提高很多。Redis作为一款缓存数据库,大量使用内存间的数据快速读写,支持高并发大吞吐,并能够对缓存提供持久化支持。下面我们从多维度来了解下Redis。

什么是Redis

Redis的全称是Remote Dictionary Server,由意大利人 Salvatore Sanfilippo 使用C语言开发。Redis是完全免费开源的,遵守BSD协议。本质上讲,Redis是一个key_value型单线程数据库,可以用作数据库、缓存和消息的中间件,属当前最受欢迎的NoSql数据库之一,也被人们称为数据结构服务器。

未分类

Redis的数据类型

Redis之所以备受欢迎,其中最大的魅力在于它支持保存五种基本数据结构类型。string(字符串),hash(哈希),list(列表),set(集合)和zset(sorted set有序集合)。

1.string

它是redis的最基本的数据类型,一个键对应一个值,需要注意是一个键值最大存储512MB。一般用于一些复杂的计数功能的缓存;

2.hash

redis hash是一个键值对的集合,是一个string类型的field和value的映射表,这里的value存放的是结构化的对象,操作其中某个字段十分方便,适合用于存储对象;

3.list

是Redis类相对简单的字符串列表,通过list可以做简单的消息列队功能。list对应的是一个双向列表,按照插入顺序排序;

4.set

是string类型的无序集合,集合中的数据不能重复出现,所以可以用来做全局的去重功能;

5.zset

是string类型的有序集合,同set一样不可重复。有序集合中排序因子为每个元素附带一个double型的分数,根据分数对元素进行升序排序。如果多个元素有相同的分数,就会通过字典序完成升序排序,因此sorted set十分适合做排行榜应用。sorted set也可用来做延时任务。

未分类

速度解析

Redis作为一款单线程模型数据库,还有另外一处魅力所在,那就是快。很多人会对此产生疑问,为什么Redis是单线程还很快,关于这个问题,我们从以下几点展开分析:

  1. Redis使用标准C语言写,所有数据都在内存中完成,读写速度分别达到10万/20万,是已知性能最快的Key-Value DB ;

  2. 单线程操作,避免了频繁的上下文切换,也不用考虑在多进程或者多线程中导致的切换而消耗 cpu;

  3. 核心采用基于非阻塞的 IO 多路复用机制,单个线程通过跟踪每个I/O的状态,来管理多个I/O流。

过期删除策略

在Redis内,我们可以使用EXPIRE或EXPIREAT设置key的过期时间,Redis内存达到maxmemory限制后,Redis内存就会施行过期数据淘汰策略。过期删除策略通常有三种:定时删除、惰性删除、定期删除,目前Redis使用的过期键删除策略为惰性删除和定期删除,两种策略配合使用。

惰性删除,指当某个key值过期之后,该key值不会马上被删除,只有当读或者写一个已经过期的key时,才会触发惰性删除策略,此时该key完成删除。

定期删除,指每隔一段时间就会扫描一定数量数据库的expires字典内一定数量的key,并删除里面过期的key。

由于惰性删除无法保证过期数据被及时删除掉,所以Redis采用惰性删除,定期删除相结合的方法,可以帮助实现定期主动淘汰已过期的key,从而使cpu和内存资源达到最优的平衡效果。

InfoQ 中文站曾就Redis应用采访过新浪微博开放平台资深工程师唐福林,唐福林在采访中表示,个人是十分认可Redis丰富数据结构和高速读写功能这两大优势的,并且在长期的技术研发中,新浪微博会不断推进RedisCounter的开发和一些存储列表类数据的 eRedis 的定制开发。Redis深受众多技术开发者的喜爱,在我们熟悉的TitanFramework中,只需实现StorageDataProcessor,满足Redis获取接口中已经实现的manager方法进行数据操作,就能实现Redis的完美接入。