关注公众号: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. DHCP服务器搭建

    一.服务端安装配置 1.安装dhcp相关软件包 执行命令:yum install dhcp dhcp-devel -y #通过yum安装dhcp软件包 2.编辑配置dhcp的配置文件,文件路径:/et ...

  2. Pandas的介绍与基本使用

    1.什么是Pandas 当大家谈论到数据分析时,提及最多的语言就是Python和SQL,而Python之所以适合做数据分析,就是因为他有很多强大的第三方库来协助,pandas就是其中之一,它是基于Nu ...

  3. java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍

    pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 变更日志 创作目的 想为 java 设计一款便捷易用的拼音工具. 如何为 java 设计一款高性能的拼音转换工具 pinyin ...

  4. hdfs断电报错解决

    一,/home/hadoop/tmp/dfs/name/current 目录下查看文件二,1.stop hadoop所有的服务;2.重新格式化namenode即可: hadoop根目录下: hadoo ...

  5. 关于neo4j初入门(5)

    neo4j和Java Neo4j提供JAVA API以编程方式执行所有数据库操作. 它支持两种类型的API: Neo4j的原生的Java API Neo4j Cypher Java API Neo4j ...

  6. python 自定义expection

    class PricePolicyInvalid(Exception): def __init__(self, msg): self.msg = msg

  7. 关于github显示不出来图片的问题

    今天打开github,突然发现图标图片等都显示不出来了. 控制台看了一下 百度查找了Failed to load resource: net::ERR_CERT_COMMON_NAME_INVALID ...

  8. 【Oracle】分区表详解

    此文从以下几个方面来整理关于分区表的概念及操作: 1.表空间及分区表的概念     2.表分区的具体作用     3.表分区的优缺点     4.表分区的几种类型及操作方法     5.对表分区的维护 ...

  9. Frameworks.Entity.Core 4

    Project.Core\Frameworks.Entity.Core\Commons\ 1 AutoMapperExtension.cs AutoMapper扩展方法 2枚举类型扩展方法EnumEx ...

  10. 使用Razor表达式 举数组和集合 精通ASP-NET-MVC-5-弗瑞曼