Redis
1. Redis介绍
1.1 Redis概述
Redis是一个开源的内存数据结构存储,用作数据库,缓存和消息代理。它支持五种数据类型来存储值,如:字符串类型、散列类型、列表类型、集合类型、有序集合类型。它是NoSQL数据库。
1.2 NoSQL
NoSQL的全称是Not Only Sql,泛指非关系型数据库,NoSQL数据库是为了解决高并发、高可用、高可扩展、大数据存储问题产生的数据库解决方案,是关系型数据库的一个很好的补充。NoSQL数据库有多种分类,它的分类如下:
- 键值对(key-value)存储数据库:如redis,主要应用在内容缓存,处理大量数据的gao访问负载。
- 列存储数据库:如HBase,应用在分布式文件系统中。
- 文档型数据库:如MogoDB,主要在web应用中(与Key-Value类似,Value是结构化的)。
- 图形(Graph)数据库:如InfoGrid,主要用在社交网络中。
1.3 Redis应用场景
- 内存数据库**(登录信息、购物车信息、用户浏览记录等)
- 缓存服务器(商品数据、广告数据等等)
- 解决分布式集群架构中的session分离问题(session共享)
- 任务队列(秒杀、抢购、12306等等)
- 支持发布订阅的消息模式
- 应用排行榜
- 网站访问统计
- 数据过期处理(可以精确到毫秒)
2. Redis单机版安装及命令介绍
2.1 Redis下载
Redis官网地址:https://redis.io/或者http://www.redis.cn/(中文网)
Redis下载地址:http://download.redis.io/releases/
Redis Windows版下载地址:https://github.com/ServiceStack/redis-windows/tree/master/downloads
2.2 Redis安装
Redis安装环境:建议在Linux上运行,这里使用CentOS 7作为安装环境。(搞个云服务器或者VMware都可以)
- STEP1:安装需要c语言需要的GCC环境
yum install -y gcc-c++
yum install -y wget
- STEP2:下载并压缩Redis源码压缩包
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
tar -xf redis-3.2.9.tar.gz
- STEP3:编译Redis源码,进入redis-3.2.9,进行编译命令
cd redis-3.2.9
make
- STEP4:安装Redis,需要通过
PREFIX
指定安装路径
make install PREFIX=/xxx/server/redis
2.3 Redis启动
- STEP1:第一步:拷贝redis-3.2.9/redis.conf配置文件到Redis安装目录的bin目录
cp redis-3.2.9/redis.conf /kkb/server/redis/bin/
注意:redis-3.2.9在哪个文件夹下 - 修改redis.conf
vim redis.conf
# 将daemonize由no改为yes
daemonize yes
# 默认不能被其他机器访问 ,要在‘bing 127.0.0.1‘’前面加‘#’,这样所有机器就可以访问了
# bind 127.0.0.1
# 是否开启保护模式,由yes该为no
protected-mode no
- STEP3:启动服务
./redis-server redis.conf
2.4 关闭服务
./redis-cli shutdown
2.5 其他命令说明
-
redis-server
:启动redis
服务 -
redis-cli
:进入redis
命令客户端 -
redis-benchmark
: 性能测试的工具 -
redis-check-aof
:aof
文件进行检查的工具 -
redis-check-dump
:rdb
文件进行检查的工具 -
redis-sentinel
: 启动监控服务
2.6 Redis命令行客户端
- 访问命令格式
./redis-cli -h 127.0.0.1 -p 6379
- 参数说明
-h:redis服务器的ip地址
-p:redis实例的端口号
如果不指定主机和端口号默认就是127.0.0.1和6379。
3. Redis数据类型
Redis官网命令大全
Redis菜鸟教程
Redsi是key-value形式存储数据的,其中value可以定义五种数据类型:
String、Hash、List、Set、SortedSet(有序集合类型,简称:zset)
注意:在redis命令语句中,命令时可以忽略大小写的,key是不忽略大小写的。
String类型(字符串类型)
- get、set、setnx、incr、incrby、decr、decrby。
- incr、incrby、decr、decrby:只能针对整数类型的数据进行使用。
- incr命令,它是原子操作,用来生成数据库表的自增主键,安全且高效。
- incr命令的使用场景:分布式数据库中订单ID的生成。
hash类型(散列类型)
- hset、hget、hdel、hmget、hmset
- hash类型也叫散列类型,它提供了字段和字段值的映射。字段值只能是字符串类型,不支持散列类型、集合类型等其它类型。
- hash类型和string类型区别
- hash类型适合于增删改操作。
- string类型适合于查询操作。string类型存储对象,需要进行对象转换为json串进行存储。
list类型(队列类型)
- 适合于只对list列表两端进行操作的场景。
- list类型存储的数据特点:有序可重复(指的是插入顺序,而不是自然排序顺序)。
- lpush、lpop、rpush、rpop、lrange
- 可以用来作为消息队列去使用
- 可以用来实现商品评论表
set类型(集合类型)
- set类型存储的数据特点:无序不重复。
- sadd 、srem、smembers
- 可以进行多集合操作:差集操作(sdiff)、交集操作(sinter)、并集操作(sunion)
zset类型(有序集合类型、sortedset)
- zset类型存储的数据特点:不重复、有序。
- 底层还是一个set集合,但是该集合中给每个member设置一个score,通过score进行排序。
- zadd、zrem、zrange、zscore
- 使用场景:销售排行榜
- 销量作为分数
- 销售人员或者商品作为member
4. Redis事务
4.1 Redis事务介绍
- Redis的事务是通过
MULTI
、EXEC
、DISCARD
和WATCH
这四个命令来完成的。 - Redis的单个命令都是原子性的,所以这里需要确保事务性的对象是命令集合。
- Redis将命令集合序列化并确保处于同一事务的命令集合连续且不被打断的执行
- Redis不支持回滚操作。
4.2 Redis事务命令
- MULTI(开启事务):用于标记事务块的开始。Redis会将后续的命令逐个放入队列中,然后使用EXEC命令原子化的执行这个命令序列。
- EXEC(提交事务):在一个事务中执行所有先前放入队列的命令,然后恢复正常的连接状态。
- DISCARD(清除事务队列):清除所有先前在一个事务中放入队列的命令,然后恢复正常的连接状态。
- WATCH(监控):当某个[事务需要按条件执行]时,就要使用这个命令将给定的[键设置为受监控]的状态。
- UNWATCH:清除所有先前为一个事务监控的键。
4.3 演示
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set s1 111
QUEUED
127.0.0.1:6379> hset set1 name zhangsan
QUEUED
127.0.0.1:6379> exec
1) OK
2) (integer) 1
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set s2 222
QUEUED
127.0.0.1:6379> hset set2 age 20
QUEUED
127.0.0.1:6379> discard
OK
127.0.0.1:6379> exec
(error) ERR EXEC without MULTI
127.0.0.1:6379> watch s1
OK
127.0.0.1:6379> multi
OK
127.0.0.1:6379> set s1 555
QUEUED
127.0.0.1:6379> exec # 此时在没有exec之前,通过另一个命令窗口对监控的s1字段进行修改
(nil)
127.0.0.1:6379> get s1
111
4.4 事务失败
-
语法错误
-
运行错误
- Redis事务不支持回滚
- redis出现问题,一般都是语法问题和类型问题,这些问题,都是在编码阶段必须要解决的问题。
- 回滚是比较好性能的,Redis因为性能方面忽略了事务回滚。
5. Redis持久化
5.1 RDB方式
5.1.1 RDB介绍
- rdb方式是Redis默认采用的方式。
- rdb方式是通过快照(snapshotting)的方式进完成的,符合一定条件时Redis自动将内存中的数据进行快照并持久化到硬盘中。
- Redis一下几种情况会触发快照
- 符合自定义配置的快照规则
- 执行save或者gbsave命令
- 执行flushall命令
- 执行主从复制
- Redis启动后会读取RDB快照文件,将数据从硬盘再入到内存。
- 根据数据量的大小与结构和服务器的性能的不同,快照的需要的条件也是不同的。通常,记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20~30秒钟。
5.1.2 设置快照规则
-
RDB持久化条件
格式:save <seconds> <changes>
实例:redis.conf(可以配置多个条件(每行配置一个条件),每个条件之间是“或”的关系)
save 900 1 : 表示15分钟(900秒钟)内至少1个键被更改则进行快照。
save 300 10 : 表示5分钟(300秒)内至少10个键被更改则进行快照。
save 60 10000 :表示1分钟内至少10000个键被更改则进行快照。
- 配置dir指定rdb快照文件的位置
# Note that you must specify a directory here, not a file name.
dir ./
- 配置dbfilename指定rdb快照文件的名称
# The filename where to dump the DB
dbfilename dump.rdb
5.1.3 快照过程(原理)
- Redis`调用系统中的fork函数复制一份当前进程的副本(子进程)
- 父进程继续接受并处理客户端发来的命令,而子进程开始将内存中的数据写入硬盘中的临时文件。
-
当子进程写入完所有是数据后,会用该临时文件替换旧文件的RDB文件。
- redis在进行快照的过程中不会修改rdb文件,只有快照结束后才会把旧的rdb文件替换掉。
- 通过定时备份rdb文件来实现reids数据库的备份,rdb文件是经过压缩的二进制文件,占用空间会小于内存中的数据,利于传输。
5.1.4 RDB的优缺点
- 优点:可以最大化redis性能,父进程在保存rdb文件时唯一要做的就是fork出一个字进程,然后这个字进程就会处理接下来的存储工作,父进程无需进行任何磁盘I/O操作,同时这也是一个缺点,如果数据集比较大的时候,fork是比较耗时的,造成服务器在一段时间内停止处理客户端的请求。
- 缺点:使用rdb方式实现持久化,一旦redis异常退出,就会丢失最后一次快照以后更改的所有数据,要根据具体应用场景,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在jieshou接受范围内。如果数据很重要,将损失降到最后,那就用AOF的方式进行持久化。
5.2 AOF(append only file)方式
5.2.1 AOF方式介绍
如果开启AOF持久化后,每执行一条更改redis中的数据的命令,redis就会将该命令写入硬盘中的AOF文件中,这一过程会降低redis的性能,但大部分这个情况下是可以接受的,使用比较快的硬盘可以提高AOF的性能。
redis.conf:
# 可以通过修改redis.conf配置文件中的appendonly参数开启
appendonly yes
# AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的。
dir ./
# 默认的文件名是appendonly.aof,可以通过appendfilename参数修改
appendfilename appendonly.aof
5.2.2 同步磁盘数据
redis每次更改数据,AOF机制每次都会将命令记录在aof文件中,但是,实际上有操作系统的缓存机制,每次数据并没有实时写入到硬盘,而是写入硬盘缓存,在通过缓存机制保存到文件中。
参数说明
# 每次执行写入都会进行同步, 这个是最安全但是是效率比较低的方式
appendfsync always
# 每一秒执行(默认)
appendfsync everysec
# 不主动进行同步操作,由操作系统去执行,这个是最快但是最不安全的方式
appendfsync no
5.2.3 AOF重写
Redis可以在 AOF 文件体积变得过大时,自动地在后台对 AOF 进行重写。重写后的新 AOF 文件包含了恢复当前数据集所需的最小命令集合。
整个重写操作时绝对安全的的,因为redis在创建新的aof文件过程中,会继续将命令追加到现有的aof文件中,即使重写过程中发生了停机,现有的aof文件也不会丢失。一旦新的aof文件创建完毕,reids就会从旧文件切换到新的aof文件,并开始对新的aof文件进行追加操作。
aof文件有序的保存了对数据库执行的写入操作,这些写入操作以redis协议保存,因此aof文件内容非常容易被人读懂,对文件分析也很轻松。
参数说明
# 表示当前aof文件大小超过上一次aof文件大小的百分之多少的时候会进行重写。如果之前没有重写过,以启动时aof文件大小为准
auto-aof-rewrite-percentage 100
# 限制允许重写最小aof文件大小,也就是文件大小小于64mb的时候,不需要进行优化
auto-aof-rewrite-min-size 64mb
5.2.4 AOF文件损坏后修复
- 为现有的 AOF文件创建一个备份。
- 使用 Redis附带的
redis-check-aof
程序,对原来的 AOF 文件进行修复。redis-check-aof --fix readonly.aof
- 重启 Redis服务器,等待服务器载入修复后的 AOF`文件,并进行数据恢复。
5.3 RDB和AOF的选择
- 一般情况下,如果对安全性要求很高的话,应该同时使用两种持久化功能。如果同时使用的话,redis重启时,会优先使用AOF文件来还原数据。
- 如果可以承受数分钟以内的数据丢失,可以使用rdb持久化。
- 定时生成 RDB 快照(snapshot)非常便于进行数据库备份, 并且 RDB恢复数据集的速度也要比 AOF 恢复的速度要快 。