华子目录
- `Redis`介绍
- 什么是`Redis`
- `Redis`能干什么
- `Redis`的特点
- `Redis`与`memcached`对比
- `redis`源码编译安装
- 下载源码包
- 准备安装环境
- 开始编译
- 开始安装
- 前台启动
- 后台启动`redis`
- 开启`systemctl`启动`redis`
- 测试redis
- 相关知识
Redis
介绍
什么是Redis
2008
年,意大利
的一家创业公司Merzia
推出了一款基于MySQL
的网站实时统计系统LLOOGG
,然而没过多久该公司的创始人Salvatore Sanfilippo
便开始对MySQL
的性能感到失望
,于是他决定亲自为LLOOGG
量身定做一个数据库
,并于2009年开发完成,这个数据库就是Redis
。不过Salvatore Sanfilippo
并不满足只将Redis
用于LLOOGG
这一款产品,而是希望更多的人使用它,于是在同一年Salvatore Sanfilippo
将Redis开源发布
,并开始和Redis
的另一名主要的代码
贡献者Pieter Noordhuis
一起继续着Redis
的开发
,直到今天。Salvatore Sanfilippo
自己也没有想到,短短的几年时间,Redis
就拥有了庞大的用户群体。Hacker News
在2012年发布了一份数据库的使用情况调查,结果显示有近12%
的公司在使用Redis
。国内如新浪微博
、街旁网
、知乎
,国外如GitHub
、Stack Overflow
、Flickr
、暴雪
和Instagram
,都是Redis
的用户
。VMware
公司从2010
年开始赞助Redis
的开发
,Salvatore Sanfilippo
和Pieter Noordhuis
也分别在3月和5月加入VMware
,全职开发Redis
。【本部分内容取自《REDIS入门指南》
】Redis
(REmote Dctionary Server远程字典服务器
),是完全开源免费
的,用C语言
编写的,遵守BSD协议
,是一个高性能的(key-value
)分布式内存数据库
,基于内存运行
,并支持持久化的NoSQL数据库
,是当前最热门的NoSQL数据库之一
, 也被人们称为数据结构服务器。Redis
是一个开源
的高性能键值对
(Key-Value
)数据库
。它通过提供多种键值数据类型
来适应不同场景下的存储需求
,目前为止Redis
支持的键值数据类型如下:- 字符串类型
- 散列类型
- 列表类型
- 集合类型
- 有序集合类型
学习参考网站:https://www.redis.net.cn/
Redis
能干什么
内存存储
和持久化
:redis
支持异步
将内存
中的数据
写到硬盘上
,同时不影响继续服务- 取
最新N个数据
的操作,如:可以将最新的10条评论的ID放在Redis的List集合里面
- 模拟类似于
HttpSession
这种需要设定过期时间
的功能(过期之后对数据的处理) - 发布、订阅消息系统
- 定时器、计数器
Redis
的特点
性能极高
:Redis
读
的速度是110000 次 /s
,写
的速度是81000 次 /s 。
丰富的数据类型
:Redis
支持二进制
案例的String
,List
,Hash
,Set
及ZSet
数据类型操作。原子性
:Redis
的所有操作
都是原子性
的,意思就是要么成功执行要么失败完全不执行
。单个操作是原子性的。多个操作也支持事务,是非原子性,通过MULTI
和EXEC
指令包起来。数据持久化
:可以将内存
中的数据
保存在磁盘
中,重启
的时候可以再次加载
进行使用
其他特性
:Redis
还支持publish/subscribe
通知,key过期
等特性。
Redis
提供的API
支持:C、C++、C#、Clojure、Java、JavaScript、Lua、PHP、Python、Ruby、Go、Scala、Perl
等多种语言。
Redis
与memcached
对比
- 共同点
- 无论是
Memcached
还是Redis
底层都是使用C语言
编写,都是基于key-value
,存储的数据都是在内存
中。
- 无论是
- 不同点
Memcached
支持的数据类型
比较简单(String,Object
);Redis
支持的数据类型比较丰富
。Memcached
默认一个值的最大存储不能超过1M
;Redis
一个值的最大存储1G
。Memcached
中存储的数据不能持久化
,一旦断电
数据丢失;Redis
中存储的数据可以持久化。
Memcached
是多线程
,支持并发访问
;Redis
是单线程
,不支持并发访问
。Memcached
自身不支持集群环境
;Redis
从3.0版本
之后自身开始提供集群环境支持
。
redis
源码编译安装
下载源码包
- 在
GitHub
上,搜索redis
,找到相应的仓库,下载对应的redis版本
- 下载
tar.gz
的包,使用mobaxterm
将这个包上传到Linux
的root
的家目录
[root@server ~]# ls
公共 模板 视频 图片 文档 下载 音乐 桌面 anaconda-ks.cfg redis-7.2.4.tar.gz
- 使用
tar
命令解压到/usr/local/
目录下
[root@server ~]# tar -zxvf redis-7.2.4.tar.gz -C /usr/local/[root@server ~]# cd /usr/local/
[root@server local]# ls
bin etc games include lib lib64 libexec redis-7.2.4 sbin share src
- 修改
redis-7.2.4
名为redis
[root@server local]# mv redis-7.2.4 redis
[root@server local]# ls
bin etc games include lib lib64 libexec redis sbin share src
准备安装环境
- 由于
Redis
是基于C语言
编写的,因此首先需要安装Redis
所需要的依赖环境:gcc、gcc-g++、make
[root@server ~]# yum install gcc gcc-g++ make -y
[root@server ~]# gcc --version
gcc (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3)
Copyright © 2021 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。[root@server ~]# g++ --version
g++ (GCC) 11.4.1 20231218 (Red Hat 11.4.1-3)
Copyright © 2021 Free Software Foundation, Inc.
本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保;
包括没有适销性和某一专用目的下的适用性担保。[root@server ~]# make --version
GNU Make 4.3
为 x86_64-redhat-linux-gnu 编译
Copyright (C) 1988-2020 Free Software Foundation, Inc.
许可证:GPLv3+:GNU 通用公共许可证第 3 版或更新版本<http://gnu.org/licenses/gpl.html>。
本软件是自由软件:您可以自由修改和重新发布它。
在法律允许的范围内没有其他保证。
开始编译
- 进入到
/usr/local/redis
目录下
[root@server ~]# cd /usr/local/redis/
[root@server redis]# ls
00-RELEASENOTES COPYING MANIFESTO runtest-cluster sentinel.conf utils
BUGS deps README.md runtest-moduleapi src
CODE_OF_CONDUCT.md INSTALL redis.conf runtest-sentinel tests
CONTRIBUTING.md Makefile runtest SECURITY.md TLS.md
- 输入
make
开始编译
[root@server redis]# make
#然后需要等待一段时间
开始安装
- 编译成功之后,输入
make install
进行安装
[root@server redis]# make install
- 如果没有
出错
,就会安装成功
。默认
的安装路径
是在/usr/local/bin
目录下。 - 此时我们查看环境变量,发现:环境变量中有
/usr/local/bin
这个路径,说明我们可以在任意路径下执行redis
命令
[root@server redis]# echo $PATH #查看环境变量
/root/.local/bin:/root/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
- 我们切换到
/usr/local/bin
目录下,查看
[root@server bin]# ls
redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-sentinel redis-server
redis-server:它是redis的服务端启动脚本
redis-cli:它是redis提供的客户端启动脚本
redis-sentinel:它是redis提供的哨兵启动脚本
redis-benchmark:性能测试工具,可以在自己电脑上运行来查看性能
redis-check-aof:修复有问题的AOF文件
redis-check-rdb:用于检查RDB(Redis Database)持久化文件的完整性。
前台启动
[root@server bin]# cd
[root@server ~]# redis-server
38105:C 16 May 2024 12:25:09.379 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
38105:C 16 May 2024 12:25:09.379 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
38105:C 16 May 2024 12:25:09.379 * Redis version=7.2.4, bits=64, commit=00000000, modified=0, pid=38105, just started
38105:C 16 May 2024 12:25:09.379 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
38105:M 16 May 2024 12:25:09.380 * Increased maximum number of open files to 10032 (it was originally set to 1024).
38105:M 16 May 2024 12:25:09.380 * monotonic clock: POSIX clock_gettime_.__.-``__ ''-.__.-`` `. `_. ''-._ Redis 7.2.4 (00000000/0) 64 bit.-`` .-```. ```\/ _.,_ ''-._( ' , .-` | `, ) Running in standalone mode|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 #服务端端口号| `-._ `._ / _.-' | PID: 38105 #服务端进程号`-._ `-._ `-./ _.-' _.-'|`-._`-._ `-.__.-' _.-'_.-'|| `-._`-._ _.-'_.-' | https://redis.io`-._ `-._`-.__.-'_.-' _.-'|`-._`-._ `-.__.-' _.-'_.-'|| `-._`-._ _.-'_.-' |`-._ `-._`-.__.-'_.-' _.-'`-._ `-.__.-' _.-'`-._ _.-'`-.__.-'38105:M 16 May 2024 12:25:09.386 * Server initialized
38105:M 16 May 2024 12:25:09.387 * Ready to accept connections tcp
注意
:这里直接执行redis-server
启动的Redis
服务,是在前台
直接运行的(效果如上图
),也就是说,执行完该命令后,如果关闭当前会话,则Redis服务也随即关闭
,因此这种方式不推荐使用。正常情况下,启动Redis服务需要从后台启动。
- 此时我们另起一个
会话
[root@server ~]# ps -ef | grep redis #查看redis端口和进程
UID PID PPID C STIME TTY TIME CMD
root 38105 2782 0 12:25 pts/1 00:00:00 redis-server *:6379
root 38166 38135 0 12:29 pts/0 00:00:00 grep --color=auto redis[root@server ~]# ps -aux | grep redis #查看redis端口和进程
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 38105 0.3 0.5 268212 10896 pts/1 Sl+ 12:25 0:01 redis-server *:6379
root 38180 0.0 0.1 221680 2220 pts/0 S+ 12:32 0:00 grep --color=auto redis
- 关闭
redis
服务
#通过redis-cli命令关闭
[root@server ~]# redis-cli shutdown 关闭`redis`服务
[root@server ~]# ps -ef | grep redis
root 38190 38135 0 12:34 pts/0 00:00:00 grep --color=auto redis#通过kill杀死redis进程关闭redis服务
[root@server ~]# ps -ef | grep redis
root 38191 2782 0 12:36 pts/1 00:00:00 redis-server *:6379
root 38198 38135 0 12:38 pts/0 00:00:00 grep --color=auto redis
[root@server ~]# kill -9 38191
[root@server ~]# ps -ef | grep redis
root 38200 38135 0 12:38 pts/0 00:00:00 grep --color=auto redis
后台启动redis
- 在
redis
的安装目录中,有一个redis.conf
文件,我们把这个文件复制到/etc/目录下
:
[root@server ~]# cp /usr/local/redis/redis.conf /etc/
[root@server ~]# find / -name redis.conf
/etc/redis.conf
/usr/local/redis/redis.conf
- 修改
/etc/redis.conf
文件,把daemonize
值设置为yes
[root@server ~]# vim /etc/redis.conf
daemonize yes
- 保存退出后,执行如下命令来
后台启动服务
。
[root@server ~]# redis-server /etc/redis.conf
38241:C 16 May 2024 12:45:16.005 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see https://github.com/jemalloc/jemalloc/issues/1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
[root@server ~]# ps -ef | grep redis
root 38242 1 0 12:45 ? 00:00:00 redis-server 127.0.0.1:6379
root 38249 38135 0 12:45 pts/0 00:00:00 grep --color=auto redis
[root@server ~]#
- 此时我们发现,已经
成功后台启动了
开启systemctl
启动redis
redis
没有开机启动功能,我们需要编写脚本
来实现这个功能。我们在/etc/systemd/system
目录下新建redis.service
文件。- 我们在
/usr/lib/systemd/system
和/etc/systemd/system
新建redis.service
都可以
[root@server ~]# cd /usr/lib/systemd/system
[root@server system]# vim redis.service
[Unit]
#服务描述
Description=Redis Server Manager
#服务类别
After=network.target[Service]
#后台运行的形式
Type=forking
#服务命令
ExecStart=/usr/local/bin/redis-server /etc/redis.conf
#给服务分配独立的临时空间
PrivateTmp=true[Install]
#运行级别下服务安装的相关设置,可设置为多用户,即系统运行级别为3
WantedBy=multi-user.target
- 重新加载文件
[root@server ~]# systemctl daemon-reload
[root@server ~]# systemctl status redis #已经可以成功使用systemctl
○ redis.service - Redis Server ManagerLoaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)Active: inactive (dead)
测试redis
[root@server ~]# systemctl start redis
[root@server ~]# systemctl status redis
● redis.service - Redis Server ManagerLoaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)Active: active (running) since Thu 2024-05-16 12:59:56 CST; 9s agoProcess: 38341 ExecStart=/usr/local/bin/redis-server /etc/redis.conf (code=exited, status=0/SU>Main PID: 38342 (redis-server)Tasks: 5 (limit: 11985)Memory: 6.7MCPU: 36msCGroup: /system.slice/redis.service└─38342 "/usr/local/bin/redis-server 127.0.0.1:6379"5月 16 12:59:56 server systemd[1]: Starting Redis Server Manager...
5月 16 12:59:56 server redis-server[38341]: 38341:C 16 May 2024 12:59:56.817 # WARNING Memory over>
5月 16 12:59:56 server systemd[1]: Started Redis Server Manager.
[root@server ~]# redis-cli #客户端连接服务端,默认使用6379端口
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
[root@server ~]#
[root@server ~]# redis-cli -p 6379 #连接时指定端口
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> exit
- 使用
systemctl
关闭redis
服务
[root@server ~]# systemctl stop redis
[root@server ~]# systemctl status redis
○ redis.service - Redis Server ManagerLoaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)Active: inactive (dead)5月 16 12:59:56 server systemd[1]: Starting Redis Server Manager...
5月 16 12:59:56 server redis-server[38341]: 38341:C 16 May 2024 12:59:56.817 # WARNING Memory over>
5月 16 12:59:56 server systemd[1]: Started Redis Server Manager.
5月 16 13:04:05 server systemd[1]: Stopping Redis Server Manager...
5月 16 13:04:05 server systemd[1]: redis.service: Deactivated successfully.
5月 16 13:04:05 server systemd[1]: Stopped Redis Server Manager.
[root@server ~]# ps -ef | grep redis
root 38373 38135 0 13:04 pts/0 00:00:00 grep --color=auto redis
相关知识
redis
默认的端口号是6379
,默认
有16
个数据库,类似数组下标从0
开始,初始默认使用0号数据库。
- 可以使用
select <dbid>
命令来切换数据库
。例如切换到2号数据库
是select 2
。 - 在
redis
中,可以使用dbsize
命令来查看当前数据库的key
的数量,也可以使用flushdb
命令来清空
当前数据库
中所有数据
,还可以使用flushall
命令来删除所有数据库中的数据。
Redis
是单线程+多路IO复用
技术。多路复用
是指使用一个线程来检查多个文件描述符(Socket)的就绪状态
,比如调用select和poll函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程
里执行,也可以启动线程执行(比如使用线程池)。