关注公众号: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)

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

  1. redis五种数据类型的应用

    redis的五种数据类型和使用场景 string类型 string类型多用于缓存 set key value(value可以为json字符串) setnx多用于分布式锁(后面详细整理) 计数器 inc ...

  2. redis五种数据类型的使用(zz)

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

  3. redis五种数据类型的使用

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

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

    string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  5. Redis五种数据类型-设置key的过期时间

    1.redis命令客户端 [root@localhost bin]# ./redis-cli 127.0.0.1:6379> #是否运行着 127.0.0.1:6379> ping PON ...

  6. Redis学习笔记(3)—— 五种数据类型&keys的通用操作

    一.Redis数据结构介绍 redis是一种高级的key-value的存储系统,其中的key是字符串类型,尽可能满足如下几点: 1)key不要太长,最好不要操作1024个字节,这不仅会消耗内存还会降低 ...

  7. (转) 淘淘商城系列——Redis五种数据类型介绍

    http://blog.csdn.net/yerenyuan_pku/article/details/72855562 Redis支持五种数据类型:string(字符串),hash(哈希),list( ...

  8. 【Redis】一、Redis简介及五种数据类型

    (一)Redis简介   Redis(Remote Dictionary Server)是一个使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value的开源 ...

  9. Redis五种数据类型应用场景

    目录 1.1 回顾 2.1 应用场景 2.1.1 String 2.1.2 Hash 2.1.3 List 2.1.4 Zet 2.1.5 zset 3.1 小结 1.1 回顾 Redis的五种数据类 ...

随机推荐

  1. MongoDB Community 的安装和卸载

    MongoDB在他们的仓库中提供官方支持的包,该仓库包括以下软件包 mongodb-org:自动安装下面的四个组件安装包 a.mongodb-org-server:mongod的守护进程和相关的配置以 ...

  2. C#实现EXCEL表格转DataTable

    C#代码实现把Excel文件转化为DataTable,根据Excel的文件后缀名不同,用不同的方法来进行实现,下面通过根据Excel文件的两种后缀名(*.xlsx和*.xls)分别来实现.获取文件后缀 ...

  3. .NET 在云原生时代的蜕变,让我在云时代脱颖而出

    .NET 生态系统是一个不断变化的生态圈,我相信它正在朝着一个伟大的方向发展.有了开源和跨平台这两个关键优先事项,我们就可以放心了.云原生对应用运行时的不同需求,说明一个.NET Core 在云原生时 ...

  4. 唬人的Java泛型并不难

    泛型 public interface Foo<E> {}public interface Bar<T> {}public interface Zar<?> {} ...

  5. 重拾c++第一天(1):环境配置

    时过多年,c++基本不记得了,故在此记录相关重拾记录. 学习语言第一步当然是环境配置了(笑),由于暂无用c++进行大型项目开发的需求,所以先下载dev进行过渡. 安装过程非常简单,值得注意的是配置时选 ...

  6. 【PCIE-2】---PCIE配置空间及访问方式简介

    对新手来说,第一步了解PCIE的相关基本概念,第二步了解PCIE配置空间,第三步深入研究PCIE设备枚举方式.本章主要总结第二步的PCIE配置空间 按照国际惯例,先提问题: 1. 什么是PCIE的配置 ...

  7. 基于Java+HttpClient+TestNG的接口自动化测试框架(四)-------参数存取处理

    在真正开始接口测试之前,我们需要对参数的处理进行梳理.这里所说的“参数”,既包含之前在xml中的配置(我们称之为全局参数),也包含在每一条用例中书写的param.全局参数为固定不变的,而根据接口相应获 ...

  8. [bzoj2815] [洛谷P2597] [ZJOI2012] 灾难

    Description 阿米巴是小强的好朋友. 阿米巴和小强在草原上捉蚂蚱.小强突然想,如果蚂蚱被他们捉灭绝了,那么吃蚂蚱的小鸟就会饿死,而捕食小鸟的猛禽也会跟着灭绝,从而引发一系列的生态灾难. 学过 ...

  9. python练习题-9-6

    本代码是<Python核心编程(第二版)>第九章的9-6练习题,完成的功能为:文件比较:比较两个文本文件是否相同,如果不同,给出第一个不同处的行号和列号. #!/usr/bin/env p ...

  10. 学习 lind api 十月 第一弹

    step one 我们来看一下代码的结构