目录
一、Redis简介
1.redis是什么
Redis是一款开源的,ANSI C语言编写的,高级键值(key-value)缓存和支持永久存储NoSQL数据库产品。
Redis采用内存(In-Memory)数据集(DataSet) 。
支持多种数据类型。
运行于大多数POSIX系统,如Linux、*BSD、OS X等。
redis就是非关系型数据库的一种,存储方式是:key:value
2.redis的作用
1.会话保持(键过期)
2.缓存(放在数据库前面,memcache,mongodb)
3.消息队列(kafka)
3.为什么要用Redis
1.redis功能全面
2.redis企业使用率高
4.redis优点
1.高速读写
将所有数据存储在内存,单线程服务,使用C语言
2.部署简单,使用稳定
3.数据类型丰富
String: 字符串类型
Hash: 哈希类型
List: 列表类型
Set: 集合类型
Sorted set: 顺序集合类型
4.支持持久化
将内存的数据写入磁盘
5.多种内存分配及回收策略
6.支持事物、锁
7.消息队列、消息订阅
8.支持高可用
哨兵模式
9.支持分布式分片集群
10.支持的客户端语言很多
java,php,python,nodejs,C语言
11.redis为什么速度快呢:
· 因为存储在内存当中,所以读写数据的时候不会受到磁盘i/o速度的限制,所以速度极快
12.redis为什么要部署多实例呢:
· 因为redis是使用单线程方式,所以无法发挥多核cpu的性能,所以可能通过多实例来完善
13.为什么redis要基于单线程呢?
· 单线程在每秒就能抗住10万+的并发,速度已经非常快了,所以就没有考虑多线程,毕竟也比较复杂,但是在redis4.0版本之后就 在某些功能上进行多线程操作
5.redis帮助
官方网站:https://redis.io/
下载网站:http://download.redis.io/releases/
帮助网站:http://redisdoc.com/
6.缓存服务对比
#Memcached:
1.优点:高性能读写、单一数据类型、支持客户端式分布式集群、一致性hash多核结构、多线程读写性能高。
2.缺点:无持久化、节点故障可能出现缓存穿透、分布式需要客户端实现、跨机房数据同步困难、架构扩容复杂度高
#Redis:
1.优点:高性能读写、多数据类型支持、数据持久化、高可用架构、支持自定义虚拟内存、支持分布式分片集群、单线程读写性能极高
2.缺点:多线程读写较Memcached慢
#Tair:
1.优点:高性能读写、支持三种存储引擎(ddb、rdb、ldb)、支持高可用、支持分布式分片集群、支撑了几乎所有淘宝业务的缓存。
2.缺点:单机情况下,读写性能较其他两种产品较慢
#对比结论:
1.Memcached:多核的缓存服务,更加适合于多用户并发访问次数(访问次数较少的应用场景)。
2.Redis:单核缓存服务,在单节点情况下,更加适合少量用户,多次访问的应用场景。
二、Redis使用场景
1.缓存
放在数据库前面
2.会话保持
登录cookie、session
折扣券,代金券
3.排行榜
4.计数器
论坛帖子点赞点踩
5.社交软件
QQ共同好友,微博共同爱好
6.消息队列
结合ELK做日志收集
三、redis搭建
1.下载软件包
[root@db01 ~]# rz redis-3.2.12.tar.gz
或者
[root@db01 ~]# wget http://download.redis.io/releases/redis-3.2.12.tar.gz
2.安装依赖
[root@db01 ~]# yum install -y gcc gcc-c++
3.解压移动
[root@db01 ~]# tar xf redis-3.2.12.tar.gz
[root@db01 ~]# mv redis-3.2.12 /usr/local/
[root@db01 ~]# ln -s /usr/local/redis-3.2.12 /usr/local/redis
4.安装
[root@db01 ~]# cd /usr/local/redis
[root@db01 redis]# make
5.启动redis
[root@db01 redis]# ./src/redis-server &
[root@db01 redis]# netstat -lntp
tcp 0 0 0.0.0.0:6379 0.0.0.0:* LISTEN 11759/./src/redis-s
6.连接redis
#配置环境变量
[root@db01 redis]# vim /etc/profile.d/redis.sh
export PATH=/usr/local/redis/src:$PATH
#连接
[root@db01 redis]# redis-cli
127.0.0.1:6379>
7.关闭redis
[root@db01 redis]# redis-cli shutdown
11759:M 03 Aug 10:20:20.535 # User requested shutdown...
11759:M 03 Aug 10:20:20.535 * Saving the final RDB snapshot before exiting.
11759:M 03 Aug 10:20:20.546 * DB saved on disk
11759:M 03 Aug 10:20:20.546 # Redis is now ready to exit, bye bye...
[1]+ Done ./src/redis-server
[root@db01 redis]# redis-cli
127.0.0.1:6379> shutdown
11851:M 03 Aug 10:20:59.580 # User requested shutdown...
11851:M 03 Aug 10:20:59.580 * Saving the final RDB snapshot before exiting.
11851:M 03 Aug 10:20:59.584 * DB saved on disk
11851:M 03 Aug 10:20:59.584 # Redis is now ready to exit, bye bye...
not connected> quit
[1]+ Done ./src/redis-server
四、redis配置文件
1.配置
#默认的配置文件
[root@db01 redis]# pwd
/usr/local/redis
[root@db01 redis]# ll
-rw-rw-r-- 1 root root 46695 Jun 13 2018 redis.conf
#创建reids配置文件目录
[root@db01 redis]# mkdir /service/redis/6379 -p
#编写配置文件
[root@db01 redis]# vim /service/redis/6379/redis.conf
bind 172.16.1.51 127.0.0.1 #绑定的主机地址
port 6379 #端口
daemonize no #守护进程模式启动
pidfile /service/redis/6379/redis_6379.pid #指定pid文件
loglevel notice #指定日志级别
logfile /service/redis/6379/redis_6379.log #指定日志文件
databases 16 #设置数据库的数量,默认数据库为0
dbfilename redis_6379.rdb #指定本地持久化文件的文件名,默认是dump.rdb
dir /etc/redis/6379 #持久化数据文件存储地址
2.指定配置文件启动
[root@db01 redis]# redis-server /service/redis/6379/redis.conf
五、redis操作
1.基本操作
1.连接redis
[root@db01 redis]# redis-cli
127.0.0.1:6379>
2.查看所有数据
127.0.0.1:6379> keys *
(empty list or set)
#查看时注意不要轻易使用,如想查看数据,先查看数据量DBSIZE
127.0.0.1:6379> DBSIZE
(integer) 2018041
3.添加数据
127.0.0.1:6379> set k1 v1
OK
4.查看数据
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> get k1
"v1"
5.删除数据
127.0.0.1:6379> keys *
1) "k1"
127.0.0.1:6379> DEL k1
(integer) 1
127.0.0.1:6379> keys *
(empty list or set)
6.修改数据
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k1 v11111
OK
127.0.0.1:6379> get k1
"v11111"
7.追加数据
127.0.0.1:6379> APPEND k1 000000
(integer) 12
127.0.0.1:6379> get k1
"v11111000000"
8.切换库
127.0.0.1:6379> SELECT 1
OK
127.0.0.1:6379[1]> SELECT 2
OK
127.0.0.1:6379[2]> SELECT 3
OK
127.0.0.1:6379> SELECT 16
(error) ERR invalid DB index
2.密码的设置
1.配置文件配置密码
[root@db01 redis]# vim redis.conf
requirepass 123
2.使用密码连接
[root@db01 redis]# redis-cli -a 123
3.登陆后输入密码
[root@db01 redis]# redis-cli
127.0.0.1:6379> AUTH 123
OK
127.0.0.1:6379> DBSIZE
(integer) 2018041
4.redis连接后获取密码
127.0.0.1:6379> CONFIG GET requirepass
1) "requirepass"
2) "123"
5.redis连接后修改密码
127.0.0.1:6379> CONFIG set requirepass 234
OK
[root@db01 redis]# redis-cli
127.0.0.1:6379> DBSIZE
(error) NOAUTH Authentication required.
127.0.0.1:6379> auth 123
(error) ERR invalid password
127.0.0.1:6379> auth 234
OK
3.通用操纵
1.判断key是否存在
127.0.0.1:6379> EXISTS k1
(integer) 1 #存在则返回1
127.0.0.1:6379> EXISTS k2
(integer) 0 #不存在则返回0
状态码:
0 表示这个key不存在
1 表示这个key存在
N 表示有的N个key存在
2.修改key的名字
127.0.0.1:6379> KEYS *
1) "k1"
127.0.0.1:6379> RENAME k1 k100
OK
127.0.0.1:6379> KEYS *
1) "k100"
3.查看数据类型
127.0.0.1:6379> TYPE k100
string
4.设置生存时间
#以秒为单位
127.0.0.1:6379> EXPIRE qiudao 10
(integer) 1
#以毫秒为单位
127.0.0.1:6379> PEXPIRE k100 10000
(integer) 1
5.查看生存时间
127.0.0.1:6379> TTL k100
(integer) 1 #正整数生存时间倒计时
127.0.0.1:6379> TTL k100
(integer) -1 #-1代表没有设置生存时间
127.0.0.1:6379> TTL k100
(integer) -2 #代表设置过生存时间已删除,已过期
6.取消生存时间
127.0.0.1:6379> TTL qiudao
(integer) 93
127.0.0.1:6379> PERSIST qiudao
(integer) 1
127.0.0.1:6379> TTL qiudao
(integer) -1
六、持久化
1.什么是持久化
将内存中的数据写入到磁盘,永久保存
2.持久化的模式
1.RDB模式
2.AOF模式
3.RDB和AOF优缺点
1.RDB和AOF优缺点
RDB: 可以在指定的时间间隔内生成数据集的时间点快照,把当前内存里的状态快照到磁盘上
优点: 压缩格式/恢复速度快,适用于备份,主从复制也是基于rdb持久化功能实现
缺点: 可能会丢失数据
AOF: 类似于mysql的binlog,重写,、每次操作都写一次/1秒写一次,文件中的命令全部以redis协议的格式保存,新命令会被追加到文件的末尾
优点: 安全,有可能会丢失1秒的数据
缺点: 文件比较大,恢复速度慢
4.RDB模式
可以在指定的时间间隔内生成数据集的时间点快照(point-in-time snapshot)
1)RDB工作模式
1.默认情况下,Redis保存数据集快照到磁盘,名为dump.rdb的二进制文件。你可以设置让Redis在N秒内至少有M次数据集改动时保存数据集,或者你也可以手动调用SAVE或者BGSAVE命令。
2.在上文中我们已经在配置文件中做过对应的配置:
例如,这个配置会让Redis在每个60秒内至少有1000次键改动时自动转储数据集到磁盘:
save 60 1000
3.当 Redis 需要保存 dump.rdb 文件时,服务器执行以下操作:
Redis 调用 fork() ,同时拥有父进程和子进程。
子进程将数据集写入到一个临时的 RDB 文件中。当子进程完成对新 RDB 文件的写入时, Redis 用新RDB 文件替换原来的 RDB 文件,并删除旧的 RDB 文件。
4.这种方式使得 Redis 可以从写时复制机制中获益。
2)配置RDB持久化
#编辑配置文件
[root@db01 ~]# vim /service/redis/6379/redis.conf
bind 172.16.1.51 127.0.0.1
port 6379
daemonize yes
pidfile /service/redis/6379/redis_6379.pid
loglevel notice
logfile /service/redis/6379/redis_6379.log
#设置redis密码
requirepass 123
#持久化数据文件存储位置
dir /etc/redis/6379
#rdb持久化数据文件名
dbfilename dump.rdb
#900秒(15分钟)内有1个更改
save 900 1
#300秒(5分钟)内有10个更改
save 300 10
#60秒(1分钟)内有10000个更改
save 60 10000
3)使用RDB文件
1.先停止redis
2.将rdb文件放到指定目录下
3.启动redis
结论:
1.执行shutdown的时候,内部会自动执行bgsave,然后再执行shutdown
2.pkill kill killall 都类似于执行shutdown命令.会触发bgsave持久化
3.恢复的时候,rdb文件名称要和配置文件里写的一样
4.如果没有配置save参数,执行shutdown不会自动bgsave持久化
5.如果没有配置save参数,可以手动执行bgsave触发持久化保存
6.kill -9 redis 不会出发持久化