- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
本文首发于公众号:Hunter后端 原文链: Redis基础命令汇总,看这篇就够了 。
本篇笔记将汇总 Redis 基础命令,包括几个常用的通用命令,和各个类型的数据的操作,包括字符串、哈希、列表、集合、有序集合等在内的基本操作.
以下是本篇笔记目录:
返回所有 key,可以使用通配符来查询.
# 查看所有 key
keys *
# 查看以 hel 开头的 key
keys hel*
# 查看 ph + 一个字符
keys ph?
注意:一般不要使用 keys 这个操作,Redis 是单线程,执行之后如果耗时过久会造成阻塞.
统计当前 db key 的总数:
select 1
dbsize
查看某个 key 是否存在,存在则返回 1,不存在返回 0 。
exists key
# 1
删除一个或多个 key:
# 删除 key
del key1
# 删除 key1、key2
del key1 key2
成功删除 n 个 key,返回整数 n 。
给 key 设置 n 秒后过期 。
假设给 key 为 hello 的数据设置 3 秒后过期:
expire hello 3
三秒后,我们尝试获取 hello 数据,就会发现返回空了.
# after 3 seconds ...
get hello
查看 key 剩余过期时间,假设我们前面设置的过期时间很长,在数据未过期的时候使用这个命令:
ttl hello
就会返回 hello 剩余的过期时间.
在 key 还未过期的时候,使用这个命令,可以去除 key 上的过期时间:
persist hello
返回 key 的类型,后面我们会介绍 Redis 的几种基本数据类型.
Redis 几种数据类型是:字符串、哈希、列表、集合、有序集合 。
在 Redis 中存储字符串,就是一个 key-value 的结构.
其中,value 可以是字符串,也可以是数字,对于数字 Redis 会自动识别,且可以使用一些字符串没有的操作,比如增加、减少等.
但在设置和存储的过程中,字符串和数字都是一样的使用方式.
字符串的增删改查操作是 get、set、del。其中 set 操作可以是增加数据,也可以是更新数据.
接下来我们对 key 为 hello 的数据进行操作:
# 增加 hello 的值为 world
set hello world
# 获取 hello 的值
get hello
# 更新 hello 的值为 "new world"
set hello "new world"
# 删除 hello
del hello
前面介绍的 set,如果存在则更新,不存在则增加,如果我们想要实现存在 key 就更新,以及不存在 key 则创建的逻辑,可以如此操作:
setnx 可以实现我们这个逻辑:
if not exists:
insert
else:
pass
比如我们执行:
del a
setnx a 1
setnx a 2
上面的操作之后,尽管我们的 setnx 执行了两遍,但前面已经设置过了 a 的值,所以第二个操作不会执行了.
set key value xx ,注意, xx 是固定用法,比如我们想 a 的值如果存在于系统,则更新 a 的值为 2,不存在的话则不操作,可以如下:
set a 2 xx
那么如果系统之前没有 a 的值存在,那么执行这个命令之后,系统也不会有 a 这个 key.
对于字符串类型的数据,可以存储字符串也可以存储整数,对于整数,有一些额外的操作,比如自增1,自减1,自增n,自减n.
# 为 a 初始化设置值为 3
set a 3
# 进行自增 1 的操作
incr a
decr a
注意 :如果 incr 和 decr 的 key 之前在 Redis 中不存在,那么系统会默认先 set key 0 ,然后进行自增自减的操作 。
# 对 a 进行自增 5
incrby a 5
# 对 a 进行自减 5
decrby a 5
对应于整数,小数也可以进行自增的操作 。
incrbyfloat 自增某个小数 。
incrbyfloat a 3.4
但是,并没有相应的小数数自减操作,但是我们可以通过在 value 加负号来表示自减操作:
incrbyfloat a -3.4
对于一个字符串,比如我们设置:
set a "this is a string"
我们通过 get 可以获取 a 的全量字符串,也可以通过 getrange 下标来指定范围获取:
getrange a 1 3
表示获取从 1 开始到 3 之间的字符串,下标从 0 开始.
也可以通过下标设置字符串内容:
setrange a 5 xxxx
上面的操作表示将 a 字符串在第 6 个的位置的字符串替换成 xxxx,那么 a 的结果应该是:
get a
# "this xxxx string"
先获取 key 的 value,然后对 key 设置新的 value:
getset a "new value"
将 value 追加到 key 的旧 value 的末尾:
set a "abc"
append a "def"
get a
# "abcdef"
获取字符串的长度:
strlen a
# 6
批量获取 key 列表的值,比如我们有 a,b,c 三个 key,我们想同时返回三个 key 的数据:
mget a b c
# 以下是返回:
#1) "abcdef"
#2) "1"
#3) "world"
批量设置 key 列表的值,一个 key 后跟一个 value,比如我们设置三个 key,a、b、c 的 value 分别是 1,2,3
mset a "1" b "2" c "3"
因为 Redis 存储的数据类型是一个 key-value 的结构,而哈希本身的数据类型也是一个 key-value 的类型,所以哈希数据相当于是一个嵌套的类型,这个地方需要了解清楚它的概念.
在下面的例子中,我们将 Redis 中的 key 称为 key,而哈希中的 key-value 中对应的 key 称为 field 以示区分.
哈希命令的前面都带一个 h,这是哈希命令的一个特点.
接下来,我们以一个例子来介绍哈希命令,我们想要存入一个这样的数据,key 为 student,它有 name,number,rank 三个 field 属性,大致如下:
{
"student":
{
"name": "Hunter",
"number": "00001",
"rank": 1
}
}
这里我们要设置 student 的几个属性值,创建和更新都用 heset :
hset student name "Hunter"
hset student number "00001"
hset student rank 1
使用 hget 查询数据:
hget student name
使用 hdel 删除数据:
hdel student name
如果是直接删除 student 这个 key 呢,直接使用 del:
del student
hexists 是用于查看 key 下某个 field 属性是否存在,假设前面的 student 数据没有删除,我们这样使用:
hexists student name
# 1
返回的结果是 1 则表示 name 这个 field 存在,不存在的话会返回 0 。
hlen 用于查看 key 下存在多少个 field 属性:
hlen student
批量查看和设置哈希数据下的属性.
比如我们想一次性查看 student 下的 name 和 number 属性的值,可以使用 hmget :
hmget student name number
#1) "Hunter"
#2) "00001"
也可以使用 hmset 来批量设置:
hmset student name "Jack" rank "2"
如果我们想查看某个 key 下所有的 field 属性,可以使用 hkeys :
hkeys student
#1) "name"
#2) "number"
#3) "rank
返回的是所有 field 属性 。
如果我们想查看某个 key 下所有的 field 属性下的值,可以使用 hvals 。
hvals student
#1) "Jack"
#2) "00001"
#3) "2"
如果我们想查看某个 key 下所有的 field 属性和对应的值,可以使用 hgetall :
hgetall student
#1) "name"
#2) "Jack"
#3) "number"
#4) "00001"
#5) "rank"
#6) "2"
会将 field-name 依次返回.
对于 Redis 中的列表数据,一般是以 l 开头,为了方便记忆,可以理解成是 List,或者是 Left 中的 L,为什么要提 Left 以及说一般是以 l 开头呢,因为有一些操作是 r 开头,这个表示是对列表的右边进行数据操作.
从列表左边添加一个或多个数据:
lpush rank 1
lpush rank 2 8
从列表右边添加一个或多个数据:
rpush rank 3
rpush rank 4 5
在指定的 value 前或者后面插入一个 new_value,比如我们在 2 前插入 1.5 。
linsert rank before 2 1.5
或者在 2后面插入 2.5:
linsert rank after 2 2.5
如果列表中有重复数据怎么办?
系统会从左边开始寻找,找到的第一个目标数据的位置就停止查找,然后插入.
通过下标查看数据范围,比如我们想查看第二个到第五个之间的数据:
lrange rank 1 4
如果想查看全部列表数据:
lrange rank 0 -1
通过下标索引获取数据,比如想查看第三个数据:
lindex rank 2
获取列表长度:
llen rank
从列表左边弹出一个数据:
lpop rank
从列表右边弹出一个数据:
rpop rank
这是一个遍历删除的操作,它的命令示例如下:
lrem key count value
当 count 大于 0 时,表示从左到右删除最多 count 个值为 value 的数据 当 count 小于 0 时,表示从右到左删除最多 count 个值为 value 的数据 当 count 等于 0 时,表示删除列表中全部值为 value 的数据 。
比如我们设置 rem_list 的值如下:
lpush rem_list 1 3 3 5 3 8 5
接下来我们从左到右删除两个 value 等于 3 的数据:
lrem rem_list 2 3
执行之后,rem_list 中应该还剩一个 3 。
如果我们想删除 rem_list 中全部 value 等于 5 的数据:
lrem rem_list 0 5
按照索引范围修剪列表:
ltrim key start end
比如我们只保留从最开始到第四个元素的数据:
rpush trim_list 0 1 2 3 4
ltrim trim_list 0 3
修改某个索引的数据,比如修改第三个位子的数据:
lset a 2 8
集合中的数据是无序的,无重复的.
集合相关的命令都是以 s 开头的 。
向集合中添加数据,可添加单个或多个元素 。
del a
sadd a 1
sadd a 2 3 4
查看集合中所有元素:
smembers a
查看元素是否在集合中,这个命令就是 is member :
sismember a 2
获取集合中元素的总数:
scard a
使用命令示例为 srandmember key [count] 。
表示从 key 中获取 count 个元素,如果不定义 count,则默认取出一个元素 。
# 取出一个元素
srandmember a
# 取出两个元素
srandmember a 2
注意:这个命令为获取元素,但是并非从集合中弹出,而是单纯的获取,原集合不会变 。
从集合中弹出一个或多个指定元素:
# 从集合中弹出 2 4 8 三个元素
srem a 2 4 8
从集合中弹出一个或多个元素,这个命令执行之后集合中就会将该元素剔除:
spop a
# 从集合中弹出两个元素
spop a 2
求取两个集合的差值,比如两个集合为 a 和 b,结果即为 a - b:
sadd a 1 2 3
sadd b 3 4 5
sdiff a b
# 1 2
求取两个集合交集:
sinter a b
# 3
两个集合并集:
sunion a b
# 1 2 3 4 5
有序集合兼具了列表和集合的特点,它是无重复的,但是是有序的 。
我们通过给元素添加额外的分数属性来实现元素的有序操作.
命令示例为:
zadd key score element
假设我们要实现 Python、Java、Golang 三个元素的排名分别在 1、2、3,可以这样操作:
del a
zadd a 2 Java
zadd a 1 Python 3 Golang
查看元素指定索引范围元素,可以通过 WITHSCORES 参数决定是否返回对应的排名分值:
zrange a 0 2
#1) "Python"
#2) "Java"
#3) "Golang"
返回排名 score:
zrange a 0 2 WITHSCORES
#1) "Python"
#2) "1"
#3) "Java"
#4) "2"
#5) "Golang"
#6) "3"
通过分数区间返回元素:
zrangebyscore a 1 3
返回有序集合中分数在 1 和 3 之间的元素 。
返回指定元素的分数:
zscore a Python
返回指定元素的排名次序:
zrank a Python
返回元素的总个数:
zcard a
返回指定分数区间元素个数,比如返回分数在 1 到 3 之间,包括 1 和 3 的元素个数:
zcount a 1 3
指定元素增加/减少分数 。
比如指定元素为 Python 的分数 +1 。
zincrby a 1 Python
删除某个元素:
zrem a Java
删除指定排名內的元素 。
前面我们通过 zrank 返回指定元素的排名,这里是删除操作:
zremrangebyrank a 1 3
删除指定分数段内的元素 。
zremrangebyscore a 1 3
如果想获取更多后端相关文章,可扫码关注阅读:
最后此篇关于Redis基础命令汇总,看这篇就够了的文章就讲到这里了,如果你想了解更多关于Redis基础命令汇总,看这篇就够了的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我有一个关于 Redis Pubsub 的练习,如下所示: 如果发布者发布消息但订阅者没有收到服务器崩溃。订阅者如何在重启服务器时收到该消息? 请帮帮我,谢谢! 最佳答案 在这种情况下,消息将永远消失
我们正在使用 Service Stack 的 RedisClient 的 BlockingDequeue 来保存一些数据,直到它可以被处理。调用代码看起来像 using (var client =
我有一个 Redis 服务器和多个 Redis 客户端。每个 Redis 客户端都是一个 WebSocket+HTTP 服务器,其中包括管理 WebSocket 连接。这些 WebSocket+HTT
我有多个 Redis 实例。我使用不同的端口创建了一个集群。现在我想将数据从预先存在的 redis 实例传输到集群。我知道如何将数据从一个实例传输到集群,但是当实例多于一个时,我无法做到这一点。 最佳
配置:三个redis集群分区,跨三组一主一从。当 Master 宕机时,Lettuce 会立即检测到中断并开始重试。但是,Lettuce 没有检测到关联的 slave 已经将自己提升为 master
我想根据从指定集合中检索这些键来删除 Redis 键(及其数据集),例如: HMSET id:1 password 123 category milk HMSET id:2 password 456
我正在编写一个机器人(其中包含要禁用的命令列表),用于监视 Redis。它通过执行禁用命令,例如 (rename-command ZADD "")当我重新启动我的机器人时,如果要禁用的命令列表发生变化
我的任务是为大量听众使用发布/订阅。这是来自 docs 的订阅的简化示例: r = redis.StrictRedis(...) p = r.pubsub() p.subscribe('my-firs
我一直在阅读有关使用 Redis 哨兵进行故障转移的内容。我打算有1个master+1个slave,如果master宕机超过1分钟,就把slave变成master。我知道这在 Sentinel 中是
与仅使用常规 Redis 和创建分片相比,使用 Redis 集群有哪些优势? 在我看来,Redis Cluster 更注重数据安全(让主从架构解决故障)。 最佳答案 我认为当您需要在不丢失任何数据的情
由于 Redis 以被动和主动方式使 key 过期, 有没有办法得到一个 key ,即使它的过期时间已过 (但 在 Redis 中仍然存在 )? 最佳答案 DEBUG OBJECT myKey 将返回
我想用redis lua来实现monitor命令,而不是redis-cli monitor。但我不知道怎么办。 redis.call('monitor') 不起作用。 最佳答案 您不能从 Redis
我读过 https://github.com/redisson/redisson 我发现有几个 Redis 复制设置(包括对 AWS ElastiCache 和 Azure Redis 缓存的支持)
Microsoft.AspNet.SignalR.Redis 和 StackExchange.Redis.Extensions.Core 在同一个项目中使用。前者需要StackExchange.Red
1. 认识 Redis Redis(Remote Dictionary Server)远程词典服务器,是一个基于内存的键值对型 NoSQL 数据库。 特征: 键值(key-value)型,value
1. Redis 数据结构介绍 Redis 是一个 key-value 的数据库,key 一般是 String 类型,但 value 类型多种多样,下面就举了几个例子: value 类型 示例 Str
1. 什么是缓存 缓存(Cache) 就是数据交换的缓冲区,是存贮数据的临时地方,一般读写性能较高。 缓存的作用: 降低后端负载 提高读写效率,降低响应时间 缓存的成本: 数据一致性成本 代码维护成本
我有一份记录 list 。对于我的每条记录,我都需要进行一些繁重的计算,因为我要在Redis中创建反向索引。为了达到到达记录,需要在管道中执行多个redis命令(sadd为100 s + set为1
我有一个三节点Redis和3节点哨兵,一切正常,所有主服务器和从属服务器都经过验证,并且哨兵配置文件已与所有Redis和哨兵节点一起更新,但是问题是当Redis主服务器关闭并且哨兵希望选举失败者时再次
我正在尝试计算Redis中存储的消息之间的响应时间。但是我不知道该怎么做。 首先,我必须像这样存储chat_messages的时间流 ZADD conversation:CONVERSATION_ID
我是一名优秀的程序员,十分优秀!