涉及开源项目(dailyfresh-B2C)的部署架构如下:
1)Redis是什么?
Redis 是一个开源的,内存中的数据结构存储系统,它可以用作数据库、缓存,除了做缓存之外,Redis 也经常用来做分布式锁,甚至是消息队列。
-
它是一种高级的key:value存储系统,其中value支持五种数据类型:
- 字符串(strings)
- 散列(hashes)(哈希是从redis-2.0.0版本之后才有的数据结构)
- 列表(lists)
- 集合(sets)
- 有序集合(sorted sets)
-
redis提供了两种磁盘持久化(persistence)的方式:
- RDB(Redis DataBase),即在不同的时间点,将redis存储的数据生成快照并存储到磁盘等介质上。
- AOF(Append Only File),即将redis执行过的所有写指令记录下来,在下次redis重新启动时,只要把这些写指令从前到后再重复执行一遍,就可以实现数据恢复了。
- RDB和AOF两种方式也可以同时使用,在这种情况下,如果redis重启的话,则会优先采用AOF方式来进行数据恢复,这是因为AOF方式的数据恢复完整度更高。
- 也完全可以关闭RDB和AOF方式,这样的话,redis将变成一个纯内存数据库,就像memcache一样。
- Redis和memcache相比:
- redis可以用来做存储(storge)、而memcache是来做缓存(cache)。
- 存储的数据有“结构”,对于memcache来说,存储的数据,只有一种类型——“字符串”,而redis则可以存储字符串、链表、集合、有序集合、哈序结构。
-
Redis的事务处理:
- 事务:一个完整的动作,要么全部执行,要么什么也没有做。
- 四个构成redis事务处理基础的指令:
- MULTI用来组装一个事务
- EXEC用来执行一个事务
- DISCARD用来取消一个事务
- WATCH用来监视一些key,一旦这些key在事务执行之前被改变,则取消事务的执行
-
Redis的主从同步:
- 像MySQL一样,redis是支持主从同步的,而且也支持一主多从以及多级从结构。
- 主从结构,一是为了纯粹的冗余备份,二是为了提升读性能,比如很消耗性能的SORT就可以由从服务器来承担。
- redis的主从同步是异步进行的,这意味着主从同步不会影响主逻辑,也不会降低redis的处理性能。
缓存数据的处理流程
为什么要用缓存?
使用缓存主要是为了提升用户体验以及应对更多的用户。
1、高性能
假如用户第一次访问数据库中的某些数据的话,这个过程是比较慢,毕竟是从硬盘中读取的。
但是,如果用户访问的数据属于高频数据并且不会经常改变的话,那么就可以放心将该用户访问的数据存在缓存中。这样用户下一次再访问这些数据的时候就可以直接从缓存中获取了。操作缓存就是直接操作内存,所以速度相当快。
不过,要保持数据库和缓存中的数据的一致性。
2、高并发
一般像 MySQL 这类的数据库的 QPS大概都在 1w 左右(4 核 8g) ,但是使用 Redis 缓存之后很容易达到 10w+,甚至最高能达到 30w+(就单机 redis 的情况,redis 集群的话会更高)。
- QPS(Query Per Second):服务器每秒可以执行的查询次数。
直接操作缓存能够承受的数据库请求数量是远远大于直接访问数据库的,所以可以考虑把数据库中的部分数据转移到缓存中去,这样用户的一部分请求会直接到缓存这里而不用经过数据库。进而也就提高的系统整体的并发。
2)Redis的安装和配置
2.1 安装Redis
2.1.1 下载Redis
进入官网:https://redis.io/download
按照官网的Installation进行操作:
he@he-ThinkPad-X200:~$ wget https://download.redis.io/releases/redis-6.2.2.tar.gz # 下载
--2021-04-28 21:20:34-- https://download.redis.io/releases/redis-6.2.2.tar.gz
Resolving download.redis.io (download.redis.io)... 45.60.125.1
Connecting to download.redis.io (download.redis.io)|45.60.125.1|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 2454893 (2.3M) [application/octet-stream]
Saving to: ‘redis-6.2.2.tar.gz’
redis-6.2.2.tar.gz 100%[============================================================>] 2.34M 930KB/s in 2.6s
2021-04-28 21:20:38 (930 KB/s) - ‘redis-6.2.2.tar.gz’ saved [2454893/2454893]
he@he-ThinkPad-X200:~$ ls
Desktop Downloads Music Public Python-3.7.9 redis-6.2.2.tar.gz Templates Videos
Documents github-learning Pictures pycharm-2021.1 Python-3.7.9.tgz snap test-uwsgi.py
he@he-ThinkPad-X200:~$ tar xzf redis-6.2.2.tar.gz # 解压
he@he-ThinkPad-X200:~$ cd redis-6.2.2 # 进入路径
he@he-ThinkPad-X200:~/redis-6.2.2$ make # 编译
cd src && make all
make[1]: Entering directory '/home/he/redis-6.2.2/src'
CC Makefile.dep
...
INSTALL redis-check-aof
Hint: It's a good idea to run 'make test' ;)
make[1]: Leaving directory '/home/he/redis-6.2.2/src'
he@he-ThinkPad-X200:~/redis-6.2.2$ ls /home/he/redis-6.2.2 -l
total 240
-rw-rw-r-- 1 he he 25124 4月 20 13:03 00-RELEASENOTES
-rw-rw-r-- 1 he he 51 4月 20 13:03 BUGS
-rw-rw-r-- 1 he he 5026 4月 20 13:03 CONDUCT
-rw-rw-r-- 1 he he 3384 4月 20 13:03 CONTRIBUTING
-rw-rw-r-- 1 he he 1487 4月 20 13:03 COPYING
drwxrwxr-x 7 he he 4096 4月 28 21:21 deps
-rw-rw-r-- 1 he he 11 4月 20 13:03 INSTALL
-rw-rw-r-- 1 he he 151 4月 20 13:03 Makefile
-rw-rw-r-- 1 he he 6888 4月 20 13:03 MANIFESTO
-rw-rw-r-- 1 he he 21567 4月 20 13:03 README.md
-rw-rw-r-- 1 he he 93724 4月 20 13:03 redis.conf
-rwxrwxr-x 1 he he 275 4月 20 13:03 runtest
-rwxrwxr-x 1 he he 279 4月 20 13:03 runtest-cluster
-rwxrwxr-x 1 he he 1046 4月 20 13:03 runtest-moduleapi
-rwxrwxr-x 1 he he 281 4月 20 13:03 runtest-sentinel
-rw-rw-r-- 1 he he 13768 4月 20 13:03 sentinel.conf
drwxrwxr-x 3 he he 12288 4月 28 21:24 src
drwxrwxr-x 11 he he 4096 4月 20 13:03 tests
-rw-rw-r-- 1 he he 3055 4月 20 13:03 TLS.md
drwxrwxr-x 9 he he 4096 4月 20 13:03 utils
此时已编译的二进制文件位于src目录中,然后进行Redis安装。
he@he-ThinkPad-X200:~/redis-6.2.2$ cd src/ # 编译成功后,进入src文件夹
he@he-ThinkPad-X200:~/redis-6.2.2/src$ make install # 执行make install进行Redis安装
CC Makefile.dep
Hint: It's a good idea to run 'make test' ;)
INSTALL redis-server
install: cannot create regular file '/usr/local/bin/redis-server': Permission denied
make: *** [Makefile:428: install] Error 1
he@he-ThinkPad-X200:~/redis-6.2.2/src$ sudo make install
[sudo] password for he:
Hint: It's a good idea to run 'make test' ;)
INSTALL redis-server
INSTALL redis-benchmark
INSTALL redis-cli
2.1.2 整理配置文件和常用命令
为了方便管理,将Redis文件中的conf配置文件和常用命令移动到统一文件中:
he@he-ThinkPad-X200:~/redis-6.2.2$ mkdir etc # 创建bin文件
he@he-ThinkPad-X200:~/redis-6.2.2$ mkdir bin # 创建etc文件
he@he-ThinkPad-X200:~/redis-6.2.2$ ls
00-RELEASENOTES BUGS CONTRIBUTING deps INSTALL MANIFESTO redis.conf runtest-cluster runtest-sentinel src TLS.md
bin CONDUCT COPYING etc Makefile README.md runtest runtest-moduleapi sentinel.conf tests utils
he@he-ThinkPad-X200:~/redis-6.2.2$ mv redis.conf ./etc/ # 回到刚刚安装目录,找到redis.conf,将其复制移动到 ./ect 下
he@he-ThinkPad-X200:~/redis-6.2.2$ ls ./etc
redis.conf
he@he-ThinkPad-X200:~/redis-6.2.2$ cd ./src/ # 进入src目录
he@he-ThinkPad-X200:~/redis-6.2.2/src$ mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server ~/redis-6.2.2/bin/ # 移动mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server到bin文件
he@he-ThinkPad-X200:~/redis-6.2.2$ ls bin/
mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-rdb redis-cli redis-server
移到bin目录下的文件:
- redis-benchmark:redis性能测试工具
- redis-check-aof:检查aof日志的工具
- redis-check-rdb:检查rdb日志的工具
- redis-cli:连接用的客户端
- redis-server:redis服务进程
2.1.3 启动Redis
he@he-ThinkPad-X200:~$ ./redis-6.2.2/bin/redis-server # 启动redis服务器
207908:C 28 Apr 2021 21:53:36.555 # oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
207908:C 28 Apr 2021 21:53:36.555 # Redis version=6.2.2, bits=64, commit=00000000, modified=0, pid=207908, just started
207908:C 28 Apr 2021 21:53:36.555 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-6.2.2/bin/redis-server /path/to/redis.conf
207908:M 28 Apr 2021 21:53:36.558 * Increased maximum number of open files to 10032 (it was originally set to 1024).
207908:M 28 Apr 2021 21:53:36.558 * monotonic clock: POSIX clock_gettime
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 6.2.2 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 207908
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | https://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
207908:M 28 Apr 2021 21:53:36.558 # Server initialized
207908:M 28 Apr 2021 21:53:36.559 # 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.
207908:M 28 Apr 2021 21:53:36.559 * Ready to accept connections
默认情况,Redis不是在后台运行,如需要把redis放在后台运行:
1、编辑conf文件,将daemonize属性改为yes(表明需要在后台运行):
2、再次启动redis服务,并指定启动服务配置文件:
he@he-ThinkPad-X200:~/redis-6.2.2/etc$ vi redis.conf
he@he-ThinkPad-X200:~/redis-6.2.2/etc$ cd ..
he@he-ThinkPad-X200:~/redis-6.2.2$ cd
he@he-ThinkPad-X200:~$ ./redis-6.2.2/bin/redis-server ./redis-6.2.2/etc/redis.conf # 启动redis,并指定配置文件
he@he-ThinkPad-X200:~$ netstat -tunpl | grep 6379 # 查看进程,Redis服务端的默认端口是6379
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp 0 0 127.0.0.1:6379 0.0.0.0:* LISTEN 207961/./redis-6.2.
tcp6 0 0 ::1:6379 :::* LISTEN 207961/./redis-6.2.
he@he-ThinkPad-X200:~$
he@he-ThinkPad-X200:~$ pkill redis-server # 停止redis实例
he@he-ThinkPad-X200:~$ netstat -tunpl | grep 6379
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
he@he-ThinkPad-X200:~$ sudo netstat -tunpl | grep 6379
[sudo] password for he:
he@he-ThinkPad-X200:~$
2.2 Redis的配置
edis配置文件被分成了几大块区域:
- 通用(general)
- 快照(snapshotting)
- 复制(replication)
- 安全(security)
- 限制(limits)
- 追加模式(append only mode)
- LUA脚本(lua scripting)
- 慢日志(slow log)
- 事件通知(event notification)
redis支持“主配置文件中引入外部配置文件”,很像C/C++中的include指令,比如:
include /path/to/other.conf
*度量单位:
redis配置中对单位的大小写不敏感,1GB、1Gb和1gB都是相同的。由此也说明,redis只支持bytes,不支持bit单位。
# 1k => 1000 bytes
# 1kb => 1024 bytes
# 1m => 1000000 bytes
# 1mb => 1024*1024 bytes
# 1g => 1000000000 bytes
# 1gb => 1024*1024*1024 bytes
2.2.1 通用
-
默认情况下,redis并不是以daemon形式(后台)来运行的。通过daemonize配置项可以控制redis的运行形式,如果改为yes,那么redis就会以daemon形式运行。
- 当以daemon形式运行时,redis会生成一个pid文件,默认会生成在/var/run/redis.pid。可以通过pidfile来指定pid文件生成的位置,比如:
pidfile /path/to/redis.pid
- 当以daemon形式运行时,redis会生成一个pid文件,默认会生成在/var/run/redis.pid。可以通过pidfile来指定pid文件生成的位置,比如:
-
默认情况下,redis会响应本机所有可用网卡的连接请求。当然,redis允许通过bind配置项来指定要绑定的IP,比如:
bind 192.168.1.2 10.8.4.2
-
redis的默认服务端口是6379,可以通过port配置项来修改。如果端口设置为0的话,redis便不会监听端口了。
-
redis还支持通过unix socket方式来接收请求。可以通过unixsocket配置项来指定unix socket文件的路径,并通过unixsocketperm来指定文件的权限。
-
当一个redis-client一直没有请求发向server端,那么server端有权主动关闭这个连接,可以通过timeout来设置“空闲超时时限”,0表示永不关闭:
timeout 0
-
TCP连接保活策略,可以通过tcp-keepalive配置项来进行设置,单位为秒,server端会每次向连接空闲的客户端发起一次ACK请求,以检查客户端是否已经挂掉,对于无响应的客户端则会关闭其连接。如果设置为0,则不会进行保活检测:
tcp-keepalive 0
-
redis也支持通过logfile配置项来设置日志文件的生成位置。如果设置为空字符串,则redis会将日志输出到标准输出。假如在daemon情况下将日志设置为输出到标准输出,则日志会被写到/dev/null中:
logfile ""
-
对于redis来说,可以设置其数据库的总数量,假如希望一个redis包含16个数据库,那么设置如下:
databases 16
,这16个数据库的编号将是0到15。默认的数据库是编号为0的数据库。用户可以使用select 来选择相应的数据库。
2.2.2 快照
快照,主要涉及的是redis的RDB持久化相关的配置。可以用如下的指令来让数据保存到磁盘上,即控制RDB快照功能:
save <seconds> <changes>
# 例如:
save 900 1 //表示每15分钟且至少有1个key改变,就触发一次持久化
save 300 10 //表示每5分钟且至少有10个key改变,就触发一次持久化
# 如果想禁用RDB持久化的策略,只要不设置任何save指令就可以,或者给save传入一个空字符串参数也可以达到相同效果,就像这样:
save ""
如果用户开启了RDB快照功能,那么在redis持久化数据到磁盘时如果出现失败,默认情况下,redis会停止接受所有的写请求。这样做的好处在于可以让用户很明确的知道内存中的数据和磁盘上的数据已经存在不一致了。如果下一次RDB持久化成功,redis会自动恢复接受写请求。
- 可以设置快照文件的名称,默认是这样配置的:
dbfilename dump.rdb
- 还可以设置这个快照文件存放的路径。比如默认设置就是当前文件夹:
dir ./
2.2.3 复制
redis提供了主从同步功能。
通过slaveof配置项可以控制某一个redis作为另一个redis的从服务器,通过指定IP和端口来定位到主redis的位置。
2.2.4 安全
可以要求redis客户端在向redis-server发送请求之前,先进行密码验证。当redis-server处于一个不太可信的网络环境中时,会用上这个功能。由于redis性能非常高,所以每秒钟可以完成多达15万次的密码尝试,所以最好设置一个足够复杂的密码,否则很容易被黑客破解。
2.2.5 限制
- 可以设置redis同时可以与多少个客户端进行连接。默认情况下为10000个客户端。如果达到了此限制,redis则会拒绝新的连接请求,并且向这些连接请求方发出“max number of clients reached”以作回应。
- 可以设置redis可以使用的内存量。一旦到达内存使用上限,redis将会试图移除内部数据,移除规则可以通过maxmemory-policy来指定。
2.2.6 追加模式
默认情况下,redis会异步的将数据持久化到磁盘。这种模式在大部分应用程序中已被验证是很有效的,但是在一些问题发生时,比如断电,则这种机制可能会导致数分钟的写请求丢失。
2.2.7 LUA脚本
2.2.8 慢日志
redis慢日志是指一个系统进行日志查询超过了指定的时长。这个时长不包括IO操作,比如与客户端的交互、发送响应内容等,而仅包括实际执行查询命令的时间。
针对慢日志,可以设置两个参数,一个是执行时长,单位是微秒,另一个是慢日志的长度。当一个新的命令被写入日志时,最老的一条会从命令日志队列中被移除。
2.2.9 事件通知
redis可以向客户端通知某些事件的发生。
2.2.10 高级配置
暂不展开说明。
3)其他扩展
可参考《查看redis数据_Redis 常见问题总结》(https://blog.csdn.net/weixin_39607935/article/details/111237648)
【部分内容参考自】
- 超强、超详细Redis入门教程:https://blog.csdn.net/liqingtx/article/details/60330555
- Redis:安装和部署、Redis命令详解:https://zhuanlan.zhihu.com/p/51769984
- 查看redis数据_Redis 常见问题总结:https://blog.csdn.net/weixin_39607935/article/details/111237648