分布式数据库Redis的简介、安装与设置使用指令
- Redis的简介
- Redis的版本选择
- Redis的安装
- Redis的基本设置、使用指令
- 官方文档
- 配置/取消配置 成服务——设置/取消 Redis开机自启
- 以——命令行交互方式(自认)——手动启动/关闭Redis服务
- 在Redis服务启动后,登录Redis服务
- 登录Redis服务后,在多数据库中切换数据库。
- 登录Redis服务后,测试客户端和服务端是否成功连接
- 登录Redis服务后,存放数据set
- 登录Redis服务后,读取数据get
- 登录Redis服务后,移动当前库中的指定数据至另一数据库
- 登录Redis服务后,查找指定key对应的value
- 登录Redis服务后,获取以s开头、其后仅包含—位任意数据
- 登录Redis服务后,判断指定键名的数据是否存在
- 登录Redis服务后,删除当前数据库的key
- 登录Redis服务后,获取key对应的value值的类型
- 登录Redis服务后,重命名key名
- 登录Redis服务后,将key1修改为key2之前判断key2是否存在,不存在再重命名
- 登录Redis服务后,查看当前数据库中key的数目
- 登录Redis服务后,选择数据库
- 在Redis服务启动后,登出Redis服务
- 以——后端观察运行情况、无法交互的形式(自认)——手动启动/关闭Redis服务
Redis的简介
全称Remote Dictionary Server,即远程字典服务。Redis是一款基于内存的高速缓存运行的高性能键值存储系统,通过Key-Value来存储数据的开源数据库,可以用作数据库、缓存和消息中间件。本文中的一些名词解释,待从此博客中找出对应并补入。
- Redis 内置了复制(replication),LUA 脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions)和不同级别的 磁盘持久化(persistence);
- Redis 支持多种类型的数据结构,如 字符串(strings),散列(hashes), 列表(lists), 集合(sets), 有序集合(sorted sets) ,范围查询, bitmaps, hyperloglogs 和 地理空间(geospatial) 索引半径查询;
- Redis 通过 哨兵(Sentinel) 和自动分区(Cluster)提供高可用性(high availability)。
Redis在【开发项目】中主要用来做缓存——Redis缓存的作用是把经常访问的【数据库中的数据】提取到Redis,①用户查询的时候,先去Redis查询,没有查到再去数据库执行sql语句查询,并同时把查询到的数据同步到Redis里面,Redis只做读操作②用户添加、删除数据的时候,先在Redis中进行操作,然后通过线程对数据库执行异步操作,来对应添加、删除数据库中的对应数据,以保持Redis与数据库中的一致——这是因为Redis基于内存,而内存中查询速度快,就像我们用 MySQL 做持久层数据一样 。通过【Redis+数据库(MySQL、Oracle)】的好处是:待补入此博客。
- 提速 数据库操作——因为原本【操作数据库】变为了【操作缓存】,而数据库的操作变为了异步,从而不再影响主线程。
- 防止数据库出现雪崩——数据库是并发场景下最薄弱的环节,如果所有请求都直接访问数据库上,将导致数据库压力过大而宕机。所以设置Redis作为数据库的缓存,当有请求的时候先从Redis中进行查询、操作,针对有需要的情况(修改数据后同步数据)再异步访问、操作数据库,从而减少直接操作数据库的次数。
Redis由VMware主持开发,遵守 BSD 协议,使用C语言按照ANSI C标准进行开发的。此处先给出Redis的官网缓存是其最常应用的场景之一。Redis支持多数据库,Redis 默认情况下包含16个数据库,数据库名称是用数字0-15 来依次命名的。 多数据库相互独立,互不干扰。
BSD 协议:
ANSI C标准:
Redis相比于MySQL,可以存很多的数据,比如文档,图片、集合对象等等,而数据库只能存基础类型。
- Redis提供多种语言的API
- 不仅支持key-value的数据,同时还提供list,set,zset,hash等数据结构的存储
- 支持数据的备份
- 支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
- Redis的所有操作都是原子性的,要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。
Redis能实现高并发、运行快,是因为:
- Redis是基于内存的高速缓存运行,避免了磁盘I/O等耗时操作。
- Redis命令处理的核心模块为单线程,减少了锁竞争,以及频繁创建线程和销毁线程的代价,减少了线程上下文切换的消耗。在Redis 6.0中新增加的多线程也只是针对处理网络请求采用了多线程,而数据的读写命令,仍然是单线程处理的。
- Redis 使用的是非阻塞 IO,采用了I/O多路复用机制——使用了单线程来轮询描述符,将数据库的开、关、读、写都转换成了事件,减少了线程切换时上下文的切换和竞争,大大提升了并发效率。
Redis的组成
Redis实例运行在单独的进程中,【应用系统(Redis客户端)】【通过Redis协议】【和Redis Server 进行交互】。
在Redis 协议之上,客户端和服务端可以实现多种类型的交互模式:
- 串行请求/响应模式
- 双工的请求/响应模式(pipeline)
- 原子化的批量请求/响应模式(事务)
- 发布/订阅模式
- 脚本化的批量执行(Lua脚本)
Redis Clinet(应用系统)
Redis Server
Redis协议
Redis的交互协议包含2 个部分:网络模型
(数据交互的组织方式)和序列化协议
(数据本身如何序列化)。
网络模型
Redis协议位于TCP之上,客户端和【Redis实例】保持双工的连接,如下图所示:
客户端和服务端交互的内容是序列化后的数据,服务器为每个客户端建立与之对应的连接,在应用层维护一系列状态保存在connection 中,connection 间相互无关联。在Redis中,connection 通过redisClient 结构体实现。
序列化协议
客户端-服务端之间交互的是序列化后的协议数据。在Redis中,协议数据分为不同的类型,每种类型的数据均以…结束,通过数据的 首字符 来区分类型。具体可详见此博客的“Redis协议”章节里的“序列化协议”。
- 由客户端发送给服务器端的类型为:inline command、由 bulk string 组成的array。
- 由服务端发送给客户端的类型为:除了 inline command之外的所有类型。并根据客户端命令或交互模式的不同进行确定。
Redis Clinet和Redis Server间的交互模式
串行的请求/响应模式
同一个connection在前一个命令执行完成之后,再发送第二个请求,如下图所示。
这种方式的弊端在于,每一个请求的发送都取决于前一个响应。Redis在处理单个请求的时间,通常比局域网传输的时间小1个数量级。因此串行模式下,单连接的大部分时间都处于网络等待,没有充分利用服务器的处理能力。
双工的请求/响应模式(pipeline的实现)
因为TCP是全双工的,请求响应【异步?】进行时,也不会引起混淆。此时批量的发送命令至服务器,在批量的获取响应数据,可以极大的提高 单连接 的吞吐量。pipeline 交互模式的穿插请求响应,如下入所示:
pipeline 的实现取决于客户端
原子化的批量请求/响应模式(事务)
通常在开发时需要将 批量的命令 原子化执行,Redis 中引入了事务模式。
入队/执行 分离的事务原子性
- 入队阶段:客户端发送请求到服务器,这些命令会被存放在Server端的conn的请求队列中。
- 执行阶段:发送完一个批次后,Redis 服务器一次执行队列中的所有请求。由于单实例使用单线程处理请求,因此不会存在并发的问题。
因为 Redis执行器一次执行的粒度是“命令”,所以为了原子地执行批次命令,Redis引入了批量命令执行:EXEC
。事务交互模式如下:
由MULTI命令开启事务,随后发送的请求都是暂存在Server conn的队列中,最后通过EXEC批量提交执行;并返回每一个命令执行的结果数组。
事务的一致性
- 当入队阶段出现语法错误时,不执行EXEC 也不会对数据产生影响;
- 当EXEC 中有一条command 执行出错时,后续请求继续执行,执行结果会在响应数组中体现,并且由客户端决定如何恢复,Redis 本身不包含回滚机制。
- 一个事务通常需要包含读操作,应用程序需要根据读取的结果决定后续的操作流程。但是在Redis中,事务中的读操作并无意义,如下所示:
发布/订阅模式
脚本化的批量执行(Lua脚本)
- 客户端发送
eval lua_script_string 2 key1 key2 first second
给服务端 - 服务端解析lua_script_string 并根据string 本身的内容通过sha1 计算出sha值,存放到redisServer对象的lua_scripts变量中。
- 服务端原子化的通过内置Lua环境执行 lua_script_string,脚本可能包含对Redis的方法调用如set 等。
- 执行完成之后将lua的结果转换成Redis类型返回给客户端。
Redis的版本选择
打开Redis的官网,在顶部导航栏中选中RESOURCES
,在弹出的下拉列表中选中Clients
,如下图所示。
在随后界面的右侧导航栏中,根据自己工程的语言种类选择,比如Java,如下图红框所示。
随后可以看到Java支持的各版本,如下图所示。
Jedis
Jedis是一个Java Redis客户端库,它提供了许多简单易用的API来操作Redis。
Redisson
Redisson是一个基于Netty框架的Java Redis客户端库,它提供了分布式锁、分布式集合、分布式对象等功能,支持Redis集群和Sentinel模式。
lettuce
lettuce是一个高级Java Redis客户端库,用于线程安全同步、异步和【响应使用——响应式API】。支持集群(Cluster)、Sentinel模式、Pipelining和编解码器(codecs)以及Redis 6中的新特性
JRedis
Redis的安装
Windows
通过自己本地保留的Redis-x64-3.0.504
安装包进行的安装,下方安装方法尚未试通。
先按此博客中的方法进行的安装,先给出安装包地址下载地址,在该链接网页中选择.msi
文件,如下图红框所示。
下面自己的方法暂未试通过= =。
下载安装包
先给出官网下载地址,选择哪个安装包根据各自的操作系统而定,这里不再赘述。
安装WSL(Windows Subsystem for Linux)
选择Windows
操作系统对应的版本后,网站会跳转到一个新的页面,要求我们安装一个WSL
软件——官方解释是因为“Redis在Windows上不受官方支持。但是,您可以按照以下说明在Windows上安装Redis进行开发。要在Windows上安装Redis,首先需要启用WSL2(Windows Linux子系统)。WSL2允许您在Windows上以本机方式运行Linux二进制文件。要使此方法工作,您需要运行Windows 10 2004版及更高版本或Windows 11”。
点击下图红框中的链接开始安装WSL2
。此处先给出该WSL安装说明的链接。
如果使用的Windows是早期版本,需要进行手动安装,官方说明the manual install page.
如下:
“您必须运行Windows 10 2004版及更高版本(内部版本19041及更高)或Windows 11才能使用以下命令。如果您使用的是早期版本,请参阅手动安装页面。”,如下图所示。此处也给出the manual install page的地址。
点击上图红框链接后,来到下图界面。
如果安装过程中遇到问题,可以查看上图红框中的链接,此处给出的是中文说明的网址。
WSL的简介及用途
WSL(Windows Subsystem for Linux)是一个由微软与Canonical公司合作开发、为在Windows 10上能够原生运行Linux二进制可执行文件(ELF格式)的兼容层,属于Windows操作系统中的一个子系统,目标是可以在Windows系统上运行Linux应用程序——使纯正的Ubuntu 14.04 "Trusty Tahr"映像能下载和解压到用户的本地计算机,并且映像内的工具和实用工具能在此子系统上原生运行。WSL为用户提供了一种在Windows环境下运行Linux软件的方法,无需虚拟机或双系统,大大方便了开发人员在Windows系统下的工作。
开发人员可以在Windows机器上同时访问Windows和Linux的功能。Windows Linux子系统(WSL)允许开发人员安装Linux发行版(如Ubuntu、OpenSUSE、Kali、Debian、Arch Linux等),并在Windows上直接使用Linux应用程序、实用程序和Bash命令行工具,无需修改,而无需传统虚拟机或双端口设置的开销。
安装包安装
将压缩包下载完成后,解压到文件夹中,使用命令提示行来进行安装:
- 首先切换到解压的文件夹下,切换方法可以参考这篇博客。
- 输入指令
redis-server.exe redis.windows.conf
,即可进行安装。
安装成功的标志
安装成功的标志如下图所示。
安装后的目录文件及其作用
- redis-benchmark.exe:官方自带的 Redis 性能测试工具,可以有效的测试 Redis 服务的性能。
语法:
redis-benchmark [选项] [选项值]
选项 作用
- -h 指定服务器主机名
- -p 指定服务器端口
- -s 指定服务器socket(套接字)
- -c 指定并发连接数
- -n 指定请求数
- -d 以字节的形式指定SET/GET值的数据大小
- -k 1=keep alive O=reconnect
- -r SET/GET/INCR使用随机key,SADD使用随机值
- -P 通过管道传输请求
- -q 强制退出redis。仅显示querylsec值
- -csv 以csv格式输出
- -1 生成循环,永久执行测试
- -t 仅运行以逗号分隔的测试命令列表
- -l ldle模式。仅打开N个idle连接并等待
示例1: 向IP地址为192.168.59.118、端口为6379的Redis服务器发送100个并发连接与100000个请求测试性能
redis-benchmark -h 192.168.59.118 -p 6379 -c 100 -n 100000
示例2:测试存取大小为100字节的数据包的性能。
redis-benchmark -h 192.168.59.118 -p 6379 -q -d 100
示例3:测试本机上Redis 服务在进行set与lpush操作时的性能。
- redis-cli.exe:登录(客户端?)数据库——使用redis-cli连接Redis数据库,默认使用的是序号为0的数据库。
命令格式:
select 序号
使用redis-cli连接Redis数据库后,默认使用的是序号为0的数据库
select 1
#切换至序号为1的数据库
select 2
#切换至序号为2的数据库
- redis-server.exe:
- redis文件夹中的内容:是用于可视化操作redis的工具,比如redis安装目录下的
\redis\rdm.exe
。
Linux
详见此博客,待验证。
Redis的基本设置、使用指令
官方文档
此处先给出Redis官方文档。
配置/取消配置 成服务——设置/取消 Redis开机自启
redis-server --service-install redis.windows-service.conf --loglevel verbose
:通过redis-server --service-install
在windows操作系统中注册Redis为服务,需要进入Redis的安装目录——比如D:\redis
下——输入此语句。
redis-server --service-uninstall
:通过redis-server --service-uninstall
在windows操作系统中取消注册的服务。
上述指令中的各参数说明
service-install
:注册为windows服务
redis.windows-service.conf
:配置文件名称
–loglevel verbose
:日志级别loglevel
定义为“详细”verbose
以——命令行交互方式(自认)——手动启动/关闭Redis服务
redis-server --service-start
:启动
redis-server --service-stop
:关闭
在Redis服务启动后,登录Redis服务
redis-cli
:在Redis的安装目录下,启动redis-cli.exe
文件,如下图所示。请注意,登录Redis服务前需要先启动Redis服务,如下图所示。
使用redis-cli连接Redis数据库后,默认使用的是序号为0的数据库。
上图中指定了ip地址和端口号。
登录Redis服务后,在多数据库中切换数据库。
Redis支持多数据库,Redis 默认情况下包含16个数据库,数据库名称是用数字0-15 来依次命名的。 多数据库相互独立,互不干扰。使用redis-cli连接Redis数据库后,默认使用的是序号为0的数据库。
select n
:切换至第n个数据库,命令格式为select 10
,表示切换至序号为10的数据库。
登录Redis服务后,测试客户端和服务端是否成功连接
PING
:在登录Redis服务后,测试客户端和服务端是否成功连接,若连接成功,命令行应显示PONG
,如下图所示。
登录Redis服务后,存放数据set
set
: 存放数据,命令格式为 set key value。
登录Redis服务后,读取数据get
get
:获取数据,命令格式为 get key。
登录Redis服务后,移动当前库中的指定数据至另一数据库
move 当前库中的键名 要移动到的数据库的序号
:move yxp 1
移动当前库中键名为“yxp”的键值对到序号为“1”的数据库中。
登录Redis服务后,查找指定key对应的value
keys *
:获取所有的key,命令格式为keys 要查找的键
,*
表示任意位的任意字符。keys n*
:获取所有以n
开头的、且其后 【任意位的任意字符】 的键对应的值,命令格式为keys 首字母*
。keys n?
:获取所有以n
开头、且其后仅有一个任意字符的键对应的值。keys n??
获取所有以n
开头、且其后仅有两个任意字符的键对应的值。
登录Redis服务后,获取以s开头、其后仅包含—位任意数据
keys s?
:获取以s开头、其后仅包含—位任意数据,命令格式为keys 首字母?
登录Redis服务后,判断指定键名的数据是否存在
exists aaa
:判断数据“aaa”是否存在——(存在:1,不存在:0)
登录Redis服务后,删除当前数据库的key
del key
:删除当前数据库的key,命令格式为del key——(成功:1,失败:0,比如删除一个已删除的数据)
登录Redis服务后,获取key对应的value值的类型
type key
:获取【该key对应的value值】的类型,命令格式为 type key。
登录Redis服务后,重命名key名
rename key1 key2
:将key1修改为key2。
登录Redis服务后,将key1修改为key2之前判断key2是否存在,不存在再重命名
renamenx key1 key2
:将key1修改为key2之前判断key2是否存在,不存在则重命名。
登录Redis服务后,查看当前数据库中key的数目
dbsize
:查看当前数据库中key的数目。
登录Redis服务后,选择数据库
select
:选择数据库,命令格式为select 数据库的序号(第几个数据库)
。
在Redis服务启动后,登出Redis服务
服务使用后,输入exit
退出即可,如下图所示。
以——后端观察运行情况、无法交互的形式(自认)——手动启动/关闭Redis服务
安装之后,每次都要先打开一个命令提示符,切换到Redis文件夹下,输入指令redis-server.exe redis.windows.conf
来连接远程的服务器,以启动服务,如下图所示。自认,此种形式是后端启动Redis,但并不能交互设置Redis,只能以运维的形式观看Redis的运行状况
以——后端观察运行情况、无法交互的形式(自认)——启动Redis服务后,使用Redis服务
此种情况因为以——后端观察运行情况、无法交互的形式——启动的Redis服务,所以需要再打开一个新的命令提示符窗口,在切换至Redis的安装根目录后,输入指令redis-cli.exe -h 127.0.0.1 -p 6379
,来访问已启动的服务器,成功的话如下图所示。
录入数据mykey=007:set myKey 007
回车
查询数据mykey的值:get myKey
回车
tips:在输入set指令后(还没输入完指令),会自动在后面给你弹出一个输入提示。
录入数据成功,如下所示。