浅谈Redis7基础命令

举报
QGS 发表于 2023/05/15 18:26:02 2023/05/15
【摘要】 浅谈Redis7基础命令

Redis基本命令


 

Ping命令 心跳命令

set & get命令

set key value

get key

select命令

切换数据库


 

dbsize命令


 

flushdb命令

清除当前数据库数据

 

flushell命令

清除所有数据库数据

 

退出命令

quitexit

 

关闭redis

redis-cli shutdown

shutdown

 

查看进程及端口号

#查看redis进程

pa axu | grep redis

#查看所有端口使用情况

netstat -ntulp |grep redis

 

Key命令

Redis中存储的数据整体是一个Map,其keyString类型,value可以是StringHashListSet等类型。

 

格式:keys pattern

功能:查询所有符合条件的patternkeypattern为正则表达式。

Keys查询速度非常快,但在一个大的数据库中使用它可能会阻塞当前服务器的服务。生产环境中一般不使用,使用scan命令代替。

 

keys * 查询所有


 

keys h* 查询以h开头


      


查询是否存在EXISTS


 

删除DEL


 

重命名RENAME


 

MOVE移动到另一个数据库

h20移动到3号库

TYPE查看类型

格式:TYPE key

返回key所存储的值的类型

类型:none(key不存在)String(字符串)list(列表)set(集合)、zset(有序表)hash(哈希表)

  


 

EXPIRE EXEPIRE设置生存时间

格式:EXPIRE key seconds

EXPIRE

PEXPIRE毫秒


 

TTL PTTL命令

TTL查看key的剩余生存时间

Key不存在时,返回-2

Key存在但没设置剩余生存时间时,返回-1

TTL

PTTL毫秒


 

PERSIST命令

格式:PERSIST key

key的生存时间转换为持久的

转换成功返回1

key不存在或key没有设置生存时间,则返回0


RANDOMKEY命令

格式:RANDOMKEY

从当前数据库中随机删除一个key

删除成功返回 key

库为null时返回 nil


SCAN命令

scan命令代替keys

     


 

Value命令-String

Redis存储数据的Value可以是一个String类型数据。String类型的ValueRedis中最基本,最常见的类型。

String类型的Value可以存放任意类型数据。

String类型的Value最大是512M


set

格式:SET key value

EX:设置过期时间,秒

PX:设置过期时间,毫秒

NX:指定的key不存在才会设置成功。等价于SETNX

XX:指定的key必须存在,相当于更新value值。



 

setex

setex n1 300 hello 等同于set n1 hello ex 300


setnx

setnx name hello 等同于 set name hello NX


getset


 

mset

mset key1 value1 key2 value2 key3 value3


 

msetnx


mget


 

Append追加


 

incr 自增 和 decr自减

strlen


getrange

格式:getrange key start end

-1表示最后一位


  

setrange

格式:setrange key offset value

Hashvalue操作命令

Redis存储数据的Value可以是一个Hash类型。Hash类型也称为Hash表、字典等。

Hash表就是一个映射表Map,也是由键-值对构成,为了与整体的key进行区分,这里的键称为field,值称为value

RedisHash表中的file-value对均为String类型。

 

Hash类型Value非常四盒存储对象数据。Key为对象名称,value为描述对象属性的Map,对对象属性的修改在Redis中就可以直接完成,其不像StringValue存储对象,那个对象是序列化过的,如序列化为JSON串,对对象属性值的修改需要先反序列化为对象后再修改,修改后再序列化为JSON串写入到Redis

 

hsethmset


格式:hset names name1 zhangsan name2 baoguo

hmset等价于hset

hsetnx

nx:指定的key不存在才会设置成功。等价于SETNX

 

hgethmget


 

hgetall hkeys hlen hvals


 

hdel

删除file


 

hexists

查看是否存在


 

hincrby

增加


hstrlen

查看field的长度

ListValue操作命令

Redis存储数据的 Value可以是一个 String列表类型数据,即该列表中的每个元素均为ting类型数据,列表中的数据会按照插入顺序进行排序,不过,该列表的底层实际是一个无头节点的双向链表,所以对列表表头与表尾的操作性能较高,但对中问元素的插入与删除的操作的性能相对较差。

lpush rpush


lrange lindex

lrange 元素 开始下标  结束下标  、结束下标:-1表示最后 格式:lrange key start stop

格式:lindex key index


lset rpushx

格式:lset key index element

格式:rpush key element [element ...]

rpushxx表示必须存在


linsertlpop rpop

格式:linsert key BEFORE|AFTER pivot element

格式:lpop key [count]

 

rpoplpush

格式:rpoplpush source destination

 

Lrem

格式:lrem key count element

 

Ltrim

格式:ltrim key start stop

保留指定区域


 

lpush + rpop可以实现队列数据结构效应,先进先出。通过lpush从左侧插入数据,通过rpop右侧取出数据。或rpush+lpop

lpush + brpop可以实现阻塞式消息队列效果。

lpush+lpop可以实现栈数据结构,先进后出。或rpush+rpop

Setvalue操作命令

set集合中的元素具有无序性与不可重复性。

应用场景:1、动态黑白名单 2、有限随机数 3、用户画像

sadd smembers

格式:sadd key member [member ...

格式:smembers key


 

sismember

格式:sismember key member


smove

格式:smove source destination member


srem

格式:srem key member [member ...]


 

srandmember

srandmember key [count]

随机获取

spop

sdiff差集

将相同的元素去掉

格式:sdiff key [key ...]


 

sdiffstore

格式:sdiffstore destination key [key ...]

ccat的差集结果存入result


sinter sinterstore

sinter key [key ...]

sinterstore destination key [key ...]

Sunion sunionstore

sunion key [key ...]

sunionstore destination key [key ...]

有限ZSetValue操作命令

Redis存储数据的vaue可以是一个有序Set,这个有序set中的每个元素均 String类型。有序setset的不同之处是,有序Set中的每一个元素都有一个分值 score, Redis会根据score的值对集合进行由小到大的排序。其与set集合要求相同,元素不能重复,但元素的score可以重复。由于该类型的所有命令均是字母z开头,所以该Set也称为Zset

zadd

格式:zadd key [NX|XX] [GT|LT] [CH] [INCR] score member [score member ...]


zrangezrevrange

格式:zrange key start stop

格式:zrevrange key start stop


  

zrangebyscore

格式:zrangebyscore key min max [WITHSCORES] [LIMIT offset count]


 

zcount zcard

格式:zcount key min max

格式:zcard key

  


zscorezrank

格式:zscore key member

格式:zrank key member

zincrby

格式:zincrby key increment member


Zremzremrangebyrank

移除

格式:zrem key member [member ...]

格式:zremrangebyrank key start stop

格式:zremrangebyscore key min max


zrangebylex

zrangebylex适用于集合中所有成员具有相同分值的情况。

格式:zrangebylex key min max [LIMIT offset count]

benchmark测试工具

Redis自带一个benchmark测试工具,用来测试redis的性能,是一个压力测试工具。

redis-server redis.conf

redis-benchmark -h 127.0.0.1 -p 6369 -c 50 -n 10000 -a password

redis-benchmark -c 50 -n 10000 -a password

 



简单动态字符串SDS

RedisKey Value,其基础数据类型都是字符串。例如,Hash Valuefield value的类型、List型、Set型、ZSet Value的元素的类型等都是字符串。虽然Redi是使用标准C语言开发的,并没有直接使用C语言中传统的字符串表示,而是自定义了种字符串。这种字符串本身的结构比较简单,但功能却非常强大,称为简单动态字符串Simple Dynamic String,简称SDS

 

SDS结构

       SDS不同于字符串。C字符串本身是一个双引号括起来的,以’\0’结尾的字符序列。

SDS是一个结构体,定义在Redis安装目录下的src/sds.h中。

Redis中的字符串并不都是SDS,也会是C字符串。C字符串只会出现在字符串“字面常量”中,并且该字符串不可能发生变更。

 

struct sdshdr{

  //字节数组,用于保存字符串

  char buf[];

  //buf[]中已使用字节数量,称为SDS

  int len;

  //buf[]中尚未使用的字节数量

  int free;

}

   

常用SDS操作函数

sdsnew() 使用指定的C字符串创建一个SDS

sdsempty() 创建一个不包含任何字符串数据的SDS

sdsdup() 创建一个SDS副本

sdsfree() 释放指定的DS

sdsclear() 清空指定SDS的字符串内容

sdslen() 获取指定SDS的已使用空间len

sdsavail() 获取指定SDS的未使用空间free

sdsMakeRoomFor() 使指定SDSfree空间增加指定的大小

sdsRemoveFreeSpace() 释放指定SDSfree空间

sdscat() 将指定的C字符串拼接到指定SDS字符串末尾

sdscatsds() 将指定的SDS字符串拼接到指定SDS字符串末尾

sdscpy() 将指定的C字符串拼接到指定SDS中并覆盖原字符串内容

sdsgrouzero() 扩展SDS字符串到指定长度。此扩展是使用空字符’\0’填空

sdsrange() 截取指定范围内的SDS字符串

sdstrim() 在指定SDS中删除所有指定C字符串中出现的所有字符

sdsemp() 对比两个给定的SDS字符串是否相同

sdstolow() 将指定SDS字符串中的所有字母变小写

sdstoupper() 将指定SDS字符串中的所有字母变大写

 

SDS的优势

C字符串使用Len+1长度的字符数组来表示实际长度为Len的字符串,字符数组最后以空字符\0结尾,表示字符串结束。这种结构简单,但不能满足 Redis对字符串功能性、安全性及高效性等的要求。

 

防止字符串长度获取性能瓶颈

对于C字符串,若要获取其长度,则必须要通过遍历整个字符串才可获取到的。对于超长字符串的遍历,会成为系统的性能瓶颈但,由于sDs结构体中直接就存放着字符串的长度数据,所以对于获取字符串长度需要消耗的系统性能,与字符串本身长度是无关的,不会成为 Redis的性能瓶颈。

 

保证二进制安全

C字符串中只能包含符合某种编码格式的字符,例如 ASCII UTF-8,并且除了字符串末尾外,其它位置是不能包含空字符0,否则该字符串就会被程序误解为提前结束。而在图片、音频、视频、压缩文件、 office文件等二进制数据中以空字符\o作为分隔符的情况是很常见的。故而在C字符串中是不能保存像图片、音频、视频、压缩文件、 office文件等进制数据的。

SDS不是以空字符"0作为字符串结束标志的,其是通过len属性来判断字符串是否结束的。所以,对于程序处理SDS中的字符串数据,无需对数据做任何限制、过滤、假设只需读取即可。数据写入的是什么,读到的就是什么。

 

减少内存再分配次数

       SDS采用了空间预分配策略与空间预分配策略是指,每次SDS进行空间扩展时,程序不但为其分配所需的空间,还会为其分配额外的未使用空间,以减少内存再分配次数。而额外分配的未使用空间大小取决于空间扩展后SDSlen属性值。

如果len属性值小于1M,那么分配的未使用空间free的大小与len属性值相同

如果len属性值大于等于1M,那么分配的未使用空间free的大小固定是1M

SDS对于空间释放采用的是惰性空间释放策略。该策略是指,SDS字符串长度如果缩短,那么多出的未使用空间将暂时不释放,而是增加到free中。以使后期扩展SDS时减少内存再分配次数。

如果要释放SDs的未使用空间,则可通过 sdsRemovefreeSpace0函数来释放。

 

兼容C函数

       Redis中提供了很多的SDSAPI,以便用户对Redis进行二次开发。为了能够兼容C函数,SDS的底层组buf[]中的字符串仍以字符串’\0’结尾。

 

zipList

       zipList,通常称为压缩列表,是一个经过特殊编码的用于存储字符串或整数的双向链表。

其底层数据结构由三部分构造:headentries、与end。这三部分在内存上是连续存放的。

Head

zlbytes:4个字节,用于存放ziplist列表整体数据结构所占的字节数,包括bytes本身的长度。

zltail:4个字节,用于存放ziplist中最后一个 entry在整个数据结构中的偏移量(字节)。该数据的存在可以快速定位列表的尾 entry位置,以方便操作

zllen:2字节,用于存放列表包含的 entry个数。由于其只有16,所以 ziplist最多可以含有的 entry个数为215-1=6535

entries

entries是真正的列表,由很多的列表元素 entry构成。由于不同的元素类型、数值的不同,从而导致每个 entry的长度不同。

每个enty由三部分构成

prevlength:该部分用于记录上一个 entry的长度,以实现逆序遍历默认长度为1字节,只要上一个 entry的长度<254字节, prevlength就占1字节,否则其会自动扩展为3字节长度。encoding:该部分用于标志后面的data的具体类型。如果data为整数类型, encoding固定长度为1字节。如果data为字符串类型, encoding长度可能会是1字节、2字节或5字节。data字符串不同的长度,对应着不同的 encoding长度。

data:真正存储的数据。数据类型只能是整数类型或字符串类型。不同的数据占用的字节长度不同。

end

end只包含一部分,称为zlend,占1字节,值固定为255,即二进制位全为1,表示zipList列表的结束。

listPack

对于Ziplist,实现复杂,为了逆序遍历,每个 entry中包含前一个 entry的长度,这样会导致在 ziplist中间修改或者插入enty时需要进行级联更新。在高并发的写操作场景下会极度降低 Redis的性能。为了实现更紧凑、更快的解析,更简单的实现,重写实现了 ziplist,并命名为 listpack

Redis7.0,已经将 ziplist全部替換为了 listpack,但为了兼容性,在配置中也保留ziplist的相关属性。

 

listPack也是一个经过特殊编码的用于存储字符串或整数的双向链表。其底层数据结构部分构成:head entriesend,且这三部分在内存上也是连续存放的tpack Ziplist的重大区别在head与每个 entry的结构上,表示列表结束的end ziplistend是相同的,占一个字节

 


head

head由两部分构成:

totalbytes:4个字节,用于存放 list Pack列表整体数据结构所占的字节数,包括totalbytes本身的长度

elemNum:2字节,用于存放列表包含的entry个数。其意义与 ziplistlen的相同与 Ziplisthead相比,没有了记录最后一个 entry偏移量的 entail

 

entries

entries也是 list Pack中真正的列表,由很多的列表元素 entry构成。由于不同的元素类型、数值的不同,从而导致每个entry的长度不同。但与ziplistentry结构相比, listPackenty结构发生了较大变化。其中最大的变化就是没有了记录前一个enty长度的 prevlength,而增加了记录当前

entry长度的 element-totak-len。而这个改变仍然可以实现逆序遍历,但却避免了由于在列表中间修改或插入enty时引发的级联更新

每个enty仍由三部分构成

encoding:该部分用于标志后面的data的具体类型。如果data为整数类型, encoding长度可能会是123459字节。不同的字节长度,其标识位不同。如果dat为字符串类型, encoding长度可能会是125字节。data字符串不同的长度,对应着不同的 encoding长度

data:真正存储的数据。数据类型只能是整数类型或字符串类型。不同的数据占用的字节长度不同

element-tota-len:该部分用于记录当前 entry的长度,用于实现逆序遍历。由于其特殊的记录方式,使其本身占有的字节数据可能会是125

 

skipList

skiplist,跳跃列表,简称跳表,是一种随机化的数据结构,基于并联的链表,宏现简单,査找效率较高。简单来说跳表也是链表的一种,只不过它在链表的基础上增加了跳跃功能也正是这个跳跃功能,使得在査找元素时,能够提供较高的效率。

 

quickList

quicklist,快速列表, quicklist本身是一个双向无循环链表,它的每一个节点都是一个ilitReds3.2版本开始,对于Lt的底层实现,使用 quicklist替代了pLitiketziplist lin kedlist都存在有明显不足, quicklist则对它们进行了改进:吸取了 ziplist linkedlist的优点,避开了它们的不足quicklist本质上是 ziplist linkedlist的混合体。其将 linkedlist按段切分,每一段使用ziplist来紧凑存储若干真正的数据元素,多个 ziplist之间使用双向指针串接起来。当然对于每个 ziplist中最多可存放多大容量的数据元素,在配置文件中通过 list-max- ziplist-size属性可以指定。

 

 

BitMap操作命令

Bitmap Redis2.2.0版本中引入的一种新的数据类型。该数据类型本质上就是一个仅包含01的二进制字符串。而其所有相关命令都是对这个字符串二进制位的操作。用于描述该字符串的属性有三个:key offset bitvalue

key: Bitmap Redis key-value中的一种vaue的数据类型,所以该vaue一定有其对应的key

offset:每个BitMap数据都是一个字符串,字符串中的每个字符都有其对应的索引,该索引从0开始计数。该索引就称为每个字符在该 Bitmap中的偏移量 offset。这个 offset的值的范围是[0,232-1],即该 offset的最大值为4G1,4294967295,42亿多。

bitvalue:每个 Bitmap数据中都是一个仅包含01的二进制字符串,每个 offset位上的字符就称为该位的值 bitvalue bitvalue的值非01

setbit getbit

格式:setbit key offset value

格式:getbit key offset

bitcount

格式:bitcount key [start end [BYTE|BIT]]

bitpos

格式:bitpos key bit [start [end [BYTE|BIT]]]

 

bitop

格式:bitop operation destkey key [key ...]

and 并运算 dest 并运算的结果存储在dest里面

HyperLogLog操作命令

超级日志记录该数据类型可以简单理解为ー个set集合,集合元素为字符串。但实际Hyperloglog是一种基数计数概率算法,通过该算法可以利用极小的内存完成独立总数的统计。其所有相关命令都是对这个“set集合的操作Hyperloglog算法是由法国人 Philippe Flajolet博士研究出来的, Redis的作者 Antirez为了纪念 Philippe Flajolet博士对组合数学和基数计算算法分析的研究,在设计 Hyperloglog命令的时候使用了Philippe Flajole姓名的英文首字母PF作为前缀。

 

HyperLogLog应用场景

       HyperLogLog可对数据量超级庞大的日志数据做到不精确的去重计数统计。误差是0.81%UV数据适合使用HyperLogLog进行记录。

pfadd

格式:pfadd key [element [element ...]]


pfcount

格式:pfcount key [key ...]

 


pfmerge

格式:pfmerge destkey sourcekey [sourcekey ...]

citydatabase集合合并到sum


 

Geospatial操作命令

Geospatial,地理空间。

Redis3.2版本中引入了Geospatial这种新的数据类型。该类型本质上仍是一种集合只不过集合元素比较特殊,是一种由三部分构成的数据结构,这种数据结构称为空间元素

经度: longitude。有效经度为[-180,180]。正的表示东经,负的表示西经。

伟度: latitude。有效纬度为185.05112878,85.05112878]。正的表示北纬,负的表示南位置名称:为该经纬度所标注的位置所命名的名称,也称为该 Geospatial集合的空间元素名称。通过该类型可以设置、查询某地理位置的经纬度,査询某范围内的空间元素,计算两空间元素间的距离等。

应用场景:QQ动态中的“附件”功能,钉钉定位签到等,微信“发现”功能

geoadd

格式:geoadd key [NX|XX] [CH] longitude latitude member [longitude latitud


 

geodist

格式:geodist key member1 member2 [M|KM|FT英尺|MI英里]

默认值为M

geopos

格式:geopos key member [member ...]

 

geohash

格式:geohash key member [member ...]

geohash是一种地址编码方法。把二维的空间维度数据编码成一个字符串。该值主要用于底层应用功或调试,实际中的用处不大。

georadius

格式:georadius key longitude latitude radius M|KM|FT|MI [WITHCOORD] [WITHDIST] [WITHHASH] [COUNT count

查看范围内

发布订阅操作命令

 

subscribe

格式:subscribe channel [channel ...]

功能: Redis客户端通过一个 subscribe命令可以同时订阅任意数量的频道。在输出了订阅了主题后,命令处于阻塞状态,等待相关频道的消息。

psubscribe

格式:psubscribe pattern [pattern ...]

功能:订阅一个或多个符合给定模式的频道。说明:这里的模式只能使用通配符*。例如,*可以匹配所有以开头的频道, it newsit blog it tweets;news.*可以匹配所有以news开头的频道,news. global. today


   


publish

格式:publish channel message


   

unsubscribe

取消订阅

格式:unsubscribe [channel [channel ...]]

punsubscribe

格式:punsubscribe [pattern [pattern ...]]

功能:退订一个或多个符合给定模式的频道

这里的模式只能使用通配符*。如果没有频道被指定,其效果与 SUBSCRIBE命令相同,客户端将退讧所有订阅的频道

 

pubsub

PUBSUB是一个查看订阅与发布系统状态的内省命令集,它由数个不同格式的子命令组成,下面分别介绍这些子命令的用法。

pubsub channels

格式:pubsub channels [pattern]

列出当前所有的活跃频道。活跃频道指的是那些至少有一个订阅者的频道。说明: pattern参数是可选的。如果不给出 pattern参数,将会列出订阅/发布系统中的所有活跃频道。如果给出 pattern参数,那么只列出和给定模式 pattern相匹配的那些活跃频道。 pattern中只能使用通配符*


 


pubsub numsub

格式:pubsub numsub [channel [channel ...]]

返回给定频道的订阅者数量

 

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。