10.22 使用轻便并且读取高效的非关系(key-value)数据库redis的故事

使用轻便并且读取高效的非关系(key-value)数据库redis的故事

前言

说到非关系库,每个人都可能会侃侃而谈的说自己非常熟悉的redis,包括在面试的时候很多公司也是会经常问到相关问题,对于这个高性能的并且是纯内存读写的数据库,也得到了不少开发者的青睐,最重要的原因也不只是它读取快,而且还能够持久化数据,将数据存入磁盘中后可以再次读取利用,其使用ANSI c语言编写,典型的key-value型数据库,和那些关系库不同之处在于不是二维表格存储。在Memcache的基础上也弥补了很多缺点和不足。

使用轻便并且读取高效的非关系(key-value)数据库redis的故事

正文

一、redis的读取特点和数据类型

都知道redis的读写速度分别是110000次/s和81000次/s,那么这个到底快不快呢,让我们了解一下,一般情况下电脑所使用的的固态硬盘的读写速度最快的一般也就3000次左右吧,还有1000次的,那么可想而知redis的读取速度有多快了,本身是纯内存操作的单线程模式,采用io复用机制因此快也是自然的了。

单线程模式:所谓单线程,通俗的讲就是一条道跑到黑吧,对于cpu我们也大概都有所了解,现在很多电脑基本配置都到了4核8线的配置(当然有更好的),所以和很早之前的单核单线的电脑配置相比,性能大大的提升了,光一个进程下面就由好多线程,而且都是具有等待机制的并发策略运行,来回切换也耗费了不少的cpu资源,那么redis就是单线程模式,免去了多个线程相互竞争和切换的麻烦,当然这种模式也是有瓶颈的,这就是鱼与熊掌不可兼得了。

I/O的多路复用机制:对于IO在平时开发使用电脑的过程中几乎都避免不了i/o的操作,本身i/o的读写操作也是非常耗用资源的,一般的普通机械硬盘读写也是相对较慢的了,那么reids是怎么做的呢?所谓多路就是当有多个网络连接请求时,可以利用select、poll、epoll监控流的i/o的处理能力,将空闲的线程中阻塞中唤醒,然后依次去处理对应的流,这样避免了所以空闲资源的浪费,而且也实现了一个线程的复用机制,大大减少了资源的消耗,提升了读写速率,reids本身的epoll将读写转换为事件,避免了在i/o上浪费时间。

使用ANSI c语言编写:ANSI c是国际化标准C程序,用来编写redis避免了大量的第三方类库,很多开发者都清楚,引入太多三方类库,由于代码量的庞大会降低系统运行效率,所以没有第三方库的依赖也是redis的优点了。

reids的数据类型:reids支持多种数据类型,基本的都有string、hash、list、set、zset等具体的使用方式这里就不详解了,有兴趣的可以自行研究。另外reids也支持包括持久化在内的主存复制(集群模式)以及消息订阅等。

redis和memcache的差异:前面也提到了memcache这个之前也用过,可以说也有它的优势,随着redis的出现也慢慢的淡出了人们的视野,那么有哪些本质异同呢?

1、redis和memcache都是内存数据库,不过memcache可以存放图片视频等,当然redis的string类型也是可以存放图片的。

2、reids支持的数据类型较memcache多,比如上面提到的set、hash等。

3、reids很大的比memcache的优势就是当其物理内存用完时,可以将之前没用的数据存入磁盘。

4、redis可以设定过期策略,memcache入值时指定并且永远不会过期。

5、memcache一旦停掉数据就会丢失,而redis会保存到磁盘。

6、memcache停掉后数据无法恢复,而redis停掉后可以通过aof恢复数据。

7、redis支持数据的备份。

使用轻便并且读取高效的非关系(key-value)数据库redis的故事

二、redis一般都用于干什么事情呢?

redis的应用也有很多,比如可以用来做数据缓存工具,消息的订阅(聊天),排行榜和计数等相关应用,这里大概说下缓存的应用。

redis的会话缓存:一般缓存的数据都是短期内不发生改变,并且请求比较频繁的数据都会写入redis,因为它的读取速度比较快,从而降低了关系库的压力。很多登录操作的用户信息数据都会存入redis,当然也有流程数据或者其他相关数据,当页面加载数据一次后,后面读取都会从页面读取的方式为页面缓存数据,如果使用了缓存也就意味了key有过期时间,一般把redis当做存储系统使用,可以用两个redis,一个用来持久化,一个用来存放热数据,也就是memcache的功能了。另外有兴趣的可以去研究下redis配置文件的参数配置,因为合理的参数配置可以合理的利用内存资源,达到redis利用的最大化。

消息的订阅(聊天):reids可以进行类似于qq的上线和下线操作,随意可以用来存放实时聊天系统数据以及群聊等。

排行榜和计数:reids和nginx配合使用(nginx、lua、redis)计数器进行IP地址的自动禁用和启用操作。

使用轻便并且读取高效的非关系(key-value)数据库redis的故事

结语:关于reids的相关知识以及原理这里说的还不是很彻底,只是个人平时用到的以及学习到的知识点大概总了一个总结,有兴趣的可以继续关注一下公众号,一起参与讨论和学习,不足之处望指教。


分享到:


相關文章: