zoukankan      html  css  js  c++  java
  • Redis(一)

    【历史与区别】


    1. 背景:当时antirez为统计网站页面次数,把代码中的缓存抽离到了单独应用,数据结构也很简单,就是键值对的保存。

    2. 名字由来:Remote DIctionary Service kv


    SQL与NoSQL区别

    • 关系型数据库特点

    1. 表格存储,二维

    2. 结构化数据,schema

    3. 表之间关联

    4. SQL语句操作

    5. 事务 ACID 酸

    • 关系型数据库限制

    1. 向上扩展,不支持动态扩容

    2. 表结构固定

    3. 基于磁盘读写压力

    • 非关系型数据库non-relational / Not Only SQL特点

    1. 非结构化

    2. 扩展强

    3. 无事务特性 BASE 碱

    4. 支持海量数据存储与高并发操作

    5. 分布式

    • 非关系型数据库种类

    1. KV

    2. 文档存储 MongoDB

    3. 列存储 HBase

    4. 图存储 Graph

    5. 对象存储

    6. XML存储

    7. NewSQL TiDB:结合关系型与非关系型

    • redis特性

    1. 高吞吐,高性能

    2. 丰富的数据类型

    3. 分布式

    4. 丰富的功能:持久化,过期性

    5. 客户端完善

    6. 高可用,支持扩容


     

    数据类型

    Redis中支持的多种数据结构:string,lists,sets,zset,hash,bit arrays,hyperlogslogs,streams

    其中前面五个是常用数据类型,后面三个是新增加的数据类型,我们着重介绍前面五种数据类型。

    【String 存储类型】

    1. INT,Float,String:分别为整形,浮点型,字符串型

    2. dict---- hashtable---KV----dictEntry:字典型,由hashtable的kv结构,使用十字邻接矩阵


    存储原理
    1. String三种编码

      1. int: 存储8个字节的长整型(long),大小不超过( 2^63-1),超过则使用下面两种类型存储

      2. embstr:embstr格式的SDS(Simple Dynamic String),存储小于44个字节的字符串

      3. raw: SDS, 存储大于44个字节的字符串

        SDS中结构的解析:

        1. char[] :Redis由C语言开发,其中对文件读写不使用字符串数据原因

          1. 内存空间分配

          2. 遍历字符数组长度O(n)

          3. 长度变化,内存重新分配

          4. 标记文件结尾,二进制不安全

        2. SDS:结构

           

          1. 长度时间o(1)

          2. 空间预分配,惰性空间释放,减少内存分配此处

          3. len来避免来判断文件是否结束

    2. embstr和raw的区别?

      1. embstr redisObject SDS 连续分配,只读

      2. raw 分配两次

    3. embstr和raw什么时候转化?会还原?

      1. 增加会修改为raw

      2. 不能逆转

    目的:节省内存


    使用场景
    1. 一些不经常变化的数据,可放入缓存

    2. 分布式Session

    3. 分布式锁:set NX EX

      set expire:session:userid:36 userInfo ex 100 nx
      get expire:session:userid:36
      ttl expire:session:userid:36
    4. incr 实现统一序号递增,全局ID

    5. incr 计数器(阅读量,点赞数)

    6. incr 限流(ip+userinfo限制访问)

      set room:number 36502
      incr room:number 36502  
    7. setbit 位操作(在线用户统计)

      setbit video:2001 502 1
      getbit video:2001 502
      getbit video:2001 503

    【Hash哈希】


    基本操作命令
    1. hset, hget,hgetall,hexists|hmset,hmget| hkeys,hvals|hdel,hlen

      hmset user:key:36 name payne age 18 like yours 
      hmget user:key:36 name age like
      hgetall user:key:36
      ---------
      hget user:key:36 age
      hexists user:key:36 like
      -------
      hkeys user:key:36
      hvals user:key:36
      -------
      hlen user:key:36
      hdel user:key:36 name age

    Hash 存储结构
    1. ziplist 压缩列表使用条件:ziplist-entries 小于512|ziplist-value 小于 64

      https://blog.csdn.net/qiangzhenyi1207/article/details/80353104

    2. hb hash表特点:十字邻接矩阵解决hash冲突,两个hash表是用来扩容,缩容的


    应用场景:

    1. 购物车

     

    【List列表】


    基本操作
    lpush queue:weibo:36 1 2 3
    rpush queue:weibo:36 4 5
    lindex queue:weibo:36 0
    lrange queue:weibo:36 0 -1 (-1代表列尾)

    存储原理
    1. ziplist(前期)

    2. linklist (前期)

    3. quicklist(最新)

      quicklist-> quicklistNode->ziplist


    场景
    1. 微博时间线

     

    【set 集合】


    操作命令
    sadd set:friends:36 1 2 3 4 5 32 43 111 120
    smembers set:friends:36
    scard set:friends:36
    srandmember set:friends:36
    spop set:friends:36 2
    srem set:friends:36 120
    sismember set:friends:36 | 判断成员元素是否是集合的成员
    del set:friends:36
    set 存储结构

    1. intset 为整型,并且小于512个值

    2. hashtable key存储值,value为空


    场景
    1. 抽奖

    2. 微博点赞集合,签到,打卡

    3. 商品评价标签

    4. 用户关注、推荐模型: 相互关注,我关注的人也关注了他, 可能认识的人


    set集合操作
    sdiff set1 set2 | (error) CROSSSLOT Keys in request don't hash to the same slot,两个集合需要在同一个master
    sinter set1 set2
    sunion set1 set2

    【zset有序集合】


    操作命令
    zadd myzset 10 java 20 php 30 ruby 40 cpp 50 python
    zrange myzset 0 -1 withscores
    zrevrange myzset 0 -1 withscores
    zrangebyscore myzset 20 30
    zrem myzset php cpp
    zcard myzset
    zincrby myzset 5 python
    zcount myzset 20 60
    zrank myzset java
    zscore myzset java

    zset 存储结构
    1. ziplist 有序集合中存储小于128个,且所有元素值小于64字节

    2. skiplist+dict 跳表+字典

      • 什么是skiplist?

      • 增加指针,level是随机的,让跳表更加灵活高效。


    场景
    1. 百度排行榜

     

    【hyperlogslogs,stream】

  • 相关阅读:
    hadoop集群无法找到datanode节点问题解决
    Startup.A51说明(上)
    UCOSII基础之数据结构
    FPGA之难度
    UCOSII学习笔记【二】
    (转)PCB中各层的含义(protel中)
    UCOSII学习笔记 一
    查看51汇编,解决奇怪的问题
    滑雪
    HMM的理解
  • 原文地址:https://www.cnblogs.com/Payne-SeediqBale/p/11747576.html
Copyright © 2011-2022 走看看