首页 > 数据库 >redis进阶

redis进阶

时间:2023-02-05 18:23:48浏览次数:36  
标签:事务 进阶 删除 redis 内存 key 执行

事务

redis事务就是一个命令执行的队列,将一系列预定义命令包装成一个整体(一个队列),当执行时,一次性按照添加顺序依次执行,中间不会被打断或者干扰。

一个队列中,一次性,顺序性,排他性的执行一系列命令

基本操作

  • 开启事务:  multi   设定事务开启的位置,此指令执行后,后续所有指令均加入到事务中
  • 执行事务:exec  设定事务的结束位置,同时执行事务,与multi成对出现,成对使用
  • 取消事务:discard  停止当前事务的定义,发生在nulit之后,exec之前

加入事务的命令暂时进入到任务队列中,并没有立即执行,只有执行exec命令才开始执行

1.redis 不支持回滚“Redis 在事务失败时不进行回滚,而是继续执行余下的命令”, 所以 Redis 的内部可以保持简单且快速。
2.如果在一个事务中的**命令**出现错误,那么**所有的命令**都不会执行;
3.如果在一个事务中出现**运行错误**,那么**正确的命令**会被执行。
注:redis的discard只是结束本次事务,正确命令造成的影响仍然存在.

1.监控数据是否发生变化  ---- 补货

  • 对key添加监视锁,在执行exec前如果key发生了变化,终止事务执行
    • watch  key1  [key2]......
  • 取消对所有key的监视
    • unwatch

2.分布式锁 ---- 超卖

  • 使用setnx设置一个公共锁      setnx lock-key val
    • 无值返回true设置成功,有值返回false设置失败
    •  返回成功的,拥有控制权,进行下一步具体业务操作
    • 返回失败,不具有控制权,排队或者等待
  • delete  lock-key :删除key -- 不删会导致死锁
  • expire lock-key  second:为key设置一个超时时间,单位为second,超过这个时间锁会自动释放,避免死锁。
  • pexpire lock-key  milliseconds    毫秒
    • 由于操作通常是微秒或毫秒级,因此该锁定时间不宜设置过大,具体时间需要业务测试后确定
      • 锁时间设定推荐:最大耗时*120% + 平均网络延迟*110%
      • 如果业务最大耗时:网络平均延迟,通常为2个数量级,取其中单个耗时较长即可

删除策略

数据状态

redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过ttl指令获取其状态

  • XX:具有时效性的数据
  • -1:永久有效的数据
  • -2:已经过期的数据或 被删除的数据 或 未定义的数据

删除策略

在内存占用与cpu之间寻找一种平衡,顾此失彼都会造成整体reids性能下降,甚至引发服务器宕机或内存泄露

定时删除

创建一个定时器,当key设置有过期时间,到达过期时间,立即执行对键的删除操作

  • 优点:节约内存,到时就删除,快速释放掉不必要的内存占用
  • 缺点:CPU压力很大,无论CPU此时负载量多高,均占用CPU,会影响redis服务器响应时间和指令吞吐量
  • 总结:用处理器性能换取存储空间(拿时间换空间)

惰性删除

只有当访问一个key时,才会判断该key是否过期,,过期就删除。极端情况下可能会出现大量的过期key没有被再次访问,从而不会被清除,占用大量的内存。

  • 优点:节约CPU性能,发现必须删除的时候才韶除
  • 缺点:内存压力很大,出现长期占用内存的数据
  • 总结:用存储空间换取处理器性能〔拿时间换空间)

定期删除

 周期性轮询redis库中时效性数据,采用随机抽取的策略,利用过期数据占比的方式控制删除频度

  • redis启动服务器初始化时,读取配置文件 server.hz的值,默认为10
  • 每秒执行server.hz次 serverCron()-----> databasesCron()---->activeExpireCycle()
  • activeExpireCycle()对每一个expires[*]逐一进行检测,每次执行250ms/server.hz
  • 对某一个expires[*]检测时,随机挑选W个key检测
    • 如果key超时,删除key
    • 如果一轮中删除的key的数量>W*25%,循环该过程
    • 如果一轮中删除的key的数量<=W*25%,检查下一个expires[*],0-15循环
    • W取值=ACTIVE_EXPIRE_CYCLE_LOOKUPS_PER_LOOP属性值
  • 参数值current_db用于记录activeExpireCycle()进入哪个expires[*]执行
  • 如果activeExpireCycle()执行时间到期,下次current_db继续向下执行

特点1: CPU性能占用设置有峰值,检测频度可自定义设置

特点2:内存压力不是很大,长期占用内存的冷数据会被持续清理

总结:周期性抽查存储空间(随机抽查,重点抽查)

 

标签:事务,进阶,删除,redis,内存,key,执行
From: https://www.cnblogs.com/zhuyilong/p/17092881.html

相关文章

  • P7基础篇-06.初识Redis-Redis的图形化界面客户端
    图形化桌面客户端GitHub上的大神编写了Redis的图形化桌面客户端,地址:http://githu.com/uglide/RedisDesktopManager不过该仓库提供的是RedisDesktopManager的源码,并未提供......
  • 超详细--redis在Linux环境搭建主从复制
    引言Redis是一个高性能的缓存中间件,一个Redis服务器可以支撑很多的并发请求。但是在一些超高的并发场景下,虽然Redis读写速度很快,但也会产生读写压力过大,服务器负载过高的情......
  • P6 基础篇-05.初识Redis-Redis命令行客户端
    安装完成Redis,我们就可以操作Redis,实现数据的CRUD了。这需要用到Redis客户端,包括:命令行客户端图形化桌面客户端编程客户端Redis命令行客户端Redis安装完成后就自带......
  • 13-Scanner进阶
    packagecom.wang.scanner;importjava.sql.SQLOutput;importjava.util.Scanner;publicclassDemo03{publicstaticvoidmain(String[]args){Sca......
  • Redis的不同客户端对比
    Redis官方推荐的Java客户端有Jedis、lettuce和Redisson客户端简介优点缺点Jedis提供了比较全面的Redis操作Jedis简单全面,支持pipeline、事务等Re......
  • Redis中的缓存穿透、雪崩、击穿的原因以及解决方案(详解)
    一、概述①缓存穿透:大量请求根本不存在的key(下文详解)②缓存雪崩:redis中大量key集体过期(下文详解)③缓存击穿:redis中一个热点key过期(大量用户访问该热点key,但是热点key......
  • redis基础
    redis在3.0以前使用的是单线程的Io模型3.0-6.0使用混合IO模型(混合:使用子线程处理redis内部请求,主线程处理客户端请求)6.0开始使用多线程IO模型提问:为什么使用多线程?因......
  • python中使用redis
    Redis的应用场景高速缓存-将不常变化但又经常被访问的热点数据放到Redis数据库中,可以大大降低关系型数据库的压力,从而提升系统的响应性能。排行榜-很多网站都有排......
  • Redis 缓存穿透、缓存雪崩、缓存击穿
    Redis缓存穿透、缓存雪崩、缓存击穿 上一篇压力测试、性能优化、jvm调优下一篇缓存数据一致问题解决方案本文作者:Little_Monster-lhq本文链接:https://www.cn......
  • P3基础篇-02.初识Redis-认识NoSQL
    Sql和NoSql的区别SQL(StructuredQueryLanguage):关系型数据库NoSql(NoStructuredQueryLanguage):非关系性数据库常见NoSql数据库:键值型数据库(Redis)文档型数据......