携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第 3 天,点击查看活动详情。
Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。这篇文章我们主要讲述一下NoSQL数据库的概念以及Redis的基础知识。
1. NoSQL数据库
NoSQL,泛指非关系型数据库,是 Not only SQL 的缩写,大意为“不仅仅是SQL”,说明这项技术是传统关系型数据库的补充而非替代。在整个NoSQL技术栈中MemCache、Redis、MongoDB被称为NoSQL三剑客。NoSQL数据库的产生是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。我们和关系型数据库来做个对比。
基于此,我们可以得出结论:NoSQL数据库 的最大优势为 高性能、高可用性 和 可伸缩性。
2. Redis简介
整个NoSQL技术栈中MemCache、Redis、MongoDB被称为NoSQL三剑客,我们这篇文章主要说一下 Redis。
2.1 概念
Redis 是一个开源的、内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。它支持多种类型的数据结构,如字符串(strings),散列(hashes), 列表(lists),集合(sets),有序集合(sorted sets) 与 范围查询,bitmaps,hyperloglogs 和 地理空间(geospatial)索引半径查询。
Redis 内置了复制(replication),LUA脚本(Lua scripting), LRU驱动事件(LRU eviction),事务(transactions) 和不同级别的磁盘持久化(persistence), 并通过Redis哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)。
2.2 应用场景
1)缓存
使用Redis可以建立性能非常出色的缓存服务器,查询请求先在Redis中查找所需要的数据,如果能够查询到(命中)则直接返回,大大减轻关系型数据库的压力。
2)数据临时存储位置
使用token(令牌)作为用户登录系统时的身份标识,这个token就可以在Redis中临时存储。
3)分布式环境下解决 Session 不一致问题时的 Session库
Spring提供了一种技术解决分布式环境下Session不一致问题,叫SpringSession。而Redis就可以为SpringSession提供一个数据存储空间。
4)流式数据去重
在Redis中有一种数据类型是Set,和Java中的Set集合很像,不允许存储重复数据。借助这个特性我们可以在Redis中使用Set类型存储流式数据达到去重的目的。
3. Redis常用的数据结构
3.1 总体结构
Redis中的数据,总体上是键值对,不同数据类型指的是 键值对 中 值的类型。
| Key | Value |
|---|---|
| String | |
| List | |
| Set | |
| Hash | |
| Zset |
3.2 String 类型
Redis中最基本的类型,它是key对应的一个单一值。二进制安全,不必担心由于编码等问题导致二进制数据变化。所以redis的string可以包含任何数据,比如jpg图片或者序列化的对象。Redis中一个字符串值的最大容量是512M。
3.3 List类型
Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。说明它的底层是基于链表实现的,所以它操作时头尾效率高,中间效率低。
3.4 Set类型
Redis的Set是String类型的无序集合。它是基于哈希表实现的。
3.5 Hash类型
本身就是一个键值对集合。可以当做Java中的Map<String,String>对待。
3.6 ZSet类型
Redis ZSet 和 Set 一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。zset的成员是唯一的,但分数(score)却可以重复。