三、五大基本数据类型
字符串对象(String)
字符串对象底层是简单动态字符串SDS
使用场景:
-
1、作为缓存
缓存一些热点数据。一般在读取数据的时候会先从Redis中读取,如果Redis中没有,再从数据库中读取,从而降低后端的压力。(需要注意缓存穿透、雪崩以及缓存更新等问题......)
-
2、计数器\限速器\分布式系统ID
计数器:主要是redis字符串自增自减
限速器:如验证码接口访问频率限制
分布式ID:由于Redis自增自减的操作是原子性的因此也经常在分布式系统中用来生成唯一的订单号、序列号
-
3、分布式系统共享session
分布式系统通常有很多个服务端,通过负载均衡机制将将用户的访问均衡到不同服务端,用户的请求可能分发
到不同的服务器上,从而导致用户登录保存Session是在一台服务器上,而读取Session是在另一台服务器上,
因此会读不到Session
需要一个公共的地方保存,redis/数据库/memecache等各有优缺点
列表对象(list)
列表中的元素是有序(按元素先后顺序存储)的,这就意味着可以通过索引下标获取某个元素或者某个范围内的元素列表。
列表中的元素可以是重复的.
ziplist压缩列表,每个压缩里列表节点保存了一个列表元素
linkedlist双端链表,每个节点都保存了一个字符串对象,在每个字符串对象内保存了一个列表元素
列表对象使用ziplist编码需要满足两个条件:一是所有字符串长度都小于64字节,二是元素数量小于512,不满足任意一个都会使用linkedlist编码。这两个都是可以直接配置修改的
Redis3.2版本开始对列表数据结构进行了改造,使用 quicklist 代替了 ziplist 和 linkedlist.
使用场景
-
消息队列
-
文章(商品等)列表
哈希对象(hash)
ziplist key-value键值对是以紧密相连的方式放入压缩链表的,先把key放入表尾,再放入value;键值对总是向表尾添加
hashtable 底层实现是字典,哈希对象中的每个key-value对都使用一个字典键值对来保存。字典键值对即是,字典的键和值都是字符串对象,字典的键保存key-value的key,字典的值保存key-value的value
哈希对象使用ziplist编码需要满足两个条件:一是所有键值对的键和值的字符串长度都小于64字节;二是键值对数量小于512个;不满足任意一个都使用hashtable编码,。这两个都是可以直接配置修改的
集合对象(set)
集合只能存储非重复的元素
集合中的元素是无序的
intset编码的集合对象底层实现是整数集合
hashtable编码的集合对象底层实现是字典,字典的每个键都是一个字符串对象,保存一个集合元素,不同的是字典的值都是NULL
集合对象使用intset编码需要满足两个条件:一是所有元素都是整数值;二是元素个数小于等于512个;不满足任意一条都将使用hashtable编码
使用场景
1、标签系统:给用户添加标签啥的
2、抽奖系统:Redis集合的
有序集合对象(zset)
ziplist
压缩列表其结构与哈希对象类似,不同的是两个紧密相连的压缩列表节点,第一个保存元素的成员,第二个保存元素的分值,而且分值小的靠近表头,大的靠近表尾。
skiplist
跳跃表和字典两种
使用场景
排行榜
小结
在Redis的五大数据对象中,string对象是唯一个可以被其他四种数据对象作为内嵌对象的;
列表(list)、哈希(hash)、集合(set)、有序集合(zset)底层实现都用到了压缩列表结构,并且使用压缩列表结构的条件都是在元素个数比较少、字节长度较短的情况下;
四种数据对象使用压缩列表的优点:
(1)节约内存,减少内存开销,Redis是内存型数据库,所以一定情况下减少内存开销是非常有必要的。
(2)减少内存碎片,压缩列表的内存块是连续的,并分配内存的次数一次即可。
(3)压缩列表的新增、删除、查找操作的平均时间复杂度是O(N),再N在一定的范围内,这个时间几乎是可以忽略的,并且N的上限值是可以配置的。
(4)四种数据对象都有两种编码结构,灵活性增加
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】