Redis的5种数据类型及常用命令

本文深入解析Redis中的五种主要数据类型:String、List、Set、Hash和Sorted Set,包括各自的特性和常用命令,以及如何在实际场景中应用这些数据类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

redis的数据类型

  • String

String类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象string类型是Redis最基本的数据类型,一个redis中字符串value最多可以是512M

常用String类型命令

命令说明
set设置String类型的value值,直接符合我们对key-value的认知
get根据key的值获取之前设置的value值
append对指定key值的value进行追加内容,相当于字符串的拼接
strlen返回字符串字符的个数,若key不存在则显示为0
del删除key对应的value值
incr对key的value值进行count的加运算,前提是对应的value必须是数值类型
decr对key的value值进行count的减运算,前提是对应的value必须是数值类型
setex设置String类型value值,并指定存活时间单位(秒)
setnx设置给String类型的value值了,如果key对应的value值,则返回0,否则返回1,常用于分布式锁
getrange指定索引区间,获取key上对应的value值
setrange指定索引区间,覆盖key上对应value值

String实例演示

// 设置值
127.0.0.1:6379> set haha 1
OK
 // 追加值
 127.0.0.1:6379> append haha 23
(integer) 3
 // 获取值
127.0.0.1:6379> get haha
"123"
// 获取值的长度
127.0.0.1:6379> strlen haha
(integer) 3
// 自增1
127.0.0.1:6379> incr haha
(integer) 124
// 自减1
127.0.0.1:6379> decr haha
(integer) 123
// 自增指定单位数值
127.0.0.1:6379> incrby haha 3
(integer) 126
// 自减指定单位数值
127.0.0.1:6379> decrby haha 3
(integer) 123

// 获取指定索引的值(其中0代表从头开始,-1 表示在尾结束)
127.0.0.1:6379> getrange haha 0 -1
"126redis"
// setRange 从指定索引0开始覆盖元素
127.0.0.1:6379> setrange haha 0 fast
(integer) 8
127.0.0.1:6379> get haha
"fastedis"
// 设置key的值并指定生存时间12秒
127.0.0.1:6379> setex redis 12 value
OK
// 设置值,当且仅当值可以写入时,返回1,否则为0,常用作分布式锁
127.0.0.1:6379> setnx xixi 2
(integer) 1
127.0.0.1:6379> setnx xixi 3
(integer) 0
127.0.0.1:6379> get xixi
"2"

// 设置多个值
127.0.0.1:6379> mset aa 1 bb 2 cc 3
OK
// 获取多个key值
127.0.0.1:6379> mget aa bb cc
1) "1"
2) "2"
3) "3"
// 先获取值在设置值
127.0.0.1:6379> getset xixi 4
"2"
127.0.0.1:6379> get xixi
"4"
  • List

List(列表)
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素导列表的头部(左边)或者尾部(右边)。它的底层实际是个链表,你可以把它想象成java的栈

List常用方法

命令说明
lpush将一个或多个值 value 插入到列表 key 的表头 ,如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头
lrange返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定。0代表第一个元素,-1表示列表最后一个元素
lpop移除并返回列表 key 的头元素。即弹出最左边的元素,也就是最后一个lpush的元素
llen返回列表的长度,若key不存在则显示为0
lrem根据参数 count 的值,移除列表中与参数 value 相等的元素。count 的值可以是以下几种:count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。count = 0 : 移除表中所有与 value 相等的值。
lindex返回列表对应索引的value值
linsert在表头已知元素前或者后添加元素
lset将列表 key 下标为 index 的元素的值设置为 value
ltrim对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,其他区间全部删除

List实例演示

// 向列表添加元素
127.0.0.1:6379> lpush cache::num 1 2 3
(integer) 3
// 获取所有的元素
127.0.0.1:6379> lrange cache::num 0 -1
1) "3"
2) "2"
3) "1"
// 弹出列表的头元素
127.0.0.1:6379> lpop cache::num
"3"
// 判断列表长度
127.0.0.1:6379> llen cache::num
(integer) 2
127.0.0.1:6379> llen gan
(integer) 0
// 删除列表的某个值(从表头开始删除1个列表为2的值)
127.0.0.1:6379> lrem cache::num 1 2
(integer) 1
// 返回列表表头元素值
127.0.0.1:6379> lindex cache::num 0
"1"
// 在列表1元素前添加2
127.0.0.1:6379> linsert cache::num before 1 2
(integer) 2
// 将索引为0(表头)的元素设置为4
127.0.0.1:6379> lset cache::num 0 4
OK
// 保留指定区间的值如保留0 1,即保留表头前两个元素
127.0.0.1:6379> ltrim cache::num 0 1
OK
  • Set

Redis的Set是string类型的无序集合。它是通过hash散列key实现,可理解为java中的set,同样的key对应value是不重复的

Set常用方法

命令说明
sadd将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将不在添加
smembers遍历获取set集合key对应的value值
scard判断集合value值的个数
srem移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。
spop移除并返回集合中的一个随机元素。
srandmember选定key随机返回元素个数, 如果 count 为正数,且小于集合基数,那么命令返回一个包含 count 个元素的数组,数组中的元素各不相同。如果 count 大于等于集合基数,那么返回整个集合。如果 count 为负数,那么命令返回一个数组,数组中的元素可能会重复出现多次,而数组的长度为 count 的绝对值。注意⚠️ 该操作和 SPOP key 相似,但 SPOP key 将随机元素从集合中移除并返回,而 SRANDMEMBER 则仅仅返回随机元素而不对集合进行任何改动
smove将 member 元素从 A 集合移动到 B 集合。
sdiffA集合和B集合的差集(属于A元素但是不属于b元素)
sinterA集合和B集合的交集(属于A元素也属于b元素)
sunionA集合和B集合的合集(返回一个集合的全部成员,该集合是所有给定集合的并集)

set实例演示

// 添加元素
127.0.0.1:6379> sadd database mysql mongondb redis
(integer) 3
// 遍历set元素集合
127.0.0.1:6379> smembers database
1) "redis"
2) "mysql"
3) "mongondb"
// 判断mysql是数据集合内的值
127.0.0.1:6379> sismember database mysql
(integer) 1
// 判断set集合长度
127.0.0.1:6379> scard database
(integer) 3
// 删除集合中的redis
127.0.0.1:6379> srem database redis
(integer) 1
// 随机删除一个元素
127.0.0.1:6379> spop database
"mysql"
// 添加课程
127.0.0.1:6379> sadd class english chinese math art
(integer) 4
// 如果count>集合长度返回所有集合
127.0.0.1:6379> srandmember class 5
1) "chinese"
2) "math"
3) "english"
4) "art"
// 如果不指定count值,随机弹出1个数
127.0.0.1:6379> srandmember class
"math"
// 如果count>0且小与集合长度,随机弹出count个不重复的元素
127.0.0.1:6379> srandmember class 3
1) "chinese"
2) "english"
3) "art"
// 如果count<0 且绝对值小与集合长度,随机弹出count个元素,元素可能重复
127.0.0.1:6379> srandmember class -3
1) "english"
2) "english"
3) "art"
// 将class的chinese移动到haha集合中
127.0.0.1:6379> smove class haha chinese
(integer) 1
127.0.0.1:6379> sadd haha xixi
(integer) 1
// 数据集合class但是不属于集合haha的值(即差集)
127.0.0.1:6379> sdiff class haha
1) "math"
2) "english"
3) "art"
// 毕竟并集
127.0.0.1:6379> sadd class chinese
(integer) 1
// class集合和haha集合刚刚都有chinese(交集)
127.0.0.1:6379> sinter haha class
1) "chinese"
// 全集
127.0.0.1:6379> sunion haha class
1) "chinese"
2) "math"
3) "art"
4) "xixi"
5) "english"
  • Hash

Redis hash 是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象类似Java里面的Map<String,Object>

Hash常用命令

命令说明
hset将哈希表 hash 中域 field 的值设置为 value 。如果域 field 已经存在于哈希表中, 那么它的旧值将被新值 value 覆盖,返回0,若值存在返回1
hget返回hash表域对象对值
hlen返回哈希表 key 中域的数量。
hexists判断某个value值是否存在hash表中
hincrby对hash表域对象对应的value值进行+count的操作,前提是value必须是Int数值型的数,为哈希表 key 中的域 field 的值加上增量 increment 。增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
hincrbyfloat对hash表域对象对应的value值进行+count的操作,前提是value必须是浮点型数,为哈希表 key 中的域 field 的值加上增量 increment 。增量也可以为负数,相当于对给定域进行减法操作。如果 key 不存在,一个新的哈希表被创建并执行 HINCRBY 命令。如果域 field 不存在,那么在执行命令前,域的值被初始化为 0 。
hsetnx当且仅当域 field 尚未存在于哈希表的情况下, 将它的值设置为 value 。如果给定域已经存在于哈希表当中, 那么命令将放弃执行设置操作。
hgetall返回值每个域名(field name)之后是域的值(value),所以返回值的长度是哈希表大小的两倍。
hdel删除hash对应域对象值

Hash实例演示

// hash设置值
127.0.0.1:6379> hset db mysql www.mysql
(integer) 1
127.0.0.1:6379> hset db redis www.redis
(integer) 1
127.0.0.1:6379> hset db oracle www.oracle
(integer) 1
// 获取hash域值
127.0.0.1:6379> hget db redis
"www.redis"
// 获取hash表长度
127.0.0.1:6379> hlen db
(integer) 3
// 判断hash中redis值是否存在
127.0.0.1:6379> hexists db redis
(integer) 1
// 遍历所有域对象和其对应的value值
127.0.0.1:6379> hgetall db
1) "mysql"
2) "www.mysql"
3) "redis"
4) "www.redis"
5) "oracle"
6) "www.oracle"
// 删除oracle域对象值
127.0.0.1:6379> hdel db oracle
(integer) 1
// 对mobile对应value加1
127.0.0.1:6379> hincrby order mobile 1
(integer) 2
  • Sorted Set

Zset(sorted set:有序集合) Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。

Sorted Set常用命令

命令说明
zadd将一个或多个 member 元素及其 score 值加入到有序集 key 当中。如果某个 member 已经是有序集的成员,那么更新这个 member 的 score 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。
zscore返回有序集 key 中,成员 member 的 score 值。如果 member 元素不是有序集 key 的成员,或 key 不存在,返回 nil 。
zrange返回有序集 key 中,指定区间内的成员。其中成员的位置按 score 值递增(从小到大)来排序。具有相同 score 值的成员按字典序(lexicographical order )来排列。可以通过使用 WITHSCORES 选项,来让成员和它的 score 值一并返回,返回列表以 value1,score1, …, valueN,scoreN 的格式表示。 客户端库可能会返回一些更复杂的数据类型,比如数组、元组等。
zrangeByScore返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。有序集成员按 score 值递增(从小到大)次序排列。具有相同 score 值的成员按字典序(lexicographical order)来排列(该属性是有序集提供的,不需要额外的计算)。min 和 max 可以是 -inf 和 +inf 区间的取值使用闭区间 (小于等于或大于等于),你也可以通过给参数前增加 ( 符号来使用可选的开区间
zrem指定key和value删除成员
zcard获取Sorted Set集合成员数量
zCount返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
zrank返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。排名以 0 为底,也就是说, score 值最小的成员排名为 0 。

Sorted Set演示

// 添加Sortset有序值
127.0.0.1:6379> zadd zset 12 value1
(integer) 1
127.0.0.1:6379> zadd zset 12 value2
(integer) 1
127.0.0.1:6379> zadd zset 14 value3
(integer) 1
// 根据key和对应的value返回相应的分数
127.0.0.1:6379> zscore zset value1
"12"
// 遍历zset集合(不带分数)
127.0.0.1:6379> zrange zset 0 -1
1) "value1"
2) "value2"
3) "value3"
// 遍历zset集合(带分数)
127.0.0.1:6379> zrange zset 0 -1 withscores
1) "value1"
2) "12"
3) "value2"
4) "12"
5) "value3"
6) "14"
// 删除zset的value值
127.0.0.1:6379> zrem zset value2
(integer) 1
// 获取Zset集合长度
127.0.0.1:6379> zcard zset
(integer) 2
// 获取Zset集合中分数在0和100成员数量
127.0.0.1:6379> zcount zset 0 100
(integer) 2
// 根据分数返回成员的排名
127.0.0.1:6379> zadd zset 23 value2
(integer) 1
127.0.0.1:6379> zadd zset 55 value4
(integer) 1

127.0.0.1:6379> zrange zset 0 -1 withscores
1) "value1"
2) "12"
3) "value3"
4) "14"
5) "value2"
6) "23"
7) "value4"
8) "55"
// 返回zset中value1在整个集合的排名顺序
127.0.0.1:6379> zrank zset value1
(integer) 0
// 返回min(相当于-inf)和max(相当于+inf)闭区间,开区间可以使用(
127.0.0.1:6379> ZRANGEBYSCORE zset  -inf +inf
1) "value1"
2) "value3"
3) "value2"
4) "value4"
// 带分数的排序
127.0.0.1:6379> ZRANGEBYSCORE zset  -inf +inf withscores
1) "value1"
2) "12"
3) "value3"
4) "14"
5) "value2"
6) "23"
7) "value4"
8) "55"
// 开区间分数大与5小于25的成员
127.0.0.1:6379> ZRANGEBYSCORE zset  (5 (25
1) "value1"
2) "value3"
3) "value2"
  • 通用key操作
命令说明
keys(正则)统配符合正则的key
exists判断key是否存在
expire对指定的key设置存活时间
type判断存储key的类型
ttl判断值是否存在,若设置存活了时间,将返回失效时间的倒计时,-1表示永久存在,-2表示对应的key不存在
keys * 返回所有的key值
127.0.0.1:6379> set haha 1
OK

127.0.0.1:6379> set hx 23
OK

返回所有包含h的所有key值

127.0.0.1:6379> keys *h*
1) "haha"
2) "hx"

返回所有以h开头的key值

127.0.0.1:6379> keys h*
1) "hx"
2) "haha"

返回所有以a结尾的key值

127.0.0.1:6379> keys *a
1) "haha"

判断haha这个key值是否存在

127.0.0.1:6379> exists haha
(integer) 1

设置haha的存活时间为1000秒

127.0.0.1:6379> expire haha 1000
(integer) 1

查看haha的存活时间

127.0.0.1:6379> ttl haha
(integer) 968
其中返回的时间若是-1:则表示此key永不过期
返回-2:则表示key已经过期

查看haha的key类型

127.0.0.1:6379> type haha
string

查看redis中key的数量

127.0.0.1:6379> dbsize
(integer) 3
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值