• Redis的数据结构与应用场景


    一、Redis简介

      Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多种语言的 API。

      Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(set)和有序集合(sorted set)等类型。

    二、字符串(String)

    1,常用指令

    #常用操作
    SET key value                         //存入字符串键值对
    MSET key value [key value ...]        //批量存储字符串键值对
    SETNX key value                       //当且仅当key不存在,存入value返回1;若key已存在,则不做操作返回0。
    GET key                               //获取一个key对应的value
    MGET key [key ...]                    //批量获取字符串键值
    DEL key [key ...]                     //删除键
    #原子加减操作
    INCR key                              //将key中存储的数字值(value为string报错)加1
    DECR key                              //将key中存储的数字值(value为string报错)减1
    INCRBY key n                          //将key中存储的数字值加n
    DECRBY key n                          //将key中存储的数字值减n

    2,应用场景

    a)单值缓存

    • SET key value
    • GET key

    b)对象缓存

    • SET user:1 value(json格式数据)
    • MSET user:1:name zs user:1:age 18  user:2:name ls user:2:age 20

      采用String类型的对象缓存有两种方式:1.直接缓存整个对象的json;2.采用将key进行分离为user:ID:属性,采用MSET存储,用MGET获取各属性值。

    c)分布式锁

    • set product:10001 true ex 10 nx
    SET key value [EX seconds] [PX milliseconds] [NX|XX]
    EX seconds :设置失效时间,单位秒
    PX milliseconds:设置失效时间,单位毫秒
    NX : key不存在时设置value,成功返回OK,失败返回nil
    XX : key存在时设置value,成功返回OK,失败返回nil

      设置key为product:ID过期时间为10s,如果当前key已经存在就会直接返回nil。

    d)计数器

    • INCR aritcle:readcount:{文章id}
    • GET aritcle:readcount:{文章id}

    e)分布式系统全局序列号

    • INCRBY orderId 10

    三、哈希(Hash)

    1,常用命令

    #hash常用操作
    HSET key field value                        //存储一个哈希表key的键值
    HSETNX key field value                      //存储一个不存在的哈希表key的键值
    HMSET key field value [field value...]      //在一个哈希表key中存储多个键值对
    HGET key field                              //获取哈希表key对应的field键值
    HMGET key field [field ...]                 //批量获取哈希表key中多个field键值
    HDEL key field [field ...]                  //删除哈希表key中的field键值
    HLEN key                                    //返回哈希表key中field的数量
    HGETALL key                                 //返回哈希表key中所有的键值
    HINCRBY key field n                         //为哈希表key中field键的值加上增量n

    2,应用场景

    a)对象存储

    • HMSET user 1:name zs 1:age 20
    • HMGET user 1:name 1:age

      当需要存储的对象不大时,可以采用固定的key,对应的field为ID:属性,采用HMSET的方式,这样就能将所有的对象存储在同一个key中;

      当需要存储的对象比较大时,可以将key进行动态分离开,例如:设置key为user:序号,序号为0~1000,每个存储对象根据id%序号,确定当前对象分配到哪个key中。

    b)购物车

      定义:用户id为key,商品id为field,商品数量为value

    • 添加商品:hset cart:1001 1100 1
    • 添加数量:hincrby cat:1001 1100 1
    • 商品总数:hlen cart:1001
    • 删除商品:hdel cart:1001 1100
    • 获取购物车所有商品:hgetall cart:1001

    3,hash结构优缺点

    a)优点

    • 同类数据归类整合储存,方便数据管理
    • 相比String操作消耗内存与cpu更小
    • 相比String存储更省空间(hash的存储结构存在ziplist)

    b)缺点

    • 过期功能不能使用在field上,只能用在key上
    • Redis集群架构下不适合大规模使用(容易造成数据倾斜)

    四、列表(list)

    1,常用命令

    #List常用操作
    LPUSH key value [value ...]                 //将一个或多个值value插入到key列表的表头(最左边),最后的值在最前面
    RPUSH key value [value ...]                 //将一个或多个值value插入到key列表的表尾(最右边)
    LPOP key                                    //移除并返回key列表的头元素
    RPOP key                                    //移除并返回key列表的尾元素
    LRANGE key start stop                       //返回列表key中指定区间内的元素,区间以偏移量start和stop指定,从0开始
    BLPOP key [key ...] timeout                 //从key列表表头弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞
    BRPOP key [key ...] timeout                 //从key列表表尾弹出一个元素,没有就阻塞timeout秒,如果timeout=0则一直阻塞

    2,应用场景

    a)常用数据结构

    • stack(栈) = LPUSH + LPOP -> FIFO
    • queue(队列) = LPUSH + RPOP
    • Blocking MQ(阻塞队列) = LPUSH + BRPOP

    b)微博消息和微信公众号消息

      用户A关注了公众号B和公众号C

    • B发微博,消息ID为1001。LPUSH msg:AID 1001
    • C发微博,消息ID为1002。LPUSH msg:AID 1002
    • A查看微博前五条。LRANGE msg:AID 0 4 

    五、集合(Set)

    1,常用命令

    #Set常用操作
    SADD key member [member ...]                //往集合key中存入元素,元素存在则忽略,若key不存在则新建
    SREM key member [member ...]                //从集合key中删除元素
    SMEMBERS key                                //获取集合key中所有元素
    SCARD key                                   //获取集合key中的元素个数
    SISMEMBER key member                        //判断member元素是否存在于集合key中
    SRANDMEMBER key [count]                     //从集合key中随机选出count个元素,元素不从key中删除
    SPOP key [count]                            //从集合key中随机选出count个元素,元素从key中删除
    #Set运算操作
    SINTER key [key ...]                        //交集运算
    SINTERSTORE destination key [key ...]       //将交集结果存入新集合destination中
    SUNION key [key ...]                        //并集运算
    SUNIONSTORE destination key [key ...]       //将并集结果存入新集合destination中
    SDIFF key [key ...]                         //差集运算
    SDIFFSTORE destination key [key ...]        //将差集结果存入新集合destination中

    2,应用场景

    a)微信微博点赞,收藏,标签

    • 点赞。SADD like:{消息ID} {用户ID}
    • 取消点赞。SREM like:{消息ID} {用户ID}
    • 检查用户是否点赞。SISMEMBER like:{消息ID} {用户ID}
    • 获取点赞的用户列表。SMEMBERS like:{消息ID}
    • 获取点赞用户数。SCARD like:{消息ID}

    b)微博微信关注模型

    • A关注的人:aSet -> {b,c,d}
    • B关注的人:bSet -> {a,c,d,e}
    • C关注的人:cSet -> {a,b,d,e,f}
    • A和B共同关注的人:SINTER aSet bSet ->{c,d}
    • A关注的人也关注C:A可能认识的人:SDIFF bSet aSet -> {a,e}
      • SISMEMBER cSet b 
      • SISMEMBER cSet d

    六、有序集合(sorted set)

    1,常用命令

    #ZSet常用操作
    ZADD key score member [[score member]...]   //往有序集合key中加入带分值元素
    ZREM key member [member...]                 //往有序集合key中删除元素
    ZSCORE key member                           //返回有序集合key中元素member的分值
    ZINCREBY key increment member               //为有序集合key中元素member的分值加上increment
    ZCARD key                                   //返回有序集合key中元素个数
    ZRANGE key start stop [WITHSCORES]          //正序获取有序集合key从start下标到stop下标的元素
    ZREVRANGE key start stop [WITHSCORES]       //倒序获取有序集合key从start下标到stop下标的元素
    #ZSet运算操作
    ZUNIONSTORE destkey numberkeys key [key...] //并集计算(相同元素分值相加),numberkeys一共多少个key,WEIGHTS每个key对应的分值乘积
    ZINTERSTORE destkey numberkeys key [key...] //交集计算(相同元素分值相加),numberkeys一共多少个key,WEIGHTS每个key对应的分值乘积

    2,应用场景

    a)微博热搜榜

    • 点击新闻:ZINCRBY hotNews:210218 1 春节零售餐饮消费超8000亿元  (将当前新闻的分值加1)
    • 展示当日排行前十:ZRERANGE hotNews:210218 0 9 WITHSCORES 
    • 七日搜索榜单计算:ZUNIONSTORE hotNews:210212-210218 7 hotNews:210212 hotNews:210213 ... hotNews:210218
    • 展示七日排行前七:ZREVRANGE hotNews:210212-210218 0 9 WITHSCORES
  • 相关阅读:
    APK Multi-Tool强大的APK反编译工具终极教程
    Android中Intent组件详解 .
    Android游戏开发之旅 View类详解
    深入理解Android中View
    SQLite学习手册(数据表和视图)
    转)sqlite 数据类型
    (转)SQLite内置函数
    Android权限Uri.parse的几种用法(转载)
    android中与SQLite数据库相关的类
    JDK核心包学习
  • 原文地址:https://www.cnblogs.com/bbgs-xc/p/14376109.html
Copyright © 2020-2023  润新知