Redis是目前最流行的键值对(key-value)数据库,以出色的性能著称,官方提供的数据是可以支持100000以上的+QPS。Redis具有高性能的主要原因如下:
- Redis是基于内存的存储数据库,绝大部分的命令处理只是纯粹的内存操作,内存的读写速度非常快。
- Redis是单进程线程的服务(实际上一个正在运行的Redis Server肯定不止一个线程,但只有一个线程来处理网络请求),避免了不必要的上下文切换,同时不存在加锁/释放锁等同步操作。
- Redis使用多路I/O复用模型(select、poll、epoll),可以高效处理大量并发连接。
- Redis中的数据结构是专门设计的,增、删、改、查等操作相对简单。
1、Redis简介
Redis(REmote DIctionary Server)是一个使用ANSI C编写的、开源的、支持网络的、基于内存的、可选持久化的键值对存储系统。在2013年5月之前,Redis的开发由VMware赞助;2013年5月至2015年6月,由Pivotal赞助;从2015年6月起,Redis的开发由Redis Labs赞助。根据数据库使用排行网站db-engines.com上的排名,Redis是目前最流行的键值对存储系统。
Redis由Salvatore Sanfilippo在2009年发布初始版本,开源后不断发展壮大,目前的最新版为Redis 7.0。
Redis在互联网数据存储方面应用广泛,主要具有以下优点:
- Redis是内存型的数据库,也就是说Redis中的key-value对是存储在内存中的,因而效率比磁盘型的快。
- Redis的工作模式为单线程(Redis6之前,从Redis6开始支持多线程),不需要线程间的同步操作。Redis采用单线程主要因为其瓶颈在内存和带宽上,而不是CPU。
- Redis中key-value的value不仅可以是字符串,也可以是复杂的数据类型,如链表、集合、散列表等。
- Redis支持数据持久化,可以采用RDB、AOF、RDB&AOF三种方案。计算机重启后可以在磁盘中进行数据恢复。
- Redis支持主从结构,可以利用从实例进行数据备份。
2、Redis 5.0的新特性
相较于Redis 4.0, Redis 5.0增加了很多新的特性,限于篇幅,本节主要介绍几个较重要的特性,具体内容可以参考官方文档:
- 新增Streams数据类型,这是Redis 5.0最重要的改进之一。可以把Streams当作消息队列
- 新的模块API、定时器、集群及字典。
- RDB中持久化存储LFU和LRU的信息。
- 将集群管理功能完全用C语言集成到redis-cli中,Redis 3.x和Redis 4.x的集群管理是通过Ruby脚本实现的。
- 有序集合新增命令ZPOPMIN/ZPOPMAX。
- 改进HyperLogLog的实现。
- 新增Client Unblock和Client ID。
- 新增LOLWUT命令。
- Redis主从复制中的从不再称为Slave,改称Replicas。
- Redis 5.0引入动态哈希,以平衡CPU的使用率和相应性能,可以通过配置文件进行配置。Redis 5.0默认使用动态哈希。
- Redis核心代码进行了部分重构和优化。
3、Redis常用数据类
Redis的数据存储结构是key-value对,定义key时要注意以下几点:
- key不要太长,尽量不要超过1024Byte,太长的话不仅消耗内存,而且会降低查找的效率。
- key也不要太短,太短的话,key的可读性会降低。
- 一个项目中,key单词与单词之间以:分开,例如SET user-name:loginnamewangwu。
这里主要简单介绍Redis的5种数据类型,即String、Hash、List、Set及Sorted Set。
3.1、String类型
String类型是Redis最基本的数据类型,一个key对应一个value。String类型是二进制安全的,即Redis的String类型可以包含任何数据,例如扩展名为.jpg的图片或者序列化的对象。
3.2、Hash类型
Redis的Hash类型是一个String类型的域(field)和value的映射表,Hash类型特别适用于存储对象,例如Username、Password和Age等。
Redis中的每个Hash类型数据都可以存储2^32-1
个field-value对。
3.3、List类型
在Redis中,List类型是按照元素的插入顺序排序的字符串列表。在插入时,如果key并不存在,Redis将为该key创建一个新的列表。List类型中可以包含的最大元素数量是4 294 967 295。
3.4、Set类型
Redis的Set类型是String类型的无序集合。集合中的元素是唯一的,不能出现重复的元素。
3.5、Sorted Set类型
Sorted Set类型是Set类型的一个加强版本,它在Set类型的基础上增加了一个顺序属性。这一属性在添加、修改元素的时候可以指定,每次指定后有序集合会自动按新的值调整顺序。
有序集合中的元素是唯一的,但分数(Score)却可以重复。
3.6、Redis HyperLogLog
Redis 2.8.9中添加了HyperLogLog。Redis的HyperLogLog是用来做基数统计的,主要使用场景是海量数据的计算。HyperLogLog的优点是,在输入元素的数量非常多时,计算基数所需的空间总是很小。HyperLogLog只会根据输入元素来计算基数,而不会存储元素本身。基数就是不重复元素的个数。例如数据集{1,3,5,7,5,7,8},那么这个数据集的基数集为{1,3,5,7,8},基数为5。HyperLogLog可以看作一种算法,它提供了不精确的基数计数方案。
HyperLogLog一开始就是为了大数据量的统计而发明的,很适合那种数据量很大,又允许有一点误差的计算,例如页面用户访问量。HyperLogLog提供了不精确的去重技术方案,标准误差是0.81%,这对于页面用户访问量的统计是可以接受的。因为访问量可能非常大,但是访问量统计对准确率要求没那么高,没必要做到绝对准确,HyperLogLog正好符合这种要求,不会占用太多存储空间,同时性能也不错。总之,Redis的HyperLogLog特别适用对海量数据进行统计,对内存占用有要求,并且能够接受一定的错误率的场景。