【redis中数据类型简单介绍和使用】


作为一名开发,对redis应该不会陌生,作为非关系型数据库中最热门的一款,redis通常被使用于缓存场景中,相比较于老牌的memcache,redis有多种数据类型,针对每种数据类型,有多种不同的命令,也让我们在开发中用的更加流畅。memcached是没有value的概念的,使用的是json。如果客户端想通过缓存取回value的某个元素,使用memcached需要返回value所有的数据,客户端需要有实现的代码去做解码。而使用redis,server中对每种类型都有自己的方法。redis中的类型主要有:String(字符类型、数值类型、bitmap)、Hash、List、Set、SortedSet。
在这里插入图片描述

补充:redis通常来说有以上五种数据类型,后面又支持了四种数据类型: BitMap(2.2 版新增,二值状态统计的场景,比如签到、判断用户登陆状态、连续签到用户总数等)、HyperLogLog(2.8 版新增,海量数据基数统计的场景,比如百万级网页 真实用户计数等)、GEO(3.2 版新增,存储地理位置信息的场景)、Stream(5.0 版新增,消息队列,相比于基于 List 类型实现的消息队列,有这两个特有的特性:自动生成全局唯一消息ID,支持以消费组形式消费数据)。
HyperLogLog、Bitmap、Bloom Filter 的底层都是 String 数据类型,Geospatial(地理位置) 的底层是 Sorted Set 数据类型。本文仅对前五种数据类型做简单介绍,细节以及新增的数据类型,后续文章中再做介绍。

1、String

包含字符类型,数值类型以及bitmap
Redis 中并没有使用 C 中 char 来表示字符串,而是引入了 简单动态字符串(Simple Dynamic Strings,SDS)来存储字符串和整型数据。
sds结构:
在这里插入图片描述
相关指令:
1、set、get、del
2、mset、mget(批量插入和获取)
3、expire key seconds(设置过期时间)
4、setnx -> 不存在创建存在不更新
5、incr decr(计数器)
6、setex key seconds value(不存在创建,存在则更新)

2、List

Redis的列表相当于Java语言中的LinkedList,它是一个双向链表数据结构,支持前后顺序遍历。链表结构插入和删除操作快,时间复杂度O(1),查询慢,时间复杂度O(n)。
Redis底层存储list(列表)不是一个简单的LinkedList,而是quicklist ——“快速列表”。
quicklist是多个ziplist(压缩列表)组成的双向列表;而这个ziplist(压缩列表)又是什么呢?ziplist指的是一块连续的内存存储空间,Redis底层对于list(列表)的存储,当元素个数少的时候,它会使用一块连续的内存空间来存储,这样可以减少每个元素增加prev和next指针带来的内存消耗,最重要的是可以减少内存碎片化问题。
ziplist示意:
在这里插入图片描述

3、Hash

Redis的hash(字典)相当于Java语言中的HashMap,它是根据散列值分布的无序字典,内部的元素是通过键值对的方式存储。
与Java中的HashMap(JDK1.7)的结构也是一致的,它的数据结构也是数组+链表组成的二维结构,节点元素散列在数组上,如果发生hash碰撞则使用链表串联在数组节点上。
hash扩容:
Redis中的hash(字典)存储的value只能是字符串值,此外扩容与Java中的HashMap也不同。Java中的HashMap在扩容的时候是一次性完成的,而Redis考虑到其核心存取是单线程的性能问题,为了追求高性能,因而采取了渐进式rehash策略。
渐进式rehash指的是并非一次性完成,它是多次完成的,因此需要保留旧的hash结构,所以Redis中的hash(字典)会存在新旧两个hash结构,在rehash结束后也就是旧hash的值全部搬迁到新hash之后,新的hash在功能上才会完全替代以前的hash。

4、Sorted Set

zset(有序集合)类似于Java语言中的SortedSet和HashMap的结合体,它一方面通过set来保证内部value值的唯一性,另一方面通过value的score(权重)来进行排序。这个排序的功能是通过Skip List(跳跃列表)来实现的。
zset(有序集合)的最后一个元素value被移除后,数据结构被自动删除,内存被回收。
示意:
在这里插入图片描述
补充:
skip list(跳表):zset的底层数据结构
Skip List(跳跃列表)这种随机的数据结构,可以看做是一个二叉树的变种,它在性能上与红黑树、AVL树很相近;但是Skip List(跳跃列表)的实现相比前两者要简单很多,目前Redis的zset实现采用了Skip List(跳跃列表)。
示意:
在这里插入图片描述

时间复杂度为logn

5、Set

Redis的set(集合)相当于Java语言里的HashSet,它内部的键值对是无序的、唯一的。它的内部实现了一个所有value为null的特殊字典。
集合中的最后一个元素被移除之后,数据结构被自动删除,内存被回收。

  • 20
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值