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】

原文地址:https://www.cnblogs.com/Payne-SeediqBale/p/11747576.html