Redis配置讲解及实战

前言

Redis是一个开源的内存k-v数据库,同时也可用作缓存,消息队列。支持多种数据类型,如字符串,列表,字典,集合,有序集合。

演示环境

$ uname -a
Darwin 18.6.0 Darwin Kernel Version 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/RELEASE_X86_64 x86_64
$ redis-server -v
Redis server v=5.0.5 sha=00000000:0 malloc=libc bits=64 build=31cd6e21ec924b46

安装

brew install redis

配置

Redis 默认用过的配置文件路径位于/usr/local/etc/redis.conf,下面将通过修改该配置文件影响Redis的行为。

Redis 默认是运行在前台,当终端退出时Redis也会退出,所以首先的任务是通过修改配置文件让Redis运行在后台:

daemonize yes

然后通过下面的命令启动Redis:

redis-server /usr/local/etc/redis.conf 

Redis启动后可以看到redis-server进程监听在127.0.0.1:6379,可以通过下面的配置项修改:

bind 127.0.0.1 ::1
port 6379

通过Redis客户端redis-cli连接Redis服务端redis-server:

$ redis-cli 
127.0.0.1:6379> 
127.0.0.1:6379> set hello world  # 字符串操作
OK
127.0.0.1:6379> keys *  # 列举所有的key
1) "x1"
2) "x2"
3) "hello"
127.0.0.1:6379> hset myhash 1 www  #字典(哈希表)操作
(integer) 1
127.0.0.1:6379> hset myhash 2 yyy
(integer) 1
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> hgetall myhash # 获取字典myhash所有的key-value
1) "1"
2) "www"
3) "2"
4) "yyy"
127.0.0.1:6379> lpush mylist 1  # 列表操作,元素可以重复
(integer) 1
127.0.0.1:6379> lpush mylist 2
(integer) 2
127.0.0.1:6379> lpush mylist 3
(integer) 3
127.0.0.1:6379> lpush mylist 1
(integer) 4
127.0.0.1:6379> lrange mylist 0 -1
1) "1"
2) "3"
3) "2"
4) "1"
127.0.0.1:6379> sadd myset 1 #集合操作,重复元素只保留一个
(integer) 1
127.0.0.1:6379> sadd myset 2
(integer) 1
127.0.0.1:6379> sadd myset 3
(integer) 1
127.0.0.1:6379> sadd myset 1
(integer) 0
127.0.0.1:6379> smembers myset
1) "1"
2) "2"
3) "3"
127.0.0.1:6379> zadd mysortset 1 redis  #有序集合操作,前面的score值,作为排序的依据
(integer) 1
127.0.0.1:6379> zadd mysortset 3 mysql
(integer) 1
127.0.0.1:6379> zadd mysortset 2 memcached
(integer) 1
127.0.0.1:6379> zrange mysortset 0 -1 withscores
1) "redis"
2) "1"
3) "memcached"
4) "2"
5) "mysql"
6) "3"

上面的操作演示了Redis字符串,列表,字典,集合,有序集合五种数据类型。redis-cli使用默认的配置连接redis-server,但是在生产环境中IP和Port:

u$ redis-cli -h
redis-cli 5.0.5

Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]
  -h <hostname>      Server hostname (default: 127.0.0.1).
  -p <port>          Server port (default: 6379).

配置redis-server鉴权

requirepass foobared

重启redis-server后,再次尝试用redis-cli连接操作:

$ redis-cli 
127.0.0.1:6379> 
127.0.0.1:6379> keys *
(error) NOAUTH Authentication required.
127.0.0.1:6379> 

这时就需要输入密码后才能接着操作:

127.0.0.1:6379> auth foobared
OK
127.0.0.1:6379> keys *
1) "myset"
2) "mysortset"
3) "x1"
4) "mylist"
5) "myhash"
6) "x2"
7) "hello"
127.0.0.1:6379> 

 

持久化

Redis数据持久化策略有RDB快照方式和AOF(append only file)方式。

RDB 是Redis默认开启的持久化策略,相关的配置为:

save 900 1           #900s有多于1个key发生变化则触发RDB持久化
save 300 10          #300s有多于10个key发生变化则触发RDB持久化
save 60 10000        #60s有多于10000个key发生变化则触发RDB持久化
rdbcompression yes   #数据压缩保存于rdb文件中
rdbchecksum yes      #开启rdb数据checksum确认功能
dbfilename dump.rdb  #rdb文件名称
dir /usr/local/var/db/redis/ #rdb文件目录位置

Redis启动后会加载dump.rdb文件数据,如果dump.rdb 文件损坏或者不完整(有可能机器断电,最后一次的RDB数据持久化部分刷到dump.rdb文件),可以通过redis-check-rdb检测dump.rdb文件的可用性:

$ redis-check-rdb dump.rdb 
[offset 0] Checking RDB file dump.rdb
[offset 26] AUX FIELD redis-ver = '5.0.5'
[offset 40] AUX FIELD redis-bits = '64'
[offset 52] AUX FIELD ctime = '1561972490'
[offset 67] AUX FIELD used-mem = '1006704'
[offset 83] AUX FIELD aof-preamble = '0'
[offset 85] Selecting DB ID 0
[offset 266] Checksum OK
[offset 266] \o/ RDB looks OK! \o/
[info] 7 keys read
[info] 0 expires
[info] 0 already expired

当dump.rdb 文件损坏且无法恢复时,需要删除dump.rdb文件,否则redis-server启动后会自动退出:

$ echo " i am test hahhahha" > dump.rdb 
$ redis-server /usr/local/etc/redis.conf 
23194:C 01 Jul 2019 17:44:34.757 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
23194:C 01 Jul 2019 17:44:34.757 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=23194, just started
23194:C 01 Jul 2019 17:44:34.757 # Configuration loaded
$ ps -ef|grep redis
  501 23264 46375   0  5:45下午 ttys002    0:00.00 grep redis

删除dump.rdb文件后,redis-server可以正常启动,但是之前的数据也没有了:

$ rm dump.rdb 
$ redis-server /usr/local/etc/redis.conf 
23498:C 01 Jul 2019 17:48:26.574 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
23498:C 01 Jul 2019 17:48:26.574 # Redis version=5.0.5, bits=64, commit=00000000, modified=0, pid=23498, just started
23498:C 01 Jul 2019 17:48:26.574 # Configuration loaded
$ redis-cli 
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> 

另外dump.rdb文件是二进制数据,用vim直接查看人眼无法看懂:

数据格式:

开头为固定的5个REDIS字符,表示为RDB文件。

db_version表示为redis的版本。

EOF表示正文内容结束。

checksum为8字节的无符号整数校验和。验证数据的完整性。

databases部分:

第一部分表示该什么是redis哪个DB的(0-15)。

第二部分db_number是具体的db需要,例如0。那么第一部分和第二部分加起来就是select 0。

第三部分key_value_pairs 表示的是具体键值对信息。

一个完整RDB文件内容示例:

RDB持久化关键点:

1.redis利用linux fork子进程后,进程拥有父进程内存快照的方式快速获取内存快照(copy on write)。

2.redis RDB持久化落盘操作发生在独立的子进程中,不影响主进程的其他请求。(对应于bgsave命令,如果是save命令还是主进程处理RDB)

RDB策略优点:

1.适合大规模的数据恢复,数据恢复快。

2.如果业务对数据完整性和一致性要求不高,RDB是很好的选择。

RDB策略缺点:

数据的完整性和一致性不高,异常情况下会丢失最后一次RDB备份前的数据。

AOF 策略

AOF的出现是为了和RDB互补,它采用日志的形式记录每个写操作的内容,将写指令从前到后执行一次以完成数据的恢复工作。

appendonly yes
appendfilename "appendonly.aof"
# appendfsync always   # 每发生一次写操作刷一次盘
appendfsync everysec   # 每秒定时刷盘
# appendfsync no         # 依靠系统自行刷盘

清空Redis然后重启redis-server:

$ redis-cli 
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> 
127.0.0.1:6379> 
127.0.0.1:6379> set hello world
OK

$ cat appendonly.aof 
*2  #表示有两个参数
$6  #该参数有6个字符
SELECT #参数是select
$1  #该参数有1个字符
0   #参数是0
*3  #表示有3个参数
$3  #该参数有3个字节
set #参数是set
$5  #该参数有5个字节
hello # 参数是hello
$5    #该参数有5个字节
world # 参数是world

所以appendonly.aof 保存了命令还原为:

select 0
set hello world

其中select 0表示默认选择Redis的0号DB。

AOF 策略优点:

数据完整性和一致性更高,异常情况只会丢失1s的数据。

AOF 策略缺点:

AOF文件有冗余,文件太大,Redis启动加载慢。

Redis服务启动后执行载入程序时,优先判断是否开启了AOF持久化,如果时就载入AOF文件,否则载入RDB文件。

对比Memcached

1.Redis支持数据持久化,Memcached不支持,断电数据会消失。

2.Redis比Memcached支持更多的数据类型,Memcached所有值都是字符串。

所以优先选择Redis。

总结

本文介绍演示了Redis五种数据类型的操作,另外介绍了Redis RDB和AOF持久化策略,最后对比了Redis和Memcached。

参考

https://redis.io/

http://redisbook.com/preview/rdb/rdb_struct.html

https://juejin.im/post/5bd96bcaf265da396b72f855

 

猜你喜欢

转载自www.cnblogs.com/makelu/p/11116418.html
今日推荐