Redis基础知识入门

参考Redis【入门】就这一篇!

Redis概述

平常做Web小项目时都是直接使用mysql等数据库,在磁盘上进行数据的存取,由于一般的系统任务中通常不会存在高并发的情况,所以没什么问题,但是一旦涉及大数据量的需求,比如商品抢购使得主页访问量瞬间极大的时候,如果仅仅使用数据库来保存数据,会因为磁盘读/写速度太慢而造成数据库系统瘫痪。

NoSQL 技术

**MySQL(关系型数据库)**需要把数据存储到库、表、行、字段里,查询的时候根据条件一行一行地去匹配,当查询量非常大的时候就很耗费时间和资源,尤其是数据是需要从磁盘里去检索。

NoSQL(非关系型的数据库) 存储原理非常简单(典型的数据类型为k-v),不存在繁杂的关系链,不需要像mysql那样需要找到对应的库、表(通常是多个表)以及字段。
NoSQL数据可以存储在内存里,查询速度非常快。
NoSQL在性能表现上虽然能优于关系型数据库,但是它并不能完全替代关系型数据库。
NoSQL因为没有复杂的数据结构,扩展非常容易,支持分布式

RedisMongoDB是当前使用最广泛的NoSQL,而就Redis技术而言,它的性能十分优越,可以支持每秒十几万此的读/写操作。

Redis值的五种类型

String 整数,浮点数或者字符串
Set 集合
Zset 有序集合
Hash 散列表
List 列表

Redis在Web开发中的应用

Redis 在应用中主要分成两部分

  • 同时使用Redis和数据库
  • 只使用Redis,事后再更新数据库

1、同时使用Redis和数据库

在日常对数据库的访问中,读操作的次数远超写操作。当我们使用SQL语句去数据库进行读写操作时,数据库就会去磁盘把对应的数据索引取回来,这是一个相对较慢的过程。

如果我们把数据放在 Redis 中,也就是直接放在内存之中,让服务端直接去读取内存中的数据,那么这样速度明显就会快上不少,并且会极大减小数据库的压力,但是内存容量有限,限于成本的原因,一般我们只是使用 Redis 存储一些常用和主要的数据,比如用户登录的信息等。

一般而言在使用 Redis 进行存储的时候,我们需要从以下几个方面来考虑:

  • **数据常用吗?命中率如何?**如果数据不常用,缓存命中率很低,就没有必要写入缓存;
  • **是读操作多,还是写操作多?**如果写操作多,频繁需要写入数据库,也没有必要使用缓存;
  • **数据大小如何?**如果要存储几百兆字节的文件,会给缓存带来很大的压力,这样也没有必要;

Redis 读操作逻辑:

img

  1. 第一次读取数据的时候,读取 Redis 的数据就会失败,此时就会触发程序读取数据库,把数据读取出来,并且写入 Redis 中;
  2. 第二次以及以后需要读取数据时,就会直接读取 Redis,读到数据后就结束了流程,这样速度就大大提高了。

Redis 写操作逻辑:

img

可见写操作不仅要写入数据库,还要同时写入Redis,因此如果写次数远大于读次数那么就没有必要使用 Redis。

2、只使用Redis,事后再更新数据库

高并发的情况为了追求极致的速度,只读写Redis,等高并发请求结束后再将Redis上的数据同步到数据库中,此时,一次请求操作的流程图如下:

img

  1. 当一个请求到达服务器时,只是把数据在 Redis 上读写而没有对数据库进行任何的操作,这样就能大大提高读写的速度,从而满足高速响应的需求;
  2. 但是这些缓存的数据仍然需要持久化,也就是存入数据库之中,所以在一个请求操作完 Redis 的读/写之后,会去判断该高速读/写的业务是否结束,这个判断通常会在秒杀商品为0,红包金额为0时成立,如果不成立,则不会操作数据库;如果成立,则触发事件将 Redis 的缓存的数据以批量的形式一次性写入数据库,从而完成持久化的工作。

Redis其他内容

1、缓存穿透、缓存击穿、缓存雪崩

问题:

  • **缓存穿透:**持续向服务器请求不存在于服务器中的数据。先在Redis中查询,查询不到后去数据库中查询(都找不到)。
  • **缓存击穿:**一个很热门的数据,突然失效,大量请求到服务器数据库中
  • **缓存雪崩:**大量数据同一时间失效。

解决方法:

  • 缓存穿透:

    1.接口层增加校验,拦截对肯定不存在的数据的请求;

    2.先后访问缓存和数据库都没有取到数据,这时可以将key-value对写为key-null,这样可以防止恶意用户反复用同一个id暴力攻击。

  • 缓存击穿:设置热点数据永不过期。

  • 缓存雪崩:

    1.缓存数据的过期时间设置随机,防止同一时间大量数据过期现象发生。
    2.如果缓存数据库是分布式部署,将热点数据均匀分布在不同的缓存数据库中。

2、redis存取使用单线程

原因:

  1. redis是基于内存的,内存的读写速度非常快(纯内存)。
  2. redis是单线程的,省去了很多上下文切换线程的时间(避免线程切换和竞态消耗)。
  3. redis使用多路复用技术,可以处理并发的连接(非阻塞IO)。

在mysql等数据库技术中需要进行磁盘I/O,等待I/O时间很长,应该把CPU让给其他线程进行存取,所以用多线程存取效率更高。而redis不需要磁盘I/O,性能瓶颈不在CPU而在内存大小和网络带宽上,因此用单线程+多路复用技术足够了。

Redis还有很多内容面试时会问到,到时再学吧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章