redis

redis源码安装过程

安装环境:win101909 wsl2 ubuntu20.04

ubuntu发行版软件仓库提供的redis安装版本是稳定版,且一般落后于最新版的redis,所以不从软件仓库安装,而是下载源码编译安装

从发行版仓库安装命令

1
2
$sudo apt-get update
$sudo apt-get install redis-server

运行redis

1
2
redis-server #服务端
redis-client #客户端

clone工程

使用了github的镜像加速方式获取的地址

1
git clone https://github.com.cnpmjs.org/redis/redis.git

image-20210308172600746

切换分支

clone下来的当前分支为unstable分支,切换到最新的稳定分支,也就是latest release所在分支

92bde12是commit的sha1值缩写

1
git checkout 92bde12

image-20210308173200693

make

执行make命令会编译生成redis的二进制可执行文件

BUILD_TLS=yess是为了支持TLS,这需要系统预先安装过OpenSSL

1
make BUILD_TLS=yes

如果没有OpenSSL,运行下面命令安装

1
sudo apt-get install openssl

image-20210308173524486

安装过程还有许多可以自定义的参数,参见工程根目录下的README.md

make install

把redis的二进制文件安装到 /usr/local/bin,如果到其他目录,运行

1
make PREFIX=/some/other/directory install

没有这一步要运行redis,需要在命令行输入redis-server执行文件的绝对路径

安装过程错误解决

如下错误是缺少了OpenSSL的开发包,安装就行了

错误

image-20210308174313906

安装libssl-dev

1
sudo apt-get install  libssl-dev

image-20210308174621245

重新运行make BUILD_TLS=yes还是报安装错误

image-20210308174759393

解决办法是运行清理

注意 应该用**make distclean && make BUILD_TLS=yes**,make distclean是清理残存文件,make是编译

1
make distclean  && make

image-20210308175034009

清理完成后在执行make BUILD_TLS=yes

image-20210308175201924

运行测试

1
make test

下面是缺少tcl库,因为redis test的脚本是tcl文件

image-20210308175615525

安装tcl

1
sudo apt-get install tcl

然后再执行make test,可能出现下面的错误

image-20210308175928340

搜索错误

1
pending querybuf: check size of pending_querybuf after set a big value in tests/unit/pendingquerybuf.tcl

这个错误可以通过反复运行make test解决,参见issue5463 ,测试全部pass,也就安装完成了。

image-20210308172354716

运行redis server

cd到src目录下,运行 ./redis-server

从截图可以看到如下信息,pid是redis-server这个程序的进程id,默认运行在6379端口。

由于./redis-server这条命令没有设置为后台运行,所以不能关闭当前的shell会话,否则会终止redis server

1
Redis version=6.2.1, bits=64, commit=92bde124, modified=0, pid=28642, just started

image-20210308180345322

运行redis client

cd到src目录,执行redis-cli,如图显示server运行在本机的6379端口

image-20210308181025940

通过这个命令行的client可以访问数据库,如

set key-value, get key-value

gdb调试正在运行的redis server

前面的sever pid为28642,

1
gdb attach pid

image-20210308181529197

gdb下输入命令查看进程的线程

1
info threads

image-20210308181651309

通过redis-cli下输入命令下传递消息给server,来调试server

hiredis安装

redis提供了多种语言的client和API,hiredis是c语言的API和client

1
git clone https://github.com.cnpmjs.org/redis/hiredis.git

如下为安装过程截图

image-20210308182020870

wsl在vscode里使用hiredis API

1
2
3
4
5
6
7
8
9
10
11
12
#include "hiredis/hiredis.h"
#include <dirent.h>
int main()
{
redisContext *context = redisConnect("127.0.0.1", 6379);

redisCommand(context, "SET number 1000");

redisFree(context);

return 0;
}

调用hiredis API写一段代码,并命名为con.cpp,运行 g++ con.cpp -lhiredis 编译,-lhiredis表示链接

hiredis的库文件

编译成功后出现执行出现如下错误

1
error while loading shared libraries: libhiredis.so.1.0.1-dev: cannot open shared object file: No such file or directory

image-20210308182534069

这是由于hiredis动态库libhiredis.so.1.0.1-dev 的默认安装路径为/usr/local/lib目录,系统找不到,在/etc/ld.so.conf文件里添加/usr/local/lib就行,执行sudo /sbin/ldconfig更新配置

编写代码向数据库写入键值对后,可以回到redis-cli下或者key-value

image-20210308181025940

ps:objdump -tT xxx.so可以查看库文件导出的函数接口

redis-cli常用命令

keys * 获取所有的键

redis默认数据为

redis地址

redis日志

我的redis安装目录为/home/hcf/redis,cd到这个目录下 cat redis.conf |grep logfile

logfile后面的path就是log路径,如果为空,redis的日志会写到标准输出

loglevel用来设置日志的等级

redis的配置文件为installdir/redis.conf

reference

linux下hiredis安装、C接口编程