五种基本数据类型

redis存储任何类型的数据都是以key-value形式保存,并且所有的key都是字符串,所以讨论基础数据结构都是基于value的数据类型

常见的5种数据类型是:String、List、Set、Zset、Hash

一) 字符串(String)

String是redis最基本的类型,value最大是512M,String类型是二进制安全的,可以包含任何数据,如jpg图片或者序列化的对象

1 使用场景

1) 缓存:redis作为缓存层,mysql做持久化层,降低mysql的读写压力

2) 计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源

3) 分布式session

4) 分布式锁

5) 限流

2 编码

String类型的编码包括:

1) int编码:保存用 long 类型的整数值

2) embstr编码:长度小于44Byte的短字符串(redis3.2版本之前是39Byte,之后是44Byte),对其进行修改后变成raw编码,无论是否达到44字节

3) raw编码: 长度大于44Byte的长字符串(redis3.2版本之前是39Byte,之后是44Byte)

3 编码转换

1)  int 编码的值不再是整数,或大小超过了long类型的时,自动转化为raw
2)  由于redis没有对embstr编码的值提供修改方法(embstr编码是只读的),在修改embstr编码的值时,都会先转化为raw编码再进行修改,修改后的对象一定是raw编码的,无论是否达到了44Byte

二) List(列表)

redis中的List其实就是双端链表

使用List的技巧
lpush+lpop=Stack(栈)
lpush+rpop=Queue(队列)
lpush+ltrim=Capped Collection(有限集合)
lpush+brpop=Message Queue(消息队列)

1 使用场景

1) 简单队列:发布微博,用lpush加入时间轴,最新消息排行,展示新的列表信息

2) 消息队列:PUSH 操作将任务存放在List中,然后工作线程再用 POP操作将任务取出进行执行

2 编码

1) linkedlist:双向链表,当列表元素个数比较多或者某个元素占用空间比较大的时使用,redis3 .2版本之前使用

2) ziplist:压缩列表,当列表元素个数比较少并且每个元素占用空间比较小时使用,redis3 .2版本之前使用

3) quicklist:快速列表,结合了ziplist和linkedlist各自的优点,redis3 .2版本开始使用

三) Set(无序集合)

redis中的Set类型是无序集合,集合中成员是不可重复的

添加,删除,查找元素的复杂度都是 O(1)

1 使用场景

1) 标签:有同一标签或者类似标签的可以给推荐关注的事或者关注的人

2) 点赞,点踩,收藏

2 编码

1) hashtable:数据全部存储于dict的键中,值字段闲置不用

2) intset:集合中存储的只能是数值数据,且必须是整数

3 编码转换

同时满足以下两个条件时,使用intset编码,否则使用hashtable编码

1) Set中所有元素都是整数

2) Set中所有元素数量不超过512M(配置文件的set-max-intset-entries参数)

四) ZSet(有序集合)

Zset类型和Set类型基本一样,区别在于Zset类型是有序集合

Zset集合中的每个元素都会关联一个 double 类型的权重参数(score),使得集合中的元素能够按score进行有序排列

添加,删除,查找元素的复杂度都是 O(1)

1 使用场景

1) 排行榜:如网站需要对用户点赞数从高到低进行排行
2) 权重分配:带权重的队列,如普通消息的score为1,重要消息的score为2,工作线程根据权重倒序获取,保证重要的任务优先执行

2 编码

1) ziplist:需要基于ziplist数据结构的基础做排序与去重

2) skiplist:底层使用了dict与skiplist两种数据结构
      单独使用dict,虽然能以 O(1) 的时间复杂度查找成员,但dict是无序的,所以进行范围操作的时候都要进行排序;

      单独使用skiplist,虽然能执行范围操作,但是查找操作为O(logN)

      因此redis使用了dict与skiplist两种数据结构来共同实现Zset,既可以以O(1) 的时间复杂度查找成员,又可以实现范围操作

3 编码转换

当Zset对象同时满足以下两个条件时,使用 ziplist 编码,否者使用 skiplist 编码

1) 保存的元素数量小于128(配置文件的zset-max-ziplist-entries参数)

2) 保存的所有元素长度都小于64Byte(配置文件的zset-max-ziplist-value参数)

五) Hash

Hash是一个key(字段) 和 value(属性) 的映射表,hash 特别适合用于存储对象

一个Hash可以存多个key-value

1 使用场景

1) 缓存:用户信息,视频信息等

2) 用户信息

3) 用户主页访问量

4) 组合查询

2 编码

1) ziplist

2) hashtable

3 编码转换

当同时满足下面两个条件时,使用ziplist编码,否则使用hashtable 编码

1) 列表保存元素个数小于512(配置文件的set-max-intset-entries参数)

2) 每个元素长度小于64Byte

redis之五种基本数据类型的更多相关文章

  1. Redis 5种主要数据类型和命令

    redis是键值对的数据库,有5中主要数据类型: 字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) 几个基本的命令: KEYS * ...

  2. 跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时)

    前言 来啦,老弟?来啦,上一篇就当唠唠嗑,接下来就开始进行实操撸命令,计划是先整体单纯说说Redis的各种用法和应用,最后再结合代码归纳总结. Redis默认有16个数据库(编号为0~15),默认使用 ...

  3. Redis五种常用数据类型

    string 字符串常用操作 1.存入字符串键值对  SET key value 2.批量存储字符串键值对  MSET key value [key value ...] 3.获取一个字符串键值  G ...

  4. redis五种基本数据类型

    1.string类:一个key对应一个value(key:value).string类是二进制安全,可以包含任何数据(例如:图片.音乐). 2.hash类:string类型field和value的映射 ...

  5. redis五种数据类型的使用(zz)

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

  6. redis五种数据类型的使用

    redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...

  7. redis五种数据类型的使用场景

    string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...

  8. redis(Springboot中封装整合redis,java程序如何操作redis的5种基本数据类型)

    平常测试redis操作命令,可能用的是cmd窗口 操作redis,记录一下 java程序操作reids, 操作redis的方法 可以用Jedis ,在springboot 提供了两种 方法操作 Red ...

  9. Redis五种数据类型-设置key的过期时间

    1.redis命令客户端 [root@localhost bin]# ./redis-cli 127.0.0.1:6379> #是否运行着 127.0.0.1:6379> ping PON ...

  10. Redis五种数据类型及应用场景

    MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加 ...

随机推荐

  1. ios网络协议从http变成https

    最近发了一个很蛋疼的事,iphone16.x以后的系统浏览器自动将http请求切换为https请求了 工程自测 1.在ihone14 pro max,iOS16.1的手机上用http请求是失败的,在i ...

  2. 狂神——SpringSecurity入门例子(设置不同用户访问权限)

    文章目录 简介 SpringSecurity环境搭建 实现界面的路由跳转 效果 用户认证和授权 授权 认证 效果 注销及权限控制 注销 权限控制 记住我及首页定制 参考资料 简介 狂神的Springb ...

  3. 基于windows系统使用GNVM进行node切换版本

    GNVM是什么? GNVM 是一个简单的 Windows 下 Node.js 多版本管理器,类似的 nvm nvmw nodist . 安装 进入官网,下载你所需要的包,直达链接 下载完成 放到我们的 ...

  4. 【学习笔记】QT从入门到实战完整版(菜单栏、工具栏、浮动窗口、状态栏、中心部件)(3)

    QMainWindow QMainWindow 是一个为用户提供主窗口程序的类,包含以下几种类型部件,是许多应用程序的基础. 示例代码 void MainWindow::test() { // --- ...

  5. CH32芯片_EVT工程配置方法说明

    CH32V系列 注意: 我们EVT例程中默认配置是CH32V203C8T6配置,若使用MCU为CH32V203K8T6-CH32V203C8U6-CH32V203C8T6,无需修改配置 若使用MCU为 ...

  6. 【Oculus Interaction SDK】(二)抓取释放效果的物理优化

    前言 这篇文章是[Oculus Interaction SDK]系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言.如果文章的内容已经不适用于新版本了,也可以直接联系我 ...

  7. springboot如何在拦截器中拦截post请求参数以及解决文件类型上传问题

      我们经常有这样一个场景,比如:在springboot拦截器中想截取post请求的body参数做一些中间处理,或者用到自定义注解,想拦截一些特定post请求的方法的参数,记录一些请求日志. 想到了使 ...

  8. UBUNTU安装代码阅读器Understand

    https://blog.csdn.net/weixin_40641902/article/details/79607225 1.直接下载 Understand-3.1.670-Linux-64bit ...

  9. 如何在Net6.0里配置多版本支持并支持注释说明的Swagger

    一.前言 现在已经进入了微服务的开发时代了,在这个时代,如果有人问你什么是微服务,你说不知道,就有点太丢人了,别人会有异样的眼光看你,俗话说:唾液淹死人.没办法,我们只能去学习新的东西.一提到微服务, ...

  10. JZOJ 5343. 【NOIP2017模拟9.3A组】健美猫

    题面 其中 \(1 \leq n \leq 2 \times 10^6\) 分析 考虑每次移动,发现负数对答案贡献少 \(1\),非负数多 \(1\) 每次移动都加了 \(1\) 负数变非负数关键点在 ...