小白都能看懂的redis讲解--针对单个键操作集锦

author author     2022-12-04     105

关键词:

1 重命名键 rename key newname可以对键重命名, 下面的例子我们创建了一个key为name,value为luke的键值对。 然后将name重命名为user,之后查询name就返回nil,而user是可以查到值的。

127.0.0.1:6379> set name luke
OK
127.0.0.1:6379> get name
"luke"
127.0.0.1:6379> rename name user
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get user
"luke"

值得注意的是,若是修改之后的新名字已经存在了,那么将被覆盖。

127.0.0.1:6379> set name luke
OK
127.0.0.1:6379> set user cedric
OK
127.0.0.1:6379> rename name user
OK
127.0.0.1:6379> get name
(nil)
127.0.0.1:6379> get user
"luke"

这时候,为了避免被误操作,redis提供了renamenx命令,这个命令要求当新的key不存在的时候,才能更名成功。 我们继续用上边的例子,可以看到当user存在的时候,更名是失败的。

127.0.0.1:6379> set name luke
OK
127.0.0.1:6379> set user luke
OK
127.0.0.1:6379> renamenx name user
(integer) 0
127.0.0.1:6379> get name
"luke"
127.0.0.1:6379> get user
"luke"

rename的原理是:

找到newkey所指的值对象
删除这个对象
找到oldkey所指的值对象
将oldkey的值对象的引用计数加1
在redis数据库中添加新的键值对信息,让newkey指向之前oldkey的值对象
删除旧的键值对信息,让oldkey不再指向之前的值对象

2 随机返回一个键

randomkey可以随机返回一个键,当数据库不为空的时候会返回一个key,当数据库为空的时候,返回nil。
127.0.0.1:6379> mset name1 luke name2 cedric name3 josh name4 coat
OK
127.0.0.1:6379> randomkey
"name4"

这个命令并不会删除返回的键

3 键过期 针对键的有效时间,redis有一系列的命令,我们一一说明: expire key seconds 键在seconds秒之后过期 expireat key timestamp 键在时间戳timestamp后过期 ttl key 可以查看对应key的过期剩余时间 pttl key 可以也可以查看过期时间,不过是毫秒级的

127.0.0.1:6379> set name luke
OK
127.0.0.1:6379> expire name 20
(integer) 1
127.0.0.1:6379> ttl name
(integer) 17
127.0.0.1:6379> pttl name
(integer) 10246
127.0.0.1:6379> ttl name
(integer) -2
127.0.0.1:6379> pttl name
(integer) -2

上面的例子我们给name设定了20秒的过期时间,当没有过期的时候,ttl和pttl都可以查出值,当过期之后,则返回-2

针对没有设置过期时间的key, ttl key的返回是-1

在2.6版本之后新增了毫秒级的过期方案 pexpire key milliseconds 键在milliseconds毫秒后过期 pexpireat key milliseconds-timestamp建在毫秒级的时间戳milliseconds-timestamp之后过期 其实在底层,不论是秒级还是毫秒级,redis都会转换为pexpireat去操作。 注意:

如果expire key的key不存在,将会返回0 如果设置的时间为负值,则会立即删除这个key persist命令可以删除键的过期时间 字符串类型的键,在执行set命令的时候会清除过期时间 对于哈希和列表等value是多个元素的数据结构,redis不支持对value内单个元素设置过期时间的操作 setex命令相当于set + expire,不单是原子执行,还会减少一次网络通讯的时间

4 迁移键 迁移键多用在redis服务间的数据转储,比如我们将生产环境的迁移到测试环境 redis中提供了三种数据迁移的方法move,dump+restore,migrate。我们一一说明 4.1 move move key db命令可以在redis内部进行数据迁移,因为在redis中可以有多个数据库,且数据是不互通的。这个命令就是在这多个数据库之间进行数据迁移。这个多个数据库一般不建议在生产环境使用,所以就简单说一下。 4.2 dump + restore dump key restore key ttl value dump + restore可以实现在不同redis实例间的数据迁移。 在源redis服务执行dump命令,会将键值序列化,格式为RDB格式。 再在目标redis上执行restore命令,会将序列化之后的值进行复原。

这就相当于我们转储mysql数据库数据为sql文件,然后在另一个数据库导入。 这个导出和导入认为控制时间,所以并不是原子性的。

4.3 migrate migrate host port key| destination-db timeout [COPY] [REPLACE] [KEYS key] migrate也是用来在redis不同实例间进行数据迁移的。 这个命令的实现和dump+restore命令相似,不过是原子性的。 我们只需要在源redis上执行migrate命令,redis将会自行完成dump + restore + del命令。至于del命令是否执行,则取决于命令的参数。 下面我们对参数进行说明:

host 目标redis的地址 port 目标redis的端口 key|"" 其实|后边有个空字符串,在3.0之前只支持单个键的迁移,这个地方填的就是需要转移的键,但是在3.0.6之后支持迁移多个键了,这里就填空字符串""即可 destination-db 目标redis的数据库索引 timeout 迁移的超时时间 [copy] 若是添加了copy参数,则迁移之后并不会删除源数据 [replace] 不管目标数据库是否存在相同的key,都会迁移并覆盖 [KEYS key] 需要迁移的键,支持多个

我们举几个例子说明一下,为了测试,我新起了一个redis实例,端口是6380 当源redis有键name,目标redis没有的时候,是可以直接成功的

127.0.0.1:6379> set name luke
OK
127.0.0.1:6380> get name
(nil)

执行如下操作

127.0.0.1:6379> MIGRATE 127.0.0.1 6380 name 0 1000
OK
127.0.0.1:6380> get name
"luke"

当两个redis有相同的key,并且迁移这个key的时候,会报错

127.0.0.1:6379> set name luke
OK
127.0.0.1:6380> set name cedric
OK

我们执行如下命令,会报错说数据已经存在

127.0.0.1:6379> MIGRATE 127.0.0.1 6380 name 0 1000
(error) ERR Target instance replied with error: BUSYKEY Target key name already exists.

当添加参数replice时才可以成功

127.0.0.1:6379> MIGRATE 127.0.0.1 6380 name 0 1000 replace
OK

此时在6380库里查看name,其value已经变为了luke

127.0.0.1:6380> get name
"luke"

当源redis没有要迁移的键的时候,会返回nokey

127.0.0.1:6379> MIGRATE 127.0.0.1 6380 name1 0 1000
NOKEY

迁移多个key

127.0.0.1:6379> mset key1 a key2 b key3 c key4 d
OK
127.0.0.1:6379> MIGRATE 127.0.0.1 6380 "" 0 1000 keys key1 key2 key3 key4
OK

然后在6380里查看,可以看到已经迁移成功

127.0.0.1:6380> keys *
1) "name"
2) "key2"
3) "key1"
4) "key3"
5) "key4"

小白都能看懂的linux系统下安装配置zabbix

实验环境:操作系统:Centos7.6服务器ip:192.168.10.100运行用户:root网络环境:InternetZabbix是一个基于web界面的提供分布式系统监控及网络功能的企业级的开源监控工具,做为一个企业运维人员来说,zabbix可以给企业和运维人员带来... 查看详情

小白都能看得懂的教程一本教你如何在前端实现富文本编辑器(代码片段)

小白都能看得懂的教程一本教你如何在前端实现富文本编辑器博主博客文章内容导航(实时更新)更多优质文章推荐:收藏!最详细的Python全栈开发指南看完这篇你还不会Python全栈开发你来打我!!!一本教你如何在... 查看详情

小白都能看懂的实战教程手把手教你pythonweb全栈开发(day4)(代码片段)

大家好,我叫亓官劼(qíguānjié),这个《小白都能看懂的实战教程手把手教你PythonWeb全栈开发》是一个零基础的实战教程,手把手带你开发一套系统,带你了解Pythonweb全栈开发,目前正在连续更新中,... 查看详情

小白都能看懂的关于mixins机制的理解(代码片段)

前言​在学习Flutter源码的时候,看到各种复杂的mixin和on,为了便于后续Flutter的学习,这里有必要一起来份详细Dart的Mixin机制。什么是mixins首先看看官方文档的定义:Mixinsareawayofreusingaclass’scodeinmultipleclasshierarchie... 查看详情

小白都能看懂的关于mixins机制的理解(代码片段)

前言​在学习Flutter源码的时候,看到各种复杂的mixin和on,为了便于后续Flutter的学习,这里有必要一起来份详细Dart的Mixin机制。什么是mixins首先看看官方文档的定义:Mixinsareawayofreusingaclass’scodeinmultipleclasshierarchie... 查看详情

小白都能看懂的实战教程手把手教你pythonweb全栈开发(day2)(代码片段)

小白都能看懂的实战教程手把手教你PythonWeb全栈开发Flask(PythonWeb)实战系列之在线论坛系统第二讲这是小白都能看懂的实战教程手把手教你PythonWeb全栈开发的第二讲,如果文中有基础知识不太熟悉的话,可以看博主前几期... 查看详情

[图解]小白都能看懂的fasterr-cnn–原理和实现细节(代码片段)

Contents [hide]1 论文原文2 介绍3 Anchors3.1 如何确定一个anchor是正样本还是负样本?4 实现细节5 调试信息6 参考资料论文原文FasterR-CNN:TowardsReal-TimeObjectDetectionwithRegionProposalNetworks介绍  FasterRCNN由RossB.Girshick在2016年提出ÿ 查看详情

小白都能看懂的分布式事务与2pc

2PC通信原理分布式事务的原子性什么是2PC2PC提交事务的过程2PC的全局提交规则2PC通信架构集中式2PC通信架构分层2PC通信架构线性2PC通信架构故障恢复站点故障报文丢失总结分布式事务的原子性一提到到事务,一般就会想到它... 查看详情

小白都能看懂的linux安装oracle数据库详细教程(代码片段)

作者简介作者:LuciferLiu,中国DBA联盟(ACDU)成员。目前主要从事OracleDBA工作,曾从事Oracle数据库开发工作,主要服务于生产制造,汽车金融等行业。现拥有OracleOCP,OceanBaseOBCA认证,擅长Oracle数据库运维... 查看详情

小白都能看懂的实战教程手把手教你pythonweb全栈开发(day5)(代码片段)

大家好,我叫亓官劼(qíguānjié),这个《小白都能看懂的实战教程手把手教你PythonWeb全栈开发》是一个零基础的实战教程,手把手带你开发一套系统,带你了解Pythonweb全栈开发,目前正在连续更新中,... 查看详情

小白都能看懂的实战教程手把手教你pythonweb全栈开发(day6)(代码片段)

大家好,我叫亓官劼(qíguānjié),这个《小白都能看懂的实战教程手把手教你PythonWeb全栈开发》是一个零基础的实战教程,手把手带你开发一套系统,带你了解Pythonweb全栈开发,目前正在连续更新中,... 查看详情

实战篇:小白都能看懂的linux安装oracle数据库详细教程(代码片段)

作者简介作者:LuciferLiu,中国DBA联盟(ACDU)成员。目前主要从事OracleDBA工作,曾从事Oracle数据库开发工作,主要服务于生产制造,汽车金融等行业。现拥有OracleOCP,OceanBaseOBCA认证,擅长Oracle数据库运维... 查看详情

小白都能看懂的sql零基础入门,一文带你轻松学会增删改查!(代码片段)

作者简介作者:LuciferLiu,中国DBA联盟(ACDU)成员。目前从事OracleDBA工作,曾从事Oracle数据库开发工作,主要服务于生产制造,汽车金融等行业。现拥有OracleOCP,OceanBaseOBCA认证,擅长Oracle数据库运维开发&#... 查看详情

零基础都能看懂的stlmap详解(代码片段)

🎈作者:Linux猿🎈简介:CSDN博客专家🏆,C/C++、面试、刷题、算法尽管咨询我,关注我,有问题私聊!🎈关注专栏:C/C++面试通关集锦 (优质好文持续更新中……)... 查看详情

小学生都能看懂的残差网络

ResNet残差网络本文适用于初次接触残差网络的小白,只是为了对残差网络有着更好的入门的一篇文章。问题提出:所谓深度学习,大部分人都会认为准确率会随着卷积层的增加而增加,但是随着技术的增加,... 查看详情

小白都能看得懂的教程看完这篇还不会生成随机验证码图片,你来打我!!!(代码片段)

小白都能看得懂的教程一文教你实现生成随机图像验证码大家好,我叫亓官劼(qíguānjié),三本计算机在读,目前在积极准备21计算机考研中,同时也在学习后端开发,准备工作。不敢孤注一掷,... 查看详情

小学生都能看懂的fft!!!

小学生都能看懂的FFT!!!前言在创新实践重心偷偷看了一天FFT资料后,我终于看懂了一点。为了给大家提供一份简单易懂的学习资料,同时也方便自己以后复习,我决定动手写这份学习笔记。食用指南:本篇受众:如标题所示... 查看详情

人人都能看懂的lstm

点击上方“迈微AI研习社”,选择“星标★”公众号重磅干货,第一时间送达大家好,我是Charmve。熟悉深度学习的朋友知道,LSTM是一种RNN模型,可以方便地处理时间序列数据,在NLP等领域有广泛应用。在看了台大李宏毅教授的... 查看详情