前言
Redis 中文网站:http://redis.cn/
Redis 是一个开源(BSD 许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件
它支持多种类型的数据结构,如字符串(strings)散列(hashes)列表(lists),集合(sets),有序集合(sorted sets)与范围查询,位图(bitmaps),基数计算算法(hyperloglogs) 地理空间(geospatial) 索引半径查询
Redis 内置了 复制(replication),LUA脚本(Lua scripting),LRU 驱动事件(LRU eviction),事务(transactions)和不同级别的磁盘持久化(persistence),并通过 Redis 哨兵(Sentinel)和自动分区(Cluster)提供高可用性(high availability)
为什么会出现 Redis?
磁盘、内存
磁盘在寻址上花费的时长是毫秒 ms 级别的,带宽是 G/M 级别
内存在寻址上花费的时长是纳秒 ns 级别的,带宽比较大,按 T 级别来算的
基于以上,内存在寻址上比磁盘快了 10W 倍
I/O buffer
成本问题:
1、磁盘、磁道、扇区,一个扇区:512 字节带来成本很大问题
2、操作系统索引以 4K 为单位,无论你读取多少数据,都至少是 4K 为单位从磁盘中拿
数据库
表数据量很大,会导致性能极速下降
若表中有索引,增删改很慢,查询速度缓慢会有以下两个维度影响
1、1 个或少量的查询语句依然很快,查询的数据量较少或频次很低
2、当查询的并发量大时会受到磁盘带宽影响,从而就会影响到查询的速度
数据库对比
官网:https://db-engines.com/en/ranking,可以在该网站上看看每年各个数据库之间的排名以及使用频率情况
基于企业级开发,经常会使用 MySQL 关系型数据库,它是基于磁盘的,若并发量或数据量上来时,它会极其影响 DML 语句操作速度;在这种情况发展到极端只有使用 SAP HANA 内存级别的关系型数据库才能扛住,原本在磁盘 2T 数据量而它的内存数据库中会被优化后压缩成 1T 多数据量进行处理,但这种内存级别数据库并不是一般的公司能用得起,一般公司都是想成本越低越好
基于此,也就有了一个折中的方案,数据持久化在库中,数据的可视化交由给缓存处理,最开始出现的缓存中间件 > Memcached
缓存中间件
一般都会用 Memcached、Redis 这两种缓存中间件来进行比较,它们都是基于 Key-Value 键值对方式存储的
MongoDB 就与它们区分开了,它是基于 Document 存储的,它主要用来作文章内容、文本存储的
Memcached、Redis
- Memcached Value 没有类型的概念,而 Redis Value 有多种数据类型,string(内置:bitmap、字符类型、数值类型)、hashes、lists、sets、sorted sets
- Memcached 不支持持久化,而 Redis 支持多种持久化方式,AOF、RDB、两者混合模式
- Memcached Value 支持 1MB 大小,而 Redis 支持 1GB 大小
安装
在上面简单介绍了 Redis 是什么,以及 Redis 由来,从不同层面上介绍 Redis 的好处,即使说 Redis 已经这么好用了,但它内部还不断在优化,比如:Redis6 在 Redis5 基础上引入了多线程模型,我们先来说说它在这方面优化后会带来哪些好处?
- 并发处理能力:Redis6 多线程模型在处理 I/O 操作时可以利用多个线程,提高了并发处理的能力;而 Redis 单线程模型下,在处理客户端请求时只使用了单线程,因此在并发处理能力上相对较低
Redis 多线程模型只涉及到 I/O 操作的处理,核心的数据处理仍然是单线程的
- 多核利用:Redis6 多线程模型下能更好地利用多核处理器性能;通过使用多个线程,可以同时处理多个客户端请求,提高系统的整体吞吐量;而 Redis 单线程模型下只能使用单个核心,无法充分利用多核处理器的优势
- 响应时间:由于 Redis6 多线程模型能够并发处理多个请求,因此在高并发的负载之下,它能够提供更低的响应时间;而 Redis 单线程模型下在高并发情况下可能会出现较高的响应时间,因为所有的客户端请求都必须在单个线程上依此之下
简单介绍过后,我们在本文中会同时告知如何在 Linux 机器上安装 Redis5、Redis6,因为在安装时,两者会出现不同的问题
提前准备一台本地虚拟机或云服务器,安装包所在目录:/home/software
虚拟机版本(cat /etc/redhat-release):CentOS Linux release 7.9.2009 (AltArch)
redis-5.0.8.tar.gz、redis-6.0.6.tar.gz
Redis5
安装 wget 命令 > yum install wget
1、下载 5.0.8 安装包:wget http://download.redis.io/releases/redis-5.0.8.tar.gz
2、解压安装包:tar xf redis-5.0.8.tar.gz(v 参数会触发 IO,故不写)
3、可仔细阅读 redis-5.0.8 目录下 > README.md 文件
4、编译安装>生成可执行程序:cd redis-5.0.8 && make install && cd src
1、安装时会提示编译失败:缺少 gcc 依赖,C 语言环境(GUN C 是 Linux 中规定的 C 语言标准)
yum-config-manager --save --setopt=mysql57-community.skip_if_unavailable=true
yum install gcc
2、然后再执行:make distclean 后再 make install && cd src
3、编译的最后会出现:
cannot find -latomic 错误
,因为我使用 Mac M1 系统 > aarch64 架构,它会在 Makefile 文件中去校验,故编辑该文件,将这部分内容注释掉,若你非该架构,可无须关注这步操作4、然后再执行:make distclean 后再 make install && cd src ,最终,安装成功了,生成了可执行的程序
make install 只会在你的系统中安装二进制文件,但不会配置 init 脚本和配置文件放在适当的位置上
1、一个物理机器中可以有多个 Redis 实例(进程)通过 port 区分
2、可执行程序只存在一份,但内存中未来的多个实例中需要各自的配置文件,持久化目录等
3、脚本会帮你启动、开机自启动!!
5、编译安装到指定位置:make PREFIX=/usr/local/redis5 install,将 redis-cli 更名为 redis5-cli,主要是为了作版本区分
6、配置系统变量:vim /etc/profile
REDIS5_HOME=/usr/local/redis5 PATH=$PATH:$REDIS5_HOME/bin
7、安装 Redis5,cd /home/software/redis-5.0.8/utils 后执行 ./install_server.sh,它会一步步提示你如何设置端口、配置文件、日志文件、数据文件
8、最后,查看 Redis5 当前占用进程
ps -ef | grep redis5
Redis6
安装 wget 命令 > yum install wget
1、下载 6.0.6 安装包:wget http://download.redis.io/releases/redis-6.0.6.tar.gz
2、解压安装包:tar xf redis-6.0.6.tar.gz(v 参数会触发 IO,故不写)
3、可仔细阅读 redis-6.0.6 目录下 > README.md 文件
4、编译安装>生成可执行程序:cd redis-6.0.6 && make install && cd src
5、编译安装到指定位置:make PREFIX=/usr/local/redis6 install,将 redis-cli 更名为 redis6-cli,主要是为了作版本区分
6、配置系统变量:vim /etc/profile
REDIS6_HOME=/usr/local/redis6 PATH=$PATH:$REDIS6_HOME/bin
7、安装 Redis6,cd /home/software/redis-6.0.6/utils 后执行 ./install_server.sh,在 Redis6 会报如下错误:This systems seems to use systemd. Please take a look at the provided example service unit files in this directory, and adapt and install them. Sorry!
编辑 vi install_server.sh 文件,将如下内容进行注释后保存,再执行脚本:
它会一步步提示你如何设置端口、配置文件、日志文件、数据文件,以 Redis5 port:56379 为例,那么 Redis6 port 自然而然会设置为 66369 了,错误❌:端口数量是有限制的,最多 65535 个,如下报错所示:
因此,将 Redis6 端口设置为 60379,最终:Redis6 安装成功!!!
8、最后,查看 Redis6 当前占用进程
ps -ef | grep redis6
使用
到此为止,Redis5、Redis6 都已经在 Linux 上安装成功了!!!
查看 redis5-cli、redis6-cli 帮助文档:
redis5-cli --help
redis6-cli --help
下面来介绍一下常用的 Redis 客户端操作命令吧!
- 连接主机名:redis5-cli -h、redis6-cli -h(未指定时,默认为 127.0.0.1)
- 连接端口:redis5-cli -p 56379、redis6-cli -p 60379(未指定时,默认为 6379)
- 连接时认证密码登录或登录后通过 auth 命令:redis5-cli -a(连接密码,默认不会指定)
- 连接指定库:在 Redis 分为 16 个库,0~15 > redis5-cli -n、redis6-cli -n
若你不知道进入到 Redis 客户端以后,该如何操作 get、set 命令,又或者是不知道 Redis 中提供的多种数据类型如何应用,请看如下:
- 连接:redis6-cli -p 60379 以后,输入 help 命令,打印如下:
127.0.0.1:60379> help
redis-cli 6.0.6
To get help about Redis commands type:
“help @
<group>
” to get a list of commands in<group>
“help
<command>
” for help on<command>
“help
<tab>
” to get a list of possible help topics“quit” to exit
- help @group:指的就是以数据类型分组的意思,当你
help @string
它就把 string 数据类型相关的操作命令以及描述给你展示出来
127.0.0.1:60379> help @string APPEND key value summary: Append a value to a key since: 2.0.0 BITCOUNT key [start end] summary: Count set bits in a string since: 2.6.0 BITFIELD key [GET type offset] [SET type offset value] [INCRBY type offset increment] [OVERFLOW WRAP|SAT|FAIL] summary: Perform arbitrary bitfield integer operations on strings since: 3.2.0 BITOP operation destkey key [key ...] summary: Perform bitwise operations between strings since: 2.6.0 BITPOS key bit [start] [end] summary: Find first bit set or clear in a string since: 2.8.7 DECR key summary: Decrement the integer value of a key by one since: 1.0.0 # ....... 更多内容
- help `command:指的就是具体的某一个具体的命令是要如何操作的,比如说怎么设置位图 > setbit
127.0.0.1:60379> help setbit SETBIT key offset value summary: Sets or clears the bit at offset in the string value stored at key since: 2.2.0 group: string
这下有了帮助文档,你该知道如何去巧妙应用好 Redis 了吧!!!
Redis 数据类型以 group 分组存在,每种数据结构下的不同操作都是一条 command 命令
总结
该篇博文是 Redis 专栏的开篇,不作过多的实践以及应用场景的描述,主要是介绍了 Redis 前生今世,为什么要出现 Redis?Redis6 比 Redis5 扩充了多线程模型好处在哪里,在生产环境中我们如何自己去安装 Redis5、Redis6;最后,简单介绍了一些连接 Redis 客户端时使用的命令以及在操作 Redis 客户端命令时如何使用帮助文档让我们快速掌握 Redis 命令操作!
有小伙伴可能会说到为什么不使用容器化部署的方式来构建 Redis,当然,使用容器化部署方便了我们不需要太多去专注这方面的知识;但是 Redis 单独使用服务器部署,它的好处就是降低了其他微服务对其使用及性能的影响,而且单独使用服务部署更方便我们可以掌握 Redis 内存以及其他持久化配置相关的东西,也不会因为 Redis 内存限制的大小影响到其他微服务的运行✅
内存不作任何设置时,它会动态的去进行扩容或压缩,这对我们的 Redis 服务极其不可靠
实属个人见解,有不同见地的小伙伴,可以在底下留言,大家一起讨论,互相进步哈!!
后续 Redis 专栏,会有更多理论+实战+图文的博文出来,敬请期待!!!
如果觉得博文不错,关注我 vnjohn,后续会有更多实战、源码、架构干货分享!
推荐专栏:Spring、MySQL,订阅一波不再迷路
大家的「关注❤️ + 点赞👍 + 收藏⭐」就是我创作的最大动力!谢谢大家的支持,我们下文见!