1. Redis基础
Redis是一款,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。
支持多种(5种)数据类型:string,hash,list,set,zset。
2. 功能
高速读写,数据类型丰富,支持持久化,多种内存分配和回收策略,支持事务,消息队列、消息订阅,支持高可用,支持分布式集群。
企业缓存数据库解决方案
Memcached、Redis、Tair(淘宝缓存)
Memcached:多核的缓存服务,更加适合于多用户并发访问(访问次数少的应用场景)
Redis:单核的缓存服务,在单节点情况下,更加适合少量用户,多次访问的场景
3. Redis单机安装部署
[root@docker02 ~]# mkdir /data/redis -p
[root@docker02 ~]# cd /data/redis
[root@docker02 redis]# wget http://download.redis.io/releases/redis-5.0.2.tar.gz
[root@docker02 redis]# tar xf redis-5.0.2.tar.gz
[root@docker02 redis]# ln -s redis-5.0.2 redis
[root@docker02 redis]# ll
total 1912
lrwxrwxrwx 1 root root 11 Apr 17 17:02 redis -> redis-5.0.2
drwxrwxr-x 6 root root 4096 Nov 22 2018 redis-5.0.2
-rw-r--r-- 1 root root 1952989 Nov 22 2018 redis-5.0.2.tar.gz
[root@docker02 redis]# cd redis
## 编译
[root@docker02 redis]# make
## 添加环境变量
## 此处填写的是本机redis-server的安装路径
[root@docker02 ~]# cat /etc/profile.d/redis.sh
export PATH="/data/redis/redis/src:$PATH"
## 刷新新增的环境变量
[root@docker02 ~]# source /etc/profile.d/redis.sh
4. Redis的基本配置
[root@docker02 ~]# mkdir /data/redis/6379/logs -p
[root@docker02 ~]# cd /data/redis/6379/
[root@docker02 6379]# cat redis.conf
daemonize yes
pidfile /data/redis/6379/redis-6379.pid
port 6379
bind 127.0.0.1
timeout 300
loglevel notice
logfile /data/redis/6379/logs/redis-6379.log
syslog-enabled no
databases 16
requirepass redis.123
redis配置文件详解
### redis配置文件详解
daemonize yes #是否以后台进程运行
pidfile /var/run/redis/redis-server.pid #pid文件位置
port 6379 #监听端口
bind 127.0.0.1 #绑定地址,如外网需要连接,设置0.0.0.0,多个使用空格
timeout 300 #连接超时时间,单位秒
loglevel notice #日志级别,分别有:
# debug :适用于开发和测试
# verbose :更详细信息
# notice :适用于生产环境
# warning :只记录警告或错误信息
logfile /var/log/redis/redis-server.log #日志文件位置
syslog-enabled no #是否将日志输出到系统日志
databases 16#设置数据库数量,默认数据库为0
############### 快照方式 ###############
save 900 1 #在900s(15m)之后,至少有1个key发生变化,则快照
save 300 10 #在300s(5m)之后,至少有10个key发生变化,则快照
save 60 10000 #在60s(1m)之后,至少有1000个key发生变化,则快照
rdbcompression yes #dump时是否压缩数据
dir /var/lib/redis #数据库(dump.rdb)文件存放目录
############### 主从复制 ###############
slaveof <masterip> <masterport> #主从复制使用,用于本机redis作为slave去连接主redis
masterauth <master-password> #当master设置密码认证,slave用此选项指定master认证密码
slave-serve-stale-data yes #当slave与master之间的连接断开或slave正在与master进行数据同步时,如果有slave请求,当设置为yes时,slave仍然响应请求,此时可能有问题,如果设置no时,slave会返回"SYNC with master in progress"错误信息。但INFO和SLAVEOF命令除外。
############### 安全 ###############
requirepass foobared #配置redis连接认证密码
############### 限制 ###############
maxclients 128#设置最大连接数,0为不限制
maxmemory <bytes>#内存清理策略,如果达到此值,将采取以下动作:
# volatile-lru :默认策略,只对设置过期时间的key进行LRU算法删除
# allkeys-lru :删除不经常使用的key
# volatile-random :随机删除即将过期的key
# allkeys-random :随机删除一个key
# volatile-ttl :删除即将过期的key
# noeviction :不过期,写操作返回报错
maxmemory-policy volatile-lru#如果达到maxmemory值,采用此策略
maxmemory-samples 3 #默认随机选择3个key,从中淘汰最不经常用的
############### 附加模式 ###############
appendonly no #AOF持久化,是否记录更新操作日志,默认redis是异步(快照)把数据写入本地磁盘
appendfilename appendonly.aof #指定更新日志文件名
# AOF持久化三种同步策略:
# appendfsync always #每次有数据发生变化时都会写入appendonly.aof
# appendfsync everysec #默认方式,每秒同步一次到appendonly.aof
# appendfsync no #不同步,数据不会持久化
no-appendfsync-on-rewrite no #当AOF日志文件即将增长到指定百分比时,redis通过调用BGREWRITEAOF是否自动重写AOF日志文件。
############### 虚拟内存 ###############
vm-enabled no #是否启用虚拟内存机制,虚拟内存机将数据分页存放,把很少访问的页放到swap上,内存占用多,最好关闭虚拟内存
vm-swap-file /var/lib/redis/redis.swap #虚拟内存文件位置
vm-max-memory 0 #redis使用的最大内存上限,保护redis不会因过多使用物理内存影响性能
vm-page-size 32 #每个页面的大小为32字节
vm-pages 134217728 #设置swap文件中页面数量
vm-max-threads 4 #访问swap文件的线程数
############### 高级配置 ###############
hash-max-zipmap-entries 512 #哈希表中元素(条目)总个数不超过设定数量时,采用线性紧凑格式存储来节省空间
hash-max-zipmap-value 64 #哈希表中每个value的长度不超过多少字节时,采用线性紧凑格式存储来节省空间
list-max-ziplist-entries 512 #list数据类型多少节点以下会采用去指针的紧凑存储格式
list-max-ziplist-value 64 #list数据类型节点值大小小于多少字节会采用紧凑存储格式
set-max-intset-entries 512 #set数据类型内部数据如果全部是数值型,且包含多少节点以下会采用紧凑格式存储
activerehashing yes #是否激活重置哈希
5. 启动redis-server
## 上一步的刷新环境变量后,就可以在任意目录下使用redis的命令
[root@docker02 ~]# redis-server /data/redis/6379/redis.conf
[root@docker02 ~]# ps -ef|grep 'redis'
root 5447 1 0 11:07 ? 00:00:00 redis-server 127.0.0.1:6379
6. 验证redis-server
[root@docker02 ~]# redis-cli -h 127.0.0.1 ## 登陆,默认6379
127.0.0.1:6379> auth redis.123 ## 密码验证
OK
127.0.0.1:6379> keys * ## 查看keys值
(empty list or set)
7. Redis单机多实例安装部署
## 同一台主机启动一个端口号为6380的redis-server
[root@docker02 ~]# mkdir /data/redis/6380/logs -p
[root@docker02 ~]# cat /data/redis/6380/redis.conf
daemonize yes
pidfile /data/redis/6380/redis-6380.pid
port 6380
bind 127.0.0.1
timeout 300
loglevel notice
logfile /data/redis/6380/logs/redis-6380.log
syslog-enabled no
databases 16
requirepass redis.456
[root@docker02 ~]# redis-server /data/redis/6380/redis.conf
[root@docker02 logs]# ps -ef|grep 'redis'
root 5447 1 0 11:07 ? 00:00:00 redis-server 127.0.0.1:6379
root 7830 1 0 11:15 ? 00:00:00 redis-server 127.0.0.1:6380
[root@docker02 6380]# redis-server /data/redis/6380/redis.conf
[root@docker02 6380]# redis-cli -h 127.0.0.1 -p 6380
127.0.0.1:6380> auth redis.456
OK
127.0.0.1:6380> keys *
(empty list or set)
## 同一台主机启动一个端口号为6381的redis-server
[root@docker02 ~]# mkdir /data/redis/6381/logs -p
[root@docker02 ~]# cat /data/redis/6381/redis.conf
daemonize yes
pidfile /data/redis/6381/redis-6381.pid
port 6381
bind 127.0.0.1
timeout 300
loglevel notice
logfile /data/redis/6381/logs/redis-6381.log
syslog-enabled no
databases 16
requirepass redis.789
[root@docker02 ~]# redis-server /data/redis/6381/redis.conf
[root@docker02 6380]# ps -ef|grep 'redis'
root 5447 1 0 11:07 ? 00:00:00 redis-server 127.0.0.1:6379
root 8507 1 0 11:17 ? 00:00:00 redis-server 127.0.0.1:6380
root 9096 1 0 11:19 ? 00:00:00 redis-server 127.0.0.1:6381
[root@docker02 ~]# redis-cli -h 127.0.0.1 -p 6381
127.0.0.1:6381> auth redis.789
OK
127.0.0.1:6381> keys *
(empty list or set)