简单回顾一下Redis数据库基础。
Redis简单介绍
Redis是一个基于内存高性能的key-value开源数据库,与mysql和oracle的数据库不同的是,它属于非关系型数据库,主要用于存储键值对,快速读取和写入数据,常用于缓存、会话存储、实时分析、排行榜、消息队列等场景。它支持多种数据结构,如字符串、哈希、列表、集合、有序集合等。
关系型和非关系型区别:
关系型数据库遵循ACID特性(原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)),支持事务处理能力。适用场景为需要事务支持和基于sql的结构化查询存储,处理复杂的关系。
非关系型数据库:即NoSQL数据库(not only sql),一般以简单的key-value模式存储,因此大大增加了数据库的扩展能力,不支持ACID,远超于SQL的性能。一般用不着sql和用了sql也不行的情况,可以考虑使用Nosql。适用场景为对数据高并发的读写(mysql数据库存储在磁盘上,高并发会产生大量IO)、对海量数据的读写(mysql数据库不支持海量数据)、对数据高可扩展性的(例如key-value,redis中支持5种类型的value)。
Redis基本数据类型
redis无论什么数据类型,在数据库中都是以key-value形式保存,并且所有的key(键)都是字符串,所以讨论基础数据结构都是讨论的value值的数据类型。主要包括常见的5种数据类型,分别是:String、List、Set、Zset、Hash。
1.String
字符串(String): 最基本的数据类型,存储单个值。字符串可以是普通文本、数字或二进制数据。常用于缓存、计数器、配置存储等。
String类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。
String类型是redis最基本的数据类型,一个redis中字符串value最多可以是512M。
使用场景:
缓存: 经典使用场景,把常用信息,字符串,图片或者视频等信息放到redis中,redis作为缓存层,mysql做持久化层,降低mysql的读写压力.
计数器:redis是单线程模型,一个命令执行完才会执行下一个,同时数据可以一步落地到其他的数据源。
session:常见方案spring session + redis实现session共享。
2.List
列表(List): 有序的字符串元素集合,可以在列表的两端执行添加、删除操作。常用于消息队列、日志存储、时间线等。Redis中的列表是双端列表。
使用List结构,我们可以轻松地实现最新消息排队功能(比如新浪微博的TimeLine)。List的另一个应用就是消息队列,可以利用List的 PUSH 操作,将任务存放在List中,然后工作线程再用 POP 操作将任务取出进行执行。
Redis还提供了操作List中某一段的api,你可以直接查询,删 除List中某一段的元素。
使用场景: 微博TimeLine: 有人发布微博,用lpush加入时间轴,展示新的列表信息;消息队列。
3.Set
集合(Set): 无序的唯一字符串元素集合,支持交集、并集、差集等操作。适用于标签、标记、好友关系等。Redis 的 Set 是 String 类型的无序集合。
集合成员是不可重复的。
Redis 中集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
使用场景:
标签(tag),给用户添加标签,或者用户给消息添加标签,这样有同一标签或者类似标签的可以给推荐关注的事或者关注的人。
点赞,或点踩,收藏等,可以放到set中实现。
4.Hash
哈希(Hash): 存储了字段和值的映射,类似于一个关联数组。适用于存储对象,如用户信息、产品属性等。一个 string 类型的 field(字段) 和 value(属性) 的映射表,hash 特别适合用于存储对象。
一个hash可以存多个key-value,类似一个对象的多个字段和属性。
使用场景:
缓存: 能直观,相比string更节省空间,的维护缓存信息,如用户信息,视频信息等。
5.Zset
Redis中的有序集合(Sorted Set),通常简称为"zset",是一种特殊的数据类型,它融合了集合和有序映射的特性。每个元素都关联一个分数(score),这个分数用于对元素进行排序。Redis 有序集合和集合一样基本一致
使用场景:
排行榜:有序集合经典使用场景。例如小说视频等网站需要对用户上传的小说视频做排行榜,榜单可以按照用户关注数,更新时间,字数等打分,做排行。
成绩排行:比如一个存储全班同学成绩的sorted set,其集合value可以是同学的学号,而score就可以是其考试得分, 形成了按成绩排序。
权重分配:可以用sorted set来做带权重的队列,比如普通消息的score为1,重要消息的score为2,然后工作线程可以选择按score的倒序来获取工作任务。让重要的任务优先执行。
总结
Redis在性能、灵活性、实时性和可扩展性方面提供了许多优势,使其成为许多企业构建高效、高性能应用程序的首选存储解决方案之一。而Redis之所以如此快速,是由于多个方面的优化和设计。它的内存存储、单线程模型、高效的数据结构、异步方式的持久化和优秀的网络模型等因素共同作用,使得Redis能够在高并发的环境下提供出色的性能和响应速度。无论是作为缓存、会话存储还是消息队列,Redis都是一个强大而高效的解决方案。