redis之五种基本数据类型
五种基本数据类型
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之五种基本数据类型的更多相关文章
- Redis 5种主要数据类型和命令
redis是键值对的数据库,有5中主要数据类型: 字符串类型(string),散列类型(hash),列表类型(list),集合类型(set),有序集合类型(zset) 几个基本的命令: KEYS * ...
- 跟我一起学Redis之五种基本类型及其应用场景举例(干了6个小时)
前言 来啦,老弟?来啦,上一篇就当唠唠嗑,接下来就开始进行实操撸命令,计划是先整体单纯说说Redis的各种用法和应用,最后再结合代码归纳总结. Redis默认有16个数据库(编号为0~15),默认使用 ...
- Redis五种常用数据类型
string 字符串常用操作 1.存入字符串键值对 SET key value 2.批量存储字符串键值对 MSET key value [key value ...] 3.获取一个字符串键值 G ...
- redis五种基本数据类型
1.string类:一个key对应一个value(key:value).string类是二进制安全,可以包含任何数据(例如:图片.音乐). 2.hash类:string类型field和value的映射 ...
- redis五种数据类型的使用(zz)
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
- redis五种数据类型的使用
redis五种数据类型的使用 redis五种数据类型的使用 (摘自:http://tech.it168.com/a2011/0818/1234/000001234478_all.shtml ) 1.S ...
- redis五种数据类型的使用场景
string 1.String 常用命令: 除了get.set.incr.decr mget等操作外,Redis还提供了下面一些操作: 获取字符串长度 往字符串append内容 设置和获取字符串的某一 ...
- redis(Springboot中封装整合redis,java程序如何操作redis的5种基本数据类型)
平常测试redis操作命令,可能用的是cmd窗口 操作redis,记录一下 java程序操作reids, 操作redis的方法 可以用Jedis ,在springboot 提供了两种 方法操作 Red ...
- Redis五种数据类型-设置key的过期时间
1.redis命令客户端 [root@localhost bin]# ./redis-cli 127.0.0.1:6379> #是否运行着 127.0.0.1:6379> ping PON ...
- Redis五种数据类型及应用场景
MySql+Memcached架构的问题 实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加 ...
随机推荐
- ios网络协议从http变成https
最近发了一个很蛋疼的事,iphone16.x以后的系统浏览器自动将http请求切换为https请求了 工程自测 1.在ihone14 pro max,iOS16.1的手机上用http请求是失败的,在i ...
- 狂神——SpringSecurity入门例子(设置不同用户访问权限)
文章目录 简介 SpringSecurity环境搭建 实现界面的路由跳转 效果 用户认证和授权 授权 认证 效果 注销及权限控制 注销 权限控制 记住我及首页定制 参考资料 简介 狂神的Springb ...
- 基于windows系统使用GNVM进行node切换版本
GNVM是什么? GNVM 是一个简单的 Windows 下 Node.js 多版本管理器,类似的 nvm nvmw nodist . 安装 进入官网,下载你所需要的包,直达链接 下载完成 放到我们的 ...
- 【学习笔记】QT从入门到实战完整版(菜单栏、工具栏、浮动窗口、状态栏、中心部件)(3)
QMainWindow QMainWindow 是一个为用户提供主窗口程序的类,包含以下几种类型部件,是许多应用程序的基础. 示例代码 void MainWindow::test() { // --- ...
- CH32芯片_EVT工程配置方法说明
CH32V系列 注意: 我们EVT例程中默认配置是CH32V203C8T6配置,若使用MCU为CH32V203K8T6-CH32V203C8U6-CH32V203C8T6,无需修改配置 若使用MCU为 ...
- 【Oculus Interaction SDK】(二)抓取释放效果的物理优化
前言 这篇文章是[Oculus Interaction SDK]系列的一部分,如果发现有对不上的对方,可以回去翻看我之前发布的文章,或在评论区留言.如果文章的内容已经不适用于新版本了,也可以直接联系我 ...
- springboot如何在拦截器中拦截post请求参数以及解决文件类型上传问题
我们经常有这样一个场景,比如:在springboot拦截器中想截取post请求的body参数做一些中间处理,或者用到自定义注解,想拦截一些特定post请求的方法的参数,记录一些请求日志. 想到了使 ...
- UBUNTU安装代码阅读器Understand
https://blog.csdn.net/weixin_40641902/article/details/79607225 1.直接下载 Understand-3.1.670-Linux-64bit ...
- 如何在Net6.0里配置多版本支持并支持注释说明的Swagger
一.前言 现在已经进入了微服务的开发时代了,在这个时代,如果有人问你什么是微服务,你说不知道,就有点太丢人了,别人会有异样的眼光看你,俗话说:唾液淹死人.没办法,我们只能去学习新的东西.一提到微服务, ...
- JZOJ 5343. 【NOIP2017模拟9.3A组】健美猫
题面 其中 \(1 \leq n \leq 2 \times 10^6\) 分析 考虑每次移动,发现负数对答案贡献少 \(1\),非负数多 \(1\) 每次移动都加了 \(1\) 负数变非负数关键点在 ...