首页 > 数据库 >Redis使用细节(持续更新中)

Redis使用细节(持续更新中)

时间:2023-08-25 19:33:29浏览次数:31  
标签:缓存 过期 Redis value 查询 细节 更新 key

Redis使用细节

分布式锁

因为Redis是单线程的,所以可以用setnx来模拟锁的获取释放从而实现分布式锁

在用setnx实现分布式锁时,会出现一些问题

  • 业务超时解锁,导致并发问题。业务执行时间超过了锁超时的时间
  • redis主从切换临界点问题,主从切换后,A持有的锁还没有同步到新的主节点,B在新的主节点获取到了锁
  • redis集群脑裂,导致出现多个主节点

大key和热key

大key定义

  • String类型:value的字节数大于10KB即为大Key

  • Hash/Set等复杂结构类型:元素个数大于5000个或总value字节数大于10M即为大key

大key危害

  • 读取成本高
  • 容易导致慢查询
  • 主从复制异常,服务阻塞,无法正常响应请求

消除大key的方法

1.拆分

将大key拆分为小key,例如一个String拆分成多个String

2.压缩

将value压缩后写入Redis,读取时解压后再用,注意选择一个合适的算法

3.集合类结构hash消除的方法

  • 拆分,用hash取余,位掩码的方式决定放在哪个key中
  • 区分冷热:比如榜单列表场景使用zset,只缓存前10页数据,后续的数据走db

热key定义

用户访问一个key的QPS特别高,导致server出现CPU负载突增或者不均的情况,热key没有明确的标准,一般QPS超过500就有可能被识别为热Key

解决热Key的方法

1.设置Localcache

在访问Redis前,在业务侧设置Localcache,降低访问Redis的QPS,如果Localcache过期或者未命中,则从Redis中将数据更新到LocalCache

2.拆分

将一个热key复制写入多份,访问的时候访问多个key,但是value是同一个,但是代价是更新时需要更新多个key

慢查询场景

容易导致慢查询的操作

  • 批量操作一次性传入过多的key/value,如mset/hmset等操作,建议单批次不要超过100

  • zset大部分命令都是O(logn),当大小超过5k以上时,简单的zadd/zerm也可能导致慢查询

  • 操作大key

缓存穿透和缓存雪崩

缓存穿透:热点数据查询绕过缓存,直接查询数据库

缓存雪崩:大量缓存同时过期

缓存穿透的危害:

  • 查询一个一定不存在的数据,这样的所有请求都会打到db上
  • 缓存过期时,一个热key过期,也会有大量的请求同时击穿至db

减少缓存穿透的方法

  • 缓存空值,在查询到在缓存和数据库中都不存在,则可以缓存一个空值
  • 布隆过滤器,使用一个算法来存储合法key

避免缓存雪崩的方法

  • 将缓存失效的时间分散开,比如在原有的失效时间基础上增加一个随机值
  • 使用缓存集群,避免单机宕机造成的缓存雪崩

标签:缓存,过期,Redis,value,查询,细节,更新,key
From: https://www.cnblogs.com/anewpro-techshare/p/17657788.html

相关文章

  • 解放生产力orm并发更新下应该这么处理求求你别再用UpdateById了
    合集-easy-query(7) 1.献给转java的c#和java程序员的数据库orm框架05-222.javaer你还在手写分表分库?来看看这个框架怎么做的干货满满05-263.你没见过的分库分表原理解析和解决方案(一)06-074.你没见过的分库分表原理解析和解决方案(二)06-305.我真的不想再用mybatis和其......
  • CentOS 7 上更新系统时间和时区
    要在CentOS7上更新系统时间和时区(CST,即中国标准时间),可以按照以下步骤进行操作:更新系统时间:首先,你可以使用以下命令来手动更新系统时间为当前时间:sudodate+%T-s"hh:mm:ss"替换"hh:mm:ss"为当前的小时、分钟和秒。你也可以更新日期和时间一起,例如:sudodate+%Y%m%......
  • php基于Redis实现播放量增加功能
    开发思路就是用redis得有序组合功能1.先自增到reids中$redisGetKey='ciku_promoter_click_number';$jyId=2;//文章id$redis=RedisService::build()->getInstance();$videoPlayNumber=$redis->zScore($redisGetKey,$jyId);//如果该文章id存在,则新增,否则自增1if......
  • 挂分记(持续更新ing...)
    (持续更新ing...)来,今天教教如何考场挂大分学校模拟赛7.31模拟赛\(T1\)没读懂题,挂\(40\)分;\(T2\)读错题,不知道挂了多少分8.17模拟赛没打freopen挂\(8\)分8.24模拟赛树上\(DFS\)求子树大小,没算这个节点本身8.25模拟赛逆序开题,结果\(T1\)会,但是没打......
  • Nacos配置管理-配置热更新
                 ......
  • mysql联合更新
    updaterailwayrjoinrailway_sectionrsonr.id=rs.railway_idjoinwork_stationwsonr.id=ws.railway_idjoinpatrollerponr.id=p.railway_idsetrs.railway_name=#{name},ws.railway_name=#{na......
  • Redis-持久化的学习
    持久化-rdbredis.conf中已经自动配置好了持久化设置,但我们可以改为自己需要的设置。当条件触发时会在同级文件夹内生成dump.rdb文件(快照)。 触发条件:1:满足config中设置的触发条件2:使用flushall命令3:退出redis,也会自动生成dump.rdb  如何打开rdb文件?在redis中输入conf......
  • Redis学习笔记
    1.Redis安装配置及开启自启1.1安装Redis依赖Redis是基于C语言编写的,因此首先需要安装Redis所需要的gcc依赖:yuminstall-ygcctcl1.2安装Redis获取Rediscd/opt/wgethttp://download.redis.io/releases/redis-6.2.6.tar.gz解压Reids#解压到/usr/local/src/......
  • Redis开启过期监听
    1.开启过期通知配置默认notify-keyspace-events""修改为:notify-keyspace-eventsEx2.增加监听类publicclassRedisKeyExpirationListenerextendsKeyExpirationEventMessageListener{publicRedisKeyExpirationListener(RedisMessageListenerContainerlisten......
  • Redis如何批量删除指定前缀的key
    批量删除指定前缀的Key有两中方法,一种是借助redis-cli,另一种是通过SCAN命令来遍历所有匹配前缀的key,并使用DEL命令逐个删除它们。redis-cli使用Redis自带的redis-cli命令行工具,你可以通过以下方式批量删除指定前缀的key:redis-cliKEYS"your_prefix*"|xargsredis......