【起】Redis 概述篇——带你走过 Redis 的前世今生

1,120 阅读9分钟

前言

距离过年那会闲在家更新的 MySQL 系列已经过去一段时间了,这段时间一直在忙其他的,所以博客的更新也就搁置了,但是一直在想着要更新啥内容比较好,刚好朋友给了我一本 Redis 的书籍,我就打算看完结合官方的文档总结一下,分享给大家,如果有什么不对的地方请指正。

Redis 系列,我想以“起承转合”的形式来更新,不过不一定是四篇噢,因为篇幅有限,太长怕你们没有耐心看完,可能《起》篇就分为几篇博文来叙述了,我也会对其进行规整,方便大家看完能更好的吸收,毕竟写文章的我能得到各位观看我的文章,是我的荣幸,我必须得对大家负责的嘛~

话归正题,Redis 应该很多人都有用过(没用过应该看这篇也能看得懂,但是一些基本理论就得自己上网百度啦)。至于 Redis 是什么,有什么好处,怎么用,那就继续往下看吧~本文会侧重于让大家对Redis 基本数据类型的操作命令,底层存储结构以及其应用场景得到一定的认知。

附上基础篇的脑图(上传平台有压缩,有兴趣可以到我的公众号【6曦轩】领取原图)

在这里插入图片描述

正文

正文前再絮絮叨叨

先亮出我们博文中使用的版本: base redis version:5.0.5 至于文中的信息来源: 参考资料: redisbook.com github.com/antirez/red…

Redis 入门

Redis 诞生历程

从一个故事开始

08年的时候有一个意大利西西里岛的小伙子,笔名 antirez(invece.org/),创建了一个访客信息网站 LLOOGG.COM。有的时候我们需要知道网站的访问情况,比如访客的 IP、操作系统、浏览器、使用的搜索关键词、所在地区、访问的网页地址等等。在国内,有很多网站提供了这个功能,比如 CNZZ,百度统计,国外也有谷歌的 Google Analytics。我们不用自己写代码去实现这个功能,只需要在全局的 footer 里面嵌入一段 JS 代码就行了,当页面被访问的时候,就会自动把访客的信息发送到这些网站统计的服务器,然后我们登录后台就可以查看数据了。

LLOOGG.COM 提供的就是这种功能,它可以查看最多 10000 条的最新浏览记录。这样的话,它需要为每一个网站创建一个列表(List),不同网站的访问记录进入到不同的列表。如果列表的长度超过了用户指定的长度,它需要把最早的记录删除(先进先出)。

在这里插入图片描述
当 LLOOGG.COM 的用户越来越多的时候,它需要维护的列表数量也越来越多,这种记录最新的请求和删除最早的请求的操作也越来越多。LLOOGG.COM 最初使用的数据库是 MySQL,可想而知,因为每一次记录和删除都要读写磁盘,因为数据量和并发量太大,在这种情况下无论怎么去优化数据库都不管用了。

考虑到最终限制数据库性能的瓶颈在于磁盘,所以 antirez 打算放弃磁盘,自己去实现一个具有列表结构的数据库的原型,把数据放在内存而不是磁盘,这样可以大大地提升列表的 push 和 pop 的效率。antirez 发现这种思路确实能解决这个问题,所以用 C 语言重写了这个内存数据库,并且加上了持久化的功能,09 年,Redis 横空出世了。从最开始只支持列表的数据库,到现在支持多种数据类型,并且提供了一系列的高级特性, Redis 已经成为一个在全世界被广泛使用的开源项目。

为啥叫 REDIS ?

它的全称是 Remote DIctionary Service,直接翻译过来是远程字典服务。

从 Redis 的诞生历史我们看到了,在某些场景中,关系型数据库并不适合用来存储我们的 Web 应用的数据。

那么,关系型数据库和非关系型数据库,或者说 SQL 和 NoSQL,到底有什么不一样呢?我们继续往下看。

Redis 定位与特性

SQL 与 NoSQL

在绝大多数情况下,我们会首先考虑用关系型数据库来存储我们的数据,比如SQLServer,Oracle,MySQL 等。

来看下关系型数据库的特点:

  1. 它以表格的形式,基于行存储数据,是一个二维的模式;
  2. 它存储的是结构化的数据,数据存储有固定的模式(schema),数据需要适应表结构;
  3. 表与表之间存在关联(Relationship);
  4. 大部分关系型数据库都支持 SQL(结构化查询语言)的操作,支持复杂的关联查询;
  5. 通过支持事务(ACID 酸)来提供严格或者实时的数据一致性。

同时使用关系型数据库的时候也存在一些限制,比如:

  1. 要实现扩容的话,只能向上(垂直)扩展,比如磁盘限制了数据的存储,就要扩大磁盘容量,通过堆硬件的方式,不支持动态的扩缩容。水平扩容需要复杂的技术来实现,比如分库分表;
  2. 表结构修改困难,因此存储的数据格式也受到限制;
  3. 在高并发和高数据量的情况下,我们的关系型数据库通常会把数据持久化到磁盘,基于磁盘的读写压力比较大。

为了规避关系型数据库的一系列问题,我们就有了非关系型的数据库,我们一般把它叫做 “non-relational” 或者 “Not Only SQL” 。NoSQL 最开始是不提供 SQL 的数据库的意思,但是后来意思慢慢地发生了变化。

非关系型数据库的特点:

  1. 存储非结构化的数据,比如文本、图片、音频、视频;
  2. 表与表之间没有关联,可扩展性强;
  3. 保证数据的最终一致性。遵循 BASE(碱)理论。 Basically Available(基本可用); Soft-state(软状态); Eventually Consistent(最终一致性);
  4. 支持海量数据的存储和高并发的高效读写;
  5. 支持分布式,能够对数据进行分片存储,扩缩容简单。

对于不同的存储类型,我们又有各种各样的非关系型数据库,比如有几种常见的类型:

  1. KV 存储,用 Key Value 的形式来存储数据;比较常见的有 Redis 和MemcacheDB;
  2. 文档存储,MongoDB;
  3. 列存储,HBase;
  4. 图存储,这个图(Graph)是数据结构,不是文件格式。Neo4j;
  5. 对象存储;
  6. XML 存储等。

这个网页列举了各种各样的 NoSQL 数据库 nosql-database.org/ 。 NewSQL 结合了 SQL 和 NoSQL 的特性(例如 PingCAP 的 TiDB)。

Redis 特性

官网介绍:redis.io/topics/intr…

中文网站:www.redis.cn

硬件层面有 CPU 的缓存;浏览器也有缓存;手机的应用也有缓存。

我们把数据缓存起来的原因就是从原始位置取数据的代价太大了,放在一个临时位置存储起来,取回就可以快一些。

Redis 的特性:

1)更丰富的数据类型

2)进程内与跨进程;单机与分布式

3)功能丰富:持久化机制、过期策略·

4)支持多种编程语言

5)高可用,集群

Redis 安装启动

服务端安装

  1. Linux 安装

参考: CentOS7 安装 Redis 单实例 blog.csdn.net/weixin_4266… 主要是注意配置文件几处关键内容(后台启动、绑定 IP、密码)的修改,配置别名

  1. Windows 服务端安装

Redis 作者没有为 Windows 编写 Redis 服务端,微软自行编写了一个 Redis 服务端,可用于基本的测试和学习。 github.com/MicrosoftAr…

服务启动

src 目录下,直接启动

./redis-server

后台启动(指定配置文件) 1、redis.conf 修改两行配置

daemonize yes
bind 0.0.0.0

2、启动 Redis

redis-server /usr/local/soft/redis-5.0.5/redis.conf

总结:redis 的参数可以通过三种方式配置,一种是 redis.conf,一种是启动时--携带的参数,一种是 config set。

基本操作

默认有 16 个库(0-15),可以在配置文件中修改,默认使用第一个 db0。

databases 16

因为没有完全隔离,不像数据库的 database,不适合把不同的库分配给不同的业务使用。 切换数据库

select 0

清空当前数据库

flushdb

清空所有数据库

flushall

Redis 是字典结构的存储方式,采用 key-value 存储。key 和 value 的最大长度限制是 512M(来自官网 redis.io/topics/data…)。

  • 键的基本操作。

命令参考:redisdoc.com/index.html

存值

set port 2673

取值

get port

查看所有键

keys *

获取键总数

dbsize

查看键是否存在

exists port

删除键

del port

重命名键

rename port 8196

查看类型

type port

Redis 一共有几种数据类型?(注意是数据类型不是数据结构)

from 官网:redis.io/topics/data…

  1. String
  2. Hash
  3. Set
  4. List
  5. Zset
  6. Hyperloglog
  7. Geo
  8. Streams

接下来的篇章会展开来讲 Redis 的数据类型,尽请关注哈~

By the way

有问题?可以给我留言或私聊 有收获?那就顺手点个赞呗~

当然,也可以到我的公众号下「6曦轩」,

回复“学习”,即可领取一份 【Java工程师进阶架构师的视频教程】~

回复“面试”,可以获得: 【本人呕心沥血整理的 Java 面试题】

回复“MySQL脑图”,可以获得 【MySQL 知识点梳理高清脑图】

回复“Redis脑图”,可以获得 【Redis 知识点梳理高清脑图】

点击菜单下的【资源共享】,可以获得分享资源的网盘链接

还有【阿里云】【腾讯云】的购买优惠噢~具体请联系我

曦轩我是科班出身的程序员,php,Android以及硬件方面都做过,不过最后还是选择专注于做 Java,所以有啥问题可以到公众号提问讨论(技术情感倾诉都可以哈哈哈),看到的话会尽快回复,希望可以跟大家共同学习进步,关于服务端架构,Java 核心知识解析,职业生涯,面试总结等文章会不定期坚持推送输出,欢迎大家关注~~~

在这里插入图片描述