IT教程 ·

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

java架构之路-(微服务专题)feign的基本使用和nacos的配置中心

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

  • 《Redis5.x入门教程》目次
  • 第一章 · 准备工作
  • 第二章 · 数据范例
  • 第三章 · ​敕令
  • 第四章 ​· 设置
  • 第五章 · Java客户端(上)
  • 第六章 · 事件
  • 第七章 · 分布式锁
  • 第八章 · Java客户端(下)

第三章 · 敕令

根据第一章 准备工作中的步骤,我们经由过程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用于并集运算。

 

3D点云配准算法简述

参与评论