正文
Redis7.0.7的简单安装与学习
摘要
2022.12.18
世界杯决赛
另外是我感染奥密克戎第五天.
高烧已经没了,但是嗓子巨疼.
睡不着觉,肝胆学习一下最新的Redis7.0.7
第一部分安装
现在最新的stable 的安装包地址为:
http://download.redis.io/redis-stable.tar.gz
然后分别在
Golden 6170 2.7G 四路全闪SSD服务器
飞腾2000+ 64核心 128G内存的浪潮NF2180M3-F服务器
飞腾服务器上面KVM的虚拟机: 8c 32G
想着先验证一下安装时间:
不同CPU编译时间统计
CPU型号 |
SYS时间 |
USER时间 |
合计时间 |
比率 |
Golded 6150 |
9.975s |
56.074s |
63.758s |
100% |
P FT2000+ |
8.282s |
210.842s |
214.923s |
337% |
V FT2000+ |
11.373s |
222.088s |
230.940s |
360% |
安装时间简要分析
Intel的第一代至强高频处理器的性能比上一代飞腾的2000+
有至少三倍的性能优势.
我认为redis的源码包也就 2-3M大小,
与内存读写速度和磁盘读写速度的关联关系不是非常巨大
可以简单看做是针对CPU的性能测试.
第二部分 参数学习
- 看一下所有的未经过注释的默认参数
- grep -v "^#" redis.conf |grep -v "^$"
bind 127.0.0.1 -::1
protected-mode no
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile ""
databases 16
always-show-logo no
set-proc-title yes
proc-title-template "{title} {listen-addr} {server-mode}"
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync yes
repl-diskless-sync-delay 5
repl-diskless-sync-max-replicas 0
repl-diskless-load disabled
repl-disable-tcp-nodelay no
replica-priority 100
acllog-max-len 128
lazyfree-lazy-eviction no
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
replica-lazy-flush no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
oom-score-adj no
oom-score-adj-values 0 200 800
disable-thp yes
appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
aof-load-truncated yes
aof-use-rdb-preamble yes
aof-timestamp-enabled no
slowlog-log-slower-than 10000
slowlog-max-len 128
latency-monitor-threshold 0
notify-keyspace-events ""
hash-max-listpack-entries 512
hash-max-listpack-value 64
list-max-listpack-size -2
list-compress-depth 0
set-max-intset-entries 512
zset-max-listpack-entries 128
zset-max-listpack-value 64
hll-sparse-max-bytes 3000
stream-node-max-bytes 4096
stream-node-max-entries 100
activerehashing yes
client-output-buffer-limit normal 0 0 0
client-output-buffer-limit replica 256mb 64mb 60
client-output-buffer-limit pubsub 32mb 8mb 60
hz 10
dynamic-hz yes
aof-rewrite-incremental-fsync yes
rdb-save-incremental-fsync yes
jemalloc-bg-thread yes
ignore-warnings ARM64-COW-BUG
简单学习一下重要的参数
1. bind
指定Redis是否允许外部访问. 如果是本机(IPV4)
可以bingd 127.0.0.1, 如果是外部, 需要bind 0.0.0.0
2. protected-mode
生产环境需要关闭, 设置为 no
保护模式好像性能不是特别好.
3. port
不解释,指定端口.
4. tcp-backlog
TCP的半连接队列和全连接长度.
半连接队列的大小与用户 listen 传入的 backlog、net.core.somaxconn
net.core.somaxconn 都有关系,准确的计算规则见上面的源码分析
在系统参数不修改的情形,盲目调大 listen 的 backlog 对最终半连接队列的大小不会有影响。
在 listen 的 backlog 不变的情况下,盲目调大 somaxconn 和 max_syn_backlog 对最终半连接队列的大小不会有影响
全连接队列的大小是用户 listen 传入的 backlog 与 net.core.somaxconn 的较小值
From:https://blog.csdn.net/mingtiannihaoabc/article/details/122276910
5. timeout
连接客户端的默认超时时间. 默认值是0 就是不超时
如果很多客户端经常无效的话,可以设置一定的时间,避免过多的连接
6. tcp-keepalive
在linux系统中,客户端发送的最后一个数据包与
redis发送的第一个保活探测报文之间的时间间隔。单位是秒。
7. daemonize no
如果是容器内, 需要设置为no
如果作为后台服务,可以设置为yes
8. pidfile /var/run/redis_6379.pid
不同端口的建议进行修改.
9. loglevel notice logfile ""
两个参数协同生效. 如果没设置logfile 应该会写入到/dev/null中.
如果需要调试,可以开启这个参数,但是认为对性能的损耗会很大.
10.database
数据库的数量. 可以从0 到 15 实现隔离.
11.always-show-logo no
不解释
12.rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
rdb-del-sync-files no
dir ./
save 300 10000
五分钟内有10000个键值对变化就进行一次dump文件保存
并且进行压缩和检查.文件名字是 dump.rdb
文件目录是当前目录.
13.复制的参数本次不学习了
14.lazy相关的命令
lazyfree-lazy-expire no
lazyfree-lazy-server-del no
lazyfree-lazy-user-del no
lazyfree-lazy-user-flush no
redis 删除数据是分为两个步骤的:
从字典表中删除数据 和 释放数据占用内存。
lazy free 不是默认开启的,此外,对于不同场景存在对应的配置项,
我们需要分别开启对应的配置项才能在对应的场景下开启惰性删除,
惰性删除可以将内存释放动作放到后台线程中执行,不会阻塞主线程。
15.oom-score-adj
之前总结过 设置分支可以避免内存紧张是被OOM掉.
16. disable-thp yes
关闭透明大页
17. appendonly no
appendfilename "appendonly.aof"
appenddirname "appendonlydir"
appendfsync everysec
除去rdb之外第二种持久化方式
需要四个个命令协同生效.
18. slowlog-log-slower-than 10000
slowlog-max-len 128
可以查看命令超过10000微秒的slowlog
slowlog的最大长度是 128
19. hz 10 dynamic-hz yes
如果是进行lazy删除时, 每秒钟扫描数据库的频率.
20. jemalloc-bg-thread yes
是否再background的线程里面使用jemalloc
21. ignore-warnings ARM64-COW-BUG
飞腾和鲲鹏服务器需要取消注释
如果Redis启动会报错.
第三部分 Redis的内存设置信息
From https://www.cnblogs.com/zgxblog/p/14198543.html
作为内存数据库,为了防止redis占用过多的内存对其他的应用程序造成影响,
可以在redis.conf文件中通过设置maxmemory选项对redis所能够使用的最大内存做限制,
并通过maxmemory_policy内存淘汰策略对redis占用内存超过maxmemory之后的行为做限制。
设置方法:
config get maxmemory
config set maxmemory 100MB
另外一种方法修改配置文件:
maxmemory 100MB
Redis内存中key的策略
当 Redis 内存使用达到 maxmemory 时,
需要选择设置好的 maxmemory-policy 进行对数据进行淘汰机制。
1.volatile-lru(least recently used):
最近最少使用算法,从设置了过期时间的键key中选择空转时间最长的键值对清除掉;
2.volatile-lfu(least frequently used):
最近最不经常使用算法,从设置了过期时间的键中选择某段时间之内使用频次最小的键值对清除掉;
3.volatile-ttl:
从设置了过期时间的键中选择过期时间最早的键值对清除;
4.volatile-random:
从设置了过期时间的键中,随机选择键进行清除;
5.allkeys-lru:
最近最少使用算法,从所有的键中选择空转时间最长的键值对清除;
6.allkeys-lfu:
最近最不经常使用算法,从所有的键中选择某段时间之内使用频次最少的键值对清除;
7.allkeys-random:
所有的键中,随机选择键进行删除;
8.noeviction:
不做任何的清理工作,在redis的内存超过限制之后,所有的写入操作都会返回错误;
但是读操作都能正常的进行; 注意这个是Redis的默认值.
前缀为volatile-和allkeys-的区别在于二者选择要清除的键时的字典不同,
volatile-前缀的策略代表从redisDb中的expire字典中选择键进行清除;
allkeys-开头的策略代表从dict字典中选择键进行清除。
第四部分 关于BigKeys不一定正确的理解
Redis的key的value一定不要太大.
如果客户端要从服务器端获取Redis的相关键值对信息
使用Get操作时, 从内存里面发送到网卡需要耗费大量昂贵的内存操作.
并且也会占用很多网络带宽的资源
100MB的key 会占用服务器1秒以上的网络栈时间(预计为2.5秒)
会引起其他访问者的大量时间延迟.
所以情况下一定要控制redis 的键值对的大小. 不然会导致严重的问题.
最近发现Redis的监控的机器的内存流量特别高.
公司内部又使用了缓存和锁和session的分布式处理
这一块会导致巨量的网络延迟和损耗
还是需要进行细致处理的.