Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >redis(二)redis的运用与缓存穿透,雪崩的处理

redis(二)redis的运用与缓存穿透,雪崩的处理

作者头像
杨小杰
发布于 2020-02-18 15:00:18
发布于 2020-02-18 15:00:18
61300
代码可运行
举报
运行总次数:0
代码可运行

springboot集成redis

redis

上一篇是关于redis介绍的文章,这里不重复赘述了。快速通道

生成springboot项目

之前有讲过如何快速创建springboot项目,这里也不重复赘述了。快速通道

springboot配置文件

找到springboot的配置文件,添加配置,这里使用的是application.propertiesapplication.yml类似

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring.redis.host=127.0.0.1
#Redis服务器连接端口
spring.redis.port=6379
#Redis服务器连接密码(默认为空)
spring.redis.password=
#连接池最大连接数(使用负值表示没有限制)
spring.redis.jedis.pool.max-active=8
#连接池最大阻塞等待时间(使用负值表示没有限制)
spring.redis.jedis.pool.max-wait= 3000ms
#连接池中的最大空闲连接
spring.redis.jedis.pool.max-idle=8
#连接池中的最小空闲连接
spring.redis.jedis.pool.min-idle=0
#连接超时时间(毫秒)
spring.redis.timeout= 3000ms

redis连接工具类

此处使用的是stringredistemplate,也是比较常用的,还有redistemplate

StringRedisTemplate和RedisTemplate区别

  • StringRedisTemplate继承了RedisTemplate
  • RedisTemplate是一个泛型类,而StringRedisTemplate则不是。
  • StringRedisTemplate只能对key=String,value=String的键值对进行操作,RedisTemplate可以对任何类型key-value键值对操作。
  • 是他们各自序列化的方式不同,但最终都是得到了一个字节数组,殊途同归,StringRedisTemplate使用的是StringRedisSerializer类;RedisTemplate使用的是JdkSerializationRedisSerializer类。反序列化,则是一个得到String,一个得到Object

RedisUtils

这个utils是从网上找的,也比较全面->RedisUtils

因为代码比较多,所以我放在了第三方渠道里面,点击文章最下方阅读原文,获取最新代码

代码测试

这里只做一个简单的取值赋值演示,详细的使用,相信各位大大,看了本文涉及到的几篇文章,再看RedisUtils代码,自己能找到适用的数据结构和配套的连接方式

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.yxj.spring.controller;

import com.yxj.spring.utils.RedisUtils;
import com.yxj.spring.vo.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

/**
 * @version v1.0
 * @Copyright(c): 2020-2020
 * @FileName: RedisTestController.java
 * @Description:
 * @autho Admin
 * @date 2020/1/17 13:55
 */
@RestController
@RequestMapping("/test")
public class StringRedisTestController {
    @Autowired
    private RedisUtils redisUtils;


    @PostMapping("/redis")
    public String updateRedis(User user){
        redisUtils.set(user.getId(),user.getUserName());
        return "success";
    }

    @GetMapping("/redis/{key}")
    public String insertRedisTest(@PathVariable String key){
        return redisUtils.get(key);
    }
}

redis事物

简介

Redis 事务可以一次执行多个命令, 并且带有以下三个重要的保证

  • 批量操作在发送 EXEC 命令前被放入队列缓存。
  • 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。
  • 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

一个事务从开始到执行会经历以下三个阶段

  • 开始事务
  • 命令入队
  • 执行事务

例子

以下是一个事务的例子, 它先以 MULTI 开始一个事务, 然后将多个命令加入到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令

单个 Redis 命令的执行是原子性的,但 Redis 没有在事务上增加任何维持原子性的机制,所以 Redis 事务的执行并不是原子性的。

事务可以理解为一个打包的批量执行脚本,某个脚本指令执行失败,不会导致前面做的操作回退和影响后面的指令运行

可以观看下图操作,set b很明显是失败的,但是set aset c 操作还是成功了

有关于事物的命令

  1. DISCARD 取消事务,放弃执行事务块内的所有命令。
  2. EXEC 执行所有事务块内的命令。
  3. MULTI 标记一个事务块的开始。
  4. UNWATCH 取消 WATCH 命令对所有 key 的监视。
  5. WATCH key [key ...] 监视一个(或多个) key ,如果在事务执行之前这个(或这些) key 被其他命令所改动,那么事务将被打断。

redis缓存穿透和

PS:以下有个人理解,但是本人没有做过这种处理,只是看文章总结出来的内容,不保障效果,如果有错误,还请各位大佬指正!

缓存穿透

介绍

通常我们使用缓存存储某条记录,流程是先根据key查询redis,如果redis不存在,查询数据库,再同步至redis,如果每次都给定一个不存在的key那么redis无存在的意义,没有一点作用,这个叫做缓存穿透

解决方案

网上给出了两种解决方案

布隆过滤

对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合则丢弃,从而避免了对底层存储系统的查询压力;

我的理解

  1. 假定查询某个文章的浏览量
  2. 在文章保存的时候,先将文章的ID,进行处理,处理后放入redis
  3. redis查询不到,准备从数据库查询前,先查询该条记录ID可不可能存在
  4. 如果不存在,不操作,存在,再去做数据库数据保存至redis操作
缓存空对象

redis和数据库都没有通过key查询到数据,将返回的空对象也存储起来key->null,之后再次访问,直接就返回了null,需要设置过期时间,推荐1-2分钟内,具体视业务而定

我的理解

这个其实相对比较容易理解,就是保障一段时间,这个不存在结果的key,不会一直访问数据库,当然,这种数据如果多了,想想都可怕,全是key->null

如果本来之前没有的key,突然存在了,再次查询走缓存,返回的null是不是与数据库就不一致了呢?这里可能需要再多做业务处理

缓存雪崩

介绍

缓存击穿,是指一个key非常热点,在不停的扛着大并发,大并发集中对这一个点进行访问,当这个key在失效的瞬间,持续的大并发就穿破缓存,直接请求数据库,就像在一个屏障上凿开了一个洞。

解决方案

保证缓存层服务高可用性

即使个别节点、个别机器、甚至是机房宕掉,依然可以提供服务,比如 Redis SentinelRedis Cluster 都实现了高可用。

依赖隔离组件为后端限流并降级

在缓存失效后,通过加锁或者队列来控制读数据库写缓存的线程数量。比如对某个key只允许一个线程查询数据和写缓存,其他线程等待。

数据预热

可以通过缓存reload机制,预先去更新缓存,即将发生大并发访问前手动触发加载缓存不同的key,设置不同的过期时间,让缓存失效的时间点尽量均匀。

分布式锁

在缓存更新或者过期的情况下,先获取锁,在进行更新或者从数据库中获取数据后,再释放锁,需要一定的时间等待,就可以从缓存中继续获取数据。

要不就设置永不过期吧,哈哈哈哈哈,省时省力

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-01-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 JAVA知识总结与分享 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Redis【入门】就这一篇!
Redis 概述 在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题
我没有三颗心脏
2018/06/07
9310
1.缓存Redis实战操作记录
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。
全栈程序员站长
2022/06/30
4980
1.缓存Redis实战操作记录
redis【redis入门到精通】
Redisredis 是完全开源免费的,是一个高性能的key-value数据库,目前市面上主流的数据库 Redis、Memcache、Tair(淘宝自研发)
高大北
2022/06/27
5870
redis【redis入门到精通】
缓存穿透问题分析压测 原
    缓存穿透,是指查询一个数据库一定不存在的数据。正常的使用缓存流程大致是,数据查询先进行缓存查询,如果key不存在或者key已经过期,再对数据库进行查询,并把查询到的对象,放进缓存。如果数据库查询对象为空,则不放进缓存。
chinotan
2019/04/03
5120
缓存穿透问题分析压测
                                                                            原
SpringBoot集成Redis并实现主从架构
hello,你好呀,我是灰小猿,一个超会写bug的程序猿 今天这篇文章来和大家分享一下在springboot中如何集成redis,并实现主从架构,进行数据的简单存储。
灰小猿
2021/12/20
2.3K0
SpringBoot集成Redis并实现主从架构
「查缺补漏」巩固你的Redis知识体系
链接: https://pan.baidu.com/s/1MJnzX_qRuNXJI09euzkPGA 提取码: 2c6w 复制这段内容后打开百度网盘手机App,操作更方便哦
Kerwin
2020/08/10
7470
「查缺补漏」巩固你的Redis知识体系
Redis入门
NoSQL,泛指非关系型的数据库。区别于关系数据库,它们不保证关系数据的ACID:原子性(atomicity,或称不可分割性)、一致性(consistency)、隔离性(isolation,又称独立性)、持久性(durability)注意不保证不代表没有。NoSQL是一项全新的数据库革命性运动,其拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
xiaozhangStu
2023/05/04
4520
Redis【入门】就这一篇!
在我们日常的Java Web开发中,无不都是使用数据库来进行数据的存储,由于一般的系统任务中通常不会存在高并发的情况,所以这样看起来并没有什么问题,可是一旦涉及大数据量的需求,比如一些商品抢购的情景,或者是主页访问量瞬间较大的时候,单一使用数据库来保存数据的系统会因为面向磁盘,磁盘读/写速度比较慢的问题而存在严重的性能弊端,一瞬间成千上万的请求到来,需要系统在极短的时间内完成成千上万次的读/写操作,这个时候往往不是数据库能够承受的,极其容易造成数据库系统瘫痪,最终导致服务宕机的严重生产问题。
我没有三颗心脏
2018/05/31
9810
Redis【入门】就这一篇!
开箱即用,一键集成 Redis 缓存
Redis 是一个开源、高级的键值存储和一个适用的解决方案,用于构建高性能,可扩展的 Web 应用程序。支持更丰富的数据结构,例如 String、List、hash、 set、 zset 等,同时支持数据持久化。
微观技术
2021/03/11
4150
开箱即用,一键集成 Redis 缓存
spring-boot-route(十二)整合redis做为缓存
redis作为一种非关系型数据库,读写非常快,应用十分广泛,它采用key-value的形式存储数据,value常用的五大数据类型有string(字符串),list(链表),set(集合),zset(有序集合)和hash(哈希表)。
Java旅途
2020/10/21
4700
spring-boot-route(十二)整合redis做为缓存
SpringBoot中的缓存穿透、击穿、雪崩解决方案
RedisTemplate底层使用lettuce的话,进行压力测试时,会抛内存溢出异常,因此去掉lettuce依赖,底层使用jedis连接Redis
花落花相惜
2021/11/25
7360
Redis实战:Redis在Java中的基本使用
Jedis 是 Java 语言开发的 Redis 客户端工具包,用于 Java 语言与 Redis 数据进行交互。
栗筝i
2023/10/16
1.6K0
Redis实战:Redis在Java中的基本使用
springboot整合redis
springboot通常整合redis,采用的是RedisTemplate的形式,除了这种形式以外,还有另外一种形式去整合,即采用spring支持的注解进行访问缓存 。
BUG弄潮儿
2022/06/30
5290
Spring Boot2(三):使用Spring Boot2集成Redis缓存
前面一节总结了SpringBoot实现Mybatis的缓存机制,但是实际项目中很少用到Mybatis的二级缓存机制,反而用到比较多的是第三方缓存Redis。
鸟不拉屎
2019/07/03
1.2K0
SpringBoot 整合 Redis 原
2. application.properties 文件中添加 Redis 相关配置
北漂的我
2019/05/29
7070
如何使用REDIS做限定登录和LIST缓存?
首先我们使用docker安装下redis,关于docker还不会用的可以去百度学习下,安装使用还是非常简单的。
技术从心
2019/11/14
7680
SpringBoot集成redis「建议收藏」
今天,日月在这里教大家如何使用springBoot集成redis,说实话比较简单,网上也有大把的教程。先套用一下网上的简介。 定义
全栈程序员站长
2022/07/04
1.3K0
SpringBoot集成redis「建议收藏」
Redis---事务篇
Redis事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
大忽悠爱学习
2021/11/15
8090
【1w字+干货】第一篇,基础:让你的 Redis 不再只是安装吃灰到卸载(Linux环境)
Redis 基础以及进阶的两篇已经全部更新好了,为了字数限制以及阅读方便,分成两篇发布。(算是对一年多前 Redis 文章的一篇重制哇)
BWH_Steven
2021/02/24
8560
【1w字+干货】第一篇,基础:让你的 Redis 不再只是安装吃灰到卸载(Linux环境)
SpringBoot整合Redis实现分布式缓存、分布式锁等,实战分享!
在前几篇文章中,我们详细介绍了 redis 的一些功能特性以及主流的 java 客户端 api 使用方法。
Java极客技术
2023/02/23
3.4K0
SpringBoot整合Redis实现分布式缓存、分布式锁等,实战分享!
相关推荐
Redis【入门】就这一篇!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验