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

相关推荐
一直都在5724 小时前
Redis (一)
数据库·redis·缓存
秦jh_5 小时前
【Redis】客户端使用
数据库·redis·缓存
我真会写代码5 小时前
Redis核心特性详解:事务、发布订阅与数据删除淘汰策略
java·数据库·redis
IT 行者5 小时前
LangChain4j 集成 Redis 向量存储:我踩过的坑和选型建议
java·人工智能·redis·后端
wenlonglanying6 小时前
nginx 代理 redis
运维·redis·nginx
随风,奔跑6 小时前
Redis
数据库·redis·缓存
TlYf NTLE7 小时前
redis分页查询
数据库·redis·缓存
wangjialelele8 小时前
一文读懂 Redis 持久化与事务
linux·数据库·redis·bootstrap
野犬寒鸦8 小时前
Redis复习记录Day03
服务器·redis·后端·面试·bootstrap·mybatis
曲幽8 小时前
FastAPI里玩转Redis和数据库的正确姿势,别让异步任务把你坑哭了!
redis·python·mysql·fastapi·web·celery·sqlalchemy·task·backgroundtask