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触发条件更精细,可达到每做一次操作都做一次持久化。

12-27 16:15