Redis 安装及配置解析
一、Redis 特性
速度极快
:官方给出的数据是 10 万次 ops 的读写,这主要归功于这些数据都存在于内存中。由于 Redis 是开源的,当你打开源代码,就会发现 Redis 都是用 C 语言写的,C 语言是最接近计算机语言的代码,而且只有区区 5 万行,保证了 Redis 的速度。同时一个 Redis 只是一个单线程,其真正的原因还是因为单线程在内存中是效率最高的。持久化
:Redis 的持久化可以保证将内存中的数据每隔一段时间就保存于磁盘中,重启的时候会再次加载到内存。持久化方式是 RDB 和 AOF。支持多种数据结构
:分别支持哈希、集合、BitMaps,还有位图(多用于活跃用户数等统计)、HyperLogLog(超小内存唯一值计数,由于只有 12K,是有一定误差范围的)、GEO(地理信息定位)。支持多种编程语言
:支持 Java、PHP、Python、Ruby、Lua、Node.js。功能丰富
:如发布订阅、Lua 脚本、事务、Pipeline(管道,即当指令到达一定数量后,客户端才会执行)。简单
:不依赖外部库、单线程、只有 23000 行 Code。主从复制
:主节点的数据做副本,这是做高可用的基石。高可用和分布式
:Redis-Sentinel(v2.8)支持高可用,Redis-Cluster(v3.0)支持分布式。
二、Redis安装部署
1、从Redis官网下载安装包
[root@localhost src]# wget http://download.redis.io/releases/redis-5.0.4.tar.gz
好习惯:将安装包存放于/usr/local/src
目录下
2、解压缩Redis源码压缩包
[root@localhost src]# tar -xzvf redis-5.0.4.tar.gz
3、建立一个redis目录的软连接,指向redis-5.0.4
[root@localhost src]# ln -s redis-5.0.4 redis
建立一个redis目录的软链接,这样做是为了不把redis目录固定在指定版本上,有利于Redis未来版本升级
4、进入redis目录
[root@localhost src]# cd redis
[root@localhost redis]# make && make install
PS:Redis基于C语言编写,在执行安装前必须安装GCC环境(yum install -y gcc gcc-c++
);
PS:若执行失败(jemalloc/jemalloc.h:没有那个文件或目录
),执行下方命令即可安装;
[root@localhost redis]# make MALLOC=libc
5、验证是否安装成功,查看版本号
[root@localhost bin]# redis-cli -v
redis-cli 5.0.4
PS:版本号第二位如果是奇数,则为非稳定版本(例如2.7、2.9、3.1),如果是偶数,则为稳定版本(例如2.6、2.8、3.0、3.2)。当前奇数版本就是下一个稳定版本的开发版本,例如2.9版本是3.0版本的开发本。
三、Redis启动关闭命令
1、启动及关闭redis服务
- server终端启动
[root@server bin]# pwd
/usr/local/bin
[root@server bin]# redis-server
9667:C 09 Jan 10:58:17.134 # Warning: no config file specified, using the default config. In order to specify a config file use redis-server /path/to/redis.conf
9667:M 09 Jan 10:58:17.135 * Increased maximum number of open files to 10032 (it was originally set to 1024).
_._
_.-``__ ''-._
_.-`` `. `_. ''-._ Redis 3.0.7 (00000000/0) 64 bit
.-`` .-```. ```\/ _.,_ ''-._
( ' , .-` | `, ) Running in standalone mode
|`-._`-...-` __...-.``-._|'` _.-'| Port: 6379
| `-._ `._ / _.-' | PID: 9667
`-._ `-._ `-./ _.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' | http://redis.io
`-._ `-._`-.__.-'_.-' _.-'
|`-._`-._ `-.__.-' _.-'_.-'|
| `-._`-._ _.-'_.-' |
`-._ `-._`-.__.-'_.-' _.-'
`-._ `-.__.-' _.-'
`-._ _.-'
`-.__.-'
- cli终端启动
[root@cli bin]# redis-cli
127.0.0.1:6379> ping
PONG
- 关闭redis服务
只需在客户端终端上执行shutdown
命令,即可退出服务
127.0.0.1:6379> shutdown
- shutdown还有一个参数,代表是否在关闭Redis前,生成持久化文件
127.0.0.1:6379> shutdown nosave|save
2、在远程服务上执行命令
如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令
redis-cli -h host -p port -a password
[root@cli bin]# redis-cli -h 192.168.182.111 -p 6379 -a 123456
PS:启动redis服务,必须先在一台终端上启动redis-server服务,再在另外一台终端启动redis-cli服务
四、redis配置文件详解
[root@server redis]# find / -name redis.conf
/usr/local/src/redis-5.0.4/redis.conf
daemonize yes
#`是否以后台进程运行,此处要改为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 123456
#`配置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
#`是否激活重置哈希`
带上配置文件启动服务:
- 进入到redis安装目录,将redis配置文件
redis.conf
移动至redis启动文件
所在目录下
[root@cli redis-3.0.7]# pwd
/usr/local/src/redis-3.0.7
[root@cli redis-3.0.7]# ls
00-RELEASENOTES COPYING Makefile redis.conf runtest-sentinel tests
BUGS deps MANIFESTO runtest sentinel.conf utils
CONTRIBUTING INSTALL README runtest-cluster src
[root@cli redis-3.0.7]# cp redis.conf /usr/local/bin/
- 启动 redis-server 服务,并查看启动进程(终端A)
[root@cli bin]# redis-server redis.conf
[root@cli bin]# ps -ef | grep redis
root 9791 9631 0 13:09 pts/1 00:00:00 redis-cli
root 14674 1 0 14:23 ? 00:00:00 redis-server 127.0.0.1:6379
root 14681 13264 0 14:23 pts/2 00:00:00 grep --color=auto redis
- 启动 redis-cli 服务(终端B)
[root@cli bin]# redis-cli -h 192.168.182.10 -a 123456
192.168.182.10:6379> ping
PONG
redis相关原理及面试官由浅到深必问的15大问题(高级)
面试中关于Redis的问题看这篇就够了
Redis详解 - 原理和机制