Redis相关Key键 操作的常用命令

园码生活

共 4270字,需浏览 9分钟

 ·

2022-01-17 00:38

DEL key [key ...] Redis  Del命令基本语法如下:

  DEl  key_name

返回值 整数:被删除key的数量。

redis> SET key1 "Hello"
"OK"
redis> SET key2 "World"
"OK"
redis> SET key3 "redis.com.cn"
"OK"
redis> DEL key1 key2 key3 key4
(integer) 3
redis> 

DUMP key

Redis DUMP 用于序列化给定 key ,并返回被序列化的值,使用 restore 命令可以将DUMP 的结果反序列化回 Redis 。

序列化格式有以下几个特点:

它带有 64 位的校验和,用于检测错误, restore 在进行反序列化之前会先检查校验和。. 值的编码格式和 RDB 文件保持一致。RDB 版本会被编码在序列化值当中,如果因为 Redis 的版本造成 RDB 格式不兼容,那么 Redis 会拒绝对这个值进行反序列化操作。序列化的值不包括任何过期(expire)信息。

如果想获得 key 的剩余过期时间,需要使用 PTTL 命令。

如果 key 不存在,那么返回 nil 。

语法 redis DUMP 命令基本语法如下:

redis 127.0.0.1:6379> DUMP KEY_NAME

返回值 多行字符串: 如果 key 不存在,那么返回 nil 。否则,返回序列化之后的值。例子

redis> SET mykey 10
"OK"
redis> DUMP mykey
"\u0000\xC0\n\t\u0000\xBEm\u0006\x89Z(\u0000\n"
redis>

EXISTS key [key ...]

Redis EXISTS 命令用于检查给定 key 是否存在。

从 Redis 3.0.3 起可以一次检查多个 key 是否存在。这种情况下,返回待检查 key 中存在的 key 的个数。检查单个 key 返回 1 或 0 。

注意:如果相同的 key 在参数列表中出现了多次,它会被计算多次。所以,如果somekey存在, EXISTS somekey somekey 命令返回 2。

@syntax

redis EXISTS 命令基本语法如下:

redis 127.0.0.1:6379> EXISTS KEY_NAME 返回值 整数 :

1 key存在 0 key不存在 例子

redis> SET key1 "Hello"
"OK"
redis> EXISTS key1
(integer) 1
redis> EXISTS nosuchkey
(integer) 0
redis> SET key2 "World"
"OK"
redis> EXISTS key1 key2 nosuchkey
(integer) 2
redis> 

输入命令,尝试一下

EXPIRE key seconds Redis  expire命令设置key的过期时间  设置过期时间后,key会被自动删除。带来短时时间的key通常被称为易失的 超时时间只能使用删除key或者覆盖key的命令清除,包括DEL,SET,GETSET和所有的*STORE命令。对于修改 key 中存储的值,而不是用新值替换旧值的命令,不会修改超时时间。例如,自增 key 中存储的值的 INCR , 向list中新增一个值 LPUSH, 或者修改 hash 域的值 HSET ,这些都不会修改 key 的过期时间。

通过使用 PERSIST 命令把 key 改回持久的(persistent) key,这样 key 的过期时间也可以被清除。

key使用 RENAME 改名后,过期时间被转移到新 key 上。

已存在的旧 key 使用 RENAME 改名,那么新 key 会继承所有旧 key 的属性。例如,一个名为 KeyA 的 key 使用命令 RENAME Key_B Key_A 改名,新的 KeyA 会继承包括超时时间在内的所有 Key_B 的属性。

特别注意,使用负值调用 EXPIRE/PEXPIRE 或使用过去的时间调用 EXPIREAT/PEXPIREAT ,那么 key 会被删除 deleted 而不是过期。(因为, 触发的key event 将是 del, 而不是 expired).

语法

redis Expire 命令基本语法如下:

redis 127.0.0.1:6379> EXPIRE key seconds

Expire 在 Redis 2.1.3 之前版本的不同 在 2.1.3 之前的版本使用 Expire 修改已经设置过生存时间的 key,将会和删掉 key 有同样的效果。这是被已被修复的复制层的限制所需要的特性。这种情况下 EXPIRE 将会返回 0。

返回值 整数:

1 设置超时成功。0 key 不存在。例子


redis> SET mykey "Hello"
"OK"
redis> EXPIRE mykey 10
(integer) 1
redis> TTL mykey
(integer) 10
redis> SET mykey "Hello World"
"OK"
redis> TTL mykey
(integer) -1
redis>

模式: 导航 session 假设你有个 web 服务并且你关注用户最近最新访问的 N 个页面,每个相邻新页面的访问时间在 60 秒内,概念上我们可把这一系列的页面访问作为一个用户的导航会话。这里面包含了很多关于用户正在寻找什么样产品的有用信息,你可以据此给用户推荐产品。

在 Redis 中使用下面的策略,我们可以给这种模式建模:用户每访问一个页面,我们都执行下面的指令:

MULTI
RPUSH pagewviews.user: http://.....
EXPIRE pagewviews.user: 60
EXEC

如果用户访问的页面空闲时间超过 60 秒,那么这个 key 将会被删除,只有那些接下来小于 60 秒空闲的页面访问将会被保留。

这个模式可以修改为使用计数指令 INCR 替换列表的 RPUSH。

附录: Redis expires 带有过期时间的 Key 一般来说 Redis 中创建 key 的是不带生存时间,如果你不使用类似 DEL 命令明确删除它,这个key将会一直存在。

EXPIRE 命令族可以给指定的 key 关联过期时间 ,key 会额外多占用一些内存。一旦一个key设置了过期时间,那么指定的时间消耗完后,Redis 需要确保 key 被删除。

key 的过期时间可以被 EXPIRE 命令更新或 PERSIST 命令删掉 。

过期时间的精度 Redis 2.4 过期时间并不精准,一般在 0到 1 秒多。

从Redis 2.6起,过期时间精度提高到 0 到 1 毫秒多 。

过期和持久 key 的过期时间以绝对 Unix 时间戳的方式存储。这意味无论 Redis 是否运行,过期时间都会流逝。

服务器的时间必须稳定准确,这样过期时间才能更准确。如果在两个时间相差较多的机器之间移动 RDB 文件,那么可能会出现所有的 key 在加载的时候都过期了。

运行的 Redis 也会不停的检查服务器的时间,如果你设置一个带有 1000 秒过期时间的key,然后你把服务器的时间向前调了 2000 秒,那么这个 key 会立刻过期,不是等 1000 秒后过期。

Redis 如何淘汰过期 Key Redis 的 key 有两种过期淘汰的方式:被动方式、主动方式。

被动过期:用户访问某个 key 的时候,key 被发现过期。

当然,被动方式过期对于那些永远也不会再次被访问的 key 并没有效果。不管怎么,这些 key 都应被过期淘汰,所以 Redis 周期性主动随机检查一部分被设置生存时间的 key,那些已经过期的 key 会被从 key 空间中删除。

Redis每秒执行10次下面的操作:

从带有生存时间的 key 的集合中随机选 20 进行检查。删除所有过期的key。如20里面有超过25%的key过期,立刻继续执行步骤1。这是一个狭义概率算法,我们假设我们选出来的样本 key 代表整个 key 空间,我们继续过期检查直到过期 key 的比例降到 25% 以下。

这意味着在任意时刻已经过期但还占用内存的 key 的数量,最多等于每秒最多写操作的四分之一。

复制连接和 AOF 文件是如何处理过期 为了获得正确结果而不牺牲一致性。当一个 key 过期时,DEL 操作会同时在AOF文件和当前配置的所有的从服务器实例上执行。过期处理中心化在主实例上处理,没有出现一致性错误的机会。

但是,尽管连接到主服务器的从服务器不会独立地使 key 过期(但会等待来自主服务器的 del),但它们仍持有完整的存在数据集中的过期状态,因此当从服务器被选为主服务器时,它将能够独立地使 key 过期,完全充当主服务器。

EXPIREAT key timestamp

EXPIREAT 与 EXPIRE 有相同的作用和语义, 不同的是 EXPIREAT 使用绝对 Unix 时间戳 (自1970年1月1日以来的秒数)代替表示过期时间的秒数。使用过去的时间戳将会立即删除该 key。

详细语义功能说明可以参考 EXPIRE。

语法 redis EXPIREAT 命令基本语法如下:

redis 127.0.0.1:6379> Expireat KEY_NAME TIME_IN_UNIX_TIMESTAMP

背景 EXPIREAT 引入的目的是为了把 AOF 持久化模式的相对时间转换为绝对时间。当然,也可以直接指明某个 key 在未来某个时间过期。

返回值 整数,:

1 设置超时成功。0 key 不存在。例子

redis> SET mykey "Hello"
"OK"
redis> EXISTS mykey
(integer) 1
redis> EXPIREAT mykey 1293840000
(integer) 1
redis> EXISTS mykey
(integer) 0
redis> 

输入命令,尝试一下


浏览 66
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报