Redis做为缓存的几个问题

缓存理流程:

前台请求,后台先从缓存中取数据,取到直接返回结果,取不到时从数据库中取,数据库取到更新缓存,并返回结果,数据库也没取到,那直接返回空结果。

1.缓存雪崩

解决方案3:如果缓存数据库是分布式部署,将热点数据均匀分布在不同搞得缓存数据库中。

解决方案4:设置热点数据永远不过期。

2.缓存穿透

解决方案3:接口层增加校验,如用户鉴权校验,id做基础校验,id<=0的直接拦截;

解决方案4:从缓存取不到的数据,在数据库中也没有取到,这时也可以将key-value对写为key-null,缓存有效时间可以设置短点,如30秒(设置太长会导致正常情况也没法使用)。        这样可以防止攻击用户反复用同一个id暴力攻击

3.缓存击穿

解决方案2:设置热点数据永远不过期

注--------其实,大多数情况下这种爆款很难对数据库服务器造成压垮性的压力。达到这个级别的公司没有几家的。所以,务实主义的小编,对主打商品都是早早的做好了准备,让缓存永不过期。即便某些商品自己发酵成了爆款,也是直接设为永不过期就好了。

大道至简,mutex key互斥锁真心用不上。

4.缓存预热

描述:

新的缓存系统没有任何缓存数据,缓存预热就是系统上线后,在缓存重建数据的过程中,系统性能和数据库负载都不太好,将相关的缓存数据直接加载到缓存系统。这样就可以避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据!

解决方案

1、数据量不大,可以在项目启动的时候自动进行加载

2、定时刷新缓存

5.缓存热备

描述:

缓存热备即当一台缓存服务器不可用时能实时切换到备用缓存服务器,不影响缓存使用。集群模式下,每个主节点都会有一个或多个从节点来当备用,一旦主节点挂点,从节点立即充当主节点使用。

解决方案:

 

6.说明

作为一个并发量较大的应用,在使用缓存时有三个目标:

第一,加快用户访问速度,提高用户体验。

第二,降低后端负载,减少潜在的风险,保证系统平稳。

第三,保证数据“尽可能”及时更新。下面将按照这三个维度对上述两种解决方案进行分析。

互斥锁 (mutex key):

这种方案思路比较简单,但是存在一定的隐患,如果构建缓存过程出现问题或者时间较长,可能会存在死锁和线程池阻塞的风险,但是这种方法能够较好的降低后端存储负载并在一致性上做的比较好。

永远不过期

这种方案由于没有设置真正的过期时间,实际上已经不存在热点 key 产生的一系列危害,但是会存在数据不一致的情况,同时代码复杂度会增大。

原文地址:https://www.cnblogs.com/yuanfang0903/p/11197963.html

时间: 2024-08-28 00:14:50

Redis做为缓存的几个问题的相关文章

Spring整合Redis做数据缓存(Windows环境)

当我们一个项目的数据量很大的时候,就需要做一些缓存机制来减轻数据库的压力,提升应用程序的性能,对于java项目来说,最常用的缓存组件有Redis.Ehcache和Memcached. Ehcache是用java开发的缓存组件,和java结合良好,直接在jvm虚拟机中运行,不需要额外安装什么东西,效率也很高:但是由于和java结合的太紧密了,导致缓存共享麻烦,分布式集群应用不方便,所以比较适合单个部署的应用. Redis需要额外单独安装,是通过socket访问到缓存服务,效率比Ehcache低,但

Python的Flask框架使用Redis做数据缓存的配置方法

flask配置redis 首先得下载flask的缓存插件Flask-Cache,使用pip下载. sudo pip install flask_cache 为应用扩展flask_cache app = Flask(__name__) 1 config = { 2 'CACHE_TYPE': 'redis', 3 'CACHE_REDIS_HOST': '127.0.0.1', 4 'CACHE_REDIS_PORT': 6379, 5 'CACHE_REDIS_DB': '', 6 'CACHE

redis 做为缓存服务器 注项!

作为缓存服务器,如果不加以限制内存的话,就很有可能出现将整台服务器内存都耗光的情况,可以在redis的配置文件里面设置: # maxmemory <bytes> #限定最多使用1.5GB内存 maxmemory 1536mb 如果内存到达了指定的上限,还要往redis里面添加更多的缓存内容,需要设置清理内容的策略: # maxmemory-policy noeviction #设置策略为最少使用的key对应的数据 maxmemory-policy volatile-lru 清理策略有多种,re

redis 做数据库缓存 php实现

<?php /*数据库的表 ( 'usr_id', 'name', 'face_score', 'usr_sex', 'usr_headimgurl' */ $redis = new Redis(); $redis->connect('127.0.0.1',6379); $usr_id ='2007'; //方法例一 //构造一个json字符串,存入redis,再读出来, 这里的key是 'mykey' . $usr_id 拼成一个字符串 $ret; $redis->set('mykey

redis 做默认缓存

配置: server.port=9999 # REDIS (RedisProperties) # Redis\u6570\u636E\u5E93\u7D22\u5F15\uFF08\u9ED8\u8BA4\u4E3A0\uFF09 spring.redis.database=0 # Redis\u670D\u52A1\u5668\u5730\u5740 spring.redis.host=127.0.0.1 # Redis\u670D\u52A1\u5668\u8FDE\u63A5\u7AEF\

Redis做为单机缓存使用建议

Redis做为单机缓存使用建议 前言 由于原来项目使用的缓存中间件无法在国产麒麟操作系统里面使用,准备在项目中引入redis做为单机缓存. 配置优化建议 配置redis服务以守护进程启动 Redis默认不是以守护进程的方式运行,可以通过将配置项daemonize修改为yes,这样启动redis-server后会自动在后台运行. 安全配置 将bind配置为127.0.0.1可以避免redis受外部攻击.另外使用requirepass配置项,可以设置访问redis服务器数据时先要输入密码. 一个小遗

Spring Boot使用redis实现数据缓存

基于Spring Boot 1.5.2.RELEASE版本,一方面验证与Redis的集成方法,另外了解使用方法. 集成方法 配置依赖 修改pom.xml,增加如下内容. <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> 配置Redis

MySQL与Redis实现二级缓存

redis简介 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库 Redis 与其他 key - value 缓存产品有以下三个特点: Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用 Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储 Redis支持数据的备份,即master-slave模式的数据备份 优势 性能极高 - Redis能读的速度是110

使用Redis做MyBatis的二级缓存

1. 介绍 使用mybatis时可以使用二级缓存提高查询速度,进而改善用户体验. 使用redis做mybatis的二级缓存可是内存可控<如将单独的服务器部署出来用于二级缓存>,管理方便. 2. 使用思路 2.1 配置redis.xml 设置redis服务连接各参数 2.1 在配置文件中使用 <setting> 标签,设置开启二级缓存: 2.2 在mapper.xml 中使用<cache type="com.demo.RedisCacheClass" /&g