Redis 数据类型(5种常用)

数据类型 类比Java数据类型
string String
hash HashMap
list LinkedList
set HashSet
sorted_set TreeSet
  • 查询数据类型用法
    help @数据类型
    

    在这里插入图片描述

redis 数据存储格式

  • redis 自身是一个 Map,其中所有的数据都是采用 key : value 的形式存储
  • 数据类型指的是存储的数据的类型,也就是 value 部分的类型,key 部分永远都是字符串
    在这里插入图片描述

String

  • 存储的数据:单个数据,最简单的数据存储类型,也是最常用的数据存储类型
  • 存储数据的格式:一个存储空间保存一个数据
  • 存储内容:通常使用字符串,如果字符串以整数的形式展示,可以作为数字操作使用
    在这里插入图片描述

string基本操作

  • 添加数据(若已存在,就直接覆盖)
    set key value
    
  • 获取数据
    get key
    
  • 删除数据
    del key
    
  • 添加/修改多个数据
    mset key1 value1 key2 value2
    
  • 获取多个数据
    mget key1 key2 ...
    

    在这里插入图片描述

  • 获取数据字符个数(字符串长度)
    strlen key
    

    在这里插入图片描述

  • 追加信息到原始信息后部(如果原始信息存在就追加,否则新建)
    append key value
    

    在这里插入图片描述
    在这里插入图片描述

单数据操作 VS 多数据操作

  • 若需要操作大量数据,可合理地切割为多个操作,一次操作多个数据。此作用是,减少客户端与服务端之间传输数据所需的时间(比如,客户端与服务端连接的时间)。
    在这里插入图片描述

    减少了中间的传输时间,但处理时间不变

string 数值操作

  • 数值自增一,若不存在,则新建一个key,value为增加的值。
    incr key
    

    在这里插入图片描述

  • 数值增加相应的值。(整型类型)
    incrby key increment
    

    在这里插入图片描述

  • 数值增加响应的值。(浮点类型)
    incrbyfloat key increment
    

    在这里插入图片描述

    在小数点后数值存在之前,incrincrbyfloat都能用,但存在小数点后的数值之后,就只能用incrbyfloat

  • 数值减少,同理。注意,没有浮点数的减少方法,若需要,则通过增加负数的方法。
    decr key
    decrby key increment
    
  • redis所有的操作都是原子性的,采用单线程处理所有业务,命令是一个一个执行的,因此无需考虑并发带来的数据影响。
  • 数值上限:9223372036854775807(java中long型数据最大值,Long.MAX_VALUE)。
  • 按数值进行操作的数据,如果原始数据不能转成数值,或超越了redis 数值上限范围,将报错。

string数据生命周期

  • 设置数据具有指定的生命周期
    setex key seconds value
    psetex key milliseconds value
    

    在这里插入图片描述
    在这里插入图片描述

其他

  • 数据操作不成功的反馈与数据正常操作之间的差异
  • 表示运行结果是否成功
    • (integer) 0 → false 失败
    • (integer) 1 → true 成功
  • 表示运行结果值
    • (integer) 3 → 3 3个
    • (integer) 1 → 1 1个
  • 数据未获取到:(nil)等同于null
  • 数据最大存储量:512MB
  • 数值计算最大范围(java中的long的最大值):9223372036854775807

命名习惯

  • 表名: 主键名: 主键值: 字段名
  • 比如,一个表是users,主键是id,主键值为5456456,该字段username对应的key为users:id:5456456:username
  • 存储一个bean,有两种方式:
    • 多个key-value键值对保存
      在这里插入图片描述
    • json格式保存
      在这里插入图片描述

hash

  • 对象类数据的存储如果具有较频繁的更新需求操作会显得笨重。(见上方法)
  • 新的存储需求:对一系列存储的数据进行编组,方便管理,典型应用存储对象信息
  • 需要的存储结构:一个存储空间保存多个键值对数据
  • hash类型:底层使用哈希表结构实现数据存储
    在这里插入图片描述
  • hash存储结构优化
    • 如果field数量较少,存储结构优化为类数组结构
    • 如果field数量较多,存储结构使用HashMap结构

基本操作

  • 添加/修改数据
    hset key field value
    
  • 仅当字段名不存在才创建
    hsetnx key field value
    
  • 获取数据
    hget key field
    hgetall key
    
  • 删除数据
    hdel key field1 [field2]
    

    在这里插入图片描述

    删除键用del,删除域用hdel

  • 添加/修改多个数据
    hmset key field1 value1 field2 value2 …
    
  • 获取多个数据
    hmget key field1 field2 …
    
  • 获取哈希表中字段的数量
    hlen key
    
  • 获取哈希表中是否存在指定的字段
    hexists key field
    

    在这里插入图片描述

  • 获取该key的所有字段名(虽然叫做hkeys,获取的却是field
    hkeys key
    
  • 获取该key的所有字段名的值
    hvals key
    

    在这里插入图片描述

  • 设置指定字段的数值数据增加指定范围的值
    hincrby key field increment
    hincrbyfloat key field increment
    

    在这里插入图片描述

其他

  • hash类型下的value只能存储字符串,不允许存储其他数据类型,不存在嵌套现象。如果数据未获取到,对应的值为(nil
  • 每个 hash 可以存储 2^32 - 1 个键值对
  • hash类型十分贴近对象的数据存储形式,并且可以灵活添加删除对象属性。但hash设计初衷不是为了存储大量对象而设计的,切记不可滥用,更不可以将hash作为对象列表使用
  • hgetall 操作可以获取全部属性,如果内部field过多,遍历整体数据效率就很会低,有可能成为数据访问瓶颈

list

  • 数据存储需求:存储多个数据,并对数据进入存储空间的顺序进行区分
  • 需要的存储结构:一个存储空间保存多个数据,且通过数据可以体现进入顺序
  • list类型:保存多个数据,底层使用双向链表存储结构实现

list基本操作

  • 添加/修改数据。分别从左边插入,和从右边插入

    lpush key value1 [value2] ……
    rpush key value1 [value2] ……
    
  • 获取数据。下标从0开始,可以以负数的形式表示(-1为最后一个元素的下标),类似于python的列表下标。

    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
    

    在这里插入图片描述

    pop数据,如果没有,那就等待timeout秒,有可能其他客户端会push数据。

    在这里插入图片描述

    从一个list的右边pop出数据,从另一个list的左边push进去

  • 通过不同方向的pushpop操作,可以实现队列的栈的数据结构。

  • 移除指定数据

    lrem key count value
    

其他

  • list中保存的数据都是string类型的,数据总容量是有限的,最多2^32 - 1 个元素 (4294967295)。
  • list具有索引的概念,但是操作数据时通常以队列的形式进行入队出队操作,或以栈的形式进行入栈出栈操作
  • 获取全部数据操作结束索引设置为-1
  • list可以对数据进行分页操作,通常第一页的信息来自于list,第2页及更多的信息通过数据库的形式加载

set类型

  • 新的存储需求:存储大量的数据,在查询方面提供更高的效率
  • 需要的存储结构:能够保存大量的数据,高效的内部存储机制,便于查询
  • set类型:与hash存储结构完全相同,仅存储键,不存储值(nil),并且值是不允许重复的
    在这里插入图片描述

基本操作

  • 添加数据

    sadd key member1 [member2]
    
  • 获取全部数据

    smembers key
    
  • 删除数据

    srem key member1 [member2]
    
  • 获取集合数据总量

    scard key
    
  • 判断集合中是否包含指定数据

    sismember key member
    

    在这里插入图片描述

  • 随机获取集合中指定数量的数据

    srandmember key [count]
    
  • 随机获取集合中的某个数据并将该数据移出集合

    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
    

    在这里插入图片描述

sorted_set

  • 新的存储需求:数据排序有利于数据的有效展示,需要提供一种可以根据自身特征进行排序的方式
  • 需要的存储结构:新的存储模型,可以保存可排序的数据
  • sorted_set类型:在set的存储结构基础上添加可排序字段
    在这里插入图片描述

基本操作

  • 添加数据
    zadd key score1 member1 [score2 member2]
    
  • 获取全部数据,正序(从小到大)和反序(从大到小)输出所有内容。并且可以选择输出的下标范围。
    zrange key start stop [WITHSCORES]
    zrevrange key start stop [WITHSCORES]
    
  • 删除数据
    zrem key member [member ...]
    

    在这里插入图片描述

  • 按条件获取数据。通过score,排序输出所有内容,并且通过score进行范围筛选。
    zrangebyscore key min max [WITHSCORES] [LIMIT]
    zrevrangebyscore key max min [WITHSCORES] 
    

    在这里插入图片描述

  • 条件删除数据。左闭右闭,可以通过排名、通过分数范围进行删除。
    zremrangebyrank key start stop
    zremrangebyscore key min max
    

    在这里插入图片描述

  • 获取集合数据总量。分别是字段个数以及指定范围内的字段个数。
    zcard key
    zcount key min max
    

    在这里插入图片描述

  • 集合交、并操作。值得一提的是,合集、交集的相同key的score都会叠加。
    zinterstore destination numkeys key [key ...]
    zunionstore destination numkeys key [key ...]
    

    在这里插入图片描述

  • 获取数据对应的索引(排名)
    zrank key member
    zrevrank key member
    

    在这里插入图片描述

  • score值获取与修改
    zscore key member
    zincrby key increment member
    

    在这里插入图片描述

其他

  • score保存的数据存储空间是64位,如果是整数范围是-9007199254740992~9007199254740992
  • score保存的数据也可以是一个双精度的double值,基于双精度浮点数的特征,可能会丢失精度,使用时候要慎重
  • sorted_set 底层存储还是基于set结构的,因此数据不能重复,如果重复添加相同的数据,score值将被反
    复覆盖,保留最后一次修改的结果