Redis数据库--基础应用

一、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(根据自己的软件包安装路径和软连接自行查找该脚本),执行过程如下

image.png

执行完毕后默认配置文件路径:/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数据库服务器只允许内网连接,不能暴露在外网环境下。

你可能感兴趣的:(Redis数据库--基础应用)