Linux下redis源码编译安装

Redis介绍

什么是Redis

  • 2008年,意大利的一家创业公司Merzia推出了一款基于MySQL的网站实时统计系统LLOOGG,然而没过多久该公司的创始人 Salvatore Sanfilippo便开始对MySQL性能感到失望,于是他决定亲自为LLOOGG量身定做一个数据库,并于2009年开发完成,这个数据库就是Redis。不过Salvatore Sanfilippo并不满足只将Redis用于LLOOGG这一款产品,而是希望更多的人使用它,于是在同一年Salvatore SanfilippoRedis开源发布,并开始和Redis的另一名主要的代码贡献者Pieter Noordhuis一起继续着Redis开发,直到今天。
  • Salvatore Sanfilippo自己也没有想到,短短的几年时间,Redis就拥有了庞大的用户群体。Hacker News在2012年发布了一份数据库的使用情况调查,结果显示有近12%的公司在使用Redis。国内如新浪微博街旁网知乎,国外如GitHubStack OverflowFlickr暴雪Instagram,都是Redis用户
  • VMware公司从2010年开始赞助Redis开发Salvatore SanfilippoPieter 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 支持二进制案例的 StringListHashSetZSet 数据类型操作。
  • 原子性Redis所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,是非原子性,通过 MULTIEXEC 指令包起来。
  • 数据持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用
  • 其他特性Redis 还支持 publish/subscribe 通知,key过期等特性。

Redis 提供的API支持:C、C++、C#、Clojure、Java、JavaScript、Lua、PHP、Python、Ruby、Go、Scala、Perl等多种语言。

Redismemcached对比

  • 共同点
    • 无论是Memcached还是Redis底层都是使用C语言编写,都是基于key-value,存储的数据都是在内存中。
  • 不同点
    • Memcached支持的数据类型比较简单(String,Object);Redis支持的数据类型比较丰富
    • Memcached默认一个值的最大存储不能超过1MRedis一个值的最大存储1G
    • Memcached中存储的数据不能持久化,一旦断电数据丢失;Redis中存储的数据可以持久化。
    • Memcached多线程,支持并发访问Redis单线程不支持并发访问
    • Memcached自身不支持集群环境Redis3.0版本之后自身开始提供集群环境支持

redis源码编译安装

下载源码包

  • GitHub上,搜索redis,找到相应的仓库,下载对应的redis版本

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 下载tar.gz的包,使用mobaxterm将这个包上传到Linuxroot家目录
[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 Manager
     Loaded: 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 Manager
     Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
     Active: active (running) since Thu 2024-05-16 12:59:56 CST; 9s ago
    Process: 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.7M
        CPU: 36ms
     CGroup: /system.slice/redis.service
             └─38342 "/usr/local/bin/redis-server 127.0.0.1:6379"

516 12:59:56 server systemd[1]: Starting Redis Server Manager...
516 12:59:56 server redis-server[38341]: 38341:C 16 May 2024 12:59:56.817 # WARNING Memory over>
516 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 Manager
     Loaded: loaded (/usr/lib/systemd/system/redis.service; disabled; vendor preset: disabled)
     Active: inactive (dead)

516 12:59:56 server systemd[1]: Starting Redis Server Manager...
516 12:59:56 server redis-server[38341]: 38341:C 16 May 2024 12:59:56.817 # WARNING Memory over>
516 12:59:56 server systemd[1]: Started Redis Server Manager.
516 13:04:05 server systemd[1]: Stopping Redis Server Manager...
516 13:04:05 server systemd[1]: redis.service: Deactivated successfully.
516 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函数,传入多个文件描述符,如果有一个文件描述符就绪,则返回,否则阻塞直到超时。得到就绪状态后进行真正的操作可以在同一个线程里执行,也可以启动线程执行(比如使用线程池)。
  • 10
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

^~^前行者~~~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值