Linux系统架构-----redis的安装配置优化与命令操作

一.redis介绍

  • redis官方网站

  • redis(remote dictionary server,远程字典服务)是一个开源的使用ANSI C语言编写、遵守BSD协议,支持网络,可基于内存可持久化的日志型、key-Value的数据库,并提供多种语言的API。它通常被称为结构服务器,因为值(value)可以是字符串(string),哈希(hash),列表(list),集合(sets)和有序集合(sorted sets)等类型
  • redis是完全开源免费的,是一个高性能的key-value数据库
  • redis的特点

redis支持数据的持久化,可以将内存中的数据库保存在磁盘中,重启的时候可以再次加载进行使用

redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储

redis支持数据的备份,即master-slave模式的数据备份(下一篇将会详述redis群集)

  • redis优势

性能极高-redis的读的速度是110000次/s,写的速度是81000次/s

丰富的数据类型-redis支持二进制案例的strings,lists,hashes,sets以及ordered sets数据类型操作

原子-redis的所有操作都是原子性的,意思就是要么成功执行要么完全不执行。单个操作是原子性的,多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来

丰富的特性-redis还支持publish/subscribe通知,key过期等特性

  • redis与其他key-value的不同

redis有着更为复杂的数据结构并且提供对他们的原子操作,这是一个不同于其他数据库的进化路径。redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象

redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据不能大于硬件内存。在内存数据库方面的另外一个优点是,相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样redis可以做很多内部复杂性很强的事情。同时,在磁盘格式方面他们是紧凑的以追加的方式生产的,因为他们不需要进行随机访问

二.redis的安装

  • 在centos7系统上安装redis,具体步骤如下
1.下载redis的安装包
[root@localhost ~]# yum install vsftpd -y
[root@localhost ~]# wget http://download.redis.io/releases/redis-5.0.7.tar.gz
2.通过yum工具,安装编译工具
[root@localhost ~]# yum install gcc gcc-c++ make -y 
3.解压redis软件包
tar xzvf redis-5.0.7.tar.gz -C /opt
4.编译且安装
cd /opt/redis-5.0.7/
make
make PREFIX=/usr/local/redis install
5.开启服务,设置各类文件
cd /opt/redis-5.0.7/utils/
[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 //可执行文件路径,需要自行定义
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.
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 redis]# netstat -natp | grep 6379
tcp        0      0 127.0.0.1:6379          0.0.0.0:*               LISTEN      6475/redis-server 1 
6.创建软链接,便于服务控制
ln -s /usr/local/redis/bin/* /usr/local/bin/
7.进入redis数据库
[root@localhost init.d]# vim /etc/redis/6379.conf 

bind 127.0.0.1 192.168.43.101    //绑定本机地址

[root@localhost init.d]# service redis_6379 restart     //重启服务
Stopping ...
Redis stopped
Starting Redis server...

[root@localhost ~]# redis-cli -h 192.168.43.101 -p 6379    //-h指定地址,-p指定端口
192.168.43.101:6379> 


三.redis配置文件的分析

  • RDB持久化
[root@localhost ~]# vim /etc/redis/6379.conf


#RDB核心规则配置 save <指定时间间隔> <执行指定次数更新操作>,满足条件就将内存中的数据同步到硬盘
中。官方出厂配置默认是 900秒内有1个更改,300秒内有10个更改以及60秒内有10000个更改,则将内存中的
数据快照写入磁盘。
若不想用RDB方案,可以把 save "" 的注释打开,下面三个注释
#   save ""
save 900 1
save 300 10
save 60 10000

#当RDB持久化出现错误后,是否依然进行继续进行工作,yes:不能进行工作,no:可以继续进行工作,可以通
过info中的rdb_last_bgsave_status了解RDB持久化是否有错误
stop-writes-on-bgsave-error yes



#配置存储至本地数据库时是否压缩数据,默认为yes。Redis采用LZF压缩方式,但占用了一点CPU的时间。若关闭该选项,
但会导致数据库文件变的巨大。建议开启。
rdbcompression yes


#是否校验rdb文件;从rdb格式的第五个版本开始,在rdb文件的末尾会带上CRC64的校验和。这跟有利于文件的
容错性,但是在保存rdb文件的时候,会有大概10%的性能损耗,所以如果你追求高性能,可以关闭该配置
rdbchecksum yes

#指定本地数据库文件名,一般采用默认的dump.rdb
dbfilename dump.rdb

#数据目录,数据库会写入这个目录。rdb、aof文件也会写在这个目录
dir /var/lib/redis/6379
  • AOF持久化
[root@localhost ~]# vim /etc/redis/6379.conf


#Redis 默认不开启。它的出现是为了弥补RDB的不足(数据的不一致性),所以它采用日志的形式来记录每个写操作,并追加到文件中。Redis 重启的会根据日志文件的内容将写指令从前到后执行一次以完成数据的恢复工作默认redis使用的是rdb方式持久化,这种方式在许多应用中已经足够用了。但是redis如果中途宕机,会导致可能有几分钟的数据丢失,根据save来策略进行持久化,Append Only File是另一种持久化方式,可以提供更好的持久化特性。Redis会把每次写入的数据在接收后都写入 appendonly.aof 文件,每次启动时Redis都会先把这个文件的数据读入内存里,先忽略RDB文件。若开启rdb则将no改为yes
appendonly no
 
指定本地数据库文件名,默认值为 appendonly.aof
appendfilename "appendonly.aof"
 
 
#aof持久化策略的配置
#no表示不执行fsync,由操作系统保证数据同步到磁盘,速度最快
#always表示每次写入都执行fsync,以保证数据同步到磁盘
#everysec表示每秒执行一次fsync,可能会导致丢失这1s数据
# appendfsync always
appendfsync everysec
# appendfsync no
 
# 在aof重写或者写入rdb文件的时候,会执行大量IO,此时对于everysec和always的aof模式来说,执行
fsync会造成阻塞过长时间,no-appendfsync-on-rewrite字段设置为默认设置为no。如果对延迟要求很高的
应用,这个字段可以设置为yes,否则还是设置为no,这样对持久化特性来说这是更安全的选择。设置为yes表
示rewrite期间对新写操作不fsync,暂时存在内存中,等rewrite完成后再写入,默认为no,建议yes。Linux的
默认fsync策略是30秒。可能丢失30秒数据
no-appendfsync-on-rewrite no
 
#aof自动重写配置。当目前aof文件大小超过上一次重写的aof文件大小的百分之多少进行重写,即当aof文件
增长到一定大小的时候Redis能够调用bgrewriteaof对日志文件进行重写。当前AOF文件大小是上次日志重写得
到AOF文件大小的二倍(设置为100)时,自动启动新的日志重写过程
auto-aof-rewrite-percentage 100
 
#设置允许重写的最小aof文件大小,避免了达到约定百分比但尺寸仍然很小的情况还要重写
auto-aof-rewrite-min-size 64mb
 
#aof文件可能在尾部是不完整的,当redis启动的时候,aof文件的数据被载入内存。重启可能发生在redis所
在的主机操作系统宕机后,尤其在ext4文件系统没有加上data=ordered选项(redis宕机或者异常终止不会造
成尾部不完整现象。)出现这种现象,可以选择让redis退出,或者导入尽可能多的数据。如果选择的是yes,
当截断的aof文件被导入的时候,会自动发布一个log给客户端然后load。如果是no,用户必须手动redis-
check-aof修复AOF文件才可以
aof-load-truncated yes
 
#加载redis时,可以识别AOF文件以“redis”开头。
#字符串并加载带前缀的RDB文件,然后继续加载AOF尾巴
aof-use-rdb-preamble yes

四.redis的性能测试

  • redis性能测试的基本命令如下
redis-benchmark [option] [option value]

注:该命令实在redis的目录下执行的,不是在redis客户端的内部指令

  • redis性能测试工具参数

选项 描述 默认值
-h 指定服务器主机名 127.0.0.1
-p 指定服务端口 6379
-s 指定服务器socket  
-c 指定并发连接数 50
-n 指定请求数 100000
-d 一字节的形式指定SET/GET值得数据大小 2
-k 1=keep alive 0=reconnect 1
-r set/get/incr使用随机key,SADD使用随机值  
-P 通过管道传输<numreq>请求 1
-q 强制退出redis,仅显示query/sec值  
--csv 以CSV格式输出  
-L 生成循环,永久执行测试  
-t 仅运行运行以逗号分隔的测试命令列表  
-l Idle模式,仅打开N个idle连接并等待  
  • 实例,测试set和get功能的性能

[root@localhost ~]# redis-benchmark -h 192.168.43.101 -p 6379 -t set,lpush -n 100000 -c 50
====== SET ======
  100000 requests completed in 1.79 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

93.49% <= 1 milliseconds
99.69% <= 2 milliseconds
99.93% <= 3 milliseconds
100.00% <= 3 milliseconds
55959.71 requests per second

====== LPUSH ======
  100000 requests completed in 2.11 seconds
  50 parallel clients
  3 bytes payload
  keep alive: 1

85.13% <= 1 milliseconds
98.81% <= 2 milliseconds
99.74% <= 3 milliseconds
99.83% <= 4 milliseconds
99.86% <= 5 milliseconds
99.87% <= 6 milliseconds
99.95% <= 7 milliseconds
100.00% <= 7 milliseconds
47438.33 requests per second


[root@localhost ~]# 

五.redis数据库的命令使用

  • 远程连接redis数据库和退出
[root@localhost ~]# redis-cli -p 6379 -h 192.168.43.101
192.168.43.101:6379> exit
[root@localhost ~]# 
  • redis键(key),redis键命令用于管理redis的键
[root@localhost ~]# redis-cli -p 6379 -h 192.168.43.101
192.168.43.101:6379> set stu zhangsan    //建立一个stu键,值为zhangsan
OK
192.168.43.101:6379> get stu    //获取stu键中的值
"zhangsan"
192.168.43.101:6379> del stu    //删除stu键
(integer) 1
192.168.43.101:6379> get stu    
(nil)
192.168.43.101:6379> exists stu    //exists key检查给定的key是否存在,1为真,0为假
(integer) 0

  • help命令
192.168.43.101:6379> help set    //获取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    //属于string字符串

192.168.43.101:6379> 

redis的五大数据结构
string:字符串
Hash:散列
List:列表
Set:集合
Sorted Set:有序集合
  • KEYS pattern,查找所有符合给定模式的key
192.168.43.101:6379> keys *
1) "stu1"
2) "mylist"
3) "student"
4) "key:__rand_int__"
5) "stu3"
6) "counter:__rand_int__"
7) "stu2"
8) "myset:__rand_int__"
192.168.43.101:6379> 
192.168.43.101:6379> keys *
1) "stu1"
2) "mylist"
3) "student"
4) "key:__rand_int__"
5) "stu3"
6) "counter:__rand_int__"
7) "stu2"
8) "myset:__rand_int__"
192.168.43.101:6379> move stu2 1    //将当前数据的key移动到给定的数据库db中
(integer) 1
192.168.43.101:6379> keys *
1) "stu1"
2) "mylist"
3) "student"
4) "key:__rand_int__"
5) "stu3"
6) "counter:__rand_int__"
7) "myset:__rand_int__"
192.168.43.101:6379> SELECT 1    //进入指定数据库
OK
192.168.43.101:6379[1]> keys *    //查看所有数据库,数据库1原值为空
1) "stu2"
192.168.43.101:6379[1]> 
192.168.43.101:6379> SELECT 2    //切换到数据库2
OK
192.168.43.101:6379[2]> keys *
(empty list or set)
192.168.43.101:6379[2]> set stu 1
OK
192.168.43.101:6379[2]> set tea 2
OK
192.168.43.101:6379[2]> keys *
1) "stu"
2) "tea"
192.168.43.101:6379[2]> FLUSHDB    //清空所有数据库
OK
192.168.43.101:6379[2]> keys *
(empty list or set)
192.168.43.101:6379[2]> SELECT 0    //返回数据库0
OK
192.168.43.101:6379> 

注:redis数据库的详细命令,参考 https://www.runoob.com/redis/redis-sorted-sets.html

发布了112 篇原创文章 · 获赞 127 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_42761527/article/details/104231973