Redis数据类型与操作命令

1. 键值对数据库

1.1 redis数据结构

redis的数据是 key-value 形式的键值对,其中 key 其实都是字符串的形式,而 value 的数据类型,也就是数据的保存形式,底层实现的方式就用到了数据结构。

所以我们一直说的“redis五种数据结构”,严格上来说是“redis五种数据类型”。

redis数据类型和底层数据结构的对应关系图如下
redis数据类型
可以看出,redis3.0与之后的版本,对象底层数据结构是有所不同的。

  1. redis3.0中list数据类型的底层数据结构由【双向列表】和【压缩列表】实现,而在3.2版本之后,list数据类型底层数据结构由quicklist实现。
  2. 压缩列表数据结构已经废弃,由listpack数据结构替代了。

所以,在redis3.0之后的版本,redis的数据结构有六种:SDS、quicklist、listpack、哈希表、整数集合、跳跃列表。


1.2 redis对象与数据结构关系

我们都知道redis是一个 key-value 形式的数据库,所有的 key 都是字符串,而 value 可以是字符串,也可以是list、hash、set、sortedset这些数据类型。

这些键值对怎么保存在redis中?
redis使用了一个哈希表保存所有键值对。哈希表的优点就是可以用O(1)的时间复杂度快速查找键值对对象,哈希表其实也是一个数组,每个元素都是一个哈希桶。
哈希表存放键值对的关系图如下所示
Redis存储结构
再搭配上面的redis数据类型和数据结构的关系,就知道redis对象和数据结构的关系了。

redis是用C语言实现的,所以redis的数据结构实际上就是C语言的数据结构。
如果想更深层次了解redis的数据结构,可以看这位大佬写的文章redis数据结构详解


2. 五种常用数据类型

作为Java开发工程师,我们需要熟知这五种常用的数据类型,并知道其操作命令,以及通过Java语言操作这五种数据类型。

2.0 key

2.0.1 类型

string字符串类型

2.0.2 通用操作命令

查看数据库中key

keys *         查看数据库所有key
keys k*        匹配以k开头的key
keys k*s       匹配以k开头,以s结尾的key
keys k?s       匹配以k开头,以s结尾,且中间只能有一个字符的key

删除key

del key
del key1 key2 ...
返回删除成功的个数

判断key在数据库中是否存在

exists key                       如果存在,则返回1;如果不存在,则返回0
exists key [key1 key2 ....]      返回值是存在的key的数量

移动key到指定的数据库

move key index
index从0开始,默认范围为0~15,代表redis的16个数据库

设置key的最大存活时间

expire key seconds

查看key的剩余存活时间

ttl key
如果key没有设置生存时间,返回-1
如果key不存在,返回-2

查看key的数据类型

type key

重命名key

rename key newkey

2.1 string

2.1.1 底层结构

类比Java的String类型,底层通过SDS(simple dynamic string)结构实现。
保存的是字符串类型数据,如果字符串以整数形式展示,可以作为数字操作使用。

单key - 单value结构

2.1.2 操作命令

新建键值对

set key value
如果key已经存在,则value会覆盖

setnx key value
如果key已经存在,则放弃设置

setex key seconds value
新建key的同时设置它的最大存活时间

mset k1 v1 k2 v2 k3 v3
批量设置字符串,若key重复,value覆盖

msetnx k1 v1 k2 v2 k3 v3
批量设置字符串,有一个key重复,全部放弃设置

获取value

get key            单个获取字符串
mget k1 k2 k3 k4   批量获取字符串

字符串追加

append key value
返回追加后的字符串长度
如果key不存在,新建key,设置value值为value

获取字符串数据长度

strlen key

字符串数值处理

incr key              数值+1
decr key              数值-1
incrby key offset     数值+offset
decrby key offset     数值-offset
返回操作后的value值
如果key不存在,首先创建这个key,设置value为字符串0,然后进行运算
如果key对应的value不是整数,报错

闭区间获取子字符串

getrange key startIndex endIndex
字符串下标可以从左往右从0开始,也可以从右往左从-1开始,二者是等价的

用value覆盖字符串

setrange key startIndex value
从第startIndex个字符开始,用value能覆盖几个字符就覆盖几个字符
返回覆盖后字符串的长度

2.2 list

2.2.1 底层结构

底层采用quicklist的数据结构,可以理解为一个双向链表,最左侧是表头,最右侧是表尾。
元素下标也是从左往右从0开始,从右往左从-1开始。
列表元素较少时使用ziplist存储,它将所有元素紧挨着存储,分配一块连续的内存空间。
数据量较多时redis将ziplist和链表结合起来形成quicklist。
列表里的元素只能是string类型。

单key - 多有序value结构

2.2.2 操作命令

创建列表key,将一个或多个值插入列表

lpush key value1 value2...     左插入
rpush key value1 value2...     右插入

更改指定位置元素值

lset key index value

获取指定下标区间的元素

lrange key startIndex endIndex
lrange key 0 -1    获取列表所有元素

移除并返回元素

lpop key    左弹出
rpop key    右弹出
pop每次只能移除并返回一个元素

获取列表中指定下标的元素值

lindex key index

获取列表长度

llen key

移除count个列表中和value相等的数据

lrem key count value
count > 0    从左侧计数
count < 0    从右侧计数
count = 0    移除全部

保留指定范围元素(闭区间)

ltrim key startIndex endIndex

2.3 hash

2.3.1 底层结构

类似于Java的HashMap,数组+链表的数据结构
hash的内容 field-value 键值对存放在链表中,数组存放的是链表的头指针

单key - 多field-value对象结构;可以认为是key和field联合组成一个key。

hash类型的key可以理解为一个类,field为类中属性,value是属性值。

2.3.2 操作命令

创建哈希表key,将一个或多个键值对放入哈希表

hset key filed1 value1 field2 value2...
如果key field已经存在,则value会把以前的值覆盖掉

获取指定哈希表指定field的值

hget key field
hmget key field1 field2...

获取哈希表内所有field和value

hgetall key

从哈希表中删除一个或多个key

hdel key field1 field2....

获取哈希表中field个数

hlen key

判断哈希表是否存在某个field

hexists key field

获取field列表

hkeys key

获取value列表

hvals key

设置field-value到哈希表,如果这个field-value已经存在,放弃设置

hsetnx key field value

2.4 set

2.4.1 底层结构

类似于Java的HashSet,底层也是hash的数据结构,所有value指向同一个内部值
往set里放置元素时,实际上是放置在hash的field上,达到去重效果。

单key - 多无序value,value不能重复。

2.4.2 操作命令

创建set集合,放置一个或多个元素

sadd key value1 value2...

获取集合中所有元素

smembers key

判断指定元素在集合中是否存在

sismember key member

获取集合元素个数

scard key

移除集合中一个或多个元素

srem key value1 value2...

随机获取集合中一个或多个元素

srandmember key count
count > 0   元素不能有重复
count < 0   元素可能有重复

随机移除集合中一个或多个元素

spop key count

将一个集合的指定元素移动到另一个集合

smove source dest value

集合的差集、交集、并集

获取第一个集合中有、但是其它集合中都没有的元素组成的新集合

sdiff key1 key2...

获取所有指定集合中都有的元素组成的新集合(交集)

sinter key1 key2...

获取所有指定集合中所有元素组成的大集合(并集)

sunion key1 key2

2.5 sortedset(zset)

2.5.1 底层结构

zset其实和hash类型很像,hash的值是field-value键值对,zset的值是value-score键值对,hash的field不能重复,zset的value也不能重复。

zset和set的不同之处在于set是无序的,而zset会根据每个元素的分数进行自动排序(从小到大),所以是有序的,而且每一个元素都有对应的下标。

zset是单key - 多value-score对象结构,底层用到了跳跃列表的数据结构。

2.5.2 操作命令

将一个或多个value-score值放入有序集合

zadd key score1 value1 score2 value2

获取有序集合中指定下标区间的元素

zrange key startIndex endIndex [withscores]
[withscores] 为可选项,如果加上这个,可以让score和value一起返回

获取有序集合中指定分数区间的元素(闭区间)

zrangebyscore key min max [withscores]

获取有序集合中元素个数

zcard key

获取有序集合中指定分数区间内元素个数

zcount key min max

获取有序集合中指定元素排名(从0开始)

zrank key value

获取有序集合中指定元素分数

zscore key value

删除有序集合中一个或多个元素,不存在的元素忽略

zrem key value1 value2...
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Redis支持多种数据类型操作,包括链表、集合和位图等。 对于链表类型的数据,可以使用lrem命令从链表中删除指定的值。lrem命令的作用是从key链表中删除value值,可以通过设置count参数来指定删除的个数和方向。当count大于0时,从表头开始删除;当count小于0时,从表尾开始删除。例如,使用lrem命令从名为anwser的链表中删除2个值为a的元素,可以执行以下命令: ``` lrem anwser 2 a ``` 执行完毕后,anwser链表中的值为\["a", "d", "c", "b", "a"\]。\[1\] 对于集合类型的数据,可以使用srem命令从集合中移除指定的元素。例如,使用srem命令从名为setkey的集合中移除setvalue3,可以执行以下命令: ``` srem setkey setvalue3 ``` 执行完毕后,setkey集合中的值为\["setvalue1", "setvalue2"\]。\[2\] 对于位图类型的数据,可以使用setbit命令设置指定偏移量上的二进制位的值。例如,使用setbit命令将名为char的键的第2位设置为1,可以执行以下命令: ``` setbit char 2 1 ``` 执行完毕后,char键对应的值为"a"。如果再将第2位设置为0,可以执行以下命令: ``` setbit char 2 0 ``` 执行完毕后,char键对应的值为"A"。\[3\] 综上所述,Redis提供了丰富的数据类型操作命令,可以根据具体需求选择适合的命令进行操作。 #### 引用[.reference_title] - *1* *3* [redis各种数据类型操作](https://blog.csdn.net/ldTrueLove/article/details/111594178)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [redis当中各种数据类型操作](https://blog.csdn.net/weixin_42518541/article/details/105722913)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值