• 为什么使用redis
            改善性能。当大SQL执行耗时久,且结果不频繁变动,就特别适合将运行结果放入缓存,后面的请求从缓存中读取,使得请求能够迅速响应
            缓解并发压力。大并发下,所有请求都是直接访问数据库的,会出现连接异常。redis做一个缓冲,让请求先访问redis,而不是数据库。
  • redis缺点
             1、缓存与数据库双写一致性问题
             2、缓存雪崩问题(缓存同一时间大面积失效,这时又来了一波请求,结果请求都怼到数据库上,从而连接异常)
             3、缓存击穿问题(黑客故意去请求缓存中不存在的数据,导致所有的请求都怼到数据库上,从而连接异常)
             4、缓存的并发竞争问题
  • redis的过期策略与内存淘汰机制
        思考:为什么redis只能存5G,而你写了10G,redis怎么删除的。为什么设置过期时间,时间到了,内存占用率还是那么高
             redis采用的是定期删除+惰性删除策略
             定期删除不等于定时删除,定期删除是指redis默认100ms检查是否有过期的key,有则删除。但redis不是每个100ms将所有的key检查一次,而是随机抽取进行检查,因此,只采用定期删除策略,会导致很多key到时间没有删除。惰性删除会在你获取key时,redis检查是否过期,如果过期,此时就会删除。
              但是如果一直没有被删除(定期删除没有删,也没有被访问),则redis内存会越来越高,应该采用内存淘汰机制:

    在redis.conf中有一行配置:# maxmemory-policy volatile-lru

    该配置就是配内存淘汰策略的(什么,你没配过?好好反省一下自己)

    1)noeviction:当内存不足以容纳新写入数据时,新写入操作会报错。应该没人用吧。

    2)allkeys-lru:当内存不足以容纳新写入数据时,在键空间中,移除最近最少使用的key。推荐使用,目前项目在用这种。

    3)allkeys-random:当内存不足以容纳新写入数据时,在键空间中,随机移除某个key。应该也没人用吧,你不删最少使用Key,去随机删。

    4)volatile-lru:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,移除最近最少使用的key。这种情况一般是把redis既当缓存,又做持久化存储的时候才用。不推荐

    5)volatile-random:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,随机移除某个key。依然不推荐

    6)volatile-ttl:当内存不足以容纳新写入数据时,在设置了过期时间的键空间中,有更早过期时间的key优先移除。不推荐

  • 解决缓存击穿问题
           1、利用互斥锁,缓存失效的时候,先获得锁,得到锁了再请求数据库,没得到锁,则休眠一段时间重试
           2、采用异步更新策略,无论key是否取到值,都直接返回。value值中维护一个缓存失效时间,缓存过期,则异步起一个线程去读数据库,更新缓存,需要做缓存预热操作。
           3、提供一个迅速判断请求是否有效的拦截机制
  • 解决雪崩问题
            1、给换成的失效时间加上随机值,避免集体失效
            2、使用互斥锁,但是该方案吞吐量明显下降了
            3、双缓存

转载于:https://www.cnblogs.com/yaohuiqin/p/9412367.html

Redis学习笔记(五) 总结相关推荐

  1. StackExchange.Redis学习笔记(五) 发布和订阅

    StackExchange.Redis学习笔记(五) 发布和订阅 原文:StackExchange.Redis学习笔记(五) 发布和订阅 Redis命令中的Pub/Sub Redis在 2.0之后的版 ...

  2. Redis学习笔记(五)——持久化及redis.conf配置文件叙述

    对于日常使用来说,学习完SpringBoot集成Redis就够我们工作中使用了,但是既然学习了,我们就学习一些Redis的配置及概念,使我们可以更深层次的理解Redis,以及增强我们的面试成功概率,接 ...

  3. Redis学习笔记五:独立功能之事务

    Redis 事务提供了一种将多个命令请求打包,然后一次性.按顺序地执行多个命令的机制,并且在事务执行期间,服务器不会中断,会将事务中的所以命令都执行完毕才去处理其他客户端的命令请求. 事务的实现 事务 ...

  4. StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用

    StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 原文: StackExchange.Redis学习笔记(二) Redis查询 五种数据类型的应用 Connec ...

  5. Redis学习笔记(B站狂神说)(自己总结方便复习)

    Redis学习笔记B站狂神说 redis: 非关系型数据库 一.NoSQL概述 1.为什么要用Nosql 1.单机Mysql的年代 思考一下,这种情况下:整个网站的瓶颈是什么? 1.数据量如果太大,一 ...

  6. Redis学习笔记-GEO经纬度编码原理地理划分

    文章目录 Redis学习笔记-GEO经纬度编码原理&地理划分 1.笔记图 2.GEO 应用场景 3.GEO 数据特点举例 4.GeoHash 的编码方法(二分区间,区间编码) 5.GEO 经纬 ...

  7. Redis(学习笔记)

    Redis学习笔记 1.NoSQL数据库 1.1解决的问题 1.1.1解决CPU及内存压力 1.1.2解决IO压力 1.2NoSQL数据库概述 1.2.1什么是NoSQL数据库 1.2.2适用与不适用 ...

  8. Redis学习笔记(八)redis之lua脚本学习

    redis系列文章目录 使用spring-data-redis实现incr自增 Redis 利用Hash存储节约内存 Redis学习笔记(九)redis实现时时直播列表缓存,支持分页[热点数据存储] ...

  9. Redis学习笔记 - 数据类型与API(1)Key

    Redis学习笔记 - 数据类型与API(1)Key Key相关命令 1. 常用命令 命令 含义 时间复杂度 keys 查找所有符合给定模式 pattern 的 key O(N), N 为数据库中 k ...

  10. Redis学习笔记~Redis在windows环境下的安装

    Redis是一个key-value的存储系统,它最大的特点就是可以将数据序列化到文件中. redis存储在服务器的内存或者文件中,它不是session,不是cookies,它只是个更安全,更稳定,更可 ...

最新文章

  1. 曼哈顿距离和切比雪夫距离链接
  2. html5 文字定义线宽,html 5画布线宽
  3. 父类卡子类卡java_Java中关于子类覆盖父类的抛出异常问题
  4. nginx日志配置指令详解
  5. 一站式金融云托管服务 都匀融通村镇银行系统成功上线运行
  6. linux那些事之zero page
  7. app测试过程和重点关注内容
  8. mysql 8 多线程_mysql8 参考手册--通用线程状态
  9. python在财务中的应用-Python用于财务工作培训
  10. Q102:光线追踪场景(2)——PLYs(多种模型汇集)
  11. POJ 3518 Prime Gap(素数)
  12. java 多线程高级,java 多线程高级(传统多线程)
  13. 光圈,焦距,工作距离与景深之间的关系。
  14. 获取视频fps、总帧数
  15. Elasticsearch 8.X 集群无响应,怎么办?
  16. spring boot 项目增加flyway的使用遇到问题解决
  17. oracle中的roll up,oracle  group by 与roll up,cube,grouping sets,grouping_id联合使用
  18. 18岁生日所经过的总天数
  19. 1951439-37-4,Bromo PEG4 azide可以修饰分子表面
  20. 【树叶分类】基于BP神经网络植物叶片分类Matlab代码

热门文章

  1. angular2 路由ajax,如何通过Javascript函数在Angular 2中实现AJAX
  2. SAS 读取数据文件
  3. [洛谷P4918]信仰收集
  4. tcp/ip四层和osi七层
  5. Web开发入门疑问收集(不定期更新)
  6. NYU Hand Pose Dataset
  7. Ibatis XML 配置文件注释引起错误及解决方案
  8. 蓝桥杯java能用编译器1吗_学java的你,这些英文单词都掌握了吗?
  9. springcloud gateway 使用nacos 作为配置中心 和 注册中心
  10. CentOS离线安装gcc环境(附安装包+图文并茂)