Redis学习笔记(五) 总结

Stella981
• 阅读 455
  • 为什么使用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、双缓存

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
java将前端的json数组字符串转换为列表
记录下在前端通过ajax提交了一个json数组的字符串,在后端如何转换为列表。前端数据转化与请求varcontracts{id:'1',name:'yanggb合同1'},{id:'2',name:'yanggb合同2'},{id:'3',name:'yang
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
3个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Jacquelyn38 Jacquelyn38
3年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
Stella981 Stella981
3年前
KVM调整cpu和内存
一.修改kvm虚拟机的配置1、virsheditcentos7找到“memory”和“vcpu”标签,将<namecentos7</name<uuid2220a6d1a36a4fbb8523e078b3dfe795</uuid
Easter79 Easter79
3年前
Twitter的分布式自增ID算法snowflake (Java版)
概述分布式系统中,有一些需要使用全局唯一ID的场景,这种时候为了防止ID冲突可以使用36位的UUID,但是UUID有一些缺点,首先他相对比较长,另外UUID一般是无序的。有些时候我们希望能使用一种简单一些的ID,并且希望ID能够按照时间有序生成。而twitter的snowflake解决了这种需求,最初Twitter把存储系统从MySQL迁移
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
为什么mysql不推荐使用雪花ID作为主键
作者:毛辰飞背景在mysql中设计表的时候,mysql官方推荐不要使用uuid或者不连续不重复的雪花id(long形且唯一),而是推荐连续自增的主键id,官方的推荐是auto_increment,那么为什么不建议采用uuid,使用uuid究
Python进阶者 Python进阶者
9个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这