Redis5.x五种数据类型常见命令

关注公众号:CoderBuff,回复“redis”获取《Redis5.x入门教程》完整版PDF。

第三章 · 命令

按照第一章 准备工作中的步骤,我们通过redis-cli命令进入redis命令行交互。

本章节将围绕上一章节的数据类型,针对不同的数据类型操作不同的Redis命令。

字符串(string)

读/写/删简单命令

写命令通过set关键字实现,set [key] [value]

127.0.0.1:6379> set hello world
OK

读命令通过get关键字实现,get [key]

127.0.0.1:6379> get hello
"world"

删除命令通过del关键字实现(删除命令可以适用于所有的数据类型),del [key]

127.0.0.1:6379> del hello
(integer) 1

字符串数据类型还有一个mset表示同时写入一个或多个字符串值,mset [key1] [value1] [key2] [value2]

127.0.0.1:6379> mset key1 value1 key2 value2
OK

自增/自减命令

自增+1命令通过incr关键字实现,incr [key]

127.0.0.1:6379> set hello 1             #写入key为hello的值为1
OK
127.0.0.1:6379> get hello                   #读取key为hello的值
"1"
127.0.0.1:6379> incr hello              #将key为hello的值自增+1
(integer) 2
127.0.0.1:6379> get hello                   #读取key为hello的值
"2"

自减-1命令通过decr关键字实现,decr [key]

127.0.0.1:6379> set world 1             #写入key为world的值为1
OK
127.0.0.1:6379> get world                   #读取key为world的值
"1"
127.0.0.1:6379> decr world              #将key为world的值自减-1
(integer) 0
127.0.0.1:6379> get world                   #读取key为world的值
"0"

自增任意整数通过incrby实现,incrby [key] [number]

127.0.0.1:6379> set coderbuff 1     #写入key为coderbuff的值为1
OK
127.0.0.1:6379> get coderbuff           #读取key为coderbuff的值
"1"
127.0.0.1:6379> incrby coderbuff 10 #将key为coderbuff的值自增+10
(integer) 11
127.0.0.1:6379> get coderbuff           #读取key为coderbuff的值
"11"

自减任意整数通过decrby实现,decrby [key] [number]

127.0.0.1:6379> set coderbook 1     #写入key为coderbook的值为1
OK
127.0.0.1:6379> get coderbook           #读取key为coderbook的值
"1"
127.0.0.1:6379> decrby coderbook 10     #将key为coderbook的值自增-10
(integer) -9
127.0.0.1:6379> get coderbook           #读取key为coderbook的值
"-9"

自增任意浮点数通过incrbyfloatincrbyfloat [key] [float]

127.0.0.1:6379> set coderchat 1     #写入key为coderchat的值为1
OK
127.0.0.1:6379> get coderchat           #读取key为coderchat的值
"1"
127.0.0.1:6379> incrbyfloat coderchat 1.1       #将key为coderchat的值自增+1.1
"2.1"
127.0.0.1:6379> get coderchat           #读取key为coderchat的值
"2.1"

字符串操作命令

redis中对字符串类型的数据类型不仅可以使用上述命令,它甚至还能像Java一样进行值得追加、获取子串等。

追加value值给指定key到末尾通过appendapppend [key] [append_string]

127.0.0.1:6379> set say hello       #写入key为say的值为hello
OK
127.0.0.1:6379> get say                 #读取key为say的值
"hello"
127.0.0.1:6379> append say world        #在key为say的value值末尾追加world
(integer) 10                                        #返回key当前value值得长度
127.0.0.1:6379> get say                 #读取key为say的值
"helloworld"

接着这个示例,通过命令getrange获取子字符串getrange [key] [start] [end]

127.0.0.1:6379> getrange say 1 10       #获取位于位置1到10的子字符串
"elloworld"
127.0.0.1:6379> get say                         #可以看到,尽管我们上面获取了子字符串,但并未修改原字符串
"helloworld"

同样是这个示例,我们通过命令setrange替换子字符串为给定值,我们会给出两个关键参数,第一个参数是[start]表示从哪里开始替换,第二个参数是[value]表示替换的内容,setrange [key] [start] [value]

127.0.0.1:6379> setrange say 1 i
(integer) 10
127.0.0.1:6379> get say
"hilloworld"

二进制位命令

任何数据在操作系统中都是以二进制位形式存储的,字符串类型中redis提供了对其进行二进制位操作。通常情况下运用可能不多,但可以通过它实现一些“巧妙”的设计。

例如,在钉钉消息中,我们发送一条消息会显示“已读”和“未读”的人,我们需要将这两个信息存储在redis中,应该怎么设计?

我们设计一条消息的key值结构为“[user_id]:[msg_id]”,所以key=“1:100”就表示“用户ID为1发送的消息ID为100”。注意,此时如果用户ID=2的人读了这条消息,就通过命令setbit 1:100 2 1写入,如果用户ID=100的人读了这条消息,就通过setbit 1:100 10 1。这条命令的含义表示对key=1:100的二进制第2位写入1,对key=1:100的二进制第10位写入1,1表示已读,0则表示未读。

127.0.0.1:6379> set 1:100 0                 #定义key=1:100,表示用户ID为1发出的消息ID为100的消息
OK
127.0.0.1:6379> setbit 1:100 0 0        #初始化1:100的第0位到第10位的二进制为0,表示刚发出来都是未读。
(integer) 0
127.0.0.1:6379> setbit 1:100 1 0
(integer) 0
127.0.0.1:6379> setbit 1:100 2 0
(integer) 1
127.0.0.1:6379> setbit 1:100 3 0
(integer) 1
127.0.0.1:6379> setbit 1:100 4 0
(integer) 0
127.0.0.1:6379> setbit 1:100 5 0
(integer) 0
127.0.0.1:6379> setbit 1:100 6 0
(integer) 0
127.0.0.1:6379> setbit 1:100 7 0
(integer) 0
127.0.0.1:6379> setbit 1:100 8 0
(integer) 0
127.0.0.1:6379> setbit 1:100 9 0
(integer) 0
127.0.0.1:6379> setbit 1:100 10 0

上面我们就初始化好了一个bitmap(位图)。接下来,当用户ID=2和用户ID=10读了这条消息。

127.0.0.1:6379> setbit 1:100 1 1        #实际上,发出消息的同时,自己也已读了
(integer) 0
127.0.0.1:6379> setbit 1:100 2 1        #用户ID=2读了这条消息
(integer) 0
127.0.0.1:6379> setbit 1:100 10 1       #用户ID=10读了这条消息
(integer) 0

我们通过getbit命令可以判断出哪些用户是否已读这条消息,例如,我们判断用户ID=3是否已读这条消息。

127.0.0.1:6379> getbit 1:100 3      #读取key为1:100的二进制位第3位二进制值
(integer) 0                                             #返回0,表示未读

判断用户ID=10是否已读这条消息。

127.0.0.1:6379> getbit 1:100 10     #读取key为1:100的二进制位第10位二进制值
(integer) 1                                             #返回1,表示已读

我们还可以通过bitcount统计值为1的数量,也就是有多少人已读这条消息。

127.0.0.1:6379> bitcount 1:100      #统计二进制位为1的数量
(integer) 3                                             #只有3个,和我们上面的假定一致,用户自己(用户ID=1)和用户ID=2、用户ID=10的用户读了这条消息

最后还有一个关于二进制位的命令bittop [operation] [result] [key1] [key2],可以对多个key值的二进制位进行二进制运算,包括并AND或OR异或XOR非NOT,计算结果保存在[result]中。

列表(list)

推入/弹出常用命令

通过rpushlpush,将一个或多个值向右或向左推入。

rpush [key] [value1] [value2],将value值推入到列表的右端

lpush [key] [value1] [value2],将value值推入到列表的左端

127.0.0.1:6379> rpush books java        #向列表key值为books的右侧推入value值java
(integer) 1
127.0.0.1:6379> lpush books c               #向列表key值为books的左侧推入value值c
(integer) 2
127.0.0.1:6379> rpush books python  #向列表key值为books的右侧推入value值python
(integer) 3
127.0.0.1:6379> lrange books 0 -1       #查看列表key值为books的值
1) "c"
2) "java"
3) "python"

接着上面的示例,通过rpoplpop,移除并返回列表中最后端、最左端的元素。

rpop [key],移除列表最后端的元素。

lpop [key],移除列表最左端的元素。

127.0.0.1:6379> rpop books                  #移除列表key值为books最右端的元素并返回
"python"
127.0.0.1:6379> lrange books 0 -1       #查看列表key为books的所有元素
1) "c"
2) "java"
127.0.0.1:6379> lpop books                  #移除列表key值为books最左端的元素并返回
"c"
127.0.0.1:6379> lrange books 0 -1       #查看列表key为books的所有元素
1) "java"

在介绍完推入和弹出命令后,接下来将介绍与列表范围查看的命令。

lrange [key] [start] [end]命令用于返回列表从[start]到[end]位置范围内的所有元素,注意,位于[start]、[end]的元素也会被返回,上面的例子已经出现过该命令。

127.0.0.1:6379> rpush level A B C D         #对列表key为level的右侧连续推入value:A B C D
(integer) 4
127.0.0.1:6379> lrange level 0 1                #返回key为level的位置0~1的元素
1) "A"
2) "B"
127.0.0.1:6379> lrange level 0 -1               #查看列表key为level的所有元素
1) "A"
2) "B"
2) "C"
2) "D"

lindex [key] [index]命令用于返回指定位置[index]的元素,仍然使用上述示例。

127.0.0.1:6379> lindex level 3
"D"

lrangelindex均不会修改原本的列表值,但ltrim则用于“修建”列表值。

ltrim [key] [start] [end]表示只保留列表从[start]到[end]范围的所有元素,注意,包含位于[start]、[end]的元素,同样采用上述示例。

127.0.0.1:6379> lrange level 0 -1       #查看列表key为level的所有元素
1) "A"
2) "B"
2) "C"
2) "D"
127.0.0.1:6379> ltrim level 1 2         #保留列表位置为1~2的元素
OK
127.0.0.1:6379> lrange level 0 -1       #查看列表key为level的所有元素
1) "B"
2) "C"

列表基本的命令就是上面这些,还有一些比较“高级”的命令:将元素从一个队列移动到另外一个队列,或者阻塞式的执行弹出命令知道有新元素新加入到列表中。在这里就不再介绍,后面章节在介绍到redis的一些应用时再讲。

哈希(hash)

hmset命令可写入hash类型的值,hmset [key] [field1] [value1] [field2] [value2]

127.0.0.1:6379> hmset okevin name kevin sex male
OK

hmget命令可读取hash类型的值,hmget [key] [field]

127.0.0.1:6379> hmget okevin name
1) "kevin"

hlen返回hash包含的键值对数量,hlen [key]

127.0.0.1:6379> hlen okevin
(integer) 2

hmgetall返回hash包含的所有键值对,hmgetall [key]

127.0.0.1:6379> hgetall okevin      #返回所有的键值对,奇数列为field,偶数列为value
1) "name"
2) "kevin"
3) "sex"
4) "male"

hexists命令检查给定的field是否存在hash值中,返回0表示不存在,返回1表示存在,hexists [key] [field]

127.0.0.1:6379> hexists okevin name
(integer) 1
127.0.0.1:6379> hexists okevin age
(integer) 0

hkeys获取hash包含的所有field键,hkeys [key]

127.0.0.1:6379> hkeys okevin
1) "name"
2) "sex"

hvals获取hash包含的所有field对应的value值,hvals [key]

127.0.0.1:6379> hvals okevin
1) "kevin"
2) "male"

hincrby给hash中指定的field键自增任意整数(和字符串类型的incrby类似),hincrby [key] [field] [number]

127.0.0.1:6379> hmset okevin age 0              #新增“年龄”field值为0
OK
127.0.0.1:6379> hmget okevin age                    #获取“年龄”
1) "0"
127.0.0.1:6379> hincrby okevin age 25           #给“年龄”field自增“25”整数
(integer) 25
127.0.0.1:6379> hmget okevin age                    #获取“年龄”
1) "25"

hincrbyfloat给hash中指定的filed键自增任意浮点数(和字符串类型的incrbyfloat类似),hincrbyfloat [key] [field] [number]

127.0.0.1:6379> hincrbyfloat okevin age 0.5
"25.5"
127.0.0.1:6379> hmget okevin age
1) "25.5"

hdel删除hash中指定的filed,hmdel [key] [field]

127.0.0.1:6379> hgetall okevin
1) "name"
2) "kevin"
3) "sex"
4) "male"
5) "age"
6) "25.5"
127.0.0.1:6379> hdel okevin age
(integer) 1
127.0.0.1:6379> hgetall okevin
1) "name"
2) "kevin"
3) "sex"
4) "male"

集合(set)

在上一章节讲到,集合(set)是以无序方式存储各不相同元素的数据类型。它和Java中的Set类型类似。它同样具有新增、删除、读取等基本操作,还有两个集合之间运算的操作。

读/写等常用命令

sadd命令将一个或多个元素添加到集合里,并返回被添加元素中原本并不存在集合中的元素数量,sadd [key] [member] [member]

127.0.0.1:6379> sadd students kevin yulinfeng
(integer) 2

sismember命令检查元素是否存在集合中,返回1表示存在,返回0表示不存在,sismember [key] [member]

127.0.0.1:6379> sismember students kevin
(integer) 1
127.0.0.1:6379> sismember students linfeng
(integer) 0

smembers命令返回集合中包含的所有元素,smembers [key]

127.0.0.1:6379> smembers students
1) "yulinfeng"
2) "kevin"

scard命令返回集合中元素的数量,scards [key]

127.0.0.1:6379> scard students
(integer) 2

srandmember命令从集合中随机返回一个或多个元素,当返回的元素数量设置为正数时,元素不会重复,当返回的元素数量设置为负数时,元素可能会重复,srandmember [key] [count]

127.0.0.1:6379> srandmember students 1
1) "yulinfeng"
127.0.0.1:6379> srandmember students 1
1) "kevin"
127.0.0.1:6379> srandmember students 3
1) "kevin"
2) "yulinfeng"
127.0.0.1:6379> srandmember students -3
1) "yulinfeng"
2) "kevin"
3) "kevin"

srem命令从集合中移除一个或多个指定的元素,并返回被移除的元素数量,srem [key] [member] [member]

多个集合命令

redis可以对多个集合进行操作,例如数学中的差集运算、交集运算等。下面只列举多个集合操作的命令,不再举例,但如果有场景运用时一定要知道redis还可以做多集合运算。

sdiff [key1] [key2]……命令返回存在于key1,但不存在于其他集合(key2)中的元素(差集运算)。

sdiff [dest-key] [key1] [key2]……命令也是同上的差集运算,但它将元素存储到dest-key键中。

sinter [key1] [key2]……命令返回同时存在所有集合(key1、key2)中的元素(交集运算)。

sinterstore [dest-key] [key1] [key2]……命令也是同上的交集运算,但它将元素存储到dest-key键中。

sunion [key1] [key2]……命令返回所有集合中(key1、key2)的元素(并集运算)。

sunionstore [dest-key] [key1] [key2]……命令也是同上的并集运算,但它将元素存储到dest-key键中。

有序集合

在上一章数据类型中,我们谈到尽管“有序集合”这种数据类型,更像是“集合”的有序版,但对于数据结构上讲,它更类似“哈希(hash)”。它同哈希类型一样,值也是k-v形式,不同的是有序集合的v代表的是用于排序的“分数”。

读/写等常用命令

zadd用于有序集合的写入操作,zadd [key] [score1] [member1] [score2] [member2]……

127.0.0.1:6379> zadd sorted 2 a 3 b
(integer) 2

zcard命令用于返回有序集合中的成员数量,zcard [key]

127.0.0.1:6379> zcard sorted
(integer) 2

zrank用于返回有序集合中成员member的排名(按分数从小到大排列),zrank [key] [member]

127.0.0.1:6379> zrank sorted a
(integer) 0
127.0.0.1:6379> zrank sorted b
(integer) 1

zrevrank命令也是返回成员member的排名,但它和zrank排序规则相反,它是按分数从大到小排列,zrevrank [key] [member]

127.0.0.1:6379> zrevrank sorted a
(integer) 1
127.0.0.1:6379> zrevrank sorted b
(integer) 0

zscore命令返回成员member的分数,zscore [key] [member]

127.0.0.1:6379> zscore sorted a
"2"

zrange [key] [start] [stop] (withscores)命令用于返回有序集合中排名介于start和stop之间的成员(按分数从小到大排列),withscores参数可选表示是否返回分数,start和end指的是排在第几名,从0开始。

127.0.0.1:6379> zrange sorted 0 0 withscores
1) "a"
2) "2"
127.0.0.1:6379> zrange sorted 0 1 withscores
1) "a"
2) "2"
3) "b"
4) "3"

zrevrangezrange类似,但它是按分数从大到小排列,zrevrange [key] [start] [end] (withscores)

127.0.0.1:6379> zrevrange sorted 0 0 withscores
1) "b"
2) "3"
127.0.0.1:6379> zrevrange sorted 0 1 withscores
1) "b"
2) "3"
3) "a"
4) "2"

zcount [key] [min_score] [max_score]返回分数介于min_score和max_score之间的成员数量。

127.0.0.1:6379> zcount sorted 0 2
(integer) 1
127.0.0.1:6379> zcount sorted 0 3
(integer) 2

zincrby [key] [incrment] [member]命令用于给member成员的分数加上incrment。

127.0.0.1:6379> zincrby sorted 2 a
"4"

zrem命令用于删除有序集合中指定的成员,zrem [key] [member1] [member2]……

127.0.0.1:6379> zrem sorted a
(integer) 1

多个有序集合命令

同集合一样,有序集合也可以做多个集合的操作,例如交集、并集等。

zinterstore用于交集运算。

zunionstore用于并集运算。

关注公众号:CoderBuff,回复“redis”获取《Redis5.x入门教程》完整版PDF。

这是一个能给程序员加buff的公众号 (CoderBuff)

原文地址:https://www.cnblogs.com/yulinfeng/p/12341135.html

时间: 2024-11-10 10:33:18

Redis5.x五种数据类型常见命令的相关文章

Redis——五种数据类型

Redis共有strings.hashs.lists.sets.sorted sets五种数据类型,可以说已经比较丰富了.下面只对这几种数据类型的数据结构与用途做简要介绍.至于每种数据类型的操作API,这里只简单一提,不再一一详细介绍,有需要的用户可以Google即可. 一.    strings string是最简单的类型,一个Key对应一个Value.string类型是类型安全的,Redis的string可以包含任何数据,比如jpg图片或者序列化的对象.存储结构如下: 常用的API函数有:

redis的五种数据类型

redis的五种数据类型 redis客户端建立 ./redis-cli -h 192.168.1.22 -p 6380 --raw 1.String 应用场景: 统计网站访问数量.当前在线人数.微博数.粉丝数等,全局递增ID等 . 常用命令: SET key value GET key MSET key1 value1 [key2 value2] MGET key1 key2 INCR key DECR key SETNX key value  #只有key 不存在时,才设置key的值 2.Ha

redis五种数据类型的使用场景

string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一段内容 设置及获取字符串的某一位(bit) 批量设置一系列字符串的内容 应用场景: String是最常用的一种数据类型,普通的key/value存储都可以归为此类,value其实不仅是String, 也可以是数字:比如想知道什么时候封锁一个IP地址(访问超过几次).INCRBY命令让这些变得很容易,

Java 操作 Redis 五种数据类型

项目添加依赖 <!-- Redis 依赖 --> <dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency> Java 怎么连接 Redis //连接 Redis @Test public void initConn01(){ S

轻松搞定高并发:详解Redis的五种数据类型及应用场景分析!

一.Redis基本概念介绍和特性 1.1 Redis基本概念介绍 1.Redis是远程的,有客户端和服务端,我们一般说的是服务端: 2.Redis是基于内存的,所以比基于硬盘的MySQL要快很多,但非常吃内存 3.Redis是非关系型数据库.本质上也是数据库,但MySQL关系型数据库存储时必须定义数据词典,而Redis则不需要. 1.2 Redis 和 Memcached比较 Redis数据类型都支持push/pop.add/remove及取交集并集和差集及更丰富的操作,而且这些操作都是原子性的

转 redis 五种数据类型的使用场景

http://www.cnblogs.com/lori/archive/2012/05/15/2501862.html Redis学习笔记~Redis提供的五种数据结构 回到目录 分布式缓存,消息队列,替代Session呵呵(Session太不稳定了,呵呵)=Redis Redis的崛起绝非偶然,它确实有自己的新东西在里面,它不像Memcached,只能将数据存储在内存中,它提供了持久化机制,避免了場机后的雪崩的问题,即服务器出现问题后,内存中保留的原始数据全部丢失,需要重新组织数据到内存,这时

redis 五种数据类型

前言 前面学会了单机, 学会了集群, 但是redis咋用啊? 或者说, redis支持哪些数据类型呢? 常用的有五种: String , Hash, List, Set, zset(SortedSet) 一.String String 类型, 在前面也是使用过的. 直接来看一下 可以使用del name来删除缓存 二.List push指令: push分两个, 一个从左边push, 一个从右边push. 但是这个左右, 是对准备push的值而言的. 而不是针对将要push的数组来说的. pop指

Redis五种数据类型及应用场景

MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题: 1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间. 2.Memcached与MySQL数据库数据一致性问题. 3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑.

《闲扯Redis三》Redis五种数据类型之List型

一.前言 Redis 提供了5种数据类型:String(字符串).Hash(哈希).List(列表).Set(集合).Zset(有序集合),理解每种数据类型的特点对于redis的开发和运维非常重要. Redis 中的 list 是我们经常使用到的一种数据类型,根据使用方式的不同,可以应用到很多场景中. 二.操作命令 ?List数据类型在 Redis 中的相关命令:: 命令 描述 用法 LPUSH 1.将一个或多个值value插入到列表key的表头2.如果有多个value值,那么各个value值按