Redis简介
本篇博客的主要内容:redis的一般性介绍;
Redis是一种非关系型数据库(NoSQL),是一种内存型数据库;在分布式和高并发项目中,redis是必须的组件。【Redis入门】部分,包括以下三部分内容:
然后,看本篇博客前,可以先参考下【数据库简介】中有关redis的内容;
一:Redis引入
● Redis之父:Salvatore Sanfilippo,他是意大利人。
● 以前的数据库比如MySQL等,是把数据存在硬盘上的,而硬盘的读写速度很慢;而,redis的核心特性就是,把原本存储在硬盘上的数据,转移到内存中,利用内存的读写快速的高性能,来提高程序的性能;
● 在工作中,一些高并发的程序中,redis都会作为内存数据库,来提高程序的性能;
● 后来,虚拟机厂商VMware公司也收购了redis;
● Salvatore Sanfilippo也成立了一个机构:redislabs,为全世界的企业提供定制化服务;(全世界有超过8000家著名厂商,都在使用redis的解决方案)
● redis,是目前最流行、用户最多、性能几乎是最好的【非关系型数据库】
二:Redis介绍
(1) NoSQL(Not only sql);
● 关系型数据的问题:数据组织比较复杂,表与表之间由于存在主外键的关系,导致数据难以切割,由此在大集群的应用场景下,或者千万级、上亿级数据进行扩容的时候,是比较困难的;(_ _ 这一点,其实不是特别理解__ )
● redis这种非关系型数据库,是不用SQL操作的;redis底层提供了一系列基础的通用命令,来操作数据;
● redis中的数据,保存的时候采用键值对的方式;redis可以看成是一个超大的Map对象;
● redis不是一种复杂的技术,redis作为一款数据库,我们需要将其单独的安装在一台服务器上,通过命令来操作(这个部署在某台服务器上的)redis数据库的;
(2) redis最显著的特性就是高性能;而,之所以高性能的最主要的原因就是【redis将数据保存在内存中】,利用内存的高吞吐,来瞬间完成数据的提取和设置工作;
● redis的性能和MySQL和Oracle等相比,可以提升一个数量级;
● 但,MySQL等自己也在底层做了一些优化啦;同时,随着硬件的发展,比如SSD固态硬盘、磁盘整列等,也能提高MySQL等传统关系型数据库的数据提取和设置的速度;
● 由于,内存中的数据,在关机或者重启后会消失;所以,redis在处理的时候,也支持将数据持久化到硬盘;(所以,由此可见,redis是一款兼顾的不错的数据库产品)
(3) 在实际应用中,redis常用于缓存;
● 缓存,就是数据的缓冲;
● 比如,电商网站,商品信息有一亿条,然后这些数据是存储在MySQL数据库中的;由于,MySQL数读取磁盘的,所以速度很慢;
● 可以在程序和MySQL之间额外的安装一个redis数据库,在数据提取的时候,redis将商品信息提取到内存中,然后由程序直接利用redis从内存中获取商品信息;由此,数据处理效率就大大提升了;(内存的处理速度比硬盘快太多了)
三:Redis特点(或特性、优点)
(1) 官方描述,在峰值情况下,redis每秒可以进行十万次操作(可能有水分,但每秒两三万肯定是有的),这种速度是MySQL和Oracle不能比拟的;
(2) java,C,.net,Python等等,redis都是支持的;redis形成了一个庞大的生态体系,市面上主流的语言,redis都提供了交互工具;同时,redis是开源的,程序员甚至可以自己开发一套交互工具;
(3) redis提供了两种不同的持久化方案;一种是RDB:基于全量的备份;一种是AOF:基于日志的更新;持久化,保证了数据在redis失去服务以后不会丢失;
(4) redis支持多种数据结构(或称数据类型);字符串,List,数组,Map等,redis都提供了良好的数据支撑,帮助我们保存不同类型的结果;
(5) 主从复制:多台redis服务器之间,建立的一种通讯机制,可以让数据保持同步;即,在一个大应用的前提下,可以同时有几十台redis数据库,而这几十台redis数据库中的数据是完全相同的,无论程序连接哪一台redis数据库,都可以提供相同的服务;
主从复制,是在分布式架构下,或者集群环境中,底层最基本的实现;
(6) redis主要的使用环境是【互联网的高并发、高可用环境】;
分布式:redis的服务器可能有多台,这些不同的服务器不要求放在同一个机房或者同一个局域网中,这些不同的服务器可能相隔几千公里,然后这些服务器彼此通过互联网联通;然后,我们的程序可以访问就近的redis服务器(比如,北京的淘宝用户,在使用淘宝软件的时候,可以就近访问离北京较近的redis服务器,或者网络上离北京就近的redis服务器),由此,可以降低网络传输所需要的时间;
高可用:在互联网环境下,要保证“随时打开,随时可用”;为此,redis底层提供了一种Sentinel哨兵机制,可以帮助我们自动发现出现故障的redis节点,并且把这个节点剔除出去,用其他可用的redis服务器进行顶替;
Linux下安装Redis
本篇博客的主要内容是:在Linux中安装redis;(不涉及redis服务化、开机自启、firewall设置端口开放和关闭。)
一:安装前准备:redis的官网,查看在Linux系统中安装redis的步骤;准备一个虚拟机;
访问redis官网【https://redis.io/】;
然后,在下载页面中提供了在Linux中安装redis的傻瓜式步骤:
为此,特地创建了一个新的虚拟机【CentOS-Redis】;创建虚拟机的过程,可以参考【安装CentOS7】
说明:
在虚拟机里面操作,和通过Xshell远程连接操作,是一样的;
下面的过程,我是在Xshell中操作的;
二: Linux中安装redis;
首先,使用 【mkdir redis】 命令,在/usr/local目录下,创建redis目录;
然后,使用 【cd redis】 命令,进入redis目录;
使用 【yum install -y gcc】 安装底层编译器gcc;gcc组件是Linux系统中的编译包,可以对程序的源代码进行编译,make命令,底层就依赖gcc
然后,接下来就是正式安装redis;
第一步:通过 【wget https://download.redis.io/releases/redis-6.2.4.tar.gz】 下载redis最新的源代码安装包;
第二步:通过 【tar xzf redis-6.2.4.tar.gz】 ,解压刚下载的压缩包
第三步:通过 【cd redis-6.2.4】 ,进入解压后的目录
在【redis-6.2.4】目录中,可以看到redis的源代码;要让redis的源代码称为能够运行的文件,需要通过make命令,编译这些源代码
第四步:通过 【make】 编译安装
经过几分钟:
启动redis
在redis的根目录执行 【./src/redis-server redis.conf】 ,即可启动redis
这儿,安装好了redis后,可以将redis设置为系统服务;然后,也可以设置为开机自启;自然,也可以设置redis的端口,并通过设置防火墙来暴露或关闭redis的端口;只是,这篇博客中没有介绍而已;
Windows下安装Redis
本篇博客的内容: 仅仅是Windows系统下redis的下载、启动;只有这些,除了这些,没有任何内容。
说明:
(1) redis官方只提供Linux下的安装包,其默认是不支持Windows下的安装的。对于Window下的工程师,微软提供了一个补救方案,微软的一个研发小组对redis进行底层的重构,开发了一款能够在Windows平台上运行的redis;
(2) 本篇博客,仅仅用于了解,因为目前Windows系统下redis,已经基本不使用了;
一:下载Windows系统下,redis安装文件
进入【https://github.com/MicrosoftArchive/redis】
PS:这个版本已经太老了,在生产环境中不建议使用;但是,作为学习,还是可以看看的;(redis从3版本到5版本,redis的命令是没有变化的)
二:在Windows系统下,启动redis
然后,关闭这个控制台,redis就会自动关闭了;(自然,也可以把redis弄成Windows的系统服务,但是还是算了吧,因为redis基本不在Windows下使用了。)
守护进程方式启动Redis
本篇博客内容:
(1) 在【Linux系统下安装Redis】中已将安装了redis,并且启动了redis了。其实,redis是有很多配置项的;本篇博客主要介绍redis各种配置项中的第一项【daemonize】:后台运行;即,通过【daemonize】配置项,设置redis后台运行(即,以守护进程方式的启动redis);
(2) 除了【daemonize】配置项外,redis还有其他配置项,其他配置项在后面介绍;
(3) 本篇博客,仅仅涉及通过【daemonize】配置项,设置redis后台运行;其他比如,redis开启自启等不包括;
说明:
(1) 本篇博客内容和【应用服务化】中的一点说明;
● 在【应用服务化】中已经介绍过服务化了;只是,在【应用服务化】是通过添加系统服务的方式,让redis以服务的方式在后台运行的。即在【应用服务化】更多的是把redis当成了一个普通的程序来看待;
● 在本篇博客中,出发的角度是:redis是一款全面的商用软件,redis本身就提供了很多设置项;即本篇博客从redis自身设置的角度出来,来实现redis后台运行;
一:Redis的常用配置简介
说明
(1)【databases】:MySQL中不同的数据库(其实就是逻辑空间)都有一个名字,redis则不同;在redis中,是使用编号的,第一个redis数据库编号是0,第二个redis数据库编号是1……
【databases】就用于设置redis中数据库的总数是多少;比如【databases 255】表示最多可以设置255个redis数据库;
(2) 【dir】:redis的持久化文件,即数据文件保存在哪里;
(3) 【requirepass】:redis的安全机制;
二:案例:通过【daemonize】设置redis后台运行
说明:下面的演示案例,都是在虚拟机里的终端里演示的;不是在Xshell里演示的;
redis原先的情况:只能前台运行,不能后台运行:
在redis-6.2.4目录,通过【./src/redis-server redis.conf】来启动redis;
启动redis后,是存在问题的:
问题1:这个redis是在前台运行,如果在当前窗口中按【Ctrl+C】,redis就直接退出了服务;
问题2:然后,如果把这个终端给关闭后,redis服务也会被杀掉;
但是,我们更希望redis作为一个服务,在系统的后台运行,与是否打开终端这个窗口无关;为此,接下来,介绍通过redis的【daemonize】配置项来实现redis后台运行;
通过【daemonize】配置项,设置redis后台运行
首先,在redis目录,通过【vim redis.conf】命令,去编辑redis的核心配置文件redis.conf文件;
redis.conf是redis的配置文件,这个文件中包含了几乎所有的redis配置;
在普通模式下通过【/daemonize】搜索;
可以搜索到,daemonize ,这个单词的意思是守护进程,而守护进程就是是否后台运行的意思;
如果我们想让redis在启动后,是在后台以服务形式来出现的话,只需要将redis.conf配置文件中的,daemonize参数值改为【yes】即可 ;
修改后,再次启动redis:可以发现,此时redis并没有“占用前台的命令行”;
验证是否是后台执行?
把终端给关掉:
然后,重新打开一个终端:
此时,只要centos系统在运行,那么redis就会一直提供服务;然后,经过实测,关掉这个虚拟机后,redis服务自然也会被关闭。
关掉redis服务,可以使用kill命令;
但,这种方式太粗暴,在实际开发中很少这样做;后面会介绍redis的客户端,利用redis自身的命令来关闭redis服务;
Redis常用基本配置
说明:
(1) redis有很多配置项,在【守护进程方式启动Redis】只介绍了【daemonize】配置项;本篇博客介绍剩余的几个配置项;
(2) 本篇博客的内容,就像是一个流水账,比较简单,快速浏览为佳;然后,本篇博客的内容,个人感觉并不难,只是这些操作需要多练习,提升熟练度;
(3) 这些配置项只是redis最基础的配置项,至于redis更深层的内容,需要在以后共工作学习中慢慢加强;
(4)要知道, 【./src/redis-server redis.conf :启动redis服务】和 【./src/redis-cli -p 6380:调用redis客户端、连接redis】是两码事;
一:Redis的常用配置简介
说明
(1)【databases】:MySQL中不同的数据库(其实就是逻辑空间)都有一个名字,redis则不同;在redis中,是使用编号的,第一个redis数据库编号是0,第二个redis数据库编号是1……
【databases】就用于设置redis中数据库的总数是多少;比如【databases 255】表示最多可以设置255个redis数据库;
(2) 【dir】:redis的持久化文件,即数据文件保存在哪里;
(3) 【requirepass】:redis的安全机制;
二:案例
前置一.redis启动后,可以通过【./src/redis-cli 】 ,调用redis的客户端,进而,我们可以在redis-cli命令行中输入命令来操作redis
首先,在redis目录,通过【./src/redis-server redis.conf 】启动redis;
那么redis启动后,如何操作redis?
在redis目录下,使用【./src/redis-cli 】 去调用redis的客户端;然后使用【ping】去检查redis服务是否是OK的;
然后,可以使用【exit】退出“redis-cli”的命令提示行
在【以守护进程方式的启动redis】最后,提到使用kill命令强制杀死redis服务是很不好的;可以利用redis客户端来关闭redis服务;
前置二.在redis目录下使用【./src/redis-cli shutdown】去正常关闭redis服务;
使用shutdown可以更加安全的关闭redis的服务;
1.配置redis的端口(port)、日志文件(logfile)
redis关闭后(即,在redis服务没有开启的情况下),进行接下来的设置;
配置redis端口;
在redis目录,通过【vim redis.conf】命令,去编辑redis的核心配置文件redis.conf文件;
然后,通过【/port 6379】快速搜索到端口的位置;
配置redis日志;
然后,通过【/logfile】快速搜索到日志文件的地方;
然后,我们可以配置日志文件信息;
验证;(当我们修改redis的配置文件redis.conf后,要想使修改生效,需要重启redis,重启redis的过程其实也是重载redis.conf的过程)
然后,在redis目录,通过【./src/redis-server redis.conf 】再次启动redis;
使用【cat redis.log 】去查看redis.log文件的内容:
然后,在redis目录下,使用【./src/redis-cli 】 去调用redis的客户端;
因为,在redis.conf配置文件中,我们修改了redsi的端口,所以这儿会出现连接不上的情况;为此,需要使用【./src/redis-cli -p 6380】去启动redis客户端;
2.配置redis的数据库总量(databases)
select命令介绍;
【select + 一个数字】;这个数字的范围是0-15;(因为redis的数据库总量,databases配置项的默认值是16)
【select】命令的作用是,使用第几号数据库;redis和MySQL不同,MySQL的数据库(或称逻辑空间)都是有名字的;但是redis数据库的名字是一个一个的数字;在默认情况下,redis的数字是0-15,共16个;
如果,觉得redis的数据库总量不够用,如何进行扩展?
配置redis的数据库总量;
在redis目录,通过【vim redis.conf】命令,去编辑redis的核心配置文件redis.conf文件;
然后,通过【/databases】去搜索定位到databases;
可以将这个值修改;我们修改成了255,其数据库的范围是0-244,共255个;
验证; (当我们修改redis的配置文件redis.conf后,要想使修改生效,需要重启redis,重启redis的过程其实也是重载redis.conf的过程)
修改后,可以在redis目录下使用【./src/redis-cli -p 6380 shutdown】去关闭redis服务;
然后,在redis目录,通过【./src/redis-server redis.conf 】重启redis;
然后,让刚才的修改就生效了;
接下来,是一个与安全相关的配置项:
3.配置redis的密码(requirepass)
配置redis的密码;
在redis中,是允许校验身份的,即使用redis的时候,可以设置输入密码,保障redis的安全;
在redis目录,通过【vim redis.conf】命令,去编辑redis的核心配置文件redis.conf文件;
通过【/requirepass】快速搜索定位到,密码设置的地方;
验证;(当我们修改redis的配置文件redis.conf后,要想使修改生效,需要重启redis,重启redis的过程其实也是重载redis.conf的过程)
修改后,可以在redis目录下使用【./src/redis-cli -p 6380 shutdown】去关闭redis服务;
然后,在redis目录,通过【./src/redis-server redis.conf 】重启redis;
然后,可以发现,需要认证后才可以使用redis-cli;
认证方法:使用【auth + 设置的密码】完成认证;
4.配置redis的文件存储目录(dir)
接下来是另一个重要的配置项,但是这个配置项采用默认的就行,我们一般不用去修改;
文件存储目录(dir)说明;
在redis目录,通过【vim redis.conf】命令,去查看redis的核心配置文件redis.conf文件;
使用【/dir ./】快速搜索到/dir配置项;
附加说明:redis设置密码后,如何使用【./src/redis-cli】的shutdown关闭redis服务;
redis设置密码后,可以使用【./src/redis-cli -a 12345 -p 6380 shutdown】去关闭redis服务;
但是,此时关闭redis服务时候,下面会有【Warning: Using a password with ‘-a’ or ‘-u’ option on the command line interface may not be safe.】的警告提示信息;
可以使用【./src/redis-cli -a 12345 -p 6380 shutdown 2/dev/null】去关闭redis服务; 此时关闭时就没有warning提示信息了;
Redis通用命令
本篇博客的主要内容 ,是简单介绍Redis在底层提供的最基础的几个命令;
说明:
(1) 目前,个人感觉redis有点类似于一个【大Map】 ;
一:Redis常用命令简介
Redis通用命令:redis中最常用,最核心的命令;
(1) select命令:选择不同编号的数据库;
● redis数据库默认是0-15;
● redis不同数据库之间存储的数据是不一样的,在进行redis设计的时候,我们可以做好规划;比如我们可以在0号数据库中存储人员信息、1号数据库存储订单信息、2号数据库保存商品信息。这样一来,通过不同的数据库,我们就可以区分开不同类型的数据了;
(2) set命令:设置值;
● redis是键值对类型的非关系型数据库,里面的所有数据都是采用key-value的方式出现;
● 如【set name lily】:意思是在当前数据库中增加一个key=name,value=lily的数据;
(3) get命令:将对应key的value提取出来
● 如【get hello】:意思是获取key=hello的数据的value;
(4) keys命令:使用一个通配符表达式,查询当前数据库中所有满足通配符表达式要求的key;
● 如【keys he*】:获取当前数据库中,所有key以he开头的,所有key的集合;
(5) dbsize命令:返回当前数据库中键值对的总数;
(6) exists命令:检查某个key在当前数据库中是否已经存在;
● 如【exists a】:意思是检查当前数据库中,是否已经存在key=a的数据;
(7) del命令:根据key值删除数据;
● 如【del a】:意思是删除key=a的那条数据;
(8) expire命令;ttl命令;这两个命令一般是一起使用的;
● 在redis中我们可以给某条数据的key设置一个有效期;
● 在有效期内,这个key就是存活的,那么这条数据也是存活的;
● 有效期一旦到期,这个key就会自动被redis销毁,自然这条数据也会被销毁;
● 如【expire hello 20】:意思是设置key=hello 20秒后过期;
二:Redis常用命令演示
预先准备:启动redis服务,打开redis客户端连接redis;
首先,在redis目录下,通过【./src/redis-server redis.conf】启动redis服务;
然后,在redis目录下,通过【./src/redis-cli -p 6380】调用客户端,连接redis;
然后,使用【auth + 设置的密码】,完成认证;
select命令;
redis不同数据库之间,所存储的数据彼此不影响;
数据库选择好了之后,就可以向选择的那个数据库中,写一些数据;
set命令;
value在redis中是以字符串的形式保存的;
get命令;
keys命令;
● *代表任意长度、任意字符串;
● 如果数据库中数据很多,是不建议使用【key *】的;【key *】相当于一个全局扫描,如果当前数据库中有10万条数据,那么【key *】就会列出10万条结果,其检索效率就会太低了;
dbsize命令;
dbsize命令背后的处理速度是很快的;因为在底层,redis并不是遍历所有数据,然后返回统计结果的;redis是通过一个计数器来记录所有数据的总量;
del命令;
exists命令;
exists命令,在以后开发过程中,会经常使用;