侧边栏壁纸
  • 累计撰写 18 篇文章
  • 累计创建 10 个标签
  • 累计收到 1 条评论

redis基础

gnng
2022-05-17 / 0 评论 / 0 点赞 / 655 阅读 / 5,557 字
温馨提示:
本文最后更新于 2022-05-17,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

1. 入门

1.1 简介

  • 问题

    • 海量用户
    • 高并发
  • 原因

    • 性能瓶颈:磁盘IO性能低下
    • 扩展瓶颈:数据关系复杂,扩展性差,不便于大规模集群
  • 解决思路

    • 降低磁盘IO次数--内存存储

    • 去除数据间关系--不存储关系,仅存数据

      NoSql

1.2 NoSql

  • 定义:NoSql(Not-Only-Sql)泛指非关系型数据库,作为关系型数据库的补充
  • 作用:应对海量用户和海量数据前提下的数据处理问题。
  • 相对特征
    • 可扩容,可伸缩
    • 大量数据下高性能
    • 灵活的数据模型
    • 高可用
  • 常见NoSql数据库
    • Redis
    • MemCache
    • HBase
    • MongoDB
  • 解决方案(电商场景)
    • 商品基本信息(MySql)
      • 名称
      • 价格
      • 厂商
    • 商品附件信息(MongoDB)
    • 描述
    • 评论
    • 详情
    • 图片信息(分布式文件系统)
    • 搜索关键字(ES、Lucene、Solr)
    • 热点信息(Redis、MemCache、tair)
      • 高频
      • 波段性
  • 应用场景:不同的nosql适用于不同的场景,技术选型的时候要合理考虑。

1.3 Redis

  • 定义:Redis(Remote Dictionary Server)是用C语言开发的开源的单线程的高性能的额键值对数据库。
  • 特征
    • 数据间没有必然关系
    • 内部采用单线程进行工作
    • 高性能
    • 支持多数据类型(只针对value,key都是string类型
      • string
      • hash
      • list
      • set
      • sorted_set
    • 支持数据持久化,容灾
  • 应用
    • 热点数据的加速查询,如热点商品、热点资讯等
    • 任务队列,如秒杀、抢购、购票排队等
    • 即时信息查询,如排行榜、访问统计、在线人数等
    • 实效性控制,如邀请码控制、投票控制等
    • 分布式系统数据共享,如session共享
    • 消息队列
    • 分布式锁

1.4 常用命令

  • set key value
  • get key
  • del key
  • clear
  • exit
  • quit
  • help

2. 基本数据类型

2.1 string

  • 基本描述
    • 存储的数据:单个数据,最简单和最常用的数据存储类型。
    • 存储数据格式:一个存储空间保存一个数据。
    • 存储内容:通常使用字符串,如果字符串以整数形式展示,可以作为整数进行操作。
  • 基本操作
    • 添加/修改
      • set key value
      • mset key1 value1 key2 value2 ...(m--multiple 多个)
    • 获取
      • get key
      • mget key1 key2 ...
    • 删除
      • del key
    • 获取字符个数(字符串长度,value的长度)
      • strlen key
    • 追加信息到原始信息后部(如果原始信息存在就追加,不存在就新建)
      • append key value
  • 扩展操作
    • redis用于控制数据库主键id的生成,保证主键唯一性
      • 业务场景:分布式系统中,分表架构的主键ID,要保证统一性且不能重复,oracle中有sequence实现,mysql没有具体方案,如何解决?
      • 解决方案
        • 设置数值增加(必须是整型数据,否则报错,并且不能超过long的最大数据值
          • incr key(自增)
          • incrby key increment(增加指定值)
          • incrbyfloat key increment(增加浮点型的指定值,可以增加整数型
        • 设置数值减少(同增加,增加和减少的值都可以为负数
          • decr key (自减)
          • decrby key increment
    • redis控制数据的生命周期,通过数据是否有效来控制业务
      • 业务场景:热门商品推荐有效期,很多热点信息都具有时效性。
      • 设置数据具有指定的生命周期
        • setex key seconds value
        • psetex key milliseconds value
    • redis应用于各种结构型和非结构型的高热度数据访问加速
      • eg: user:id:3506728370:fans → 12210947(大V粉丝数) 注:参考下文key命名规范
      • eg: user:id:3506728370 →
        {"id":3506728370,"name":"春晚","fans":12210862,"blogs":6164, "focus":83}
  • 注意事项
    • 数据操作不成功的反馈与数据正常操作之间的差异(取决于想要获取什么)
      • 表示运行结果成功
        • 0->false
        • 1->true
      • 表示运行结果的值
        • 3->3个
        • 1->1个
    • 数据未获取到(nil等同于null)
    • 数据最大存储量(512MB)
    • 数值计算最大范围(Java中long的最大值-9223372036854775807)
  • 数据规范(热点数据key命名规范)
    • 表名:主键名:主键值:字段名

2.2 hash

  • 基本描述
    • 对一系列存储的数据进行编组,方便管理,典型应用存储对象信息。
    • 一个存储空间保存多个键值对数据。
    • 底层使用hash表实现结构实现数据存储。
  • 基本操作
    • 添加/修改数据
      • hset key field value
      • hmset key field1 value1 field2 value2 ...
    • 获取数据
      • hget key field
      • hmget key field1 field2
      • hgetall key
    • 删除数据
      • hdel key field1 [field2]
    • 获取hash表中字段数量
      • hlen key
    • 获取hash表中是否存在指定字段
      • hexists key field
  • 扩展操作
    • 获取hash表中所有的字段名和字段值
      • hkeys key
      • hvals key
    • 设置指定字段的数值数据增加指定范围值
      • hincrby key field increment
      • hincrbyflot key field increment
  • 注意事项
    • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未取到,对应的值为nil。
    • 每个hash可以存储2³²-1个键值对。
    • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但是不可滥用。
    • hgetall操作可以获取全部属性,如果field过多,遍历整体数据效率较低,可能成为数据访问瓶颈。
  • 应用场景
    • redis应用于购物车数据存储设计。
    • redis应用于抢购,限购类、限量发送优惠券、激活码等业务的数据存储设计。

2.3 list

  • 基本描述
    • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分。
    • 存储结构:一个存储空间存储多个数据,且通过数据可以体现进入顺序。
    • list类型:保存多个数据,底层是双向链表实现。
  • 基本操作
    • 添加/修改数据
      • lpush key value1 [value2] ...
      • rpush key value1 [value2] ...
    • 获取数据
      • lrange key start stop (下标)
      • lindex key index
      • llen key
    • 获取并移除数据
      • lpop key
      • rpop key
  • 扩展操作
    • 规定时间内获取并移除数据(有就移除,没有就阻塞)
      • blpop key1 [key2] timeout
      • brpop key1 [key2] timeout
      • brpoplpush source destination timeout
    • 移除指定数据(redis应用于具有操作先后顺序的数据控制)
      • lrem key count value
  • 注意事项
    • list中保存的数据都是string类型,数据总容量有限最多2³²-1个元素。
    • list具有索引的概念,但是数据的操作通常以队列或栈的形式进行入队出队操作。
    • 获取全部数据操作结束索引设置为-1。
    • list可以对数据进行分页操作,通常第一页的数据来自于list,第二页之后的数据以数据库的形式加载。
  • 应用场景
    • 依赖list的数据具有顺序的特征对信息进行管理。
    • 使用队列模型进行多路信息汇总合并。
    • 使用栈模型解决最新消息的展示。

2.4 set

  • 基本描述
    • 存储需求:存储大量的数据,在查询方面提供更高的效率。
    • 存储结构:与hash存储结构相同,仅存键,不存储值(nil),并且值是不允许重复的。
  • 基本操作
    • 添加数据
      • sadd key member1 [member2] ...
    • 获取全部数据
      • smembers key
    • 删除数据
      • srem key member1 [member2] ...
    • 获取集合数据总量
      • scard key
    • 判断集合中是否包含指定数据
      • sismember key member
  • 扩展操作
    • 随机获取集合内指定数量的数据(redis用户随机推荐类的信息检索)
      • srandmember key [count] count不加默认为1
    • 随机获取集合内指定数量的数据并将数据移除
      • spop key [count]
    • 求两个集合的交、并、差集
      • sinter key1 [key2]
      • sunion key1 [key2]
      • sdiff key1 [key2]
    • 求两个集合的交、并、差集并存储到指定集合中
      • sinterstore destination key1 [key2]
      • sunionstore destination key1 [key2]
      • sdiffstore destination key1 [key2]
    • 将指定数据从原始集合中移动到目标集合中
      • smove source destination member
  • 注意事项
    • set类型不允许数据重复,如果添加的数据在set中已经存在,将只保留一份。
    • set虽然和hash存储结构相同,但是无法启用hash中存储值的空间。
  • 应用场景
    • redis应用于相同类型数据快速去重
    • redis应用于黑名单和白名单设定的服务控制

2.5 sorted_set

  • 基本描述

    • 存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式。
    • 存储结构:在set存储结构上添加可排序字段。
  • 基本操作

    • 添加数据

      • zadd key score1 member1 [score2 member2 ...]
    • 获取全部数据

      • zrange key start stop [withscores]
      • zrevrange key start stop [withscores] --排序结果反转
    • 删除数据

      • zrem key member [member ...]
    • 按条件获取数据

      • zrangebyscore key min max [withscores]
      • zrevrangebyscore key min max [withscores]
    • 按条件删除数据

      • zremrangebyrank key start stop
      • zremrangebyscore key min max
    • 获取集合数据总量

      • zcard key
      • zcount key min max
    • 集合交、并操作

      • zinterstore destination numkeys key [key ...]
      • zunionstore destination numkeys key [key ...]

      注意

      • min和max用于限定搜索查询的条件,表示最小和最大。
      • start和stop用于限定查询的范围,作用于索引,表示开始和结束索引。
      • offset和count用于限定查询范围,作用与查询结果,表示开始位置和数据总量。
  • 扩展操作

    • 获取数据对应的索引(排名)
      • zrank key member
      • zrerank key member
    • score值获取与修改
      • zscore key member
      • zincrby key increment member
  • 注意事项

    • score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992。
    • score保存的数据也可以是双精度的double值,可能会丢失精读。
    • sorted_set底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同数据,score值会反复覆盖,保留最后一次修改的结果。
  • 应用场景

    • redis应用于计数器组合排序功能对应的排名。
    • redis应用于定时任务执行顺序管理或任务过期管理。
    • redis应用于即时任务/消息队列执行管理。
    • redis应用于按次结算的服务控制。

2.6 解决方案列表

  • Tips 1:redis用于控制数据库表主键id,为数据库表主键提供生成策略,保障数据库表的主键唯一性
  • Tips 2:redis 控制数据的生命周期,通过数据是否失效控制业务行为,适用于所有具有时效性限定控制的操作
  • Tips 3:redis应用于各种结构型和非结构型高热度数据访问加速
  • Tips 4:redis 应用于购物车数据存储设计
  • Tips 5:redis 应用于抢购,限购类、限量发放优惠卷、激活码等业务的数据存储设计
  • Tips 6:redis 应用于具有操作先后顺序的数据控制
  • Tips 7:redis 应用于最新消息展示
  • Tips 8:redis 应用于随机推荐类信息检索,例如热点歌单推荐,热点新闻推荐,热卖旅游线路,应用APP推荐,大V推荐等
  • Tips 9:redis 应用于同类信息的关联搜索,二度关联搜索,深度关联搜索
  • Tips 10:redis 应用于同类型不重复数据的合并、取交集操作
  • Tips 11:redis 应用于同类型数据的快速去重
  • Tips 12:redis 应用于基于黑名单与白名单设定的服务控制
  • Tips 13:redis 应用于计数器组合排序功能对应的排名
  • Tips 14:redis 应用于定时任务执行顺序管理或任务过期管理
  • Tips 15:redis 应用于及时任务/消息队列执行管理
  • Tips 16:redis 应用于按次结算的服务控制
  • Tips 17:redis 应用于基于时间顺序的数据操作,而不关注具体时间

3. Redis通用指令

  • 删除指定key
    • del key
  • 获取key是否存在
    • exists key
  • 获取key的类型
    • type key
  • 为key设置有效期
    • expire key seconds
    • pexpire key milliseconds
    • expireat key timestamp
    • pexpireat key milliseconds-timestamp
  • 获取key的有效时间
    • ttl key
    • pttl key
  • 切换key从时效性转换为永久性
    • persist key
  • 查询key
    • keys pattern (正则)
  • 为key改名
    • rename key newkey
    • renamenx key newkey
  • 对所有key排序
    • sort
  • 其他key的通用操作
    • help @generic
  • 切换数据库
    • select index
  • 其他操作
    • quit
    • ping
    • echo message
  • 数据移动
    • move key db
  • 清除数据
    • dbsize
    • flushdb
    • flushall
0

评论区