是用C语言开发的一个开源的高性能键值对(key-value)(非关系型)数据库 特征:
数据间没有必然的关联关系内部采用单线程机制进行工作高性能支持多种数据类型 string(字符串)、list(列表)、hash(哈希)、set(集合)、sorted_set(有序集合) 支持持久化jedis是java操作redis的一种工具 1) 配置pom.xml文件
<dependency> <groupId>redis.clients</groupId> <artifactId>jedis</artifactId> <version>2.9.0</version> </dependency>2)代码流程
连接redis//配置域名跟端口号 Jedis jedis = new Jedis(“127.0.0.1”, 6379);操作redis //对数据进行操作,(存入取出什么的) jedis.set(“name”, “cyx”); jedis.get(“name”);关闭redis连接 jedis.close();Jedis的API文档: http://xetorthio.github.io/jedis/.
以守护进程方式启动,使用本启动方式,redis将以服务的形式存在,日志将不再打印到命令窗口中
port 6379
设定当前服务启动端口号 dir “/自定义目录/redis/data“ 设定当前服务文件保存位置,包含日志文件、持久化文件(后面详细讲解)等
logfile “6379.log”
设定日志文件名,便于查阅
将当前的数据以二进制的形式保存。
操作方式A使用save命令 每保存一次生成一个.rdb文件作用:手动执行一次保存操作save指令的相关配置(虚拟机)1) dbfilename dump.rdb 说明:设置本地数据库文件名,默认值为 dump.rdb 经验:通常设置为dump-端口号.rdb 2) dir 说明:设置存储.rdb文件的路径 经验:通常设置成存储空间较大的目录中,目录名称data 3) rdbcompression —> yes 说明:设置存储至本地数据库时是否压缩数据,默认为 yes,采用 LZF 压缩 经验:通常默认为开启状态,如果设置为no,可以节省 CPU 运行时间,但会使存储的文件变大(巨大) 4) rdbchecksum —>yes 说明:设置是否进行RDB文件格式校验,该校验过程在写文件和读文件过程均进行 经验:通常默认为开启状态,如果设置为no,可以节约读写性过程约10%时间消耗,但是存储一定的数据损坏风险
save指令的执行会阻塞当前Redis服务器,直到当前RDB过程完成为止,有可能会造成长时间阻塞,线上环境不建议使用。
操作命令B使用bgsave命令作用:手动启动后台保存操作,但不是立即执行流程 : 1)执行bgsave命令,redis返回一条消息Background saving started(但是不一定立刻执行) 2)什么时候执行,在返回消息的时候抽空调用Linux的fork函数生成一个子进程,由它创建一个rdb文件,来处理(完成)这件事 3)然后,返回一个消息(日志文件中)Background saving terminated with success
bgsave的配置除了save的四个文件外,还要配置stop-writes-on-bgsave-error —> yes作用 : 后台存储过程中如果出现错误现象,是否停止保存操作,默认为开启状态
bgsave命令是针对save阻塞问题做的优化。Redis内部所有涉及到RDB操作都采用bgsave的方式,save命令可以放弃使用。
操作方式C使用save配置(自动化出发RDB持久化的方式)配置方式 save second changes(使用的是bgsave) 作用 满足限定时间范围内key的变化数量达到指定数量即进行持久化 参数 second:监控时间范围 changes:监控key的变化量 位置 在conf文件中进行配置
rdb特殊启动形式 1) 全量复制 2) 服务器运行过程中重启 debug reload 3) 关闭服务器时指定保存数据 shutdown save默认情况下执行shutdown命令时,自动执行 bgsave(如果没有开启AOF持久化功能)
RDB的优缺点RDB优点 1) RDB是一个紧凑压缩的二进制文件,存储效率较高 2) RDB内部存储的是redis在某个时间点的数据快照,非常适合用于数据备份,全量复制等场景 3) RDB恢复数据的速度要比AOF快很多 4) 应用:服务器中每X小时执行bgsave备份,并将RDB文件拷贝到远程机器中,用于灾难恢复。
Rdb缺点 1) RDB方式无论是执行指令还是利用配置,无法做到实时持久化,具有较大的可能性丢失数据 2) bgsave指令每次运行要执行fork操作创建子进程,要牺牲掉一些性能 3) Redis的众多版本中未进行RDB文件格式的版本统一,有可能出现各版本服务之间数据格式无法兼容现象
将数据的操作过程保存下来
默认是no 作用 : 是否开启AOF持久化功能,默认为不开启状态
配置 appendfsync always/everysec/no作用 : AOF写数据策略 AOF写数据三种策略(appendfsync) 1) always(每次) 每次写入操作均同步到AOF文件中,数据零误差,性能较低,不建议使用。 2) everysec(每秒) 每秒将缓冲区中的指令同步到AOF文件中,数据准确性较高,性能较高,建议使用,也是默认配置 在系统突然宕机的情况下丢失1秒内的数据 3) no(系统控制) 由操作系统控制每次同步到AOF文件的周期,整体过程不可控
key对应的数据并不存在,每次针对此key的请求从缓存获取不到,请求都会到数据库去找,从而可能压垮数据库。比如用一个不存在的用户id获取用户信息,不论缓存还是数据库都没有,若黑客利用此漏洞进行攻击可能压垮数据库。
方式①采用布隆过滤器,将可能出现问题的数据存储到一个集合內,将其拦截掉
方式②如果一个查询返回的数据为空(不管是数据不存在,还是系统故障),仍然把这个空结果进行缓存,然后给它设置一个失效时间
key对应的数据存在,但在redis中过期(查询不到),此时若有大量并发请求过来,这些请求发现缓存过期(中没有,)一般都会前往后端数据库加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把后端数据库压垮。
设置value永不过期
使用互斥锁。在缓存失效的时候(判断拿出来的值为空),不是立即去load db,而是先使用缓存工具的某些带成功操作返回值的操作(比如Redis的SETNX或者Memcache的ADD)去set一个mutex key,当操作返回成功时,再进行load db的操作并回设缓存;否则,就重试整个get缓存的方法。
SETNX,是「SET if Not eXists」的缩写,也就是只有不存在的时候才设置,可以利用它来实现锁的效果。
当缓存服务器重启或者大量缓存集中在某一个时间段失效,这样在失效的时候,也会给后端系统(比如DB)带来很大压力。
给每个key设置不同的失效时间,避免
何为集群? 集群就是通过增加服务器的数量,提供相同的服务,从而让服务器更加稳定,高效。
若单个redis宕机了,就没服务可用了,而且单个redis的读写能力也是有限的。redis可以强化redis的读写能力。
1)在redis集群中,每个redis都是一个节点 2)节点分为主节点和从节点 3)redis集群基于redis的主从复制
主从复制模型中,有多个redis节点。 其中,有且仅有一个为主节点Master。从节点Slave可以有多个。
特点 (1)主节点Master可读、可写. (2)从节点Slave只读。(read-only)
因此,主从模型可以提高读的能力,在一定程度上缓解了写的能力。因为能写仍然只有Master节点一个,可以将读的操作全部移交到从节点上,变相提高了写能力。
当主节点宕机了,整个集群就没有可写的节点了。这时候,通过哨兵机制,将一个从节点(从节点上备份了主节点的所有数据)变成了主节点。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance), 该系统执行以下三个任务:
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运作正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会进行选举,将其中一个从服务器升级为新的主服务器, 并让失效主服务器的其他从服务器改为复制新的主服务器; 当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器