当客户端调用getUser接口的查询用户信息的时候,执行顺序1、2、3、4;由于用户信息存放在DB中,所以2、3就有一次磁盘IO;这个看似非常简单业务逻辑,但是当你做架构设计的时候往往要考虑最坏的场景,或者当成千上万的用户频繁的调用这个接口应该怎么处理?如果按照上图这样的架构处理,这个看似简单业务的接口会使整个系统变慢,这样用户的请求就会长时间得不到响应.
图2解说:
当用客户端调用getUser接口查询用户信息的时候,getUser接口直接去redis中查询,如果redis中有该用户信息,直接返回,避免查询DB,从而避免了磁盘IO操作;如果redis中没有该用户信息,则从DB查询,并且把该用户信息存放到redis中;这样在服务接口(getUser)和DB中间,增加了一个缓存层;看似逻辑增加了,其实当面对高并发的时候,比如上边提到的频繁查询用户信息的情况,只有第一次查询有磁盘IO操作,以后只要redis中存在就没必要再查询数据库了;由于没有了磁盘IO操作,并且redis所有数据都在内存操作,所以速度回大大提升。
redis相对于memcache提供了更丰富的数据类型,根据不同的业务场景可以选在不同的数据类型;redis本身也提供了主从模式、集群模式;也有第三方的比如codis提供了redis集群解决方案。
下载说明:
在https://redis.io/download下载需要的redis版本,目前5.0版本是比较稳定的,4.0版本目前是经过生产验证最多的版本
下载完后,复制到要安装的机器上进行以下操作:
(1.解压安装包:
[root@mini ~]# tar xf redis-4.0.11.tar.gz -C /usr/local ///解压到你指定的路径
(2.进入解压的文件中编译安装:
[root@mini ~]# cd /usr/local/redis-4.0.11/
[root@mini redis-4.0.11]# make -j 4 ///4表示cpu数,实际据服务器配置决定
问题:
redis编译报致命错误:jemalloc/jemalloc.h:没有那个文件或目录
解决:编译时加一个参数:
make MALLOC=libc
(3.启动服务:
图3出现界面说明安装成功了[root@mini redis-4.0.11]# ./src/redis-server /usr/local/redis-4.0.11/redis.conf & //注意安装路径
(4.打开操作界面:
[root@mini redis-4.0.11]# ./src/redis-cli -h 172.0.0.0.1 ////后面写本机ip
(5.配置文件:
[root@mini redis-4.0.11]# vim /usr/local/redis-4.0.11/redis.conf
# Note that Redis will write a pid file in /var/run/redis.pid when daemonized.
daemonize yes
# 默认情况下 redis 不是作为守护进程运行的,如果你想让它在后台运行,你就把它改成 yes。
# nothing bad happens, the server will start and run normally.
pidfile /var/run/redis_6379.pid
# 当redis作为守护进程运行的时候,它会把 pid 默认写到 /var/run/redis.pid 文件里面,你也可以指定写入的位置
# in order to get the desired effect.
tcp-backlog 511
# TCP 监听的最大容纳数量
# 在高并发的环境下,你需要把这个值调高以避免客户端连接缓慢的问题。
# Examples:
bind 127.0.0.1 ::1 192.168.1.100
# 默认情况下,redis 在 server 上所有有效的网络接口上监听客户端连接。
# 你如果只想让它在一个网络接口上监听,那你就绑定一个IP或者多个IP。
# Close the connection after a client is idle for N seconds (0 to disable)
timeout 0
# 指定在一个 client 空闲多少秒之后关闭连接(0 就是不管它)
# Redis default starting with Redis 3.2.1.
tcp-keepalive 0
# tcp 心跳包
# 如果设置为非零,则在与客户端缺乏通讯的时候使用 SO_KEEPALIVE 发送 tcp acks 给客户端。
# debug (a lot of information, useful for development/testing)
# verbose (many rarely useful info, but not a mess like the debug level)
# notice (moderately verbose, what you want in production probably)
# warning (only very important / critical messages are logged)
loglevel notice
# 定义日志级别(debug,verbose,notice,warning)
# output for logging but daemonize, logs will be sent to /dev/null
logfile ""
# 指定日志文件的位置
# Set the number of databases. The default database is DB 0, you can select
# a different one on a per-connection basis using SELECT <dbid> where
# dbid is a number between 0 and 'databases'-1
databases 16
# 设置数据库的数目。
# 默认数据库是 DB 0,你可以在每个连接上使用 select 命令选择一个不同的数据库,
# 但是 dbid 必须是一个介于 0 到 databasees - 1 之间的值
# However if you have setup your proper monitoring of the Redis server
# and persistence, you may want to disable this feature so that Redis will
# continue to work as usual even if there are problems with disk,
# permissions, and so forth.
stop-writes-on-bgsave-error yes
# 默认情况下,如果 redis 最后一次的后台保存失败,redis 将停止接受写操作,
# 这样以一种强硬的方式让用户知道数据不能正确的持久化到磁盘,
# 否则就会没人注意到灾难的发生。
# 如果后台保存进程重新启动工作了,redis 也将自动的允许写操作。
# the dataset will likely be bigger if you have compressible values or keys.
rdbcompression yes
# 是否在 dump .rdb 数据库的时候使用 LZF 压缩字符串
# 默认都设为 yes
# 如果你希望保存子进程节省点 cpu ,你就设置它为 no ,
# 不过这个数据集可能就会比较大
# tell the loading code to skip the check.
rdbchecksum yes
# 是否校验rdb文件
# The filename where to dump the DB
dbfilename dump.rdb
# 设置 dump 的文件位置
# Note that you must specify a directory here, not a file name.
dir ./
#指定本地数据库存放目录
slaveof <masterip> <masterport>
#设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
masterauth <master-password>
#当master服务设置了密码保护时,slave服务连接master的密码
equirepass foobared
#设置Redis连接密码,如果配置了连接密码,客户端在连接Redis时需要通过AUTH <password>命令提供密码,默认关闭
maxclients 10000
#设置同一时间最大客户端连接数,默认无限制,Redis可以同时打开的客户端连接数为Redis进程可以打开的最大文件描述符数,如果设置 maxclients 0,表示不作限制。当客户端连接数到达限制时,Redis会关闭新的连接并向客户端返回max number of clients reached错误信息
maxmemory <bytes>
#指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作。Redis新的vm机制,会把Key存放内存,Value会存放在swap区
appendonly no
指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendfilename "appendonly.aof"
#指定更新日志文件名,默认为appendonly.aof
appendfsync everysec
#指定更新日志条件,共有3个可选值:
no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折衷,默认值)
activerehashing yes
指定是否激活重置哈希,默认为开启
include /path/to/local.conf
#指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件
以上就是redis的基本配置
网友评论