面试题之你对redis的认识

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ZSS1753936255/article/details/82496753

这里是我自己看书对redis的总结:这次我们目标的Redis在java互联网项目网中的作用。

在传统的javaweb项目中,使用数据库进行存储数据,但是有一些致命的弊端。主要来自性能方面。由于数据库持久化数据主要是面向磁盘,而磁盘的读/写比较慢,在一般的管理系统上,由于不存在高并发,因此没有需要瞬间需要读/写大量书写数据的要求,这时候数据库的读写是没有问题的。但是在互联网中,往往存在大量数据的需求,比如抢票,发红包等等。或者是主页访问量瞬间较大的时候,一瞬间成千上万的请求的到来,需要系统在极短的时间内完成成千上万次的读写操作。这个数据库根本承受不来,容易造成数据库系统瘫痪,最终导致服务器宕机。

     为了克服这些功能,我们的javaweb就要引入nosql技术。Nosql也是一种数据库。他主要是一种基于内存的数据库,并提供一定的持久化功能Redis和MongoDB是当前使用最广泛的Nosal的技术。这里介绍的就是redis技术。他的性能十分优秀。可以支持每秒十几万次的读写操作,其性能远超数据库,并且支持集群,分布式,主从同步等配置。原则是无限扩展,让更多的数据存储在内存中,而更让我们感到欣慰的是,他还能支持一定的事务能力,还在高并发的场景下支持数据安全性和一致性。

    redis的鑫能优越主要来自3个方面

1.他是基于ANSI C语言编写的,接近于汇编语言的机器语言,运行速度十分快

2.他是基于内存的读写,速度自然比基于磁盘的读写的要快很多。

3.他只有6中数据类型,数据结构比较简单,因此规则比较少。

所以用好Reids对于java互联网项目的响应速度和性能是至关重要的。

Redis在javaWEB的应用

一般而言redis在javaweb应用中存在两个主要场景,

一个是缓存常用的数据   另一个就是需要高速读/写的场合使用它的急速写

缓存

在对数据库的读写操作中,现实的情况下读操作的次数比远超写操作,一般是1:9到3;7,所以读的可能系就比写的可能性还要多。当发送sql去数据库进行读取时,数据库就会去磁盘吧对应的数据索引回来,而索引磁盘是一个缓慢的过程,如果把数据直接放在放在运行在内存的redis的服务器上,纳闷我们就不需要读写磁盘了。而是去直接读写内存了,显然读取速度会快的多。并且会极大减轻数据库的压力。内存虽然高效但是空间有限,价格也比磁盘贵了不少。因此代价比较高哦,我们就要思考该存什么?

<1>业务数据常用吗?命中率高吗?如果命中率很低,就没有必要写入缓存。

<2>该业务数据是读操作多?还是写操作多,如果写操作多,频繁需要写入数据库,也卖油必要使用缓存。

<3>业务数据大小如何?如果要缓存几百兆的文件,回个缓存带来了很大的压力。有没有必要?

高速读写场合

当一个请求到达到服务器,只是把业务数据现在Redis读/写,而没有进行任何对数据库的操作,换句话说,系统仅仅是操作Redis缓存,而没有操作数据库,这个速度比操作数据库要快的多。从而达到高速响应的效果。但是一般缓存不能持久化,或者持久化的数据不太规范,因此需要把这些数据写入数据库,所以在一个请求操作完redis的读写完后,回去判断该高速读写的业务是否结束这个判断的条件就是秒杀商品的个数是否为0,红包是否为0,如果不成立,则不会操作数据库;如果成立,则触发事件将Redis缓存的数据以批量的新式一次性写入数据库,从而完成持久化的工作。

Redis集群中内置了16384个哈希槽,Redis集群中放置一个key-value时,redis先对key使用crc16算法算出一个结果,然后把结果对16384求余数,这样的话每个key都会对应一个编号在0-16383之间的哈希槽,redis根据节点数量大致均等的就将哈希映射到不同的节点。

Redis集群么有使用一直hash,而是引入了哈希槽的概念。。

Redis集群有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定放置哪一个槽,集合的每一个节点负责一部分hash槽,这种结构很容易添加或者删除节点。并且无论是添加或者删除修改某一个节点。都不会曹成集群不可用 的状态。

猜你喜欢

转载自blog.csdn.net/ZSS1753936255/article/details/82496753