Redis数据结构详解

Redis是一个高性能的键值数据库,提供STRING、LIST、SET、HASH和ZSET五种数据结构。STRING支持数值操作,适用于普通键值存储;LIST作为双向链表,常用于消息队列;SET为无序不重复集合,可用于关注列表;HASH存储键值对,适合作为数据库行;ZSET是有序集合,结合分值实现排序功能,应用于排行榜等场景。

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

Redis是一个速度非常快的非关系型数据库,它可以存储键与五种不同类型的值之间的映射,他可以将存储在内存的键值对数据持久化到硬盘,他可以使用复制特性来扩展读写性能,可以使用客户端分片来扩展写性能。

   Redis五种基本数据结构:String、List、Set、Hash、Zset.
  • STRING:可以是字符串、整数、或者浮点数,如果redis将一个值存储为字符串里面的时候,这个值可以解释成十进制或者浮点数,那么redis会察觉到这一点,并且允许用户对这个值执行数值操作,如果用户对一个不存在的键或者一个空串执行自增或者自减操作,那么redis会将这个键值当成0来处理。应用场景:String是最常用的一种数据类型,普通的key/ value 存储都可以归为此类.

          GET:获取存储给定键中的值
          SET:设置存储在给定键中的值
          DEL:删除存储在给定键中的值
          INCR:将键值加一
          DECR:将键值减一
          INCRBY:将键存储的值加上整数
          DECRBY:将键存储的值减去整数
          INCRBYFLOAT:将键存储的值加上浮点数amount(版本大于2.6)
          APPEND:将值追加到给定键值后面
          GETRANGE:获取一个偏移量范围内的子串:getrange keyname start end
          SETRANGE:将从start偏移量开始的子串设置为给定值
          GETBIT:将字节串看做是二进制位串并返回位串中偏移量位offset的二进制位的值
          SETBIT:将字节串看做是二进制位串并将位串中偏移量为offset的二进制位的值设置为value
          BITCOUNT:统计二进制串里为1的数量,如果指定了start和end,那么只对指定偏移量内进行统计 bitcount keyname [start end]
          BITOP:对一个或者多个二进制位串执行包括并、或、异或、非操作。并将计算结果保存在destkey中  bitop operation destkey keyname [keyname...]
    

    这里写图片描述

localhost:0>set key helloworld
"OK"
localhost:0>get key
"helloworld"
localhost:0>append key ' redis'
"16"
localhost:0>get key
"helloworld redis"
localhost:0>set num 12
"OK"
localhost:0>incr num
"13"
localhost:0>decr num
"12"
localhost:0>decr num
"11"
localhost:0>incrby num 8
"19"
  • LIST:一个链表,链表的每个节点都包含了一个字符串,redis的列表允许用户从序列的两端推入或者弹出元素,获取列表元素,以及执行各种常见的列表操作。它的优点在于他可以包含多个字符串值,这使得用户可以将数据集中在同一个地方。应用场景比如twitter的关注列表,粉丝列表、消息队列等,可以利用Lists的PUSH操作,将任务存在Lists中,然后工作线程再用POP操作将任务取出进行执行。Redis还提供了操作Lists中某一段的api,你可以直接查询,删除Lists中某一段的元素。

          Rpush:将给定值推入列表的右端
          LPUSH:将给定值推入列表的左端
          Lrange:获取列表在给定范围上的所有值
          Lindex:获取列表在给定位置上的单个元素
          Lpop:从列表的左端移除一个值,并返回被弹出的值
          RPOP:从列表的右端移除一个值,并返回被弹出的值
          LTRIM:对列表进行修剪,只保留strat到end的元素,其中偏移量位start和end的元素也会被保留
          llen:获取列表中元素的个数。
          BLPOP:从第一个非空列表中移除位于最左端的元素,或者在timeout秒之内阻塞等待可弹出元素 blpop keyname [keyname...] timeout 
          BRPOP:从第一个非空列表中移除位于最右端的元素,或者在timeout秒之内阻塞等待可弹出元素 blpop keyname [keyname...] timeout 
          RPOPLPUSH:RPOPLPUSH sourcekey destkey 从sourcekey列表中弹出位于最右端的元素,然后将这个元素推入destkey列表的最左端,并向用户返回这个元素
          BRPOPLPUSH:BRPOPLPUSH sourcekey destkey timeout 从sourcekey列表中弹出位于最右端的元素,然后将这个元素推入destkey列表的最左端,并向用户返回这个元素,如果sourcekey为空那么在timeout内阻塞并等待
    

    这里写图片描述

localhost:0>rpush list 1
"1"
localhost:0>rpush list 1 2 3
"4"
localhost:0>lrange list 0 -1
 1)  "1"
 2)  "1"
 3)  "2"
 4)  "3"
localhost:0>lpush list 0
"5"
localhost:0>lrange list 0 -1//获取列表在给定范围上的所有值
 1)  "0"
 2)  "1"
 3)  "1"
 4)  "2"
 5)  "3"
 localhost:0>lindex list 3
"2"
localhost:0>rpop list
"3"
localhost:0>lpop list
"0"
localhost:0>brpoplpush list destList 1// 从sourcekey列表中弹出位于最右端的元素,然后将这个元素推入destkey列表的最左端,并向用户返回这个元素,如果sourcekey为空那么在timeout内阻塞并等待
"2"
localhost:0>lrange destList 0 -1
 1)  "2"
  • SET:包含字符串的无序收集器,并且被包含的每个字符串都是独一无二的、各不相同。用户可以快速的对集合执行添加元素操作、移除元素操作以及检查一个元素是否存在于集合中。当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,应用场景比如在微博应用中,可以将一个用户所有的关注人存在一个集合中,将其所有粉丝存在一个集合。Redis还为集合提供了求交集、并集、差集等操作,可以非常方便的实现如共同关注、共同喜好、二度好友等功能,对上面的所有集合操作,你还可以使用不同的命令选择将结果返回给客户端还是存集到一个新的集合中。

          Sadd:将给定元素添加到集合
          Smembers:返回集合包含的所有元素
          Sismembers:检查给定元素是否存在于集合中
          Srem:如果给定的元素存在于集合中,那么移除这个元素
          SRANDMEMBER:SRANDMEMEBER key [count] 随机获得集合中元素(当count>0时随机获取count个不重复元素,count<0时不保证重复)
          SPOP:SPOP key 从集合中随机弹出一个元素
          SMOVE:SMOVE SOURCEKEY DESTKEY ITEM 如果集合中存在item元素则移除并且添加到destkey中,如果item被成功移除,那么返回1,否则返回0              
          sinter:交集操作,返回同时存在于所有集合中的元素
          SINTERSTROE:交集操作,返回同时存在于所有集合中的元素存储到destkey中
      Sunion:并集操作返回那些至少存在于一个集合中的元素
      SUNIONSTORE:并集操作返回那些至少存在于一个集合中的元素存储到destkey中
      sdiff:sdiff keyname [keyname ...]差集操作,返回那些存在于第一个集合中,但不存在于其他集合中的元素
      SDIFFSTORE:SDIFFSTORE destkey keyname [keyname ...]差集操作,返回那些存在于第一个集合中,但不存在于其他集合中的元素存储到destkey中。
    

    这里写图片描述

localhost:0>sadd set 1 2 3 4
"4"
localhost:0>smembers set
 1)  "1"
 2)  "2"
 3)  "3"
 4)  "4"
localhost:0>scard set
"4"
localhost:0>sadd set 3
"0"
localhost:0>spop set
"1"
localhost:0>sismember set 1
"0"
localhost:0>sismember set 3
"1"
  • HASH:包含键值对的无序散列表,redis散列可以让用户将多个键值对存储到一个redis键里面,适合将一些相关的数据存储到一起我们可以把这种数据聚集看做数据库中的行。

          Hset:在散列里面关联起给定的键值对
          Hget:获取指定散列键的值
          HMset:在散列里面关联起给定的一个或者多个键值对
          HMget:获取指定散列一个或者多个键的值
          Hgetall:获取散列包含的所有键值对
          Hdel:删除给定键存在于散列里面,那么移除这个键
          hlen:返回散列包含的键值对数量
          HEXISTS:检查给定的键是否存在于散列中
          HKEYS:获取散列包含的所有键
          HVALS:获取散列包含的所有值
          HINCRBY:将键key的值加上整数   HINCRBY keyname key increment
          HINCRBYFLOAT:将键key的值加上float,
    

    这里写图片描述

localhost:0>hmset hash-key name xiaoming age 12 sex 1
"OK"
localhost:0>hmget hash-key name
 1)  "xiaoming"
localhost:0>hlen hash-key
"5"
localhost:0>hgetall hash-key
 1)  "name"
 2)  "xiaoming"
 3)  "age"
 4)  "12"
 5)  "sex"
 6)  "1"
 localhost:0>hkeys hash-key
 1)  "name"
 2)  "age"
 3)  "sex"
localhost:0>hvals hash-key
 1)  "xiaoming"
 2)  "12"
 3)  "1"
  • ZSET:字符串成员与浮点数分值之间的有序映射,元素的排列顺序由分值的大小来决定,当你需要一个有序的并且不重复的集合列表,那么可以选择ZSET数据结构

          Zadd:将一个带有给定分值的成员添加到有序集合里面
          Zrange:根据元素在有序排列中所处的位置,从有序集合里面获取多个元素
          Zrangebyscore:获取有序集合在给定分值范围内的所有元素
          Zrem:如果给定成员存在于有序集合,那么移除这个成员
          ZCARD:ZCARD key 获得集合中元素个数
          ZINCRBY:ZINCRBY key increment member 增加某个元素的分数
          ZCOUNT:ZCOUNT key min max 获得指定范围内的元素个数
          ZRANK:ZRANK key member 获得元素的排名
          ZSCORE:ZSCORE key member 获得元素的分数
          ZREVRANK:ZREVRANK key member 返回member所处的位置,成员按照分值从大到小排序
          ZREVRANGE:ZREVRANGE key start stop [WITHSCORE] 从大到小的顺序
          ZRANGEBYSCORE:ZRANGEBYSCORE key min max [WITHSCORE] [LIMIT offset count] 按照从小到大返回分数在min和max之间的元素
          ZREVRANGEBYSCORE:ZREMRANGEBYRANK key start stop 按照元素分数从小到大的顺序删除指定排名范围内的所有元素,并返回删除元素的个数
          ZREMRANGEBYRANK:删除制定排名内的所有元素·
          ZREMRANGEBYSCORE:ZREMRANGEBYSCORE key min max 删除指定分数范围内的所有元素
          ZINTERSTORE:对有序集合执行交集运算
      ZUNIONSTORE:对有序集合执行并集运算
    

    ZSET实例

localhost:0>zadd zset-key 2 member1 1 member3 3 member2
"3"
localhost:0>zrange zset-key 0 -1
 1)  "member3"
 2)  "member1"
 3)  "member2"
 localhost:0>zrank zset-key member3 //返回集合元素排名
"0"
localhost:0>zscore zset-key member2 //返回集合元素分值
"3"
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值