Redis学习心得—Redis数据结构

Redis数据结构

Redis目前支持5种数据类型,分别是string、list、hash、set及zset,下面来一一介绍;

1.string(字符串)

string是Redis最基础的数据结构,所有的key都是字符串类型,一个key=value,
string类型是二进制安全,也就是可以包含任意数据(图片,文字,数字等等),但是最大的值不能超过512m,同时也是唯一个会被其他四种对象嵌套的类型。

例如:
127.0.0.1:6379> set address 长沙   #这里address 就是key, 长沙是value

二进制安全特点:
1.编码、解码在客户端完成,执行效率高
2.不需要频繁的边解码,不会出现乱码(不是个正宗的开发听得有点懵)
适用场景:
缓存:用于缓存访问频率较高的数据,或者不经常变动的数据(如图片,视频,css文件),也支持incr操作,
计数器:用作计数器,进行相关数据统计。
限速:处于安全性考虑,限制用户登录网站获取验证码的频率

2.list

list(列表)是简单的字符串列表,按照插入顺序排序,你可以添加一个元素到列表的头部(左边)或者尾部(右边)。
list的本质是个链表,list的元素是有序的,并且元素的值是可以重复的。
Redis列表集合主要是用来有序的存储多个字符串。3.0之前列表存储是使用ziplist和linkedlist实现的。3.0之后使用quicklist实现的

在redis.conf配置文件中,有两个参数可以优化列表:
list-max-ziplist-size 表示每个quicklistNode的字节大小。默认为-2 表示8KB
list-compress-depth 表示quicklistNode节点是否要压缩。默认是0 表示不压缩

什么是quicklist?

quicklist就是一个双向链表结构,和普通的链表操作一样,插入删除效率很高,但查询的效率却是O(n)。不过,这样的链表访问两端的元素的时间复杂度却是O(1)。所以,对list的操作多数都是poll和push。
每个quicklist节点就是一个ziplist,具备压缩列表的特性。

什么是ziplist?

ziplist是由一系列特殊编码的连续内存块组成的顺序存储结构,类似于数组,ziplist在内存中是连续存储的,但是不同于数组,为了节省内存 ziplist的每个元素所占的内存大小可以不同(数组中叫元素,ziplist叫节点entry,下文都用“节点”),每个节点可以用来存储一个整数或者一个字符串。
具体ziplist参考:https://www.jianshu.com/p/afaf78aaf615

3.hash

Redis是一个键值对集合,通过键值对存储,又称散列存储,类似于golang中的map,支持一个key对应多个value,简单来说,是数据库把key-value(多个)数据以hash方式来管理。如:var user map[string]string
Redis hash是一个string类型的field和value的映射表,所以特别适合存储对象,Redis中每个hash可以存储可以存储4294967295个键值对。
hash的key是不能重复的。

例如:
	127.0.0.1:6379> HSET user1 age 30
	127.0.0.1:6379> HGET user1 age
	"30":我们查询结果发现返回结果30是打双引号,也就是我们通过hash存储的数据类型还是string类型。
hash底层的数据结构实现有两种:
(1)ziplist(上面有介绍)(2)hashtable:是当存储的数据超过配置的阀值时就转用hashtable的结构。这种转换比较消耗性能,所以应该尽量避免这种转换操作。同时满足以下两个条件时才会使用这种结构:
当键的个数小于hash-max-ziplist-entries(默认512)
当所有值都小于hash-max-ziplist-value(默认64)
这种结构的时间复杂度为O(1),但是会消耗比较多的内存空间。

适用场景:
存储对象

4.set

Set是string类型的无序集合,底层是hashTable数据结构,可以存放很多字符串元素,但是元素的值不能重复,并且元素是无序的。
常用操作是对集合插入、删除、判断等操作。
通过insert参数,set集合也可以存储存储整数的有序集合,里面存放同一类型的整数,可以达到去重的效果。
共有三种整数:int16_t、int32_t、int64_t。
intset在redis.conf中也有一个配置参数set-max-intset-entries默认值为512。
如果entry的个数小于此值,则可以编码成REDIS_ENCODING_INTSET类型存储,节约内存。否则采用dict的形式存储。

例如(存储多个邮箱账号):
	127.0.0.1:6379> sadd emails tim@qq.com tom@163.com pic@126.com
	(integer) 3
	127.0.0.1:6379> smembers emails
	1) "tom@163.com"
	2) "pic@126.com"
	3) "tim@qq.com":此时应该发现key的value跟我们输入顺序不同,所以他是无序的
	127.0.0.1:6379> sadd emails tim@qq.com	//当我们在加重复的value时,则提示0,代表set不能添加重复的value
	(integer) 0

zset

zset是有序集合,使用键值对方式存储,并且每个元素都是唯一的。
有序集合类型和集合类型的差别是,有序集合为每个元素配备了一个属性:分数,分数必须为浮点数。
有序集合就是根据分数来排序的。有序集合是使用散列表和跳跃表实现的。所以和列表相比,操作中间元素的速度也很快。
Redis 数据类型中的有序集合类型比 Redis 数据类型中的列表类型更加耗费资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值