Redis支持的数据类型
    String
    List
   Set
   Sorted Set
   Hashes
   Bit array
   HyperLogLog
 
 
Binary-safe strings :
    Redis的键是二进制安全的,可以使用任何的二进制序列作为键.
        比如"foo"这样的字符串,甚至是JPEG文件的二进制内容.
        空串""也是合法的键.
 
    不推荐使用特别长的键.
        影响性能,做键的比较,查找键是很耗费性能的.
        同时对带宽以及内存要求很大.如果当前的任务是匹配大值的存在.
        建议使用hash,比如SHA1 , MD5等.
 
    不推荐使用特别短的键.
        例如使用"user:1000:followers"而不是"u1000flw".
        前者明显可读性高,而且增加的空间较小.
 
    坚持用统一的命名结构
        比如 "object-type:id"
        使用"."或"-"来表示由多个词语组成的字段.
        比如"comment:1234:reply.to"或者"comment:1234:reply-to"
    
    键的最大长度是512MB
        这里的最大长度指的是单个key的长度.
        对于value同样限制的是512MB.
 
 
List
    List有两种底层实现机制 : 一种是基于array,而另一种是基于linked list.
    而Redis中的list就是基于后者(linked list).
    这样做的好处就是
            在list头部/尾部 添加数据的时候,都可以以很快的速度去处理,不管你是添加1条数据,还是插入1亿条数据效率上都是差不多的.
    坏处就是
            当你访问list的时候,随着index的变大,消耗的时间也将成比例增加.
 
    如果访问一个比较大的list 中间的元素的需求比较重要的话,建议使用sorted set.
 
    常用命令 : 
            LPUSH , RPUSH , LPOP , RPOP ,  LRANGE , LTRIM ..
 
            LRANGE 
                    接受3个参数 : 一个list实例参数,两个index参数(起始位置,结束位置)
                    两个index参数均可以为负数, 表示list.size() - index 处的元素的索引数;
                    LRANGE mylist 0 -3
 
            LPUSH/RPUSH 
                    它们的参数是可变长的参数.
                    具体来说第一个参数接收一个list实例,后面n个参数均是要添加到list最开始/最末端 的元素.多个参数之间用空格分割
                     LPUSH mylist 12 4 www "ss"
 
            LTRIM 
                    类似于LRANGE , 所不同的是 LRANGE只是为了展现,而LTRIM会将在它抽取的范围外的元素都给移除.
                    和LPUSH合作,可以实现保留最新多少条数据.
                    LPUSH mylist 100 3 4
                    LTRIM mylist 0 999
 
            LPOP/RPOP 将list最前端/最尾端的元素返回回来,并且将它从源list中删除掉.
                    可以和PUSH操作一起使用实现生产者消费者模式.
 
    
    list最普遍的两个代表性用法
        1).记载用户发布到社交网络的最新更新.
        2).使用消费者-生产者模式进行进程之间的通信:
                生产者向一个list中添加元素;
                消费者消耗这些元素,并执行操作.
                Redis提供了一些list命令来保证这种做法的高效性以及可靠性.
 
 
      list拥有一个特性使得它适合实现 队列 , 并且通常作为进程间通信系统的构建块.这个特性就是BLPOP 和 BRPOP .是个阻塞操作.
    
     Note : 
            正常来讲 生产者消费者模式, 当消费者向list索取元素的时候,发现该队列为空, 那么,消费者通常会进行等待一会儿,然后再重试索取(这个过程叫轮询),
            这样,会导致redis以及客户端都做了很多无用的命令行操作.
            因此Redis提供了两个阻塞型的 pop 操作.
 
            当list为空时,只有当新的元素被添加到list中后或者达到了用户指定的超时时间,BRPOP/BLPOP指令才会返回给调用者(一个结果).
    
            demo : 
                    BRPOP tasks 5  --等待tasks中的元素,如果超过5秒钟没有可以用的元素,就返回.
    
            如果timeout参数 设置为 0 , 那么会永远等待新元素(不会超时,一直阻塞).
            其中list参数可以接受 多个列表,比如task1 task2 .. , 当有一个列表任务有新增元素,就返回pop的结果.
 
 
    关于BRPOP/BLPOP的一些需要注意的事情:
        1).客户端是按照顺序来享受服务的
                第一个客户端阻塞的来等待一个list,那么当有新的元素被其它的客户端push进来,那么它(即第一个客户端)将会首先享受这个服务.
 
        2).和RPOP/LPOP的返回值不同
                它是个包含键名的双元素的数组,因为BRPOP/BLPOP可以同时阻塞式地从多个list列表中等待元素.
 
        3).如果过期时间的阀值到了,将返回NULL
 
    关于list以及阻塞操作的更多内容:
        1).可以使用RPOPLPUSH指令 来构建更安全的队列 或者 旋转队列.
        2).redis提供了一个阻塞的变种指令 : BRPOPLPUSH
 
 
 
    主键的自动创建与删除
        三条规则来总结:
            1). 当我们添加一个元素到聚合数据类型,如果目标关键字不存在,在添加这个元素之前会(自动)创建一个空的聚合数据类型.
            2). 当我们从聚合数据类型中移除元素的时候, 如果该值是空的,那么键也将自动被销毁.
            3).调用 只读命令/移除元素的写命令 在一个空的关键字上,永远会返回同样的结果,好像该关键字正持有命令行希望找到空的数据类型.
 
 
 
Hashes (散列)
    键值对 , 可以理解为java中的对象或map.
    demo :
        hmset user:1000 uname antirez birthyear 1977 verified 1
        hget user:1000 uname
        hget user:1000 birthyear
        hgetall user:1000
        hmget user:1000 uname birthyear no-such-field
        hincrby user:1000 uname birthyear 10
 
 
Set
    redis中的set是字符串类型的无序集合.
    可以使用SADD指令添加元素.
    如果给定的元素已经存在,还可以做很多其它的操作,比如做交集,并集处理,或者比较多个set的不同之处.
    
            sadd   myset  1 2 3
            smembers   myset
            sismember   myset 3 --检查元素3是否在set中存在
            sinter   tag:1:news   tag:2:news   tag:10:news   tag:27:news --对这些set取交集
            sunionstore   game:1:deck deck -- 合并多个set
            spop   game:1:deck -- 从set中随机取出一个元素,并在该set中删除该元素
            scard   game:1:deck --返回该set集合中元素的个数
            sandmember   game:1:deck --返回set中的一个随机元素,对源set没有影响
 
 
Sorted Set
    Sorted Set像是Set以及Hash的混合体.
 
    排序规则:
        1).按照score(一个设置的浮点值)从小到大顺序排列的.
        2).如果score一致,那么按照value的字段顺序排列
 
    实践注意:
        Sorted Set实现自两个接口(dual-ported) : skip list 以及 hash table
        因此每次添加元素的时候,以O(log(N))复杂度进行操作. 这个复杂度是ok的.
        但取数的时候,redis几乎不用做什么额外操作,因为顺序是已经排列好的.
 
 
    常用命令
            ZADD     some_set     any_score     the_element
            ZRANGE     some_set     start_index     end_index     [withscores]
            ZREVRANGE     some_set     start_index     end_index     [withsores]
            ZRANGEBYSCORE     some_set     -inf     any_score
            ZREMRANGEBYSCORE     some_set     any_start_score     any_end_score
            ZREVRANK     some_set
 
        #以下命令是基于字典而非score来取得结果的
            ZRANGEBYLEX , ZREVRANGEBYLEX , ZREMRANGEBYLEX , ZLEXCOUNT
        
            demo : zrangebylex hackers [B [P -- 表示闭区间
 
            注意,所有*range*的操作,都会把这些元素从set中删除哦~
 
 
Bitmap
    Bitmap 并非是一种数据类型.而是String类型上的一组"面向-位"的操作.
 
    由于String是二进制安全的大文本(可以有512M大小),因此就有了 2^32种不同的位组合.
 
    bit操作分为两组 : 常量时间-单个位 的操作 ;  bit组的操作(即多个bit的批量操作).
 
    常用命令 SETBIT , GETBIT , BITOP , BITCOUNT , BITPOS
 
    bitmap普遍使用场景 :
        1).各种实时分析
        2).存储和对象id关联的boolean信息, 高效而又节省空间
 
 
HyperLogLog (以下简称HLL)
    redis提供的一种概率数据结构.用于计算唯一事物(技术上来讲,是指估计一个集合的基数).
    如果用其它方式,会消耗成比例的内存来实现.
    而是用redis提供的hyperloglog,可以得到比较精确的统计结果,这个结果相比真实结果,误差小于1%.
    
    使用 PFADD 来添加计数 ; 使用 PFCOUNT 来查询集合中的基数.
 
    HLL中不会真的存储这些元素,该数据结构只保存一个状态.
 
 
Redis的其它显著特性
    1).支持 对大集合的中的键空间进行逐步迭代
    2).可以云信Lua脚本服务器端 来提升延迟和带宽
    3).Redis也是一个pub-sub服务器(即发布与订阅)
 
 

Redis之datatype概述的更多相关文章

  1. 峰Redis学习(9)Redis 集群(概述)

    第一节:Redis 集群概述 redis cluster是去中心化,去中间件的,也就是说,集群中的每个节点都是平等的关系,都是对等的,每个节点都保存各自的数据和整个集群的状态.每个节点都和其他所有节点 ...

  2. redis之sentinel概述

    一.配置sentinel 修改的是这条: 对应: 上面那条配置需要注意:<master-name>:监控主节点的名称 <ip>:监控主节点的ip   <redis-por ...

  3. Redis数据库 01概述| 五大数据类型

    1.NoSQL数据库简介 解决应用服务器的CPU和内存压力:解决数据库服务的IO压力: ----->>> ① session存在缓存数据库(完全在内存里),速度快且数据结构简单: 打 ...

  4. redis 一般性使用概述

    最近一段时间与redis接触比较频繁.发现有些东西还是工作中经常会用到的,自己也花了点时间巩固下.本篇文章主要是以总结性的方式梳理,因为redis的主题很大,任何一个技术点展开都是几篇文章的量.也可以 ...

  5. Redis集群概述

    Redis Cluster与Redis3.0.0同时发布,以此结束了Redis无官方集群方案的时代,目前,Redis已经发布了3.0.7版本. redis cluster是去中心化,去中间件的,也就是 ...

  6. Redis系列1——概述

    1. 简介 Redis,key-value内存存储的数据库,全称“”Remote Dictionary Service(Sever)“”,默认端口号:6379 Redis是一个开源的使用ANSI C语 ...

  7. Redis底层结构概述

    可以使用 object encoding <key> 查看使用的具体数据结构 原图链接

  8. Redis的安装以及在项目中使用Redis的一些总结和体会

    第一部分:为什么我的项目中要使用Redis 我知道有些地方没说到位,希望大神们提出来,我会吸取教训,大家共同进步! 注册时邮件激活的部分使用Redis 发送邮件时使用Redis的消息队列,减轻网站压力 ...

  9. Redis复制与可扩展集群搭建

    抄自:http://www.infoq.com/cn/articles/tq-redis-copy-build-scalable-cluster 讨论了Redis的常用数据类型与存储机制,本文会讨论一 ...

随机推荐

  1. locust --hellp

    1. Locust简介 Locust是使用Python语言编写实现的开源性能测试工具,简洁.轻量.高效,并发机制基于gevent协程,可以实现单机模拟生成较高的并发压力. 官网:https://loc ...

  2. Linux Mysql基础操作

    1). 打开MySQL 使用如下两条命令,打开MySQL服务并使用root用户登录: # 启动 MySQL 服务 sudo service mysql start # 使用 root 用户登录,实验楼 ...

  3. C++关键字总结【新手必学】

    const 关键字——常量const 与definedefine是预编译器的编译指令,它从C语言兼容下来,工作方式与文本编辑器中的全局搜索和替换相似.define定义的常量的意义在它开始的地方持续到文 ...

  4. S32K144之时钟配置

    一般来说,时钟精度.稳定性取决于所采用的时钟源,就MCU S32K来说如内部振荡器SIRC,FIRC,128KLPO,外部晶振等,跟所使用的外设(FTM, LPIT,LPT,RTC等)和哪一路输出时钟 ...

  5. Aery的UE4 C++游戏开发之旅(4)加载资源&创建对象

    目录 资源的硬引用 硬指针 FObjectFinder<T> / FClassFinder<T> 资源的软引用 FSoftObjectPaths.FStringAssetRef ...

  6. dmidecode查看硬件信息

    //check memory,cpu,system,biosroot@dellemc-diag-os:/home# dmidecode -t Memoryroot@dellemc-diag-os:/h ...

  7. Css——设置input输入框光标颜色

    在使用 input 输入框时,我们可能会遇到需要给其设置光标颜色的情况.谷歌浏览器的默认光标颜色是黑色的,GitHub 上的光标却是白色,那么这个用 CSS 怎么改变呢? 上面描述的情景有两种实现方式 ...

  8. Python学习笔记007

    赋值运算符 num+=1 num=num+1 num-=1 num=num-1 num*=2 num=num*2 num/=2 num=num/2 num//=2 num=num//2 num%=2 ...

  9. jvm学习:类的加载、连接、初始化、常量

    类在jvm中有这几个过程类的加载.连接.初始化.使用.卸载 类的加载 类的加载是将class文件中的二进制数据加载到内存中,将其放在运行时的数据区:方法区内,然后在内存中创建一个 java.lang. ...

  10. 为什么很多 Android 程序喜欢在存储卡根目录建文件夹来存储数据而不是 Android/data 目录下?

    知乎回答.   http://www.zhihu.com/question/19866689   pansz,欢迎评论 知乎用户.弓长.知乎用户 赞同 这个道理很简单:因为没人管啊.你乱存放文件,在a ...