redis数据类型

Redis哈希类型

  1. 哈希类型就是值为Map 类型
  2. 命令
  • 设置值:hset key field value,成功返回1,失败返回0,hsetnx 命令与setnx 命令类似,但作用域不是键,而是field
  • 获取值:hget key field,如果键或field 不存在则返回nil
  • 删除键:hdel key field [field1…],删除一个或多个field,返回结果为成功删除的field个数
  • 计算某个key的field个数:hlen key
  • 批量设置和获取值:hmset key field1 value1 field2 value2,hmget key field1 field2
  • 判断是否包含field:hexists key field,存在则返回1,不存在则返回0
  • 获取key的所有field 域:hkeys key
  • 获取key的所有域的值:hvals key
  • 获取key的所有field-value:hgetall key
  1. 内部编码
  • 哈希类型的内部编码有两种:ziplist(压缩列表)和 hashtable(哈希表)
  • ziplist 使用更加紧凑的存储结构,所以比hashtable 更节省内存
  • 当不能满足ziplist 的存储要求时(数据量较大),ziplist的读写效率会下降,此时redis会使用hashtable
  1. 使用场景
  • 缓存关系型数据

在这里插入图片描述

使用字符串序列化也可以缓存关系型数据,但哈希类型更加直观

哈希类型是稀疏的,而关系型数据库是完全结构化,如下图所示:

在这里插入图片描述

关系型数据库可以做复杂的关系查询,而redis模拟关系查询难度大,维护成本高

  • 缓存数据的三种方法

    • 原生字符串,每个属性一个键
    set user:1:name tom
    set user:1:age 23
    set user:1:city beijing
    
    • 序列化字符串类型,将信息序列化后用一个键保存
    set user:1 serialize(userInfo)
    
    • 哈希类型,对象的一个属性用一个field-value 保存,总共只用一个键
    hmset user:1 name tom age 23 city beijing
    

列表

  1. redis列表是值为List的类型,且这个List的两端都是可以插入和弹出的

在这里插入图片描述

  1. 列表有两个特点:有序 和 可重复,有序则可以按索引获取
  2. 命令
  • redis List 命令分为增删查改和阻塞操作五类,如下图所示:

在这里插入图片描述

  • 添加

    • 从左或右边压入一个或多个元素:rpush | lpush key value [value…]
    • 在某个元素前或后插入元素,左为前,右为后:linsert key before | after pivot value,即从左至右在第一个等于pivot的元素的前或后插入value,返回值为插入后列表的长度
  • 删除

    • 每次操作从列表左或右弹出一个元素:rpop | lpop key

    • 移除指定值的一个或多个元素:lrem key count value,count分正负零三种情况:

      ​ 正,表示从左至右开始查找,最多移除count个值等于value的元素

      ​ 负,表示从右至左开始查找,最多移除count的绝对值个值等于value的元素

      ​ 零,表示移除所有值等于value的元素

    • 裁剪列表,只保留一段元素:ltrim key start end,即从左至右保留start 至 end 的元素,特别要注意的是,在redis中end会包含在其中,不会像许多语言只保留到end-1

  • 查找

    • 按索引返回查找的列表值:lrange key start end,N个元素从左至右索引编号为0 - N-1,从右至左索引编号为-1 - -N。lrange key 0 -1,表示返回列表所有元素的值
    • 按索引返回元素的值:lindex key index,索引规则同lrange 命令
    • 获取列表长度:llen key
  • 修改

    • 修改之指定索引的值:lset key index,索引规则同上
  • 阻塞弹出

    • brpop | blpop key [key…] timeout,表示从左至右扫描所有key,弹出第一个非空的元素后返回,返回值为弹出的key 与 元素值。若所有key 都没有元素则会阻塞,timeout为阻塞的时间,timeout为0表示一直阻塞。
    • 若多个客户端同时执行brpop | blpop, 则最先执行命令的客户端可以获取到弹出的值,其他客户端继续阻塞
  1. 内部编码

在满足一定条件的情况下使用ziplist,节省内存;不满足条件时使用linkedlist;redis3.2 提供了quicklist 实现,它结合了ziplist 与 linkedlist 的优势

  1. 使用场景
  • 消息队列,使用lpush + brpop,实现阻塞队列,如下图所示:

在这里插入图片描述

集合

  1. 集合(Set)的元素不可重复且是无序的
  2. 命令
  • 集合的操作分为集合内的增删查改和集合间的交集,并集,差集

  • 增:sadd key ele [ele…],如果成功,返回结果为增加的元素个数

  • 删:srem key ele [ele…],如果成功,返回结果为删除元素的个数

    spop key [count],从集合中随机弹出指定个数的元素,count参数从redis3.2开始支持

  • 查:smembers key,获取所有元素,返回结果是无序的

  • 改:暂无

  • 集合内其他操作:

    • scard key,计算集合内元素个数,直接读取redis变量值,时间复杂度为1
    • sismember key ele,判断元素是否在集合内
    • srandmember key [count],从集合中随机获取指定个数的元素
  • sinter | suion | sdiff key [key…],求多个集合的交并差集

  • sinter | suion | sdiff + store destination_key key [key…],求交并差集比较耗时,这个命令可以将结果存在destination_key 中

  1. 内部编码

当集合的元素都是整数且小于set-maxintset-entries 时采用intset(整数集合),否则采用hashtable

  1. 应用场景
  • sadd = tagging(标签)
  • spop/srandmember = Random item(生成随机数,如抽奖)
  • sadd + sinter = Social Graph(社交需求)

有序集合

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值