`
足至迹留
  • 浏览: 494750 次
  • 性别: 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; ...

    JSP实现一个网站流量统计器

    为了持久化统计信息,可以将数据存储在数据库、文件或者使用内存缓存(如Redis)。每次计数器更新后,将数值写入存储系统。同时,需要创建一个JSP页面,展示统计信息,例如总访问量和独立访客数。 ### 6. 注意事项 ...

    redis安装使用.docx

    ##### 4.2 启动与测试 Redis - 启动 Redis 服务: - `$ redis-server` - 检查 Redis 是否已启动: - `$ redis-cli` - 输入 `ping` 命令,如果返回 `PONG`,则表示 Redis 已成功安装。 #### 五、总结 通过上述...

    Redis Cluster部署文档.docx

    ### Redis Cluster 部署与配置详解 #### 一、Redis Cluster 概述 Redis Cluster 是 Redis 3.0 版本引入的一项重要特性,它允许用户将 Redis 实例分组...这为实现大规模分布式系统中的缓存解决方案提供了强有力的支持。

    安装redis(主备)

    slaveof &lt;masterip&gt; &lt;masterport&gt; ``` - **启动从节点**:使用修改后的配置文件启动从节点: ```bash # redis-server /path/to/redis-slave.conf ``` 通过以上步骤,就可以成功搭建起一个基本的Redis主从...

    redis操作文档

    - **使用注解**:通过`@Cacheable`、`@CachePut`、`@CacheEvict`等注解简化Redis缓存逻辑。 #### 七、图形化显示工具 - **Redis Desktop Manager**:一款常用的Redis图形化管理工具,方便用户管理和调试Redis...

    spring-redis jar

    &lt;bean id="jedisConnectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory"&gt; &lt;property name="hostName" value="localhost"/&gt; &lt;property name="port" value="6379"/&gt; ...

    Redis入门到集群部署笔记(最全版).docx

    #### 二、Redis缓存机制与应用场景 ##### 2.1 缓存机制 缓存机制的主要目的是降低客户端对真实数据源的访问频率,通过在前端或中间层存储一份数据的副本(通常是热数据),来减少后端数据库的压力。当数据源发生...

    redis 单机,哨兵,集群安装

    Redis 是一种高性能的键值存储系统,在大数据场景中,它通常被用作数据库、缓存和消息中间件。本章节详细介绍如何在 CentOS 7 环境下安装和配置 Redis 单机环境。 **步骤一:安装依赖** - 使用 yum 安装 gcc 和 tcl...

    Redis学习-实战.docx

    Jedis 是一个 Java 实现的 Redis 客户端,提供了非常简洁的 API 来操作 Redis。 - **连接池**:使用 JedisPool 进行连接管理,可以有效提高性能。 - **基本操作**:通过 `Jedis` 对象调用方法,如 `set`、`get` 等。...

    redis3.0集群安装

    Redis(Remote Dictionary Server)是一款开源的键值存储系统,以其高性能、低延迟的特点在缓存领域有着广泛的应用。随着数据量的增长,单一Redis实例往往难以满足大规模应用场景的需求。为此,Redis 3.0引入了集群...

    技术文档笔记Redis

    在Spring Boot项目中,只需要添加Spring Boot Starter Data Redis依赖即可自动配置Redis缓存。 ```xml &lt;!-- pom.xml --&gt; &lt;dependency&gt; &lt;groupId&gt;org.springframework.boot&lt;/groupId&gt; &lt;artifactId&gt;spring-boot-...

    Redis缓存中间件技术实践指南

    根据给定的信息,本文将详细解析“Redis缓存中间件技术实践指南”中涉及的关键知识点,包括Redis的特点、应用场景、支持的数据结构以及如何在不同平台上部署Redis。 ### 一、Redis概述 #### 1.1 Redis简介 Redis,...

    Redis 介绍

    kill &lt;PID&gt; ``` ##### 4.5 设置密码 - 打开配置文件 `redis.conf`,找到 `requirepass` 行,取消注释并设置密码。 ```shell requirepass yourpassword ``` ##### 4.6 远程连接 - 一旦 Redis 服务配置允许远程...

    redis学习笔记

    **8.2 示例**:在从节点的配置文件中设置`slaveof &lt;master-ip&gt; &lt;master-port&gt;`。 #### 九、Redis虚拟内存 Redis虚拟内存允许将部分数据存储在磁盘上而不是内存中,从而节省内存空间。 **9.1 工作原理**:将冷数据...

    redis技术文档

    使用`redis-trib.rb create --replicas &lt;replicas&gt; &lt;node_ip&gt;:&lt;node_port&gt; ...`命令创建集群。 ##### 10.3 Redis-Cluster主从节点不要在同一个机器部署 为了避免单点故障,主从节点应该部署在不同的物理机上。 ##...

    linux下最新版本php-redis4.0.2扩展包

    Redis是一个开源的、基于键值对的数据结构存储系统,它支持字符串、哈希、列表、集合和有序集合等多种数据类型,广泛应用于缓存、消息队列和分布式锁等领域。PHP-Redis扩展则为开发者提供了在PHP中操作Redis的强大...

    python3开发django项目安装和使用redis教程

    slaveof &lt;masterip&gt; &lt;masterport&gt; ``` ##### 5.2 Redis 集群 Redis 集群由多个节点组成,这些节点相互协作来处理客户端请求。集群中的每个节点负责一部分哈希槽(hash slots),每个槽对应一个键值对。 - **...

    redis tools.rar

    Redis是世界上最受欢迎的开源内存数据结构存储系统,它可以用作数据库、缓存和消息代理。在本"redis tools.rar"压缩包中,包含了用于安装和管理Redis的各种必要资源,特别是针对Redis 4.2版本。这是一份全面的Redis...

    10-Redis高级功能.docx

    slaveof &lt;master_ip&gt; &lt;master_port&gt; ``` 例如,假设主节点的IP地址为`127.0.0.1`,端口为`6379`,那么可以在从节点的配置文件中添加如下命令: ```plaintext slaveof 127.0.0.1 6379 ``` 启动从节点服务时,使用...

Global site tag (gtag.js) - Google Analytics