美文网首页
Redis基础--基本数据类型

Redis基础--基本数据类型

作者: 卧雪听月 | 来源:发表于2019-06-07 18:39 被阅读0次

    0 Redis 介绍

    0.1 基础知识

    不仅仅是简单的key-value数据库,更是一个in-memory data structure store。不仅仅支持简单的String key对应String value,还支持众多的类型数据:Binary-safe Strings、Lists、Sets、Sorted Sets、Hashes、Bit arrays、HyperLogLogs、Streams

    key是binary safe ,可以使任意二进制串,甚至是JPEG文件的内容。key和value 都不能超过512MB。

    最基本的操作SET 和 GET 、INCR 增加value值。EXISTS 访问key space确认是否存在key,DEL删除key和value。

    0.2 Redis expires

    Redis expires特性:Redis expires: keys with limited time to live。设置粒度最小为1ms,过期时间会保存在硬盘上。EXPIRE命令,TTL检查,PERSIST命令可以让key不过期。

    0.3 Redis lists

    基于Linked Lists实现的。 Linked List的特点:这样在List头部或者尾部增加1个element的时间是常数时间,无论List里面有几个element还是有上百万个element。当然也有缺点:检索很慢。

    Redis lists 使用Linked Lists,考虑的是作为数据库系统,快速地插入数据到一个长的list是非常重要的。Redis实现在常数时间获取lists。

    如果想要快速访问集合中间位置的数据,可以使用sorted sets。

    使用LPUSH 表头插入,RPUSH尾部插入,LRANGE KEY Start_index End_index 访问list指定区间数据。index 0开始,-1是倒数第一个。LPUSH 是 可变长的命令,可以一口气输入多个值。

    可以POP操作,获取并且从list删掉一个元素。LPOP 或者 RPOP,如果lists没有内容了,就会返回null

    0.3.1 Redis lists 场景

    1. 社交网络,记录用户最近的文章(比如 twitter 使用 Redis lists 来记录用户最新的tweets)
    2. 进程间通信,用来做消息队列,Producer和Consumer。(ruby 使用进行 background jobs)

    常见例子:
    1.每当有用户产生新的消息,就把消息ID LPUSH 到 lists中;
    2.当有其他用户访问网站的时候,就LRANGE 0 9 选择最新的10个消息展示;

    0.3.2 Capped Lists 盖帽lists

    通过LTRIM 0 99 可以只保持,最新的100个记录,其他的会被删除。

    0.3.3 Blocking operations Lists锁操作

    LPOP和RPOP升级版,可以进行等待再返回,BLPOP和BRPOP KEY 等待时间(B 应该是 Block)。等待时间内有新的element,返回,否则返回null。 但是返回值是key-value对,因为可能会等待多个lists(支持等待多个lists),而且如果多个client同时消费一个lists,先到先服务。

    还有其他command : RPOPLPUSH 和 BRPOPLPUSH

    0.3.4 自动创建和删除list key

    不光是 list 更适用于data types composed of multiple elements -- Streams, Sets, Sorted Sets and Hashes.

    对应三条规则:
    1.当向 aggregate data type增加element,如果key不存在,就先创建他,再插入element。
    2.当从aggregate data type删除element,如果空了的话,就会删除对应的key,stream类型除外。
    3.对应空的key的话,使用只读 command 例如 LLEN,或者remove 命令,仿佛存在这个没有element的key一样。

    0.4 Redis Hashes

    一个key 对应多个键值对,类似Table或者Map、Dict。

    HMSET 可以sets multiple fields of the hash
    HMGET 返回一个array关于multiple fields对应value
    HGET 返回单个值
    HINCRBY 增加单个值

    小的hashs (element少,values小)在内存中以特殊编码方式存储,效率很高。

    0.5 Redis Sets

    Redis Sets 是无序String的集合。

    SADD key elements 向sets添加一个element,还可以进行其他sets数据结构式的操作。
    smembers key 查看sets所有的元素。
    sismember key element 检查元素是否是在sets,1是,0否。

    应用场景1:标签系统
    可以正向给客户或者文章打标签,每一个客户或者文章就对应这一个key,他们的标签就都放到key对应的set里面。
    反向可以每个标签作为key,他们对应的文章或者客户放到对应的set里面。
    使用:可以通过SINTER 实现取多个set内容的交集。当然也可以unions, difference, extract a random element

    应用场景2:在线扑克游戏
    可以设置一个set存储52张牌,SPOP每次取出一张牌。
    为了防止一副牌set被POP没有元素,可以在每一局开始的时候进行copy牌集操作。使用SUNIONSTORE copySet copiedSet。

    可以使用SCARD查看集合元素数量。当然可以使用SRANDMEMBER 可以获得随机的元素,而不从sets删除他们。

    0.6 Redis Sorted sets

    既像Sets又像Hashs, Sets部分,就是保存了一系列唯一不重复的的String值。但是Sorted Sets 实现了element的排序,内部是每个element会映射一个浮点型score用来排序。score来决定大小顺序,如果score一样则比较字典顺序。

    zadd sorted_sets score key(可以设置多个) ,例如 zadd hackers 1940 "Alan Kay"

    内部实现是采用了两个数据结构,一个skip list和一个hash table。add操作LOG(N) ,读取操作是常数时间的。

    ZRANGE sorted_sets begin_index end_index读取排好序的element ,从小到大。
    ZREVRANGE 逆序读取。 可以选择末尾增加WITHSCORES 选项,同时显示Score。

    0.6.1 特殊操作 ZRANGEBYSCORE等

    ZRANGEBYSCORE sorted_sets begin_score end_score, 例如:zrangebyscore hackers -inf 1950, with a score between negative infinity and 1950 (both extremes are included).

    zremrangebyscore begin_score end_score , 删除指定范围的元素。

    zrank & zrevrank 返回元素的排序位置。

    0.6.2 Lexicographical scores字典顺序score

    使用方式,score一样,所有的元素都是按照字典顺序进行排序。

    ZRANGEBYLEX 、ZREVRANGEBYLEX 按照字典获取对应范围的元素,例如: zrangebylex hackers [B [P

    可以使用reds sorted sets 做索引。

    示例: 自动补全demo,
    把linux内核,800W行unique代码放到 1GB内存中提供服务。

    0.6.3 更新score

    可以通过ZADD 相同的元素,实现更新score

    场景:Leader Board
    e.g., "you are the #4932 best score here"

    0.7 Bitmaps

    并不是一个真正的数据类型, 而是一系列在String 上的bit维度操作。有2^32不同bits,因为String最大512MB。

    两大类操作:1 常数时间单bit操作 2 针对一组bits的操作

    Bitmaps最大的优势就是,节省空间!例如,USER可以通过自增id来指示,可以维护single bit information (代表,每一bit,代表这个用户是否想要接收新信息或其他选项), 40亿客户只需要使用512MB空间。

    SETBIT bitmaps_name key value (takes as its first argument the bit number, and as its second argument the value to set the bit to)
    GETBIT bitmaps_name key value

    Redis会自动扩充代表bitmaps的 String ,如果bitmaps 的 key超过了当前的String范围。

    0.7.1 operating on group of bits

    BITOP performs bit-wise operations between different strings. The provided operations are AND, OR, XOR and NOT.

    BITCOUNT 计数有多少bit被设置为1,BITPOS 返回第一个bit 被设置为0或者1。他们两个都可以传入RANGE参数,统计一段范围。

    使用场景
    1 实时分析
    2 和Object ID有关的高效boolean 信息
    如:想要统计网站用户访问最大的时间间隔,count day 从0开始,之后用户访问的时候,就拿时间戳-初始日期,转化为day力度,就是对应的 BIT index,之后设置为1。 每个用户都有这么一个String Bitmap就可以方便进行统计。直接BITCOUNT就可以统计客户访问网站多少天。一些BITPOS调用就可以算出最长的访问间隔。

    出于shading缘故,通常不会存一个非常长的bitmaps,而是使用多个bitmaps,通常额策略就是每个bitmaps保存 M bits, bitmaps-key = bit-number/M and , 之后对应 bitmaps-key 中的位置 Nth bit=bit-number MOD M.

    0.8 HyperLogLogs

    概率结构,来估算包含了多少元素。通常完成这个任务需要消耗大量内存,因为要记录下所有见到的元素。使用一些算法,可以在标准误差范围内,提供高效的统计,redis 误差在1%以内,消耗的空间不超过12KB。内部只是保存了一个state,并没有真正保存元素(怀疑是使用类似bloom fliter类似算法)

    HyperLogLogs(HLL)在Redis 内部被编码为String ,可以通过GET和SET来编码和解码HLL。

    概念上来说HLL和 集合Set操作性质一样,SADD添加元素,SCARD计算数量。

    PFADD 添加元素, PFCOUNT来统计大概的数据量。

    使用场景:
    统计每天客户有多少不同的查询。

    引用

    1. Flink Redis Connector官方网站
    2. Redis官方网站
    3. Redis 数据类型介绍

    相关文章

      网友评论

          本文标题:Redis基础--基本数据类型

          本文链接:https://www.haomeiwen.com/subject/ymxpxctx.html