Redis
1、基本概念
基本概念
Redis是一款用于缓存的nosql数据库,用C语言写的,性能放在第一位,稳定安全放在第二位,这是与关系型数据库有区别的地方。与redis同类型的产品有memcache,这两个产品各有优缺点,我们后面会有分析。
Redis的运行比较依赖内存,通常我们在运行Redis的服务器上安装大内存,而且是集群的方式运行,一台服务器可以运行多个Redis实例,配置起来也比较简单。
下面我们使用Redis的3.2.12版本来演示,官网地址:www.redis.io 具体下载地址下载地址。
面试点
- 持久化
- 数据类型
- 缓存穿透
memcache&redis
memcache是一款比较极端的软件,追求极速,安全性和扩展性都不是太好,而且只支持键值对。
redis支持多种数据类型,持久化,自带高可用。
tair是二次开发的memcache,淘宝的缓存应用,单机跑没有优势,分布式性能非常好。
总结:
memcached:多核的缓存服务,更加适合于多用户并发访问次数较少的应用场景,适合淘宝,比如双11。
redis:单核的缓存服务,在单节点的情况下,更适合于少量用户多次访问,集群可弥补这一缺陷,redis一般都是集群跑,比如新浪微博。
2、基本操作
安装&启动&基本配置
//基本的安装启动
[root@NFS nosql]# ls
redis-3.2.12.tar.gz
[root@NFS nosql]# tar xzf redis-3.2.12.tar.gz
[root@NFS nosql]# ls
redis-3.2.12 redis-3.2.12.tar.gz
[root@NFS nosql]# mv redis-3.2.12 redis
[root@NFS nosql]# ls
redis redis-3.2.12.tar.gz
[root@NFS nosql]# cd redis
[root@NFS redis]# make
src/redis-server & #启动并放入后台
[root@NFS src]# vim /etc/profile
[root@NFS src]# source /etc/profile
[root@NFS src]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin:/nosql/redis/src
[root@NFS src]# redis-cli 连接进入mysql
127.0.0.1:6379>
//自定义配置文件
[root@NFS ~]# mkdir /nosql/6379
[root@NFS ~]# cd /nosql/6379
[root@NFS 6379]# vim redis.conf
daemonize yes #是否后台运行
port 6379
logfile /nosql/6379/redis.log
dir /nosql/6379 #持久化文件存储位置
dbfilename dump.rdb #RDB持久化数据文件
//先关闭运行的redis
[root@NFS 6379]# redis-cli
127.0.0.1:6379> shutdown [NOSAVE|SAVE]
not connected> exit
//然后应用配置文件
[root@NFS ~]# redis-server /nosql/6379/redis.conf
//设置并查看键值对
127.0.0.1:6379> set name zhangsan
OK
127.0.0.1:6379> get name
"zhangsan"
安全配置
刚安装好不允许远程用户登录,只允许本地登录。redis没有用户的概念,只有密码。怎样才能让远程用户也可以使用呢?在配置文件里面加一行,如下所示:
[root@NFS ~]# cat /nosql/6379/redis.conf
daemonize yes
port 6379
logfile /nosql/6379/redis.log
dir /nosql/6379
dbfilename dump.rdb
bind 127.0.0.1 192.168.80.24 #默认就只侦听127,加上网卡的地址
//更改完配置文件之后,先停止当前REDIS,然后再加载配置文件
[root@NFS ~]# redis-cli
127.0.0.1:6379> shutdown
not connected> exit
[root@NFS ~]# redis-server /nosql/6379/redis.conf
[root@NFS ~]# redis-cli -h 192.168.80.24
192.168.80.24:6379> set a 2
OK
//给Redis配置个密码
[root@NFS ~]# redis-cli
127.0.0.1:6379> shutdown
not connected> exit
[root@NFS ~]# vim /nosql/6379/redis.conf
daemonize yes
port 6379
logfile /nosql/6379/redis.log
dir /nosql/6379
dbfilename dump.rdb
bind 127.0.0.1 192.168.80.24
requirepass cba-123 #配置个密码
[root@NFS ~]# redis-server /nosql/6379/redis.conf
//在命令行当中通过-a输入用户名和密码
[root@NFS ~]# redis-cli -a cba-123
127.0.0.1:6379> set b 2
OK
//进入redis再输入密码也可以
[root@NFS ~]# redis-cli
127.0.0.1:6379> AUTH cba-123
OK
127.0.0.1:6379> set b 3
OK
在线配置
//在REDIS内部获取配置文件的路径
127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/nosql/6379"
//在redis内部查看绑定了哪个地址
127.0.0.1:6379> CONFIG GET bind
1) "bind"
2) "127.0.0.1 192.168.80.24"
//在redis内部获取所有的配置文件的内容
127.0.0.1:6379> CONFIG GET * 所有
//在线修改密码
127.0.0.1:6379> CONFIG SET requirepass abc-123
OK #立即生效、临时生效、重启失效
3、持久化
持久化是Redis的核心功能之一,是比memcache强大的地方,本来以为Redis的持久化是一种了不起的功能,原来Redis所谓的持久化就是将内存中的内容下刷到硬盘上,缓存产品的运行都是非常依赖内存的,因为只有数据在内存当中才能高效的响应,默认Redis的持久化是关闭的,默认所有的数据都不会保存到磁盘当中。
Redis的持久化分为两类:RDB和AOF。
RDB
RDB的持久化就是将内存当中的数据通过快照的方式下刷到硬盘当中,这种方式速度比较快,适合做备份,但是做快照的时候并不会对内存中的内容加锁,所以有可能会导致部分数据在做快照时没有被照上。另外,有一点值得注意,就是Redis的主从复制也是基于RDB的方式。
RDB的触发又分为手工和自动两种方式。
手工就是在Redis内部敲一个命令“save”,通知Redis将内存中的内容下刷到硬盘上,那么下刷到什么地方了呢?我们在配置文件当中有一个dbfilename dump.rdb
文件,就是下刷到这个文件里面了。
自动就是我们在配置文件当中设置一个触发条件,满足条件条件之后就会自动下刷到硬盘上,下面演示的是官方给的条件,比如宽松,我们可以自己定义一些严格的,但是注意,如果下刷的太频繁,一定会影响到Redis的性能的,而且违背了Redis设计的初衷。
[root@NFS ~]# cat /nosql/6379/redis.conf
daemonize yes
port 6379
logfile /nosql/6379/redis.log
dir /nosql/6379
dbfilename dump.rdb
bind 127.0.0.1 192.168.80.24
requirepass cba-123
save 900 1
save 300 10
save 60 10000
触发条件解释:
900(15分钟)秒之内有一个更改就做一次save
300(5分钟)秒之内有10个更更改
60秒内有100000个更改
AOF
AOF(apped only log file)只追加日志文件
AOF持久化会记录服务器执行的所有写操作命令,并在服务器启动时,通过重新执行这些命令来还原数据。
优点:最大程度保证数据不丢,类似mysql的binlog日志
缺点:日志记录量比较大
AOF的触发条件在三种(我们选择一种即可):
1、appendfsync always #触发条件,每个写操作都要写入到磁盘
2、appendfsync everysec #每秒一次,可能会丢(常用)
3、appendfsync no #默认是on,没有触发条件,交给操作系统去判断,不能用
[root@NFS ~]# cat /nosql/6379/redis.conf
daemonize yes
port 6379
logfile /nosql/6379/redis.log
dir /nosql/6379
dbfilename dump.rdb
bind 127.0.0.1 192.168.80.24
requirepass cba-123
appendonly yes #开启aof持久化功能
appendfsync everysec
区别
我们在redis如果多次给一个键赋予不同的值,那么就会覆盖上一次的值,如下所示:
set name zhanghe
set name zhangjia
RDB只会只留最后一次赋值,即name等于zhangjia
而AOF会把所有的过程都保留下来,先执行set name zhanghe
,再执行
set name zhangjia
,所以我们说AOF的的记录量是比较大的,而且AOF触发条件更精细,可达到每做一次操作都做一次持久化。