Redis中常用数据结构

目录

常用的数据结构

string类型

set

mget/mset

setnx/setex/psetex

incr/incrby/decr/decrby/incrbyfloat

append

getrange/setrange

strlen

hash类型

hset/hget/hexists/hdel

hkeys/hvals

hgetall/hmget

hlen/hsetnx/hincrby/hincrbyfloat

内部编码

list类型

lpush/lrange

lpushx/rpush/rpushx

lpop/rpop

lindex/linsert/llen

lrem

ltrim/lset

blpop/brpop

set类型

sadd/smembers/sismember

spop/srandmember

smove/srem

sinter/sinterstore/sunion/sunionstore/sdiff/sdiffstore


常用的数据结构

Redis中常用的数据类型如下图所示:

每一种数据类型的编码实现方式也不同,不同的数据结构编码实现方式如下:

|--------|------------|
| 数据结构 | 内部编码 |
| string | raw |
| string | int |
| string | embstr |
| hash | hashtable |
| hash | ziplist |
| list | linkedlist |
| list | ziplist |
| set | hashtable |
| set | intset |
| zset | skiplist |
| zset | ziplist |

raw是最基本的字符串,底层持有一个char数组;当value就是一个整数的时候,redis会使用int来保存;embstr是针对短字符串进行的特殊优化。

hashtable为最基本的哈希表;ziplist为压缩列表,在哈希表元素较少的时候会使用,能够节省空间。

linkedlist为基本的链表;ziplist为压缩列表;redis 3.2之后,引入了新的实现方式quicklist,这个数据结构同时兼顾了linkedlist和ziplist的优点,将时间和空间效率都兼顾到。

skiplist为跳表。

查看编码方式可使用object encoding key指令。

string类型

Redis中的字符串,直接就是按照二进制数据的方式存储的,不会做任何的编码转换,存的是啥,取出来就是啥;Redis对于string类型,限制了大小最大是512M。

set

set命令语法如下:

复制代码
set key value [expiration EX seconds | PX milliseconds] [NX|XX]

在设置时可以设置超时时间,NX表示如果key不存在,才设置,如果key存在,则不设置(返回nil);XX表示如果key存在,才设置(相当于更新key的value)并进行覆盖,原来key的ttl时间也会失效,如果key不存在,则不设置(返回nil)。

mget/mset

mset和mget可以一次性操作多个key和value,语法如下:

复制代码
mget key [key ...]
mset key value [key value ...]

setnx/setex/psetex

setnx用来在设置key时同时设置了nx,不存在才能设置,存在则设置失败。setex用来指定key的超时时间,时间单位为秒,psetex的超时时间单位为微秒。

incr/incrby/decr/decrby/incrbyfloat

incr为针对value + 1,incrby针对value+n,decr针对vlaue-1,decrby针对value-n,incrbyfloat为针对value进行+/-一个小数,返回值为计算结果之后的值。

若操作的key不存在,就会把这个key的value当做0来使用。

append

append用来对字符串进行拼接,如果key已经存在并且是一个string,命令会将value追加到原有string的后面,如果key不存在,效果相当于set命令,append返回的长度为拼接字符串后的字节长度,append语法如下:

复制代码
append key value

getrange/setrange

getrange可以返回key对应的string的子串,由start和end确定(左闭右闭)。可以使用负数表示倒数。-1代表倒数第一个字符串,-2代表倒数第二个,超过范围的偏移量或根据string的长度调整为正确的值。语法如下:

复制代码
getrange key start end

该函数返回string类型的子串。

setrange用来修改字符串,语法如下:

复制代码
setrange key offset value

offset为偏移量,代表开始进行替换的位置,返回替换后的字符串长度,

若setrange对一个不存在的key进行操作,就会在对应的位置凭空生成字节0x00,并将要替换的字符串追加到后面。

strlen

能获取到字符串长度,获取到的长度为字节。语法如下:

复制代码
strlen key

返回字符串的长度,当key不存在时,返回0。

hash类型

Redis本身就是键值对,自身的键值对就是通过哈希的方式来组织的,不过,v将key这一层组织完了后,到了value这一层,还可以是哈希。

hset/hget/hexists/hdel

hset用来设置键值对,语法如下:

复制代码
hset key field value [field value ...]

返回值为设置成功的键值对的个数。

value为字符串类型的数据。

hget用来获取hash中指定的字符串,语法如下:

复制代码
hget key field

若对应的key或者field不存在,都会返回nil。

hexists用来判断hash中是否有指定的字段,语法如下:

复制代码
hexists key field

hdel用来删除hash对应的field,语法如下:

复制代码
hdel key field [field...]

返回值为成功删除的个数。

hkeys/hvals

hkeys可以用来对应的hash的所有字段。

复制代码
hkeys key

hvals用来获取hash中所有的val,语法如下:

复制代码
hvals key

在使用这个指令前,要保证对应的value为哈希类型。

hgetall/hmget

hgetall用来获取hash中所有的字段和对应的值,语法如下

复制代码
hgetall key

hmget可以查询多个field,语法如下:

复制代码
hmget key field1 [field ...]

查询结果中,多个value的顺序和field的顺序是匹配的。

hlen/hsetnx/hincrby/hincrbyfloat

hlen用来获取hash的元素个数,语法如下:

复制代码
hlen key

hsetnx用于在对应的key不存在时设置成功,存在则设置失败,语法如下:

复制代码
hsetnx key field value

返回值为1,表示设置成功;为0表示设置失败。

hincrby用于将hash中字段对应的数值添加指定的整数值。语法如下:

复制代码
hincrby key field increment

hincrbyfloat用于将将hash中字段对应的数值添加指定的小数值。语法如下:

复制代码
hincrbyfloat key field increment

hincrby和hincrbyfloat返回值都为对应字段变化之后的值。

内部编码

哈希的内部编码有两种,分别为ziplist和hashtable,当哈希类型元素个数较少时,会使用ziplist来表示,当元素个数较多时,会使用hashtable来表示;如果每个value的值长度比较短,使用ziplist来表示,如果某个value的长度太长了,也会转换成hashtable。

list类型

list用来存储多个有序的字符串,可以对列表两端插入(push)和弹出(pop),还可以获取指定范围的元素列表、 获取指定索引下标的元素等。

lpush/lrange

lpush可以将一个或多个元素从头部插入,语法如下:

复制代码
lpush key element [element ...]

若插入多个,则按照顺序头插,返回值为list的长度,如果key已经存在,并且key对应的value类型不是list,此时lpush就会报错。

lrange可以查看指定范围的元素。语法如下:

复制代码
lrange key start stop

这个start和stop支持负数,如下所示:

前面的序号是是专门给结果集使用的序号,和list的下标无关。若区间不合法,会尽可能获取合法区间的元素,如下所示:

lpushx/rpush/rpushx

lpush为在key存在时,将一个或者多个元素从头插到list中,不存在则直接返回;rpush可以将一个或多个元素从尾部插入;rpush为在key存在时,将一个或者多个元素从尾部插到list中,不存在则直接返回。

lpop/rpop

lpop可以从list左侧取出元素,即头删,语法如下:

复制代码
lpop key

rpop可以从list右侧取出元素,即尾删,语法如下:

复制代码
rpop key

lindex/linsert/llen

lindex指令为获取指定下标的元素,如果下标非法,会返回空值,语法如下:

复制代码
lindex key index

linsert可以在特定位置插入元素,语法如下:

复制代码
linsert key <before | after> pivot element

返回值为插入之后得到的新list长度。pivot为具体的值,不是通过下标,若基准值存在多个,从左往右寻找,找到第一个符合基准值的位置即可。

llen指令为获取list的长度,语法如下:

复制代码
llen key

lrem

lrem可以用来删除元素,语法如下:

复制代码
lrem key count element

count为要删除的个数,element为要删除的值,count > 0时,从左往右去找并删除;count < 0 时,从右往左去找并删除;count = 0 时,删除所有的element元素。

ltrim/lset

ltrim保留指定范围内的元素,范围外的元素全部删除,语法如下:

复制代码
ltrim key start stop

lset根据下标来修改元素,语法如下:

复制代码
lset key index element

如果下标越界则会报错。

blpop/brpop

blpop和brpop为lpop和rpop的阻塞版本,redis中的list也相当于阻塞队列一样,线程安全是通过单线程模型支持的,redis中的阻塞只支持队列为空的情况,如果list中存在元素,blpop和brpop就和lpop和rpop作用完全相同;如果list为空,blpop和brpop就会根据阻塞时间产生阻塞,一直阻塞到队列不为空为止,期间redis也可以执行其他命令。

同时,blpop和brpop也可以同时去尝试获取多个key的列表的元素,多个key对应多个list,哪个list有元素了,就会返回哪个元素。

如果多个客户端对同一个key执行blpop或者brpop,则最先执行命令的客户端就会得到弹出的元素。

blpop和brpop语法如下:

复制代码
[blpop | brpop] [key ... ] timeout

timeout为超时时间,单位为秒。

set类型

set集合类型就是将一些有关联的数据放到一起,集合中的元素是无序的,例如,1, 2, 32, 1, 3是一个集合。

sadd/smembers/sismember

sadd可以将一个或者多个元素添加到set中,注意,重复的元素无法添加到set中,语法如下 :

bash 复制代码
sadd key member [member ...]

返回值类型为添加成功元素的个数。

smembers可以查看set集合中的元素,语法如下:

bash 复制代码
smembers key

sismember用来判断一个元素是否在set中,语法如下:

bash 复制代码
sismember key member

查找成功返回1,查找失败返回0。

spop/srandmember

spop用来删除元素,但这个是随机删除,语法如下:

bash 复制代码
spop key [count]

count为要删除元素的个数,不指明默认删除1个。返回删除的元素。

srandmember可以随机获取set集合中的元素。语法如下:

bash 复制代码
srandmember key [count]

smove/srem

smove指令可以将一个元素从set中取出来并放到目标set中,语法如下:

bash 复制代码
smove source destination member

返回1说明移动成功,返回0说明移动失败。如果移动的元素在目标set中存在,则会按照先删除再插入的顺序执行;如果source中要移动的元素不存在,则移动失败,返回0。

srem用来将指定的元素从key中删除,语法如下:

bash 复制代码
srem key member [member ...]

返回值代表删除元素的数据个数。

sinter/sinterstore/sunion/sunionstore/sdiff/sdiffstore

sinter用来求集合间的交集,语法如下:

bash 复制代码
sinter key [key ...]

每个key都对应一个集合,返回值为最终交集的数据。

sinterstore用来将获取的交集保存到目标set中,语法如下:

bash 复制代码
sinterstore destination key [key ...]

返回值为交集的元素个数。

同样地,sunion/sunionstore为对应的求并集操作,sdiff/sdiffstore为对应的求差集操作。

相关推荐
用户3169353811832 小时前
MyBatis Mapper XML 文件解读
数据库
这个DBA有点耶2 小时前
数据库迁移灰度验证:从读流量到双写再到全量切换的完整路径
数据库·mysql·架构
Wang's Blog2 小时前
PostgreSQL笔记16: 索引基础——概念、类型、创建与最佳实践
数据库·笔记·postgresql
用户3169353811832 小时前
"批量"删除-sql
数据库
瀚高PG实验室3 小时前
SQL优化案例:使用分区表优化SQL查询性能
linux·服务器·数据库·sql·microsoft·postgresql
SelectDB3 小时前
15 分钟搭建 PostgreSQL + Apache Iceberg + Apache Doris 的湖仓分析平台
数据库
SelectDB3 小时前
科大讯飞可观测性底座:从 ES/Loki 到 Apache Doris 的可观测存储分析升级实践
数据库
SelectDB3 小时前
Cisco WebEx 数据平台统一改造:基于 Apache Doris / SelectDB 替换 Trino、Pinot、Iceberg 及 Kyuubi
数据库
数据技术说3 小时前
MySQL 和 PostgreSQL 的 CDC 方案到底有什么区别?
数据库·架构