zoukankan      html  css  js  c++  java
  • Redis的数据类型

    前面说过,Redis的一大特性是支持丰富的数据类型,

    这为更多的应用场景提供了可能。

    Redis有五种数据类型,包括string,list,set,sorted set和hash,
    注意,Redis的数据类型不支持嵌套。
    下面学习一下这五种数据类型的特点和简单应用。

    1.String 字符串

    String 数据结构是简单的 key-value 类型,value 不仅可以是 String,也可以是数字(当数字类型用 Long 可以表示的时候encoding 就是整型,其他都存储在 sdshdr 当做字符串)。使用 Strings 类型,可以完全实现目前 Memcached 的功能,并且效率更高。还可以享受 Redis 的定时持久化(可以选择 RDB 模式或者 AOF 模式),操作日志及 Replication 等功能。

    应用场景:
    应用最广泛,Redis最基础的数据类型。

    常用命令:
    set,get,将字符串值value关联到key/返回key所关联的字符串值。
    incr,将key中储存的数字值增一。
    decr,将key中储存的数字值减一。
    mset,同时设置一个或多个key-value对。
    mget,返回所有(一个或多个)给定key的值。

    2.Hash 哈希

    很多时候我们需要存储一些对象数据信息,
    比如用户信息,包括用户的昵称、年龄、性别等,如果使用String数据类型,
    通常是将这些信息序列化后存储为一个JSON 格式的字符串,比如“lilei,18,man”。
    如果更新这些信息,需要将字符串(JSON)取出来,进行反序列化,修改某一项的值,再序列化成字符串(JSON)存储回去。在数据的传输和处理时会造成很大的浪费,
    这个时候散列数据类型就可以很好解决这个问题。Hash 结构可以直接修改某一项属性值。
    实现方式:

    常用命令:
    HSET 给字段赋值,更新时可以直接覆盖
    HGET 获得字段的值
    HMSET,HMGET 给多个字段赋值(获得值)
    HGETALL 获取键中所有字段和字段值
    如,

    redis> hmset tom age 18 gender male
    OK
    redis> hgetall tom
    1) "age"
    2) "18"
    3) "gender"
    4) "male"
    

      

    3.List 列表

    应用场景:
    关注列表,粉丝列表,消息队列等。

    实现方式:

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

    常用命令:
    #将一个或多个值value插入到列表key的表头/移除并返回列表key的头元素
    lpush,lpop
    #将一个或多个值value插入到列表key的表尾(最右边)/移除并返回列表key的尾元素
    rpush,rpop
    #返回列表 key 中指定区间内的元素,区间以偏移量 start 和 stop 指定
    lrange
    # LPOP 命令的阻塞版本,当给定列表内没有任何元素可供弹出的时候,连接将被 BLPOP 命令阻塞,直到等待超时或发现可弹出元素为止。
    BLPOP(阻塞版)


    4.Set 集合

    由一个或多个元素所构成的叫做集合。
    集合中的元素有三个特征:确定性,互异性,无序性。集合和列表的区别在于列表中的元素有序且并不一定唯一。Redis还为集合提供了求交集、并集、差集等操作。

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

    实现方式:
    set 的内部实现是一个value为null的HashMap, 实际就是通过计算hash的方式来快速排重的,操作set的时间复杂度始终为O(1)。

    常用命令:
    #向集合中添加一个或多个元素,返回成功加入的元素
    SADD key member1 [member2...]
    #删除一个或多个元素
    SREM key member [member...]
    #随机弹出一个元素
    SPOP key
    #集合间运算,差集运算
    SDIFF key [key...]
    #交集运算
    SINTER key [key...]
    #并集运算
    SUNION key [key...]
    #获得集合中的所有元素
    SMEMBERS key
    #判断元素是否在集合中
    SISMEMBERS key member

    操作实例:

    redis>sadd myset a b c
    (integer) 3
    redis>smembers myset
    1) "a"
    2) "c"
    3) "b"
    redis>spop myset
    "a"


    5.Sorted set 有序集合

    有序集合在集合类型的基础上,为每个元素都关联了一个分数,这样除了可以进行集合相关的操作,
    还可以根据分数不同,进行排序等操作,有序集合中元素的分数可以是相同的。

    应用场景:
    以某个条件为权重,比如按顶的次数排序。
    可以用Sorted Sets来做带权重的队列,
    比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。

    实现方式:
    Redis sorted set的内部使用 HashMap 和跳跃表(SkipList)来保证数据的存储和有序,HashMap里放的是成员到score的映射,而跳跃表里存放的是所有的成员,排序依据是HashMap里存的分数。

    有序集合和列表的区别:
    list和sorted set中元素都是有序的,
    列表类型是听过链表实现的,当元素增多时,访问中间元素速度会下降,
    而有序集合是用HashMap和跳跃表(SkipList),不存在这个问题,但是有序集合的内存开销比列表要大。

    常用命令:
    #添加一个或多个成员到有序集合,或者如果它已经存在更新其分数
    ZADD key score1 member1 [score2 member2]
    #由索引返回一个成员范围的有序集合
    ZRANGE key start stop [WITHSCORES]
    #移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
    ZREM
    #返回有序集 key 的基数。
    ZCARD 

  • 相关阅读:
    继续致歉
    向大家致歉!!
    访问速度调查
    致歉
    [功能改进]通过Blog客户端直接发随笔至网站分类
    带宽升级公告
    创业团队的类型
    [讨论]基于.NET的开源论坛软件的选择
    调整一下工作的节奏
    公告
  • 原文地址:https://www.cnblogs.com/binyue/p/4872103.html
Copyright © 2011-2022 走看看