安装
CentOS
|
|
Ubuntu
|
|
源码安装
需要注意要安装 redis 5.0 以上的版本。 源码下载地址 [https://redis.io/download]。
在 centos 7 上直接执行 make 会出现以下问题
In file included from adlist.c:34:
zmalloc.h:50:10: fatal error: jemalloc/jemalloc.h: No such file or directory
50 | #include <jemalloc/jemalloc.h>
| ^~~~~~~~~~~~~~~~~~~~~
compilation terminated.
解决办法
make MALLOC=libc
然后出现问题:
linux redis release.c:37:10: fatal error: release.h: No such file or directory
解决办法
cd src
chmod +x mkreleasehdr.sh
cd src && make all
make[1]: Entering directory `/home/reas/Downloads/redis-6.2.6/src'
CC Makefile.dep
make[1]: Leaving directory `/home/reas/Downloads/redis-6.2.6/src'
make[1]: Entering directory `/home/reas/Downloads/redis-6.2.6/src'
CC release.o
CC networking.o
CC util.o
CC object.o
CC db.o
CC replication.o
CC rdb.o
CC t_string.o
CC t_list.o
CC t_set.o
CC t_zset.o
CC t_hash.o
CC config.o
CC aof.o
CC pubsub.o
CC multi.o
CC debug.o
debug.c: In function ‘debugCommand’:
debug.c:474:22: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
474 | *((char*)-1) = 'x';
| ~~~~~~~~~~~~~^~~~~
CC sort.o
CC intset.o
CC syncio.o
CC cluster.o
CC crc16.o
CC endianconv.o
CC slowlog.o
CC scripting.o
CC bio.o
CC rio.o
CC rand.o
CC memtest.o
CC crcspeed.o
CC crc64.o
CC bitops.o
CC sentinel.o
CC notify.o
CC setproctitle.o
CC blocked.o
CC hyperloglog.o
CC latency.o
CC sparkline.o
CC redis-check-rdb.o
CC redis-check-aof.o
CC geo.o
CC lazyfree.o
CC module.o
CC evict.o
CC expire.o
CC geohash.o
CC geohash_helper.o
CC childinfo.o
CC defrag.o
CC siphash.o
CC rax.o
CC t_stream.o
CC listpack.o
CC localtime.o
CC lolwut.o
CC lolwut5.o
CC lolwut6.o
CC acl.o
CC gopher.o
CC tracking.o
CC connection.o
CC tls.o
CC sha256.o
CC timeout.o
CC setcpuaffinity.o
CC monotonic.o
CC mt19937-64.o
LINK redis-server
INSTALL redis-sentinel
CC redis-cli.o
redis-cli.c: In function ‘_serverAssert’:
redis-cli.c:485:18: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
485 | *((char*)-1) = 'x';
| ~~~~~~~~~~~~~^~~~~
CC cli_common.o
LINK redis-cli
CC redis-benchmark.o
redis-benchmark.c: In function ‘_serverAssert’:
redis-benchmark.c:269:18: warning: writing 1 byte into a region of size 0 [-Wstringop-overflow=]
269 | *((char*)-1) = 'x';
| ~~~~~~~~~~~~~^~~~~
LINK redis-benchmark
INSTALL redis-check-rdb
INSTALL redis-check-aof
Hint: It's a good idea to run 'make test' ;)
make[1]: Leaving directory `/home/reas/Downloads/redis-6.2.6/src'
上述输出则通过。
可进入 src 文件夹执行 。/redis-server 进行测试
(base) [root@reas src]# ./redis-server
65252:C 28 Dec 2021 10:23:02.533 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
65252:C 28 Dec 2021 10:23:02.533 # Redis version=6.2.6, bits=64, commit=00000000, modified=0, pid=65252, just started
65252:C 28 Dec 2021 10:23:02.533 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
65252:M 28 Dec 2021 10:23:02.534 * Increased maximum number of open files to 10032 (it was originally set to 1024).
65252:M 28 Dec 2021 10:23:02.534 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.6 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 65252
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
65252:M 28 Dec 2021 10:23:02.535 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
65252:M 28 Dec 2021 10:23:02.535 # Server initialized
65252:M 28 Dec 2021 10:23:02.535 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. 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.
65252:M 28 Dec 2021 10:23:02.535 * Ready to accept connections
测试
|
|
配置
可以通过修改 /etc/redis/redis.conf 文件或使用 CONFIG set 命令来修改配置
CONFIG SET 命令基本语法:
|
|
redis-cluster
需要注意要安装 redis 5.0 以上的版本, 可能需要采用源码安装的方式。
cluster 的构建:
因为redis集群最少需要三主三从,所以我们启动6个实例,
- 新建 /usr/local/redis-cluster 目录并进入
|
|
- 建立如下的目录结构与配置文件
|
|
文件 redis-6301.conf 修改后的文件内容如下,接下来5个配置文件分别按照6302, 6303, 6304, 6305, 6306来配置:
pidfile /var/run/redis/redis-6301-server.pid
port 6301
logfile /usr/local/redis-cluster/log/redis-6301-server.log
dir /usr/local/redis-cluster/data/redis-6301
dbfilename dump-6301.rdb
requirepass foobared
cluster-enabled yes
cluster-config-file nodes-6301.conf
cluster-node-timeout 15000
- 进入 /usr/local/redis-cluster 启动实例
|
|
此时执行 tree 命令应该得到以下目录结构
.
├── conf
│ ├── redis-6301.conf
│ ├── redis-6302.conf
│ ├── redis-6303.conf
│ ├── redis-6304.conf
│ ├── redis-6305.conf
│ └── redis-6306.conf
├── data
│ ├── redis-6301
│ │ └── nodes-6301.conf
│ ├── redis-6302
│ │ └── nodes-6302.conf
│ ├── redis-6303
│ │ └── nodes-6303.conf
│ ├── redis-6304
│ │ └── nodes-6304.conf
│ ├── redis-6305
│ │ └── nodes-6305.conf
│ └── redis-6306
│ └── nodes-6306.conf
└── log
├── redis-6301-server.log
├── redis-6302-server.log
├── redis-6303-server.log
├── redis-6304-server.log
├── redis-6305-server.log
└── redis-6306-server.log
9 directories, 18 files
- 现在每个实例是单独的,需要把它们连接到一起
|
|
若此步骤出现没有参数 -cluter
的错误,注意安装的 redis 版本问题 (需要 > 5)
|
|
redis 集群有三种模式
- 主从复制模式:
数据库分为两类,一类是主数据库(master),另一类是从数据库(slave)。主数据库可以进行读写操作,当写操作导致数据变化时会自动将数据同步给从数据库。而从数据库一般是只读的,并接受主数据库同步过来的数据。一个主数据库可以拥有多个从数据库,而一个从数据库只能拥有一个主数据库。 2. Sentinel(哨兵)模式:
第一种主从同步/复制的模式,当主服务器宕机后,需要手动把一台从服务器切换为主服务器,这就需要人工干预,费事费力,还会造成一段时间内服务不可用。这不是一种推荐的方式,更多时候,我们优先考虑哨兵模式。
哨兵模式通过发送命令,让 Redis 服务器返回监控其运行状态,包括主服务器和从服务器; 当哨兵监测到 master 宕机,会自动将 slave 切换成 master ,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机; 然而一个哨兵进程对Redis服务器进行监控,也可能会出现问题,为此,我们可以使用多个哨兵进行监控。各个哨兵之间还会进行监控,这样就形成了多哨兵模式。
优点:哨兵模式是基于主从模式的,所有主从的优点,哨兵模式都具有。 主从可以自动切换,系统更健壮,可用性更高(可以看作自动版的主从复制)。 缺点:Redis较难支持在线扩容,在集群容量达到上限时在线扩容会变得很复杂。
- Cluster 集群模式: 在 redis3.0上加入了 Cluster 集群模式,实现了 Redis 的分布式存储,也就是说每台 Redis 节点上存储不同的内容。
Redis 集群有16384 个哈希槽,每个 key 通过 CRC16 校验后对 16384 取模来决定放置哪个槽。集群的每个节点负责一部分hash槽,举个例子,比如当前集群有3个节点,那么:
节点 A 包含 0 到 5460 号哈希槽 节点 B 包含 5461 到 10922 号哈希槽 节点 C 包含 10923 到 16383 号哈希槽
在 Redis 的每一个节点上,都有这么两个东西,一个是插槽(slot),它的的取值范围是:0-16383。还有一个就是 cluster,可以理解为是一个集群管理的插件。当我们的存取的 Key到达的时候,Redis 会根据 CRC16 的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的节点,然后直接自动跳转到这个对应的节点上进行存取操作。
python
Connect to Redis
|
|
Once connected to Redis, you can read and write data with Redis command functions.
The following code snippet assigns the value bar to the Redis key foo, reads it back, and prints it:
|
|
The redis-py client natively supports SSL.
Use the SSLConnection class or instantiate your connection pool using a rediss:// URL and the from_url method, like so:
|
|
redis + cloudpickle
server
|
|
client
|
|
c++
使用C/C++调用进行redis 的连接,最常见的是 hiredis,但是它本身不提供集群的便利访问,像 MGET,MSET 这种操作不太支持。我们可以使用 hiredis-vip
, 或者官方推荐使用的 hiredis-cluster
, redis-plus-plus
hiredis
安装
$ git clone git@github.com:redis/hiredis.git
$ cd hiredis
$ make
$ make install
make install 的输出如下:
mkdir -p /usr/local/include/hiredis /usr/local/include/hiredis/adapters /usr/local/lib
cp -pPR hiredis.h async.h read.h sds.h /usr/local/include/hiredis
cp -pPR adapters/*.h /usr/local/include/hiredis/adapters
cp -pPR libhiredis.so /usr/local/lib/libhiredis.so.0.13
cd /usr/local/lib && ln -sf libhiredis.so.0.13 libhiredis.so
cp -pPR libhiredis.a /usr/local/lib
mkdir -p /usr/local/lib/pkgconfig
cp -pPR hiredis.pc /usr/local/lib/pkgconfig
复制动态链接库到lib:
|
|
连接
client_connect.cc
|
|
这里要注意,对于序列化的结构数据,string中保存的是二进制数据,c_str()方法返回的c字符串被二进制0值截断,会造成数据不完整,而hiredis提供%b作为格式化二进制的方法,需要提供起始地址和长度:
reply = (redisReply *)redisCommand(redisContext, "SET %s %b", key.c_str(), value.data(), value.length());//写长byte流
编译
g++ client_connect.cc -o client -lhiredis
在使用上发现如果连接的是 6301, 则会输出 MOVED 12182 127.0.0.1:6303
。
redis-plus-plus
官方的默认安装路径:
- 头文件在
/usr/local/include/sw/redis++
- 链接库文件在
/usr/local/lib/libredis++.a
/usr/local/lib/libredis++.so
g++ -std=c++17 rediscc.cpp -o main /usr/local/lib/libredis++.a /usr/local/lib/libhiredis.a -pthread
使用
连接
|
|
Send Command to Redis Server
|
|
issue
kill redis-server
/etc/init.d/redis-server stop
useful command
- get all keys
redis-cli --scan --pattern '*'
or
redis-cli KEYS '*'
- delete everything in redis
redis-cli flushall # Deletes all keys from all databases.
redis-cli flushdb # Deletes all keys from the connection's current database.