redis之五种基本数据类型

一) 字符串(String)

1 使用场景

2 编码

3 编码转换

二) List(列表)

1 使用场景

2 编码

三) Set(无序集合)

1 使用场景

2 编码

3 编码转换

四) ZSet(有序集合)

1 使用场景

2 编码

3 编码转换

五) Hash

1 使用场景

2 编码

3 编码转换

五种基本数据类型

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

相关推荐
Kagol16 小时前
macOS 和 Windows 操作系统下如何安装和启动 MySQL / Redis 数据库
redis·后端·mysql
hzulwy17 小时前
Redis常用的数据结构及其使用场景
数据库·redis
ashane131418 小时前
Redis 哨兵集群(Sentinel)与 Cluster 集群对比
redis
Y第五个季节19 小时前
Redis - HyperLogLog
数据库·redis·缓存
Justice link20 小时前
企业级NoSql数据库Redis集群
数据库·redis·缓存
爱的叹息1 天前
Spring Boot 集成Redis 的Lua脚本详解
spring boot·redis·lua
morris1311 天前
【redis】redis实现分布式锁
数据库·redis·缓存·分布式锁
爱的叹息1 天前
spring boot集成reids的 RedisTemplate 序列化器详细对比(官方及非官方)
redis
weitinting1 天前
Ali linux 通过yum安装redis
linux·redis
纪元A梦1 天前
Redis最佳实践——首页推荐与商品列表缓存详解
数据库·redis·缓存