2020.04.23 Redis的五种数据结构

一.关于

Redis是一种支持Key-Value型的非关系型数据库, 其Value有多种类型,它支持包括String、List、Set、Zset、hash五种数据结构。

二.String(字符串类型)

1.是redis中最基本的数据类型,一个key对应一个value。
string 可以包含任何数据,如数字,字符串,jpg图片或者序列化的对象。

2.使用:
1)赋值:SET key value。如 set hello world
2)取值:GET key。如 get hello。返回是 world
3)自增:INCR key。就是 Mysql的AUTO_INCREMENT。每次执行 INCR key时,该key的值都会+1.若key不存在,则先建立一个0,然后+1,返回 1。如果值不是整数则报错。该操作是原子操作。
4)自减:DECR key。将指定 key 的值减少 1。 如 DECR num,就是 num-1
5)自增 N:INCRBY key increment 用来给指定 key 的值加 increment。如 INCRBY num 5 就是 num+5
6)自减 N:DECRBY key increment 用来给指定 key 的值减 increment。如 DECRBY num 5 就是 num-5
7)增加浮点数:INCRBYFLOAT key increment
8)向尾部追加:APPEND key value。如set test:key 123、append test:key 456、get test:key 就是 123456
9)获取长度:STRLEN key
10)同时给多个 key 赋值:MSET title 这是标题 description 这是描述 content 这是内容。
11)同时获取多个 key 的值:MGET title description content
12)位操作之获取:GETBIT key offset。如字符 a 在 redis 中的存储为 01100001(ASCII为98),那么 GETBIT key 2 就是 1,GET key 0 就是 0。
13)位操作之设置:SETBIT key offset value。如字符 a 在 redis 中的存储为 01100001(ASCII为98),那么 SETBIT key 6 0,SETBIT key 5 1 那么 get key 得到的是 b。因为取出的二进制为 01100010。
14)位操作之统计:BITCOUNT key [start] [end]:BITCOUNT key 用来获取 key 的值中二进制是 1 的个数。而 BITCOUNT key start end 则是用来统计key的值中在第 start 和 end 之间的子字符串的二进制是 1 的个数(好绕啊)。
15)位操作之位运算:BITOP operation resultKey key1 key2。operation 是位运算的操作,有 AND,OR,XOR,NOT。resultKey 是把运算结构存储在这个 key 中,key1 和 key2 是参与运算的 key,参与运算的 key 可以指定多个。

3.实战场景:

  • 缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力。
  • 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
  • session:常见方案spring session + redis实现session共享

三.List(链表)

1.List 说白了就是链表(redis 使用双端链表实现的 List),是有序的,value可以重复,可以通过下标取出对应的value值,左右两边都能进行插入和删除数据。
在这里插入图片描述
2.主要使用
1)向头部插入:LPUSH key value1 value2…。返回增加后的列表长度。
2)向尾部插入:RPUSH key value1 value2…。返回增加后的列表长度。
3)从头部弹出:LPOP key。返回被弹出的元素值。该操作先删除key列表的第一个元素,再将它返回。
4)从尾部弹出:RPOP key。返回被弹出的元素值。
5)列表元素个数:LLEN key。key 不存在返回 0。
6)获取列表的子列表:LRANGE start end。返回第 start 个到第 end 个元素的列表。包含 start 和 end。支持负数索引。-1 表示最后一个元素,-2 表示倒数第二个元素。
7)删除列表中指定值:LREM key count value。删除 key 这个列表中,所有值为 value 的元素,只删除 count。如果有 count+1 个,那么就保留最后一个。count 不存在或者为 0,则删除所有的。如果 count 大于 0,则删除从头到尾的 count 个,如果 count 小于 0,则删除从尾到头的 count 个。
8)获取指定索引值:LINDEX key index。如LINDEX key 0就是列表的第一个元素。index可以是负数。
9)设置索引和值:LSET key index value。这个操作只是修改指定 key 且指定 index 的值。如果 index 不存在,则报错。
10)保留片段,删除其它:LTRIM key start end。保留 start 到 end 之间的所有元素,含 start 和 end。其他全部删除。
11)向列表插入元素:LINSERT key BEFORE/AFTER value1 value2。从列表头开始遍历,发现值为 value1 时停止,将 value2 插入,根据 BEFORE 或者 AFTER 插入到 value1 的前面还是后面。
12)把一个列表的一个元素转到另一个列表:RPOPLPUSH list1 list2。将列表 list1 的右边元素删除,并把该与元素插入到列表 list2 的左边。原子操作。返回删除的值。

3.使用列表的技巧

  • lpush+lpop=Stack(栈)
  • lpush+rpop=Queue(队列)
  • lpush+ltrim=Capped Collection(有限集合)
  • lpush+brpop=Message Queue(消息队列)

四.set(无序集合)

1.集合类型也是用来保存多个字符串的元素,但和列表不同的是集合中 1. 不允许有重复的元素,2.集合中的元素是无序的,不能通过索引下标获取元素,3.支持集合间的操作,可以取多个集合取交集、并集、差集。

2.使用:命令都是以s开头的
1)增加:SADD key value
2)删除:SREM key value
3)获取指定集合的所有元素:SMEMBERS key
4)判断某个元素是否存在:SISMEMBER key value
5)差集运算:SDIFF key1 key2…。对多个集合进行差集运算。
6)交集运算:SINNER key1 key2…。对多个集合进行交集运算。
7)并集运算:SUNION key1 key2…。对多个集合进行并集运算。
8)获取集合中元素个数:SCARD key。返回集合中元素的总个数。
9)对差集、交集、并集运算的结果存放在一个指定的 key 中:SDIFFSTORE storekey key1 key2。对 key1 和 key2 求差集,结果存放在 key 为 storekey 的集合中。SINNERSTORESUNIONSTORE 类似。
10)获取集合中的随即元素:SRANDMEMBER key [count]。参数 count 可选,如果 count 不存在,则随即一个。count 大于 0,则是不重复的 count 个元素。count 小于 0,则是一共 |count|个 元素,可以重复。
11)随即弹出一个元素:SPOP key。随即从集合中弹出一个元素并删除,将该元素的值返回。

3.实战场景

  • 标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
  • 点赞、点踩、收藏等,可以放到set中实现

五.zset有序集合

1.有序集合类型和集合类型的差别是,有序集合为每个元素配备了一个属性:分数。有序集合就是根据分数来排序的。有序集合是使用散列表和跳跃表实现的。所以和列表相比,操作中间元素的速度也很快。时间复杂度尾 O(log(N))。Redis 数据类型中的有序集合类型比 Redis 数据类型中的列表类型更加耗费资源。

2.使用(有序集合的命令都是 以 z 开头)
1)增加:ZADD key sorce1 value1 sorce2 value2…
2)获取分数:ZSCORE key value。获取key的有序集合中值为 value 的元素的分数。
3)获取排名在某个范围内的元素列表:ZRANFGE key start stop [WITHSCORE]。获取排名在 start 和 end 之间的元素列表,包含 start 和 end2 个元素。每个元素一行。如果有WITHSCORE参数,则一行元素值,一行分数。时间复杂度为O(LOGn+m)。如果分数相同,则 0<0
4)获取指定分数范围的元素:ZRANGEBYSCORE key min max [WITHSCORE] [LIMIT offset count]。获取分数在 min 和 max 之间的元素列表。含两头。每个元素一行。如果有 WITHSCORE 参数,则一行元素值,一行分数。如果 min 大于 max 则顺序反转。
5)为某个元素增加分数:ZINCRBY key increment value。指定的有序集合的值为 value 的元素的分数 +increment。返回值后更改后的分数。
6)获取集合中元素的数量:ZCARD key
7)获取指定分数范围内的元素个数:ZCOUNT key min max
8)删除一个或多个元素:ZREM key value1 value2…
9)根据排名范围删除元素:ZREMRANGEBYRANK key start end。删除排名在 start 和 end 中的元素。
10)按照分数范围删除元素:ZREMRANGEBYSCORE key min max
11)获得元素排名(正序):ZRANK key value。获取 value 在该集合中的从小到大的排名。
12)获得元素排名(倒序):ZREVRANK key value。获取 value 在该集合中从大到小的排名。
13)有序集合的交集:ZINTERSTORE storekey key1 key2…[WEIGHTS weight [weight…]] [AGGREGATE SUM|MIN|MAX]。用来计算多个集合的交集,结果存储在 storekey中。返回值是 storekey 的元素个数。AGGREGATE 为 SUM 则 storekey 集合的每个元素的分数是参与计算的集合分数和。MIN 是参与计算的分数最小值。MAX 是参与计算分数最大值。WEIGHTS 设置每个集合的权重,如 WEIGHTS 1 0.1。那么集合A的每个元素分数 * 1,集合B的每个元素分数 * 0.1
14)有序集合的并集:ZUNIONSTORE storekey key1 kye2…[WEIGHTS weight [weight…]] [AGGREGATE SUM|MIN|MAX]

3.实战场景:

  • 排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。

六.hash(健值对)

1.Redis的散列可以存储多个健值对,跟字符串一样,散列的值可以存储字符串和数字。

2.使用:所有hash的命令都是h开头的
1)赋值:HSET key field value。如 hset user name lane。hset user age 23
2)取值:HGET key field。如 hget user name,得到的是 lane。
3)同一个key多个字段赋值:HMSET key field1 value1 field2 value2…
4)同一个KEY多个字段取值:HMGET key field1 fields2…
5)获取KEY的所有字段和所有值:HGETALL key。如 HGETALL user 得到的是 name lane age 23。每个返回都是独立的一行。
6)字段是否存在:HEXISTS key field。存在返回 1,不存在返回 0
7)当字段不存在时赋值:HSETNX key field value。如果 key 下面的字段 field 不存在,则建立 field 字段,且值为 value。如果 field 字段存在,则不执行任何操作。它的效果等于 HEXISTS + HSET。但是这个命令的优点是原子操作。再高的并发也不会怕怕。
8)自增 N:HINCREBY key field increment。同字符串的自增类型,不再阐述。
9)删除字段:DEL key field1 field2… 删除指定KEY的一个或多个字段。
10)只获取字段名:HKEYS key。与 HGETALL 类似,但是只获取字段名,不获取字段值。
11)只获取字段值:HVALS key。与 HGETALL 类似,但是只获取字段值,不获取字段名。
12)获取字段数量:HLEN key

3.实战场景:
1.缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值