zoukankan      html  css  js  c++  java
  • Redis缓存浅析

    一.Redis简介

    redis官网:https://redis.io/  

    Springboot项目整合Redis

    redis是当下非常流行的非关系型数据库(NOSQL)之一,Redis能读的速度是110000次/s,写的速度是81000次/s ,所以他的读写速度是极高的。这种非关系型数据库关系型数据库有什么区别呢?

    两种不同类型的数据库最显著的区别就是:

    1.非关系型数据库的数据存储在内存上,存取效率极高,但是一旦发生断电的情况,存储的数据就会丢失。数据不安全。

    2.关系型数据库的数据存储在磁盘上,存取效率相对较低,但是断电之后,其存储的数据并不会丢失。数据安全。

    redis作为一款广受开发大众欢迎的高效率的非关系型数据库,这一点肯定会做相应的处理的。正所谓兵来将挡水来土掩,redis在存储数据的时候会自动将数据备份到磁盘上一份,这样断电恢复之后,数据会自动恢复,从而解决了数据丢失的问题。

    redis还能控制并发?

    首先redis内部是一个单线程的工作模式,它能够接收海量的并发请求,到达内部之后进行单个请求排队处理。从而达到很好的并发控制效果,现在很多的秒杀项目中也是会经常出现redis的身影。

    二.Redis常见的应用场景

    1.热点数据缓存

    2.数据库

    3.Session共享

    4.消息队列

    5.分布式锁

    6.计数器

    ……

    redis作为热点数据缓存是我们项目中经常使用的一个场景。

    三.缓存使用流程图

    (图有点丑陋,将就看吧)上图中,我们在业务系统中需要到数据库中查询一个数据,

    如果没有使用到缓存的话,那么基本的流程就是:

    业务系统----->数据库------>业务系统

    但是添加了缓存技术的话,基本的业务流程就变成了:

    1.业务系统先到缓存中进行查询是否有该数据

    2.如果缓存中有该数据,则直接从缓存中获取该数据并返回给业务系统。

    3.如果缓存中没有该数据,则到数据库中查询出该数据,并将该数据存一份到缓存中,然后将查询到的数据返回给业务系统。(这样下次如果业务系统还需要这个数据,则继续到缓存中查询是否存在,存在则直接返回数据,不存在继续到数据库中查询并存一份到缓存中)

    四.Redis支持的数据类型

    redis支持5大数据类型:String(字符串),Hash(哈希),List(列表),Set(集合),Zset(有序集合)

    redis是一个key-value结构的存储系统。可以通过get和set进行取值和存值操作。

    五.Redis关于事务的支持

    redis可以保证一个客户端发起的事务命令可以连续的执行,中间不会插入其他的命令。

    Multi 事物开始
    Exec 执行事务
    Discard 放弃事物
    Watch 监听key
    Unwatch 放弃所有key的监听
    watch 命令会监视给定的key,当exec时候如果监视的key从调用watch后发生过变化,则整个事务会失败。注意watch的key是对整个连接有效的,和事务一样,如果连接断开,监视和事务都会被自动清除。

    六.需要注意的

    1.缓存雪崩

    1.1概念

    缓存雪崩的情况就是,当某一时刻发生大规模的缓存失效的情况,比如你的缓存服务宕机了,会有大量的请求进来直接打到DB上面,结果就是DB撑不住,直接挂掉。

    1.2解决方案

    1)使用缓存集群,保持缓存的高可用,避免出现单点故障问题

    2)使用ehcache本地缓存+Hystrix限流&降级,避免数据库直接被打死

    在缓存不可用的情况下,使用本地缓存ehcache还能支撑一段时间。

    Hystrix限流&降级就是对请求进行限制,比如同一时间来了7000的并发请求,但是我们可以设置同一时间只能有2000个请求能够通过,剩余的请求则走我们的限流逻辑。以此来保护我们的DB不会被大量请求压死。

    3)因为redis能够从内存上备份数据到磁盘,所以我们开启redis的数据持久化机制,保证在发生缓存雪崩之后数据还能够正常恢复。

    2.缓存击穿

    2.1概念

    在平常的高并发的系统中,大量的请求同时请求同一个key,此时key正好失效了,就会导致大量的请求都打到数据库上面。这种现象我们就称之为缓存击穿。

    2.2解决方案

    缓存击穿的情况一般是多个线程同时去数据库查询这条数据,这里我们可以使用互斥锁来进行解决,在第一个线程去数据库查询的时候我们对其添加互斥锁,然后后面的请求因为没有拿到锁就只能等待了,等第一个线程查询到数据之后再向缓存中添加一份,剩下的线程就可以直接去缓存中查询数据了,从而避免了数据库出现性能瓶颈问题。

    3.缓存穿透

    3.1概念

    具体什么是缓存穿透呢?了解了缓存在项目中锁存在的环节位置之后我们再举个栗子说明一下什么是缓存穿透:在业务逻辑中需要查询一条数据,结果这条数据在缓存中不存在,然后又屁颠屁颠的跑到数据库中查询,很尴尬的是数据库中也查询不到这条数据,也就是说查询一条根本不存在的数据那么每次都会到数据库中查询,我们都知道频繁的做一些操作会加大数据库的压力(要不然为啥使用缓存技术?)。这种现象就是我们常说的缓存穿透。

    3.2解决方案

    1)因为用户拿着key去查询一个缓存和数据库中都不存在的值,那么当第一次查询的时候我们就可以将这个null作为这个key对应的值缓存到数据库中,那么之后用户再次用这个key去查询的时候就会直接返回null值了。

    2)另外在大数据量的情况下也可以使用BloomFilter(布隆过滤器)来对key进行过滤。

    4.热点数据集中失效的情况

    4.1概念

    我们都知道缓存技术其实就是将频繁查询数据库的数据缓存备份到redis中一份,然后依托redis的高性能读取数据的特性保护数据库,避免数据库出现性能瓶颈问题。一般我们在缓存数据的时候会给数据设置一个过期时间,如果大量的缓存数据的过期时间过于集中,那么就会出现在集中的时间段内大量的请求去数据库重新查询数据的情况,从而使我们的数据库宕机。这也就是热点数据集中失效。

    4.2解决方案

    为了避免热点数据集中失效,我们在设置过期时间的时候,可以让失效时间错开,比如在基础的过期时间上再加上一个随机值。

    结尾

    redis缓存还可以用来进行短信验证,发送一个随机验证码并使用手机号作为key,验证码作为值缓存到redis中,然后在验证的时候直接用手机号作为key验证该key在redis中是否存在等等……

  • 相关阅读:
    计算机漏洞安全相关的概念POC 、EXP 、VUL 、CVE 、0DAY
    开始使用kali的一些小问题:菜鸟瞎折腾
    nmap参数详解(罗列一下)
    安装kali之后必做的几件小事
    Debian下virtualBox增强功能出错
    ArcGIS Engine 基础功能(一)
    sublime 配置简单的python环境
    解决 ‘Could not fetch URL https://pypi.python.org’的问题
    golang基础语法学习
    大象盒子技术栈
  • 原文地址:https://www.cnblogs.com/wgty/p/12810503.html
Copyright © 2011-2022 走看看