【Redis】五种数据类型

一、前言:

      上篇博客已经对Redis的一些基本知识做了一些简介,这篇博客,将简单介绍一些Redis的五种数据类型。分别为String(字符串)、Hash(哈希)、List(链表)、Set(集合)、zset(有序集合)。对这些类型可以执行很多原子性的操作:比如向一个string类型的value后面追加字符串;向list中添加一个元素或减少一个元素;计算set的交、并、减;甚至可以获取一个sorted set中的最大值。


 二、String类型:

1、常用命令:set、get、decr、incr等

2、应用场景:

        String是最常用的数据类型,普通的key/Value存储都可以归为此类,在此不再赘述。

3、实现方式:

String在redis内部默认存储就是一个字符串。当遇到incr、decr等操作时会转换成数值型进行计算,此时redisObjects的encoding字段为int。


三、List类型:

1、常用命令:lpush、rpush、lpop、rpop、lrange等

2、应用场景:

        List的应用场景非常多,比如Twitter的关注列表、粉丝列表等都可以用List结构来实现。可以轻松实现最新消息排行等功能。List的另一个应用就是消息队列,可以利用List的push操作,将任务存在List中,然后工作线程再用pop操作将任务取出进行执行。

3、实现方式:

      List的实现为 一个双向链表,可以支持反向查找和遍历,更方便操作,不过带来了额外的内存开销,Redis内部的很多实现包括发送缓冲队列等也都是用的 这个数据结构。


四、Hash类型:

       常见命令:hget,hset,hgetall等

       应用场景:比如我们使用普通的key/value结构来存储一个用户的信息对象,包含以下信息:用户ID为key、姓名name、年龄age、生日birthday等信息为value。

       第一种方式:将用户ID作为查找key,其他信息封装成一个对象以序列化的方式存储。(set u111 '张三,,18,19930202')  

                                                                  

       这种方式的缺点是:增加了序列化/反序列化的开销。当需要修改其中一项信息时,需要把整个对象取回,并且修改操作需要对并发进行保护。

       第二种方式:用户信息对象有多少成员就存多少个key-value对儿,用用户ID+对应属性的名称作为唯一标识来取得相应属性的值。(mset user:001:name “李三” user:001:birthday "20010101")这样虽然省去了序列化开销和并发问题,但是用户ID为重复存储,如果存在大量这样的数据,内存浪费还是非常大的。

                                                       

       那么Redis提供的Hash很好的解决了这个问题,Redis的Hash实际是内部存储的Value为一个HashMap,并提供了直接存取这个Map成员的接口(如 hmset user:001 name "李三" age 18 birthday “20010101”)也就是说,key仍然是用户ID,value是一个Map,这个Map的key是成员的属性名,value是属性值,这样对数据的修改和存取都可以直接通过内部的Map的key,也就是通过key(用户ID)+Field(属性标签)操作对应数据了,既不需要重复存储数据,也不会带来序列化和并发修改控制的问题。

       Redis  Hash对应的Value内部实际就是一个HashMap,实际这里会有2中不同的实现方式。这个Hash的成员比较少时Redis为了节省内存会采用类似一维数组的方式来紧凑存储,而不会采用真正的HashMap结构。

                                         


五、Set类型:

       常用命令:sadd,srem,spop,sdiff,smembers,sunion等。

       应用场景:

       Redis Set对外提供的功能与list类似,是一个列表的功能,特殊之处在于set可以自动重排的,当你需要存储一个列表数据,又不希望出现重复数据时,set是一个很好的选择,并且set提供了判断某个成员是否在一个set集合内的重要接口,这个也是list所不能提供的。

       实现方式:

       set的内部实现是一个value用于为null的HashMap,实际就是通过计算hash的方式来快速重排的,这也是set能提供判断一个成员是否在集合内的原因。

六、Sorted  set

       常用命令:

       sadd,zrange,zrem,zcard等

       使用场景:

       Redis sorted set的使用场景与set类似,区别是set不是自动有序的,而sorted set 可以通过用户额外提供一个优先级(score)的参数来为成员排序,并且是插入有序的,即自动排序。当你需要一个有序的并且不重复的集合列表,那么 可以选择sorted set数据结构。

       实现方式:

       和Sets相比,Sorted Sets是将 Set 中的元素增加了一个权重参数 score,使得集合中的元素能够按 score 进行有序排列。另外还可以用 Sorted Sets 来做带权重的队列。让重要的任务优先执行。
      1.带有权重的元素,比如一个游戏的用户得分排行榜
      2.比较复杂的数据结构,一般用到的场景不算太多







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值