redis 是一个高性能的分布式内存型数据库 , 在国内外各大互联网公司中都有着广泛的使用 , 即使是一些非互联网公司中也有着非常重要的适用场景 , 所以对 Redis 的掌握也成为后端工程师必备的基础技能 , 在面试中 , Redis早已成为老生常谈的话题 , 而在实际工作中 , 我们更是每时每刻都需要和 Redis 打交道 。因此熟练的掌握Redis技术栈的各种武功秘籍至关重要!
Redis提供了五种主要的对象(数据类型)供开发者使用 , 它提供了强大且实用的功能 。然而实际开发中有大多数的开发者仅简单会用Redis String的Get与Set 。这就好比降龙十八掌 , 你只学会了一掌 。在真正实战对敌之时不免略显单薄!这篇文章我们将回顾Redis这五大对象 , 以便于我们能够在实战中真正做到游刃有余 。
一、字符串(终究是我扛下了所有)字符串类型是Redis最基础的数据结构 , 其他几种数据结构都是在字符串类型基础上构建的 。字符串类型的值是字符串(简单的字符串、复杂的字符串(例如JSON、XML))、数字(整数、浮点数) , 甚至是二进制(图片、音频、视频)等
文章插图
字符串
字符串对象的内部编码有3种 :int、raw和embstr 。Redis会根据当前值的类型和长度来决定使用哪种编码来实现 。
- int:如果一个字符串对象保存的是整数值,并且这个整数值可以用long类型来表示
- raw:如果字符串对象保存的是一个字符串值,并且这个字符串值的长度大于32字节
- embstr:如果字符串对象保存的是一个字符串值,并且这个字符申值的长度小于等于32字节
- 作为缓存层,缓存热点数据
- Redis字符串可以自增自减的特性可以用来做计数器、限速器、自增ID生成等
- 分布式系统的Session共享
- 二进制数据的存储
Redis对象——字符串(String)
二、哈希(存储对象我也行)哈希对象用来存储一组数据对 。每个数据对又包含键值两部分 。
文章插图
哈希
哈希对象也有两种实现方式 。ziplist(压缩列表),hashtable(哈希表)
同样 , 只有当存储的数据量比较小的情况下 , Redis 才使用压缩列表来实现哈希对象 。具体需要满足两个条件:
- 字典中保存的键和值的大小都要小于 64 字节;
- 字典中键值对的个数要小于 512 个 。
当存储的内容是对象的时候 , Redis 字符串对象的很多功能使用Redis 哈希对象也可以实现 。如缓存用户信息的时候 , 使用Redis哈希对象存储 , 简单直观 , 如果使用合理可以减少内存空间的使用 。但也有其缺点 , 就是要要控制哈希在ziplist和hashtable两种内部编码的转换 , hashtable会消耗更多内存 。
此外 , Redis 哈希对象还可以实现购物车、计数器等功能 。
有关Redis哈希对象的更详细的介绍 , 可以查看我的这篇文章 。
Redis对象——哈希(Hash)
三、列表(栈和队列我都行)列表这种对象支持存储一组有序的、不重复的数据 。因为其有序性 , 它可以获取指定范围的元素列表、可以在O(1)的时间复杂度获取指定索引下标的元素等 。
文章插图
列表
在Redis3.2版本以前列表类型的内部编码有两种 。当满足下面两个条件的时候 , Redis 列表对象使用ziplist(压缩列表)来实现 。
- 当列表的元素个数小于list-max-ziplist-entries配置(默认512个)
- 当列表中每个元素的值都小于list-max-ziplist-value配置时(默认64字节)
而在Redis3.2版本开始对列表数据结构进行了改造 , 使用 quicklist 代替了 ziplist 和 linkedlist.
推荐阅读
- Excel教程:数据列太长,找个数据老是左拖右拽?是时候做点改变了!
- 一文学会redis,就是这么简单
- 支持数据连接池 分享一个简单的C#的通用DbHelper类
- 十一 网络编程懒人入门:一文读懂什么是IPv6
- 如何快速处理网络故障,一文了解网络故障排查方法
- 企业VPN数据传输流量走向解密
- 数据采集技术简介
- Go基本数据类型
- Mysql数据库查询好慢,除了索引,还能因为什么?
- BurpSuite抓取HTTPS数据包