Redis는 지속성을 최적화하기 위해 기본 명령 서비스를 컴파일 및 설치합니다.

Redis 기본 사항

원격 사전 서비스 인 Redis (Remote Dictionary Server)는 ANSI C 언어로 작성된 오픈 소스 로그 기반 키-값 데이터베이스로, 네트워크, 메모리 기반 또는 영구를 지원하고 여러 언어로 API를 제공합니다. 2010 년 3 월 15 일부터 Redis 개발은 VMware에서 호스팅됩니다. 2013 년 5 월부터 Redis 개발은 Pivotal의 후원을 받았습니다.
여기에 사진 설명 삽입
그것은이다 비 관계형 데이터베이스 . 그것은이다 메모리 / 캐시 데이터베이스. 데이터는 저장됩니다 메모리 ,하지만 데이터가 하드 디스크에 기록 할 정기적으로 .
redis
지원 메모리 캐시의 장점 , 고속 데이터 읽기 및 쓰기
지원 지속성 저장,
클러스터 된 개체 , 분산
데이터 유형을 저장할 수 있습니다.
데이터 백업
은 원자
지원 대기열입니다.

Redis 컴파일 및 설치 (어서! 보여주세요 !!)

[root@localhost bao]# yum -y install gcc gcc-c++ make
[root@localhost bao]# rz -E
rz waiting to receive.
[root@localhost bao]# ls
redis-5.0.7.tar.gz
[root@localhost bao]# tar zxvf redis-5.0.7.tar.gz 
…省略解压过程…
[root@localhost bao]# cd redis-5.0.7/
[root@localhost redis-5.0.7]# ls
00-RELEASENOTES  deps       README.md        runtest-moduleapi  tests
BUGS             INSTALL    redis.conf       runtest-sentinel   utils
CONTRIBUTING     Makefile   runtest          sentinel.conf
COPYING          MANIFESTO  runtest-cluster  src
[root@localhost redis-5.0.7]# make   ##没有con啥的脚本文件,那就直接make吧
[root@localhost redis-5.0.7]# make install PREFIX=/usr/local/redis  ##指定安装目录
[root@localhost redis-5.0.7]# cd /usr/local/redis/
[root@localhost redis]# ls
bin
[root@localhost redis]# cd bin/
[root@localhost bin]# ls   ##看看这六个文件齐不齐
redis-benchmark  redis-check-rdb  redis-sentinel
redis-check-aof  redis-cli        redis-server
[root@localhost bin]# cd /bao/redis-5.0.7/utils/
[root@localhost utils]# ls
build-static-symbols.tcl  hashtable          redis_init_script.tpl
cluster_fail_time.tcl     hyperloglog        redis-sha1.rb
corrupt_rdb.c             install_server.sh  releasetools
create-cluster            lru                speed-regression.tcl
generate-command-help.rb  redis-copy.rb      whatisdoing.sh
graphs                    redis_init_script

[root@localhost utils]# ./install_server.sh  ##若没有要求可以一直回车,直到设置可执行文件的八个路径需要手动设置
Welcome to the redis service installer
This script will help you easily set up a running redis server

Please select the redis port for this instance: [6379] 
Selecting default: 6379
Please select the redis config file name [/etc/redis/6379.conf] 
Selected default - /etc/redis/6379.conf
Please select the redis log file name [/var/log/redis_6379.log] 
Selected default - /var/log/redis_6379.log
Please select the data directory for this instance [/var/lib/redis/6379] 
Selected default - /var/lib/redis/6379
Please select the redis executable path [] /usr/local/redis/bin/redis-server  ##手敲,bin可执行文件
Selected config:
Port           : 6379	##端口
Config file    : /etc/redis/6379.conf	##主配置文件
Log file       : /var/log/redis_6379.log	##日志文件
Data dir       : /var/lib/redis/6379	##默认接口的数据文件
Executable     : /usr/local/redis/bin/redis-server	##可执行脚本文件
Cli Executable : /usr/local/redis/bin/redis-cli	##连接终端命令脚本文件
Is this ok? Then press ENTER to go on or Ctrl-C to abort.  ##ok就回车
Copied /tmp/6379.conf => /etc/init.d/redis_6379
Installing service...
Successfully added to chkconfig!
Successfully added to runlevels 345!
Starting Redis server...
Installation successful!   ##安装 成功!

[root@localhost utils]# cd /etc/init.d/   ##在init.d下可以看到redis的脚本,证明可以被service控制
[root@localhost init.d]# ls |grep redis
redis_6379
[root@localhost init.d]# service redis_6379 stop
/var/run/redis_6379.pid does not exist, process is not running
[root@localhost init.d]# service redis_6379 start
Starting Redis server...
[root@localhost init.d]# netstat -ntuap |grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      77279/redis-server 

데이터베이스를 성공적으로 입력 할 수 있는지 확인하기 위해 수신 포트를 설정합니다.

[root@localhost init.d]# vim /etc/redis/6379.conf
# Examples:   ##这个下面的两个注释掉的bind是redis给的模板,不用修改
#
# bind 192.168.1.100 10.0.0.1
# bind 127.0.0.1 ::1

70 bind 127.0.0.1 20.0.0.6	##要改的在第70行
[root@localhost init.d]# service redis_6379 restart
Stopping ...
Waiting for Redis to shutdown ...
Redis stopped
Starting Redis server...
[root@localhost init.d]# ln -s /usr/local/redis/bin/* /usr/local/bin
[root@localhost init.d]# redis-cli -h 20.0.0.6 -p 6379
20.0.0.6:6379> 		##可以正常进入数据库了

기본 명령! !

[root@localhost init.d]# redis-cli -h 20.0.0.6 -p 6379
20.0.0.6:6379> help set		##查看命令帮助

  SET key value [expiration EX seconds|PX milliseconds] [NX|XX]
  summary: Set the string value of a key
  since: 1.0.0
  group: string
20.0.0.6:6379> set gunpla 00Q	##创建 key键 值
OK
20.0.0.6:6379> set gundam EXIA
OK
20.0.0.6:6379> keys *		##查看所有 键
1) "gunpla"
2) "gundam"
20.0.0.6:6379> RENAME gunpla gaoda		##重命名 gunpla 为 gaoda
OK
20.0.0.6:6379> del gundam		##删除 gundam 键
(integer) 1
20.0.0.6:6379> keys *
1) "gaoda"

도서관 운영

20.0.0.6:6379> SELECT 10		##切换到 第 10 库
OK
20.0.0.6:6379[10]> keys *
(empty list or set)
20.0.0.6:6379[10]> set GUNDAM00 00RAISE
OK
20.0.0.6:6379[10]> MOVE GUNDAM00 9		##移动 键 到 第9库
(integer) 1		##操作状态码 成功返回 非0,不成功返回 0
20.0.0.6:6379[11]> SELECT 9
OK
20.0.0.6:6379[9]> KEYS *
1) "GUNDAM00"
20.0.0.6:6379[9]> GET GUNDAM00		##查看 键值
"00RAISE"
20.0.0.6:6379[9]> FLUSHALL		##清空库方法 ①
OK
20.0.0.6:6379[9]> keys *
(empty list or set)
20.0.0.6:6379[9]> SELECT 0
OK
20.0.0.6:6379> set caicai 180
OK
20.0.0.6:6379> keys *
1) "caicai"
20.0.0.6:6379> FLUSHDB		##清空库方法 ②
OK
20.0.0.6:6379> KEYS *
(empty list or set)

스트레스 테스트
redis-benchmark 테스트 도구
-h를 사용하여 호스트 IP
지정 -p 포트 지정
-c 동시 연결
수 지정 -n 요청
수 지정 -d SET / GET 값을 바이트 데이터 크기로 지정
-q redis를 강제 종료하고 표시 만 초당 쿼리 값

[root@localhost init.d]# redis-benchmark -h 20.0.0.6 -p 6379 -c 100 -n 10000	##并发量 100,请求量 10000
……省略部分
====== SET ======		##写入速度
  10000 requests completed in 0.12 seconds		##耗时
  100 parallel clients
  3 bytes payload
  keep alive: 1

97.86% <= 1 milliseconds
99.24% <= 2 milliseconds
99.79% <= 3 milliseconds
100.00% <= 3 milliseconds
86956.52 requests per second

====== GET ======		##读取速度
  10000 requests completed in 0.11 seconds		##耗时
  100 parallel clients
  3 bytes payload
  keep alive: 1

99.92% <= 1 milliseconds
100.00% <= 1 milliseconds
87719.30 requests per second
省略部分……

[root@localhost init.d]# redis-benchmark -h 20.0.0.6 -p 6379 -q -d 100
##-q 强制退出redis,-d 指定字节数量
…省略部分
SET: 85616.44 requests per second
GET: 86655.11 requests per second
省略部分…

해시 구조

20.0.0.6:6379> hset yaoshi Asuo yihao
(integer) 1
20.0.0.6:6379> hset demaxiya gaolun 190
(integer) 1
20.0.0.6:6379> hset demaxiya kuiyin 160
(integer) 1
20.0.0.6:6379> hset demaxiya huangzi 185
(integer) 1
20.0.0.6:6379> hget demaxiya gaolun
"190"
20.0.0.6:6379> hget demaxiya huangzi
"185"

Redis 데이터 지속성

데이터 지속성 개요
Redis는 원래 메모리에서 실행되며 컴퓨터 전원이 꺼지면 데이터가 손실됩니다.
Redis 데이터를 보호하고 시스템 오류를 방지하려면 Redis의 데이터를 하드 디스크에 기록해야합니다.이 작업을 지속성이라고합니다.

지속성 분류

  • RBD 방법 : 스냅 샷의 모든 데이터 파일 사본을 얻을 수 있도록 스냅 샷을 만드는 방법
  • AOF 모드 : 실행 된 쓰기 명령을 파일의 마지막 줄에 쓰고 데이터 변경 사항을 로그 모드에 기록합니다.

RBD

RBD는 redis의 기본 지속성 방법입니다.
기본 백업 파일 이름은 dump.rdb이고 위치는 / var / lib / redis / 6379입니다.
트리거 조건은 다음과 같습니다.
지정된 시간 간격으로 지정된 수의 쓰기 작업을
실행 합니다 (구성 파일에서 변경 가능). 또는 bgsave 명령으로 flushall 명령을
실행하여 데이터베이스의 모든 데이터를 지우고
shutdown 명령을 실행하여 데이터 손실없이 서버가 정상적으로 종료되도록합니다.

장점과 단점

  1. 대규모 데이터 복구에 적합
  2. 비즈니스에 높은 데이터 무결성과 일관성이 필요하지 않은 경우 RDB가 선호되는 선택입니다.
  3. 데이터 무결성 및 일관성이 높지 않습니다.
  4. 백업 중 일부 메모리를 차지

구성 파일 표시

[root@localhost init.d]# vim /etc/redis/6379.conf 
 217 #   save ""
 218 
 219 save 900 1 ##900秒之内至少进行了一次写操作
 220 save 300 10 ##300秒内至少进行了10次写操作
 221 save 60 10000  ##60秒内至少进行10000次写操作
 253 # The filename where to dump the DB
 254 dbfilename dump.rdb	##RBD文件名
 251 rdbchecksum yes	##压缩功能开启
 264 dir /var/lib/redis/6379	##RDB文件位置
[root@localhost init.d]# cd /var/lib/redis/6379/
[root@localhost 6379]# ls
dump.rdb

AOF

Redis는 기본적으로
RDB (데이터 불일치)의 부족 보완하여
각 쓰기 작업을 로그 형식으로 기록하고 파일에 추가하지 않습니다.
Redis를 다시 시작하면 로그 파일의 내용에 따라 쓰기 명령을 앞뒤로 실행하여 데이터를 완성합니다. 직장 복귀

AOF 파일에 따라 데이터를 복원합니다.
appendonly.aof 파일을 redis 설치 디렉터리의 bin 디렉터리에 복사하고 redis 서비스를 다시 시작합니다.

AOF 재 작성 메커니즘
개요 AOF
의 작동 원리는 파일에 쓰기 작업을 추가하는 것이며 파일의 중복 내용이 점점 더 많아 질 것
입니다. AOF 파일의 크기가 설정된 임계 값을 초과하면 Redis는 AOF 파일의 내용을 변경합니다. 압축

原理
Redis会fork出一条新进程,读取内存中的数据(并没有读取旧文件),并重新写到一个临时文件中,最后替换旧的aof文件

配置文件展示

[root@localhost ~]# vim /etc/redis/6379.conf 
700 appendonly yes 		##默认为no,改成yus开启持久化
704 appendfilename "appendonly.aof"		##文件名称
729 # appendfsync always	##同步持久化,每次发生数据变化会立刻写入磁盘
730 appendfsync everysec	##默认推荐,每秒异步记录次,默认值
731 # appendfsync no	##不同步,交给操作系统决定如何同步
752 no-appendfsync-on-rewrite no	##在日志进行BGREWRITEAOF时, 如果设置为yes表示新写操作不进行同步fsync,只暂存在缓冲区里,避免造成磁盘I0操作冲突,等重写完成后在写入,redis中默认为no
771 auto-aof-rewrite-percentage 100	##当前AOF文件大小是上次日志重写时AOF文件大小两倍时,发生BGREWRITEAOF操作
772 auto-aof-rewrite-min-size 64mb	##当前AOF文件执行BGREWRITEAOF命令的最小值,避免刚开始启动Reids时由于文件尺寸较小导致频繁的BGREWRITEAOF.当AOF文件到达64M的时候,发生BGREWRITEAOF操作
796 aof-load-truncated yes	##忽略最后一条可能存在问题的指令

将appendonly.aof文件拷贝到redis安装目录的bin目录下,重启redis服务即可,就可以恢复数据了

[root@localhost ~]# cd /var/lib/redis/6379/
[root@localhost 6379]# ls
appendonly.aof  dump.rdb

Redis 性能管理

127.0.0.1:6379> INFO MEMORY
# Memory
used_memory:853504	##Redis使用其分配器分配的内存大小,已经使用了的内存大小
used_memory_human:833.50K	##用户数据所占用的内存,就是你缓存的数据的大小
used_memory_rss:12820480	##操作系统分配给Redis实例的内存大小,表示该进程所占物理内存的大小
used_memory_rss_human:12.23M
used_memory_peak:853504
used_memory_peak_human:833.50K
used_memory_peak_perc:100.01%
used_memory_overhead:841280
used_memory_startup:791416
used_memory_dataset:12224
used_memory_dataset_perc:19.69%
allocator_allocated:1608480
allocator_active:2019328
allocator_resident:9019392
total_system_memory:1907970048
total_system_memory_human:1.78G
used_memory_lua:37888
used_memory_lua_human:37.00K
used_memory_scripts:0
used_memory_scripts_human:0B
number_of_cached_scripts:0
maxmemory:0
maxmemory_human:0B
maxmemory_policy:noeviction
allocator_frag_ratio:1.26
allocator_frag_bytes:410848
allocator_rss_ratio:4.47
allocator_rss_bytes:7000064
rss_overhead_ratio:1.42
rss_overhead_bytes:3801088
mem_fragmentation_ratio:15.78	##内存碎片率,内存疑惑行为???
mem_fragmentation_bytes:12007992
mem_not_counted_for_evict:98
mem_replication_backlog:0
mem_clients_slaves:0
mem_clients_normal:49694
mem_aof_buffer:98
mem_allocator:jemalloc-5.1.0
active_defrag_running:0
lazyfree_pending_objects:0

内存碎片率

操系统分配的内存值used_ memory rss除以redis使用的内存值
used
_memory计算得出
内存碎片是由操作系统低效的分配/回收物理内存导致的
不连续的物理内存分配
跟踪内存碎片率对理解redis实例的资源性能是非常重要的
内存碎片率稍大于1是合理的,这个值表示内存碎片率比较低
内存碎片率超过1.5,说明redis消耗了实际需要物理内存的150%,其中50%是内存碎片率
内存碎片率低于1的,说明Redis内存分配超出了物理内存,操作系统正在进行内存交换
여기에 사진 설명 삽입我这边看到一篇写的挺详细的,图也是拿的他的,链接放这了
点这里

높은 조각화에 대한 해결 방법
1. Redis 서버를 다시 시작하면 추가 메모리 조각이 무효화되고 새 메모리로 재사용 될 수 있으므로 운영 체제가 효율적인 메모리 관리를 복원하고 메모리 할당자를 수정할 수 있습니다.
Redis는 glibc의 malloc, jemalloc11 및 tcmalloc의 여러 다른 메모리 할당자를 지원하며 각 할당자는 메모리 할당 및 조각화에서 다른 구현을 가지고 있습니다. 일반 관리자가 Redis 기본 메모리 할당자를 수정하는 것은 권장되지 않습니다. 이러한 메모리 할당 자 간의 차이점을 완전히 이해하고 Redis를 다시 컴파일해야하기 때문입니다.
2. 새 지침을 사용하여 수동으로 메모리 조각을 복구하고 redis 4.0 이상에 대한 모니터링을 구성 할 수 있습니다. 더 나은 성능.
경고이 기능은 시험용입니다. 그러나 스트레스 테스트는 프로덕션 환경에서도 수행되었으며 일정 기간 동안 여러 엔지니어가 수동으로 테스트했습니다.
3. 자동 (실시간) 조각 모음을 통해 Redis 서버는 작은 데이터 할당과 메모리의 데이터 릴리스 사이의 공간을 압축하여 메모리를 회수 할 수 있습니다. .

[root@localhost 6379]# vim /etc/redis/6379.conf
1353 activedefrag yes

메모리 사용량

redis 인스턴스의 메모리 사용량이 사용 가능한 최대 메모리를 초과하고 운영 체제가 메모리 교환

방지 하기 위해 메모리 및 스왑 공간을 교환 하기 시작합니다 .
캐시 된 데이터의 크기를 선택
합니다. 가능한 한 해시 데이터 구조를 사용합니다.
키 만료 시간을 설정 합니다.

KEY 재활용

redis의 제한된 메모리 리소스가 합리적으로 할당되었는지 확인합니다.
메모리 사용량이 설정된 최대 임계 값에 도달하면 키 재활용 전략을 선택해야합니다.
기본적으로 재활용 전략은
maxmemory-policy 속성 값을 수정하기 위해 redis.conf 구성 파일 삭제를 금지하는 것입니다.

volatile-lru:使用LRU算法从已设置过期时间的数据集合中淘汰数据
volatile-ttl:从已设置过期时间的数据集合中挑选即将过期的数据淘汰(建议使用)
volatile-random:从已设置过期时间的数据集合中随机挑选数据淘汰
allkeys-lru:使用LRU算法从所有数据集合中淘汰数据
allkeys-random:从数据集合中任意选择数据淘汰
no-enviction:禁止淘汰数据

추천

출처blog.csdn.net/Ora_G/article/details/108472525