Redis的基本使用

1、NoSQL数据库基本介绍

1.1、NoSQL数据库

NoSQL(Not Only SQL ),意即“不仅仅是SQL”,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。

NoSQL有如下优点:易扩展,NoSQL数据库种类繁多,但是一个共同的特点都是去掉关系数据库的关系型特性。数据之间无关系,这样就非常容易扩展。无形之间也在架构的层面上带来了可扩展的能力。大数据量,高性能,NoSQL数据库都具有非常高的读写性能,尤其在大数据量下,同样表现优秀。这得益于它的无关系性,数据库的结构简单。

 

NoSQL 数据库特点: 

  • 不遵循SQL标准。
  • 区别于关系数据库,它们不保证关系数据的ACID特性
  • 远超于SQL的性能。

 

NoSQL适用场景:

  • 对数据高并发的读写
  • 海量数据的读写
  • 对数据高可扩展性的

 

NoSQL不适用场景:

  • 需要事务支持
  • 基于sql的结构化查询存储,处理复杂的关系,需要即席查询。(用不着sql的和用了sql也不行的情况,请考虑用NoSql

 

1.2、常见的 NoSQL 数据库

Memcache

Redis

MongoDB

 

2、Redis的基本介绍

Redis是一个开源的、可基于内存亦可持久化的日志型、高性能的键值对(Key-Value)存储数据库,并提供多种语言的API。Redis 通常被称为数据结构服务器,因为值(value)可以是字符串(String)、哈希(Hash)、列表(list)、集合(sets)和有序集合(sorted sets)等类型。

 

Redis 与其他 key - value 缓存产品有以下三个特点:

  • Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
  • Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
  • Redis支持数据的备份,即master-slave模式的数据备份。

 

2.1、Redis的优势

  • 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
  • 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
  • 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
  • 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。

Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。

 

3、Redis安装和启动关闭

3.1、安装 Redis

window 版本可参考:https://www.runoob.com/redis/redis-install.html

下面我们安装 Linux 版本的 Redis。

下载地址:https://redis.io/download,下载完成后将 .tar.gz 安装包上传到 Linux 系统上,比如我们上传至 /usr/mysoft 目录下。

注意,编译 Redis 需要C语言编译器gcc的支持,如果没有,需要先安装gcc,我们可以使用 gcc --version 来查看gcc是否安装:

如果没有安装 gcc 的话,可使用 yum install gcc 命令安装 gcc。

 

解压安装包,命令:tar -zxvf redis-6.2.6.tar.gz

进入解压后目录,并输入 make 命令进行编译:

 如果 gcc 没有安装好,编译可能会报错:Jemalloc/jemalloc.h:没有那个文件。此时可以先使用 make distclean 命令来清除临时文件,然后再执行 make 命令进行再次编译。

 

运行 make install 命令安装 Redis:

安装完成后,Redis 默认会安装在 /usr/local/bin 目录下,目录结构如下:

文件说明:

  • redis-benchmark:性能测试工具,可以在自己本子运行,看看自己本子性能如何
  • redis-check-aof:修复有问题的AOF文件,rdbaof后面讲
  • redis-check-dump:修复有问题的dump.rdb文件
  • redis-sentinelRedis集群使用
  • redis-serverRedis服务器启动命令
  • redis-cli客户端,操作入口。在启动 Redis 后,可以使用客户端来访问Redis

 

3.2、启动Redis

启动 Redis 只需进入到 Redis 的安装目录,并执行 redis-server 命令即可:

默认情况下,这里直接执行 Redis-server 启动的Redis服务,是在前台直接运行的,也就是说,执行完该命令后,如果把当前窗口关闭掉,则Redis服务也会随即关闭。所以一般情况下,启动Redis服务需要从后台启动,也就是让 Redis 可以在后台运行。

我们可以先拷贝一个 Redis 配置文件到指定目录下,比如:cp  /usr/mysoft/redis-6.2.6/redis.conf  /usr/mysoft/redis-6.2.6/myredis/redis.conf。然后编译新拷贝的配置文件,将 daemonize 由 no 改为 yes。

再次启动redis服务,并指定启动服务配置文件:/usr/local/bin/redis-server /usr/mysoft/redis-6.2.6/myredis/redis.conf:

由此 Redis 即可运行在后台,即使关闭运行窗口 Redis 也不会被关闭。

 

在启动 Redis 后,我们可以使用客户端访问Redis,直接输入 /usr/local/bin/redis-cli 命令即可启动客户端访问 Redis:

redis-cli 只是 Redis 的客户端,如果没有启动 Redis 进程的话,启动 redis-cli 会提示无法连接。

 

 3.3、关闭Redis

单实例关闭,命令:redis-cli shutdown

也可以进入终端后再关闭:

 

多实例关闭,指定端口关闭,命令:redis-cli -p 6379 shutdown

 

4、Redis相关知识

4.1、端口号

Redis  的默认端口号为 6379。(6379在是手机按键上MERZ对应的号码,而MERZ取自意大利歌女Alessia Merz的名字)

 

4.2、Redis的单线程+多路IO复用技术

Redis是单线程+多路IO复用技术。这里“多路”指的是多个网络连接,“复用”指的是复用同一个线程,采用多路 I/O 复用技术可以让单个线程高效的处理多个连接请求(尽量减少网络 IO 的时间消耗)。

 

多路复用:Redis 会使用一个线程来检查多个文件描述符(socket)的就绪状态,如果有一个文件描述符(socket)就绪,就返回,否则 Redis 会把当前线程阻塞掉。在得到就绪状态后进行真正的操作时可以在同一个线程里执行,也可以启动新线程去执行(线程池),本质上是没有阻塞的。

 

多路I/O复用模型是利用 select、poll(轮询)、epoll 可以同时监察多个流的 I/O 事件的能力,在空闲的时候(即没有IO事件时),会把当前线程阻塞掉。当有一个或多个流有 I/O 事件时,就从阻塞态中唤醒,此时程序会轮询一遍所有的流(epoll 是只轮询那些真正发出了事件的流),并且只依次顺序的处理就绪的流,这种做法就避免了大量的无用操作。

采用单线程,避免了不必要的上下文切换和竞争条件,也不存在多进程或者多线程导致的切换而消耗 CPU,不用去考虑各种锁的问题,不存在加锁释放锁操作,没有因为可能出现死锁而导致的性能消耗;

这里我们一直在强调的单线程,只是 Redis 在处理我们的网络请求(即对 Redis 的数据库连接)的时候只有一个线程来处理,一个正式的Redis Server运行的时候肯定是不止一个线程的,这里需要大家明确的注意一下!例如Redis进行持久化的时候会以子进程或者子线程的方式执行。

 

4.3、Redis操作的原子性

Redis的所有单个操作都是原子性的,所谓原子操作是指不会被线程调度机制打断的操作,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。

这种操作一旦开始,就一直运行到结束,中间不会有任何 context switch (切换到另一个线程)。

1)在单线程中, 能够在单条指令中完成的操作都可以认为是"原子操作",因为中断只能发生于指令之间。

2)在多线程中,不能被其它进程(线程)打断的操作就叫原子操作。

Redis单命令的原子性主要得益于Redis的单线程。

 

5、Redis的数据库

 

5.1、Redis的多个数据库

Redis 默认提供了 16 个数据库,每个数据库都有一个 id, 从 0 开始,0~15, 且默认使用的是0号库。

每个数据库的数据是隔离的不能共享。我们可以通过修改 redis 的配置文件的 databases 进行修改数据库的数量,并且该数量无上限。Redis是一个字典结构的存储服务器,而实际上一个Redis实例提供了多个用来存储数据的字典,客户端可以指定将数据存储在哪个字典中。这与我们熟知的在一个关系数据库实例中可以创建多个数据库类似,所以可以将其中的每个字典都理解成一个独立的数据库。

客户端与Redis建立连接后会自动选择 0 号数据库,不过可以随时使用 select <dbid> 命令更换数据库。

比如要选择1号数据库:

 

Redis 多个数据库的特点:

  • Redis 不支持自定义数据库的名字,每个数据库都以编号命名,开发者必须自己记录哪些数据库存储了哪些数据。
  • Redis 不支持为每个数据库设置不同的访问密码,统一密码管理,所有库同样密码。所以一个客户端要么可以访问全部数据库,要么连一个数据库也没有权限访问。
  • 多个数据库之间并不是完全隔离的,比如 FLUSHALL 命令可以清空一个Redis实例中所有数据库中的数据。

综上所述,这些数据库更像是一种命名空间,而不适宜存储不同应用程序的数据。比如可以使用0号数据库存储某个应用生产环境中的数据,使用1号数据库存储测试环境中的数据,但不适宜使用0号数据库存储A应用的数据而使用1号数据库B应用的数据,不同的应用应该使用不同的Redis实例存储数据。由于Redis非常轻量级,一个空Redis实例占用的内存只有1M左右,所以不用担心多个Redis实例会额外占用很多内存。

 

5.2、数据库相关命令

数据库相关常用命令如下:

  • select 数据库 id:根据id切换数据库
  • dbsize:查看当前数据库的key的数量
  • flushdb:清空当前库的数据
  • flushall:将全部数据库的数据都清空

 

如何查看当前连接的是几号数据库?默认选择的是 0 号数据库,当通过 select 命令切换数据库后,会在命令行后面显示 [],[] 括号里面的就是当前连接的数据库号,默认。如下:

 

6、数据库的键

6.1、键的过期时间

redis 的键默认是永不过期的。一般情况是这样,当你配置中开启了超出最大内存限制就写磁盘的话,那么这些没有设置过期时间的key可能会被写到磁盘上。如果没设置,那么redis将使用LRU机制,将内存中的老数据删除,并写入新数据。

当然也可以为键设置过期时间,“expire key 时间” 命令用于设置key 的过期时间,key 过期后将不再可用,单位以秒计。

 

6.2、key 相关命令

Redis 键命令用于管理 redis 的键。

key 相关常用命令如下:

  • set key value:添加 string 类型的 key,并设置该 key 的 value 值
  • keys *:查看当前库所有key    (匹配:keys *1)
  • exists key:判断某个key是否存在。存在返回1,否则返回0
  • type key:查看你的key是什么类型
  • del key:删除指定的key。删除成功则输出1,否则输出0
  • unlink key:异步删除。仅将keys从keyspace元数据中删除,真正的删除会在后续异步操作。
  • expire key 时间:为给定的key设置过期时间,单位为秒。比如expire key 10,即该 key 在10秒后过期。key 如果不设置过期时间,默认是永不自动过期
  • ttl key:查看还有多少秒过期。该命令返回 key 有效时间的秒数,如果是 -1 则表示永不过期,-2 则表示已过期。

操作示例:

 

posted @ 2022-01-10 11:24  wenxuehai  阅读(1363)  评论(0编辑  收藏  举报
//右下角添加目录