事务
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