一、redis的过期

A.应用场景

cookie自动过期,限时优惠价格,限制每分钟的访问次数

B.实现方式

setex(String key, int seconds, String value)

expire key time #秒

pexpire key time #毫秒

expireat key time #秒

pexpireat key time #毫秒

C.实现原理

定时清理

设置key过期时间的时候,就创建一个定时器,不断循环,时间一到就删除掉这个key。

优点:过期key马上被删除,内存使用率最高。

缺点:如果有一万个key设置了过期时间,就需要一万个定时器,不断循环,这会造成cpu性能的严重损耗。

懒汉式清理

在取key的时候,先判断key是否有过期,如果过期,就删除。

优点:过期key,只有在被使用时才被删除,对cpu的占用是最少的。

缺点:如果一个key过期之后,很长时间都没有被使用过,那这个key会一直占用内存空间,一直不释放。

定期清理+懒汉式清理

redis采用的是这种方式。经过前面两种策略可以很清楚的看到。定时清理和懒汉式清理,都不能达到一个最好的效果。

那现在有第三种,就是隔一段时间进行一次清理,清除掉过期的 key。比如一分钟或者是十分钟清理一次。

同时使用懒汉式清理,每次获取key的时候能判断一下,是否过期,是否需要清理。

二、redis的发布订阅

A.应用场景

订阅新闻频道(体育,军事等),关注大V,关注好友,系统消息广播。

B.实现方式

PUBLISH channel message #发布消息
SUBSCRIBE channel [channel ...] #订阅一个或多个频道
PSUBSCRIBE channel #订阅一组匹配的频道

C.实现原理

pubsub_channels存放频道信息,pubsub_patterns存放客户端信息。通过类似观察者模式,新的消息发送给每个订阅者。

三、redis的事务

redis事务和mysql对比

redis mysql
multi begin
exec commit
discard rollback
watch lock

A.应用场景

秒杀商品的数量,抢票

B.实现方式

watch multi exec discard

C.实现原理

watch的实现原理:

当一个key被修改后,就会对所有监控该key的客户端,设置dirty标识。

multi和exec的实现原理:

客户端的三种状态

REDIS_MULTI 客户端进入事务状态。

REDIS_DIRTY_EXEC 客户端事务无效状态。命令队列中有发生错误的命令。

REDIS_DIRTY_CAS 客户端事务处于非安全状态。watch的key已经被其他客户端抢先修改了。

事务执行原理:

1.事务执行成功。

第一步:客户端设置事务状态为REDIS_MULTI ;

第二步:将多条命令加入到命令队列;

第三步:执行exec,依次执行完命令队列中的所有操作命令;

2.第一种事务执行失败REDIS_DIRTY_EXEC。

第一步:客户端设置事务状态为REDIS_MULTI ;

第二步:将多条命令加入到命令队列,但是命令队列中,存在产生错误的命令;

第三步:错误的操作命令,导致客户端状态变成REDIS_DIRTY_EXEC ,事务执行失败;

3.第二种事务执行失败REDIS_DIRTY_CAS

第一步:客户端设置事务状态为REDIS_MULTI ;

第二步:将多条命令加入到命令队列;

第三步:正在watch的key被其他的客户端,抢先修改,导致客户端状态变成REDIS_DIRTY_CAS ,事务执行失败;

四、redis的pipline

A.应用场景

一个客户端能合并多条命令一起发送时,都推荐使用。例如,取出用户信息,并且取出该用户关注的用户列表。

但是,如果命令过多时(返回时间大于1秒),可以拆分到两个client分别去发送。

B.实现方式

pipline在命令中是没有的,可以通过java客户端(jedis)设置。

Pipeline pipe = jedis.pipelined();

pipe.set

C.实现原理

pipeline通过减少client与redis-server的连接通信的次数,来降低往返延时时间。

如果一次往返的时间是10ms,往返一千次,就是10秒。而通过pipline的方式,往返时间是20ms。

Pipeline 实现的原理是队列,即先进先出。数据的顺序性得到了保证。

redis的四大特性和原理相关推荐

  1. 怎么实现事务_你可能知道事务的四大特性,但是不一定知道“事务的实现原理”...

    说到数据库,那就一定会聊到事务,事务也是面试中常问的问题,我们先来一个面试场景: 面试官:"事务的四大特性是什么?"我:"ACID,即原子性(Atomicity).隔离性 ...

  2. acid四大特性_深入理解MySQL的ACID四大特性原理

    专注于Java领域优质技术,欢迎关注 作者:孤独烟 引言 照例,我们先来一个场景~ 面试官:"知道事务的四大特性么?" 你:"懂,ACID嘛,原子性(Atomicity) ...

  3. mysql数据库事务四大特性的实现原理

    事务的四大特性 原子性.一致性.隔离性.持久性 原子性实现 原子性保证事务要么全执行成功,要么全不执行. mysql使用回滚机制实现,undo log实现回滚. 事务执行 insert.update. ...

  4. 事务的四大特性及实现原理

    事务的四大特性及实现原理 1.原子性(Atomicity) 不可再分,事务的最小单位.在一个事务中,我们对数据库的操作,要么都成功,要么都失败,不可能出现部分成功或部分失败的情况.若操作失败必须回滚. ...

  5. 赠书:Redis 深度历险:核心原理与应用实践

    Redis 是互联网技术架构在存储系统中使用得最为广泛的中间件,它也是中高级后端工程师技术面试中面试官最喜欢问的工程技能之一,特别是那些优秀的.竞争激烈的大型互联网公司(比如 Twitter.新浪微博 ...

  6. Redis主从复制下的工作原理

    Redis主从复制下的工作原理 Redis主从复制的配置十分简单,它可以使从服务器是主服务器的完全拷贝.需要清楚Redis主从复制的几点重要内容: 1)Redis使用异步复制.但从Redis 2.8开 ...

  7. redis cluster 集群 HA 原理和实操(史上最全、面试必备)

    文章很长,建议收藏起来慢慢读!疯狂创客圈总目录 语雀版 | 总目录 码云版| 总目录 博客园版 为您奉上珍贵的学习资源 : 免费赠送 经典图书:<Java高并发核心编程(卷1)> 面试必备 ...

  8. 最详细的MySQL事务特性及原理讲解!(一)

    点击上方"后端开发技术",选择"设为星标" ,优质文章和资源,及时送达 我们将事务这块内容分为两篇来讲,这篇主要是事务的特性和原理. 接着看文章,如果对你有帮助 ...

  9. Redis缓存何以一枝独秀?以及热门面试题中Redis的核心特性

    Redis的各种数据类型 作为缓存组件,Redis的数据结构整体而言就是key-value类型的键值对,但是Redis对于value类型的支持还是比较丰富的,提供了5种不同的数据结构,可以满足大部分场 ...

最新文章

  1. 重构-改善既有代码的设计:重新组织函数的九种方法(四)
  2. Tableau系列之圆环图制作
  3. 详解Attention、Tacotron、WaveNet、LPCNet声码器等前沿方法
  4. flink报错:Error: Static methods in interface require -target:jvm-1.8 已解决
  5. 2025 : 简单环路(并查集)
  6. ubuntu 21.04 版本上 安装 sqlcmd
  7. JS ===和==区别
  8. CentOS6.5安装ElasticSearch6.2.3
  9. anki 插入表格_Anki之导出卡牌组到Excel文件
  10. vue 拖拽(笔记)
  11. windows2003修改远程桌面连接数
  12. 备忘录AIX主机下用SHELL脚本编写FTP传某个目录下的文件到LINUX主机
  13. jmeter web监听结果_监听器-聚合报告监听性能测试结果
  14. linux服务器离线安装python第三方库
  15. win7用友u8安装教程_win7系统安装用友u8的方法 win7用友u8安装教程
  16. APM —全链路追踪
  17. 剑指offeⅤ(Java 持续更新...)
  18. 微信内置浏览器调试和调试微信内的H5页面汇总(持续更新...)
  19. linux终端安装playonlinux,安装PlayOnLinux - 手把手教您如何在Linux上安装《暗黑3》_Linux新闻_Linux公社-Linux系统门户网站...
  20. 配置Visual Studio Code的SciLab开发环境

热门文章

  1. openstack私有云_OpenStack-下一代私有云的未来
  2. android 默认浏览器 视频播放 二维码,Android调用系统默认浏览器访问的方法
  3. python正则匹配_Python正则表达式只匹配一次
  4. Java中lastValue_在Logstash中为sql_last_value使用表的ID?
  5. ruby hash方法_Ruby中带有示例的Hash.keys方法
  6. 认真聊一下MySQL索引的底层实现!
  7. 50种Java编程技巧,越早知道越好!(建议收藏)
  8. 我的移动混合开发之旅
  9. 动态类型var和dynamic和传统确定类型区别和效率
  10. springboot发送qq邮件