一、redis是什么
redis是一种基于键值对的NoSQL数据库,与很多键值对数据库不同,redis中的值可以有string,hash,list,set,zset,geo等多种数据库结构和算法组成;因为redis会将所有数据都放在内存中,所以他的读写效率非常惊人,不仅如此,redis还可以将内存中的数据利用快照和日志的形式保存到磁盘上,还提供了键过期,发布订阅,流水线,事务等附加功能。
二、redis重要特性
1.速度快
Redis 所有的数据都存放在内存中,读写速度更快;
Redis 使用c语言实现,更接近底层语言;
Redis 使用单进程架构,源代码编写优秀,单进程执行命令,占用服务器资源更少。
2.基于键值对的数据结构服务器
5种数据结构:字符串,哈希,列表,集合,有序集合。
3.丰富的功能
提供了键过期功能,可以实现缓存,例如session的缓存时间设置;
提供了发布订阅功能,可以实现消息系统;
提供了pipeline功能,客户端可以将一批命令一次性传到 Redis,减少了网络开销。
4.简单稳定
源码很少,3.0 版本以后 5 万行左右,使用单线程模型法,是的Redis服务端处理模型变得简单,不依赖操作系统的中的类库
5.客户端语言多
java,PHP,python,C,C++,Nodejs等
6.数据持久化
把所有的数据都存在内存中,通过RDB和AOF两种不同的方式来完成持久化写入磁盘。
7.主从复制
自带主从复制功能,需要手动配置
8.高可用和分布式
高可用:哨兵 redis-sentinel
分布式:集群 redis-cluster
三、redis应用场景
1.缓存-键过期时间
a.缓存session会话
b.缓存用户信息,找不到再去mysql查,查到然后回写到redis
c.优惠卷过期时间
2.排行榜-列表&有序集合
a.热度排名排行榜
b.发布时间排行榜
3.计数器应用-天然支持计数器
a.帖子浏览数
b.视频播放次数
c.商品浏览数
4.社交网络-集合
a.踩/赞
b.粉丝
c.共同好友/喜好
d.推送
e.打标签
5.消息队列系统-发布订阅
配合elk实现日志收集
四、redis安装部署
1.安装gcc编程语言译器,C语言环境主备
yum install gcc -y
2.清楚历史编译缓存(可做可不做)
make distclean && make
3.创建数据存储目录以及安装包目录
mkdir -p /data/soft
mkdir -p /data/redis_6379
mkdir -p /opt/redis_6379/{conf,pid,logs}
4.下载redis数据库tar包并编译安装
cd /data/soft/ #进入软件暗转目录
wget http://download.redis.io/releases/redis-3.2.9.tar.gz #官网下载redis-3.2.9软件包
tar zxf redis-3.2.9.tar.gz -C /opt/ #解压到指定目录
ln -s /opt/redis-3.2.9/ /opt/redis #设置软连接便于日后管理使用
cd /opt/redis #进入redis数据库目录
make && make install #进行编译安装
说明:在编译安装的过程中一般分为三步,第一步为./configure,设置编译安装的文件路径及功能模块,第二部make,基于第一步的Makefile文件将源代码编译为二进制文件,第三步make install将二进制文件复制到系统中,并设置应用环境。而此redis安装过程中,不涉及第一步./configure的原因为,在下载的tar包中就已经包含有./configure设置好的Makefile文件,因此直接进行make&&make install即可。
5.配置文件
cat >/opt/redis_6379/conf/redis_6379.conf <
说明:此配置文件为最基础文件,且指定安装到/opt/redis_6379/conf/redis_6379.conf文件中,而redis数据库默认的配置文件需要执行tar包中的安装服务脚本:/opt/redis/utils/install_server.sh(根据自己的软件包安装路径和软连接自行查找该脚本),执行过程如下
执行完毕后默认配置文件路径:/etc/redis/6379.conf,并自动启动redis数据库
6.启动redis并检查
redis-server /opt/redis_6379/conf/redis_6379.conf
ps -ef|grep redis
netstat -lntup|grep redis
7.登录redis数据库
redis-cli
五、redis全局命令操作命令----针对5种数据类型
1.插入key及查看key内容
插入键值:set 键值名称 键值内容
查看键值:get 键值名称
例子:
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> get k1
"v1"
127.0.0.1:6379> get k2
"v2"
2..查看所有的key!线上禁止使用!
查看所有键:keys *
127.0.0.1:6379> keys *
1) "k3"
2) "k2"
3) "k1"
说明:由于在生产环境中key值数量一般较为庞大,直接全部查看,会导致占用服务器全部资源,如内存、IO等最终会将服务器卡死至宕机;如必须使用请在从库中使用
3.查看有多少个key,注意是估值
估计key数量:DBSIZE
127.0.0.1:6379> DBSIZE
(integer) 3
输出结果显示3,代表key值的数量估值为3个
4.查看是否存在这个key
查看key是否存在:EXISTS 键值名称
127.0.0.1:6379> EXISTS k1
(integer) 1
127.0.0.1:6379> EXISTS k4
(integer) 0
127.0.0.1:6379> EXISTS k1 k2 k3
(integer) 3
127.0.0.1:6379> EXISTS k1 k2 k3 k4
(integer) 3
输出显示的状态码含义:
0:表示这个key不存在
1:表示这个key存在
N:表示有的N个key存在
5.删除key
删除键:DDL 键值名称
删除当前数据库所有键:flushdb
删除所有数据库所有键:flushall
127.0.0.1:6379> DEL k1
(integer) 0
127.0.0.1:6379> DEl k1
(integer) 1
127.0.0.1:6379> DEL k2 k3
(integer) 2
输出显示的状态码含义:
0:表示这个key不存在
1:表示这个key存在,并且删除成功
N:表示有的N个key存在,并且删除N个Key
6.键过期
a.查看键是否过期:TTL 键值名称
127.0.0.1:6379> set k1 v1
OK
127.0.0.1:6379> set k2 v2
OK
127.0.0.1:6379> TTL k1
(integer) -1
127.0.0.1:6379> TTL k3
(integer) -2
127.0.0.1:6379> TTL k2
(integer) 88
127.0.0.1:6379> TTL k2
(integer) 87
说明:TTL是生命周期的意思,过期后的key直接会被删除,没有任何提示
输出显示的状态码含义:
-1:这个key存在,并且永不过期
-2:这个key不存在
N:这个key存在,并且在N秒后过期
b.设置过期时间:EXPIRE 键值名称 过期时间(默认秒)
127.0.0.1:6379> EXPIRE k1 10
(integer) 1
127.0.0.1:6379> TTL k1
(integer) 9
127.0.0.1:6379> TTL k1
(integer) 8
127.0.0.1:6379> TTL k1
(integer) 7
...
127.0.0.1:6379> TTL k1
(integer) 1
127.0.0.1:6379> TTL k1
(integer) 0
127.0.0.1:6379> TTL k1
(integer) -2
说明:当一个键值对还在其生命周期内时,若我们重新插入这个key的内容,则该key的生命周期将重新定义,例如:
127.0.0.1:6379> TTL k3
(integer) -1
127.0.0.1:6379> EXPIRE k3 20
(integer) 1
127.0.0.1:6379> EXPIRE k3 20
(integer) 1
127.0.0.1:6379> TTL k3
(integer) 17
127.0.0.1:6379> set k3 v3
OK
127.0.0.1:6379> TTL k3
(integer) -1
此时k3键值对的生命周期状态码又变更为-1
c.取消过期时间:PERSIST 键值名称
127.0.0.1:6379> EXPIRE k1 100
(integer) 1
127.0.0.1:6379> TTL k1
(integer) 98
127.0.0.1:6379> TTL k1
(integer) 97
127.0.0.1:6379> PERSIST k1
(integer) 1
127.0.0.1:6379> TTL k1
(integer) -1
127.0.0.1:6379> PERSIST k1
(integer) 0
输出显示的状态码含义为:
0:表示这个key不存在
1:表示这个key存在,并且设置过期时间成功
说明:当使用PERSIST取消key的过期时间时,不改变key的内容也无需知道key的内容即可直接修改,相比较使用set从新插入key内容而重置key的生命周期而言,更加安全稳定,因为若不需要修改key内容时,使用set插入必须与原内容一致,因此 存在不稳定性
六、Redis字符串操作命令
1.设置一个key:set 键值名称 键值内容
127.0.0.1:6379> set k1 v1
OK
说明:set不仅仅可以插入简单的字符串,还可以插入大批量的字符串信息,例如将一个文件的内容全部插入到redis数据库中,但文件内容必须为单独的一行数据,不可多行并且在数据库中查看时,内容为人类不可读的信息,导出后方可正常显示,使用>指定路径,即可导出key内容至该文件
echo '此处省略一万字' > ./test.txt
redis-cli set file $(cat ./test.txt)
OK
redis-cli get file
"\xe6\xad\xa4\xe5\xa4\x84\xe7\x9c\x81\xe7\x95\xa5\xe4\xb8\x80\xe4\xb8\x87\xe5\xad\x97"
redis-cli -a 123456 get file > ./show.txt
cat ./show.txt
此处省略一万字
2.查看一个key:get 键值名称
127.0.0.1:6379> get k1
"v1"
3.设置多个key:mset 键值名称1 键值内容1 键值名称2 键值内容2
127.0.0.1:6379> MSET k1 v1 k2 v2 k3 v3
OK
4.查看多个key:mget 键值名称1 键值名称2 键值名称3
127.0.0.1:6379> MGET k1 k2 k3
1) "v1"
2) "v2"
3) "v3"
5.天然计数器
说明:此功能主要是计数,统计或赞踩文章等数字操作,因此键值内容必须为数字,并且只能为整数
a.加1:INCR 键值名称
127.0.0.1:6379> set k1 1
OK
127.0.0.1:6379> INCR k1
(integer) 2
127.0.0.1:6379> get k1
"2"
b.加N:INCRBY 键值名称 增加数值
127.0.0.1:6379> INCRBY k1 100
(integer) 102
127.0.0.1:6379> get k1
"102"
c.减N:INCRBY 键值名称 减少数值
127.0.0.1:6379> INCRBY k1 -1
(integer) 101
127.0.0.1:6379> get k1
"101"
127.0.0.1:6379> INCRBY k1 -100
(integer) 1
127.0.0.1:6379> get k1
"1"
七、Redis列表命令
1.插入列表:
从列表左侧插入数据:LPUSH 列表名称 插入内容
从列表右侧插入数据:RPUSH 列表名称 插入内容
说明:列表其实就是一个key
127.0.0.1:6379> LPUSH list1 1 2 3
(integer) 3
127.0.0.1:6379> RPUSH list1 6 5 4
(integer) 6
列表中内容为:3 2 1 6 5 4
2.查看列表的长度:llen 列表名称
127.0.0.1:6379> LLEN list1
(integer) 6
输出结果显示为:列表list1拥有6个元素
3.查看列表的内容:LRANGE 列表名称 查看范围
127.0.0.1:6379> LRANGE list1 0 -1 #代表查看列表所有元素,即内容
1) "3"
2) "2"
3) "1"
4) "4"
5) "5"
6) "6"
127.0.0.1:6379> LRANGE list1 0 2 #代表查看列表中第一个到第三个元素,redis数据库中计数从0开始
1) "3"
2) "2"
3) "1"
4.删除列表元素:
从列表左侧删除:LPOP 列表名称
从列表右侧删除:RPOP 列表名称
删除列表全部内容:DEL 列表名称
127.0.0.1:6379> LPOP list1
"3"
127.0.0.1:6379> LRANGE list1 0 -1
1) "2"
2) "1"
3) "6"
4) "5"
5) "4"
127.0.0.1:6379> RPOP list1
"4"
127.0.0.1:6379> LRANGE list1 0 -1
1) "2"
2) "1"
3) "6"
4) "5"
127.0.0.1:6379> DEL list1
(integer) 1
127.0.0.1:6379> LRANGE list1 0 -1
(empty list or set)
八、Readis哈希类型操作命令
主要用于MySQL数据库的缓存时使用,通过哈希映射的方式于MySQL数据库形成连接,Hash看起来就像一个’hash’的样子.由键值对组成。
1.哈希操作命令
a.HSET:设置一个哈希类型key
b.HMSET:设置hash中的多个域
c.HGET:取回单个域
d.HMGET:取回多个域
e.HGETALL:取回所有的值
举例说明:
127.0.0.1:6379> hset user:1 name zs
(integer) 1
127.0.0.1:6379> hmset user:1 age 18 job it
OK
127.0.0.1:6379> hget user:1 name
"zs"
127.0.0.1:6379> hmget user:1 name age
1) "zs"
2) "18"
127.0.0.1:6379> hgetall user:1
1) "name"
2) "zs"
3) "age"
4) "18"
5) "job"
6) "it"
2.应用场景
Redis数据库中的哈希类型主要就是应用于与MySQL数据库的缓存设备,通过哈希的映射,将Redis数据库的数据格式转化成MySQL数据库中可识别的数据格式,使在Redis上的缓存数据逐步的写入到磁盘中,减少MySQL的性能消耗,发挥哈希数据类型的最大的作用。
举例说明
第一步:在MySQL数据库中生成简易的user表
create database test_user;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
| test_event |
| test_user |
+--------------------+
9 rows in set (0.00 sec)
mysql> use test_user
Database changed
mysql>
mysql> create table user (
uid int not null primary key auto_increment comment '编号',
name varchar(10) not null comment'姓名',
age tinyint not null comment ' 年龄',
job varchar(10) not null comment '工作');
Query OK, 0 rows affected (0.02 sec)
mysql> show tables;
+---------------------+
| Tables_in_test_user |
+---------------------+
| user |
+---------------------+
1 row in set (0.00 sec)
mysql> desc user
-> ;
+-------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+----------------+
| uid | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(10) | NO | | NULL | |
| age | tinyint(4) | NO | | NULL | |
| job | varchar(10) | NO | | NULL | |
+-------+-------------+------+-----+---------+----------------+
4 rows in set (0.01 sec)
mysql> insert into user(uid,name,age,job) values(1,'zs',28,'it'),(2,'ls',18,'it'),(3,'xh',20,'stu');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0
mysql>
mysql> select * from user;
+-----+------+-----+-----+
| uid | name | age | job |
+-----+------+-----+-----+
| 1 | zs | 28 | it |
| 2 | ls | 18 | it |
| 3 | xh | 20 | stu |
+-----+------+-----+-----+
3 rows in set (0.00 sec)
第二步:通过MySQL表数据转化成出Redis数据库哈希数据类型的相应格式
HMSET uid:1 name zs age 28 job it
HMSET uid:2 name ls age 18 job it
HMSET uid:3 name xh age 20 job stu
第三步:mysql数据和redis哈希对比:
user表
uid,name,age,job
1,zs,it,28
2,ls,it,18
3,xh,it,20
mysql查询数据
select * from user where id = 3
redis缓存mysql数据
名字 key1 k1的值 key2 k2的值 key3 k3的值
uid:1 name zs age 28 job it
uid:2 name ls age 18 job it
uid:3 name xh age 20 job stu
九、Redis集合类型操作命令
说明:首先集合的本质也是key,其次在集合这个类型中不允许出现重复的值,当集合中出现重复的字符串依然只记录一次
1.创建集合:SADD 集合名称 集合成员
db01:6379> SADD set1 1 2 3 4
(integer) 4
db01:6379> SADD set2 2 4 5 7
(integer) 4
2.查看集合的成员:SMEMBERS 集合名称
db01:6379> SMEMBERS set1
1) "1"
2) "2"
3) "3"
4) "4"
db01:6379> SMEMBERS set2
1) "2"
2) "4"
3) "5"
4) "7"
3.查看集合的差集:SDIFF 集合名称1 集合名称2
说明:以前面一个集合为基准对比后面的,前面有,后面没有则选出来
db01:6379> SDIFF set1 set2
1) "1"
2) "3"
db01:6379> SDIFF set2 set1
1) "5"
2) "7"
4.查看集合的交集:SINTER 集合名称1 集合名称2
db01:6379> SINTER set1 set2
1) "2"
2) "4"
5.查看集合的并集:SUNION 集合名称1 集合名称2
db01:6379> SUNION set1 set2
1) "1"
2) "2"
3) "3"
4) "4"
5) "5"
6) "7"
说明:查看交集时会自动去重且排序
十、Redis持久化的操作命令
1.持久化的重要性
在Redis数据库中如果尚未开启持久化功能,则Redis数据库关闭后,当再次登陆后,我们会发现,以前的所有数据将会自动清空,因为Redis数据库最大的特色就是所有数据都会存储到内存中,当服务器或数据库发生重启后,内存自然会进行清空的状态,导致之前的数据全部消失,因此只有开启持久化功能才可以保证数据真正的写入到磁盘当中,从而实现数据的完整性和一致性。
2.持久化的俩种方式
a.RDB: 快照,把当前内存里的状态快照到磁盘上
优点: 恢复速度快
缺点:
①可能会丢失数据(原因:RDB文件是将当前内存中的数据快照到磁盘中,而触发生成RDB文件是有一定的条件限制的,也就是说,当前一次RDB快照结束后,第二次RDB快照开始前,期间发生数据库重启就会导致这个期间的数据丢失)
说明:当我们关闭Redis数据库时,使用的shutdown命令会自动执行一次手动RDB快照命令即BGSAVE,将数据库关闭前和上一次RDB快照后期间的数据手动RDB快照一份,保证数据完整,但使用kill -9强制杀死进程或者其他非正常情况下关闭数据库时,依然无法保证期间数据的完整
②执行频繁(根据设定的触发条件),成本较高
b.AOF:以独立日志的方式记录每次写的命令,类似于mysql的binlog,1秒写一次
优点: 安全,有可能会丢失1秒的数据
缺点: 文件比较大,恢复速度慢
3.配置RDB及AOF
a.RDB配置文件
cat /opt/redis_6379/conf/redis_6379.conf
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.51 127.0.0.1
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile "/opt/redis_6379/pid/redis_6379.pid"
logfile "/opt/redis_6379/logs/redis_6379.log"
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename "redis_6379.rdb"
### 本地数据库的目录
dir "/data/redis_6379"
### 触发RBD持久化保存条件
save 900 1
save 300 10
save 60 10000
b.:RDB快照持久化注意事项
1.执行shutdown的时候,内部会自动执行bgsave,然后再执行shutdown
2.pkill kill killall 都类似于执行shutdown命令.会触发bgsave持久化
3.恢复的时候,rdb文件名称要和配置文件里写的一样
4.如果没有配置save参数,执行shutdown不会自动bgsave持久化
5.如果没有配置save参数,可以手动执行bgsave触发持久化保存
c.配置AOF
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.51 127.0.0.1
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile "/opt/redis_6379/pid/redis_6379.pid"
logfile "/opt/redis_6379/logs/redis_6379.log"
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename "redis_6379.rdb"
### 本地数据库的目录
dir "/data/redis_6379"
### 触发RBD持久化保存条件
#900S内有一个key生成触发RDB快照持久化
save 900 1
#300S内有十个key生成触发RDB快照持久化
save 300 10
#60S内有一万个key生成触发RDB快照持久化
save 60 10000
### 开启AOF独立日志持久化功能
#设置AOF独立日志名称
appendfilename "redis_6379.aof"
#AOF持久化功能开关
appendonly yes
#AOF重写时间设置--everysec每秒重写
appendfsync everysec
#AOF回写机制算法及触发条件,默认AOF文件大小超过64MB时触发
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
d.注意事项:
- 在redis数据库配置文件中,不要以空格为结尾,否则会出现配置文件读取报错
- RDB快照持久化和AOF独立日志持久化可以并存在相同的Redis数据库中
- 如果aof和rdb文件同时存在,redis会优先读取aof文件
十一、Redis认证功能
1.配置文件(只支持明文)
vim /opt/redis_6379/conf/redis_6379.conf
### 以守护进程模式启动
daemonize yes
### 绑定的主机地址
bind 10.0.0.51 127.0.0.1
### 监听端口
port 6379
### pid文件和log文件的保存地址
pidfile "/opt/redis_6379/pid/redis_6379.pid"
logfile "/opt/redis_6379/logs/redis_6379.log"
### 设置数据库的数量,默认数据库为0
databases 16
### 指定本地持久化文件的文件名,默认是dump.rdb
dbfilename "redis_6379.rdb"
### 本地数据库的目录
dir "/data/redis_6379"
### 触发RBD持久化保存条件
save 900 1 #900S内有一个key生成触发RDB快照持久化
save 300 10 #300S内有十个key生成触发RDB快照持久化
save 60 10000 #60S内有一万个key生成触发RDB快照持久化
### 开启AOF独立日志持久化功能
#设置AOF独立日志名称
appendfilename "redis_6379.aof"
#AOF持久化功能开关
appendonly yes
#AOF重写时间设置--everysec每秒重写
appendfsync everysec
#AOF回写机制算法及触发条件,默认AOF文件大小超过64MB时触发
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
### 登陆密码
requirepass "123456"
2.使用密码登录的两种方式:
第一种:内部连接登录
redis-cli
127.0.0.1:6379> AUTH 123456
OK
第二种:命令行参数登录
redis-cli -a 123456
127.0.0.1:6379>
说明:由于密码存放在配置文件中以及需要在命令行中登录使用,并且是以明文的形式存在,因此生产环境中Redis数据库服务器只允许内网连接,不能暴露在外网环境下。