`
足至迹留
  • 浏览: 485363 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

<redis-9> 4.2 redis 实现缓存

阅读更多
1. 生存时间
1.1 命令介绍
在实际的开发中经常会遇到一些有时效的数据,比如限时优惠活动、缓存或验证码等,过了一定的时间就需要删除这些数据。在关系数据库中一般需要额外的一个字段记录到期时间,然后定期检测删除过期数据。而在Redis中可以使用EXPIRE命令设置一个键的生存时间,到时间后Redis会自动删除它。

EXPIRE命令的使用方法为:
EXPIRE key seconds

其中seconds参数表示键的生存时间,单位是秒。如要想让session:29e3d键在15分钟后被删除:
redis>SET session:29e3d uid1314
OK
redis>EXPIRE session:29e3d 900
(integer) 1

EXPIRE命令返回1表示设置成功,返回0则表示键不存在或设置失败。例如:
redis>DEL session:29e3d
(integer) 1
redis>EXPIRE session:29e3d 900
(integer) 0

如果想知道一个键还有多久的时间会被删除,可以使用TTL命令。返回值是键的剩余时间
(单位是秒):
redis>SET foo bar
OK
redis>EXPIRE foo 20
(integer) 1
redis>TTL foo
(integer) 15
redis>TTL foo
(integer) 7
redis> TTL foo
(integer) -2

可见随着时间的不同,foo键的生存时间逐渐减少,20秒后foo键会被删除。当键不存在时TTL命令会返回-2。另外没有为键设置生存时间(即永久存在,这是建立一个键后的默认情况)使用TTL会返回-1
redis>SET persistKey value
OK
redis>TTL persistKey
(integer) -1

注意:
在 Redis 2.8 以前,当 key 不存在,或者 key 没有设置剩余生存时间时,命令都返回 -1 。

如果想取消键的生存时间设置(即将键恢复成永久的),可以使用PERSIST命令。如果生存时间被成功清除则返回1;否则返回0(因为键不存在或键本来就是永久的):
redis>SET foo bar
OK
redis>EXPIRE foo 20
(integer) 1
redis>PERSIST foo
(integer) 1
redis>TTL foo
(integer) -1


(1)除了PERSIST命令之外,(2)使用SET或GETSET命令为键赋值也会同时清除键的生存时间,例如:
redis>EXPIRE foo 20
(integer) 1
redis>SET foo bar
OK
redis>TTL foo
(integer) -1


补充:
getset命令:
GETSET key value
将给定key的值设为value,并返回key的旧值。
当key存在但不是字符串类型时,返回一个错误。
时间复杂度:O(1)
返回值:返回给定key的旧值(old value)。
当key没有旧值时,返回nil。
redis> EXISTS mail
(integer) 0
redis> GETSET mail xxx@google.com  # 因为mail之前不存在,没有旧值,返回nil
(nil)
redis> GETSET mail xxx@yahoo.com  # mail被更新,旧值被返回
"xxx@google.com"


使用EXPIRE命令会重新设置键的生存时间,就像这样:
redis>SET foo bar
OK
redis>EXPIRE foo 20
(integer) 1
redis>TTL foo
(integer) 15
redis>EXPIRE foo 20
(integer) 1
redis>TTL foo
(integer) 17


其他只对键值进行操作的命令(如INCR、LPUSH、HSET、ZREM)均不会影响键的生存时间。
EXPIRE命令的seconds参数必须是整数,所以最小单位是1秒。如果想要更精确的控制键的生存时间应该使用PEXPIRE命令,PEXPIRE命令与EXPIRE的唯一区别是前者的时间单位是毫秒,即PEXPIRE key 1000与EXPIRE key 1等价。对应地可以用PTTL命令以毫秒为单位返回键的剩余时间。
注意: 如果使用WATCH命令监测了一个拥有生存时间的键,该键时间到期自动删除并不会被WATCH命令认为该键被改变。

另外还有两个相对不太常用的命令:EXPIREAT 和PEXPIREAT。
EXPIREAT命令与EXPIRE命令的差别在于前者使用Unix时间作为第二个参数表示键的生存时间的截止时间。PEXPIREAT命令与EXPIREAT命令的区别是前者的时间单位是毫秒。例如:
redis>SET foo bar
OK
redis>EXPIREAT foo 1351858600
(integer) 1
redis>TTL foo
(integer) 142
redis>PEXPIREAT foo 1351858700000
(integer) 1


1.2 实现缓存
为了提高网站的负载能力,常常需要将一些访问频率较高但是对CPU或IO资源消耗较大的操作的结果缓存起来,并希望让这些缓存过一段时间自动过期。比如教务网站要对全校所有学生的各个科目的成绩汇总排名,并在首页上显示前10名的学生姓名,由于计算过程较耗资源,所以可以将结果使用一个Redis的字符串键缓存起来。由于学生成绩总在不断地变化,需要每隔两个小时就重新计算一次排名,这可以通过给键设置生存时间的方式实现。每次用户访问首页时程序先查询缓存键是否存在,如果存在则直接使用缓存的值;否则重新计算排名并将计算结果赋值给该键并同时设置该键的生存时间为两个小时。伪代码如下:
rank=GET cache:rank
if not rank
rank=计算排名...
MUlTI
SET cache:rank, rank
EXPIRE cache:rank, 7200
EXEC

然而在一些场合中这种方法并不能满足需要。当服务器内存有限时,如果大量地使用缓存键且生存时间设置得过长就会导致Redis占满内存;另一方面如果为了防止Redis占用内存过大而将缓存键的生存时间设得太短,就可能导致缓存命中率过低并且大量内存白白地闲置。实际开发中会发现很难为缓存键设置合理的生存时间,为此可以限制Redis能够使用的最大内存,并让Redis按照一定的规则淘汰不需要的缓存键,这种方式在只将Redis用作缓存系统时非常实用。

具体的设置方法为:
修改配置文件的maxmemory参数,限制Redis最大可用内存大小(单位是字节),当超出了这个限制时Redis会依据maxmemory-policy参数指定的策略来删除不需要的键,直到Redis占用的内存小于指定内存。

maxmemory-policy支持的规则如表4-1所示。其中的LRU(Least Recently Used)算法即“最近最少使用”,其认为最近最少使用的键在未来一段时间内也不会被用到,即当需要空间时这些键是可以被删除的。


如当maxmemory-policy设置为allkeys-lru时,一旦Redis占用的内存超过了限制值,Redis会不断地删除数据库中最近最少使用的键① ,直到占用的内存小于限制值。
注释:
①事实上Redis并不会准确地将整个数据库中最久未被使用的键删除,而是每次从数据库中随机取3个键并删除这3个键中最久未被使用的键。删除生存时间最接近的键的实现方法也是这样。“3”这个数字可以通过Redis的配置文件中的maxmemory-samples参数设置。
  • 大小: 148.6 KB
0
0
分享到:
评论

相关推荐

    t淘淘商城项目 商城项目 视频和源码教程 详细

    &lt;groupId&gt;redis.clients&lt;/groupId&gt; &lt;artifactId&gt;jedis&lt;/artifactId&gt; &lt;version&gt;${jedis.version}&lt;/version&gt; &lt;/dependency&gt; &lt;!-- solr客户端 --&gt; &lt;dependency&gt; &lt;groupId&gt;org.apache.solr&lt;/groupId&gt; ...

    基于SSM框架的商品实时秒杀系统的设计与实现.rar(论文设计+项目源码) 采用SSM+redis缓存+rabbitMS消息队列

    2.4 redis缓存数据库 9 2.5 RabbitMQ消息队列 10 3 需求分析与设计 10 3.1 可行性分析 10 3.1.1技术可行性 10 3.1.2 经济可行性 11 3.1.3操作可行性 11 3.2 系统功能分析 11 3.3 系统功能结构图 11 3.4 系统流程图 ...

    Spring Boot中配置Redis的讲义最全讲义

    编写Redis缓存操作示例 4.1 添加缓存注解 4.2 获取缓存数据 4.3 更新缓存数据 4.4 删除缓存数据 使用Redis实现分布式锁 5.1 设置分布式锁 5.2 释放分布式锁 Redis常用操作 6.1 字符串操作 6.2 哈希操作 6.3 列表操作...

    1.redis课程介绍.mp4

    本系列课程从redis基础到高级,老师手把手教你搭建高可用集群,解决redis集群常见问题,思路清晰,旨在挑战高薪...9.面试及redis性能监控 9.1.缓存预热 9.2.缓存雪崩 9.3.缓存击穿 9.4.缓存穿透 9.5.性能指标监控

    laravel-angular:Laravel+angular+CouchDb 锅炉模板

    支持的功能: -Laravel 4.2:PHP 框架-AngularJS 1.3:AngularJS 前端框架-CouchDB:NoSQL 数据库-Redis:缓存数据库-Sendgrid : 邮寄服务-Beanstalk:队列服务 选择您想要的所有或任何服务开始编码的完美样板...

    sping4.2.5 springmvc4.2.5 mybatis3.4框架(SSM)的maven web项目,整合了log4j redis quartz

    本人搭建的ssm框架的maven web项目,用maven管理项目的jar包,项目架构搭好,用的都是现阶段最新的jar包,整合了log4j日志,redis缓存,quartz定时任务,全局配置文件在代码中使用等,controller层/service层/bo层/dao层都...

    基于SpringCloud的绿植养护软件的设计与实现.docx

    目录 第一章绪论 1.1研究背景 1.2研究现状 1.3论文创新点 1.4论文内容与结构 第二章系统需求分析 2.1系统业务需求 2.1.1用户模块 ...4.2. 2 Redis缓存数据库设计 4.3 EMQ服务器部署 4.4业务微服务实现 ......

    SpringBoot新手学习手册.pdf

    使用Redis做集中式缓存 9 八、 其他内容 9 8.1、使用@Scheduled创建定时任务 9 8.2、使用@Async实现异步调用 9 8.3、自定义参数 9 8.4、多环境配置 9 8.5、修改端口号 9 8.6、SpringBoot yml 使用 9 8.7、...

    开涛高可用高并发-亿级流量核心技术

    4.3.1 Redis+Lua实现 76 4.3.2 Nginx+Lua实现 77 4.4 接入层限流 78 4.4.1 ngx_http_limit_conn_module 78 4.4.2 ngx_http_limit_req_module 80 4.4.3 lua-resty-limit-traffic 88 4.5 节流 90 4.5.1 throttleFirst/...

    黑马品优购项目

    怎么提高redis缓存利用率 缓存如何同步 1.3. 图片上传 图片怎么存储 图片怎么上传 1.4. 搜索 ​ 怎么实现 数据量大、 并发量高的搜索 怎么分词 1.5. 消息通知 ​ 哪些情况用到activeMq 1.6. 优化 seo怎么优化 ...

    基于 SpringBoot ++Dubbo 开发分布式REST服务+源代码+文档说明

    | Redis | 分布式缓存数据库 | | Log4J | 日志组件 | | Fastjson |JSON处理器| | Maven | 项目构建管理 | | dubbo|分布式服务框架| # 系统功能 | **序号** | **功能** | **是否完成**| | ------------- |:-------...

    用微服务spring cloud架构打造物联网云平台

    4.2redis 可视化工具安装与使用 4.3mqtt可视化工具安装与使用 4.4kafka可视化工具安装与使用 4.5代码管理工具安装git与使用 五、后台开发基础知识介绍 5.1数据库使用 5.2Redis连接 5.3Mqtt接入 5.4Influxdb接入 5.

    springboot知识点整理

    4.2 静态资源映射规则 56 4.3 引入Thymeleaf 60 4.4 Thymeleaf语法 61 4.5 SpringMVC自动配置原理 67 4.6 SpringBoot扩展与全面接管 70 4.7 如何修改SpringBoot的默认配置 72 4.8 【实验】CRUD操作 73 4.8.1 默认...

    SpringBoot新手学习手册

    7.2使用Redis集成缓存 37 八、 热部署 37 8.1 什么是热部署 37 8.2 项目演示案例 37 8.3 热部署原理 37 8.4 Devtools依赖 38 8.5 Devtools原理 38 九、 监控管理 38 Actuator监控应用 38 Maven依赖 38 YML...

    R的极客理想:工具篇 带书签扫描版(1/2)

    3.1 R语言本地缓存工具memoise 104 3.2 R语言性能监控工具Rprof 108 3.3 R语言性能可视化工具lineprof 116 第二部分 R服务器 122 第4章 R语言的跨平台通信 122 4.1 Rserve与Java的跨平台通信 122 4.2 Rsession...

    R的极客理想:工具篇 带书签扫描版(2/2)

    3.1 R语言本地缓存工具memoise 104 3.2 R语言性能监控工具Rprof 108 3.3 R语言性能可视化工具lineprof 116 第二部分 R服务器 122 第4章 R语言的跨平台通信 122 4.1 Rserve与Java的跨平台通信 122 4.2 Rsession...

    Guns 技术文档 旗舰版v2.3.pdf

    4.1.1 修改项目名 4.1.2 修改包名 4.2 放过接口权限验证 4.3 静态资源和模板位置的变更 4.4 三个或更多数据源如何配置 4.5 添加登录验证码 4.6 spring profile 4.7 多机器部署开启spring session 4.8 使用Redis ...

    大型分布式网站架构与实践

     4.2 集群监控 239  4.2.1 监控指标 239  4.2.2 心跳检测 247  4.2.3 容量评估及应用水位 252  4.3 流量控制 255  4.3.1 流量控制实施 255  4.3.2 服务稳定性 260  4.3.3 高并发系统设计 265  4.4 性能优化...

    java版ss源码-UniAuth:统一认证

    security4+cas+cxf作为基础框架,数据库为mysql5.7,配置管理使用zookeeper3.4,redis用于存储ticket,缓存使用,前端使用angularJS 1.x; 二. 快速开始 2.1.编译打包 在源码目录执行命令 (gradle版本2.12) gradle ...

Global site tag (gtag.js) - Google Analytics