Redis理论简述


一、Redis简介

Redis是一款高性能的NOSQL数据库。

NoSQL最初指不使用SQL标准的数据库,现在泛指所有的非关系型数据库。
NoSQL和SQL数据库是相辅相成,不存在相互替换的可能。

NoSQL数据库都复合CAP定理。

CAP定理:C(强一致性),A(高可用性),P(高分区容错性)只能满足其二,无法同时满足!

常见NOSQL数据库:
①Redis : 常见在java应用中。
特点: Key-value结构存储
②Mongodb: 常见在前端或Java应用中。
特点: 存储具有自我描述性的数据。
例如: html,xml,json
文档型数据库
③HBase: 海量数据(百亿级)的实时读写场景
特点: 列式存储

④Neo4J: 图数据库。用于图计算。社交网站,社交关系等计算。
特点: 支持图式存储和图式计算

二、Redis特点

特点:
①短小精悍
核心代码不超过2w行,总版本代码不超过5w行。
性能强劲,每秒百万级读写

②服务端是单线程,多路IO复用
单线程: 服务器同时只能处理一条命令
多路IO复用:

③使用C语言编写

④在内存中工作的数据库

三、安装

凡是C语言编写的软件,必须先编译后安装。

编译:
①在Makefile文件所在的目录,执行make命令
make: 编译,在编译c语言写的软件时,需要有 gcc-c++库

安装gcc-c++: yum -y install gcc-c++

②cd src ,执行make(编译) 命令, make install (安装)
安装的文件存放在 /usr/local/bin中

四、使用

服务端:
启动: redis-server 配置文件
停止: ctrl+c : 强行停止
客户端 shutdown: 通过客户端停止

客户端:
使用: redis-cli 参数 命令
启动: redis-cli -h 服务的主机名 -p 端口号
redis-cli : 默认连localhost:6379

退出: quit; exit;

五、常用的五大基本数据类型

数据: key(string)-value[string,hash,list,set,zset(sorted set)]

六、Hash

前端---->{“name”:“mike”,“age”:18}---->后台----->Person p---->Dao(ORM)---->数据库(Mysql)

数据库(Redis)—>String---->Person对象序列化---->从redis中get(key)----反序列化---->使用
---->JSON串----->从redis中get(key)---->转为Java对象

{“name”:“mike”,“age”:18}----->从redis中get(key)---->java对象---->setAge(19)---->JSON----set()

redis提供了hash结构
{field:value,field:value,field:value}

hash{“name”:“mike”,“age”:18}—>hset(age:19)

七、持久化

Redis在内存中工作,可能需要将内存的数据持久化到磁盘,保证数据安全。

Redis提供了RDB,AOF持久化

  1. RDB持久化
    RDB: 快照备份。 每间隔一段时间,触发备份。redis服务器的主进程使用fork()复制一个和主进程一模一样
    的子进程(共享所有的资源)。 主进程默认会阻塞,等待子进程将数据全部dump到磁盘。
    持久化结束后,子进程停止,主进程继续接受请求!

全盘备份。 每次持久化后,新的快照文件,覆盖旧的快照文件。

缺点: 有可能丢失最后一次持久化后的数据!

工作:
进行备份:
dbfilename : 备份后的文件名,默认dump.rdb
dir : rdb和aof备份文件的存放目录
默认./ (redis-server命令在哪个目录启动)

恢复数据: 每次redis服务启动时,读取dir/dbfilename,将全部数据一次性读入到内存

备份的时机:
主动备份: ①执行save/bgsave命令
②执行shutdown命令
③执行flushall命令,持久化的数据中没有key-value

自动备份:在redis.conf配置
save 且
seconds: 举例上次备份的时间
changes: 写操作数

其他配置:

八、AOF备份

AOF备份也叫日志备份。

AOF需要手动开启。appendonly yes

AOF文件人类可读可写。可以用来做一些致命操作的恢复,例如flushall。
如果aof文件损坏,可以使用redis-check-aof --fix 文件进行自动修复。

如果既有RDB也有AOF,默认采用AOF进行恢复。AOF安全性较高。

备份: 只记录写操作到一个日志文件中

恢复: 服务启动时,读入日志文件中所有的写操作命令,从头到尾依次执行来重建数据

相关参数: appendfilename : 保存的日志文件名称
dir : 日志文件保存的目录

如何备份: appendfsync always| everysec(默认) | no
没间隔1秒,将缓冲区中的写操作命令持久化到磁盘。
最多丢失1秒的数据。

AOF重写: 在不影响数据的情况下,重写aof文件,消除冗余的写命令。
好处: ①节省磁盘空间 ②服务启动恢复数据时,缩短启动时间

特点:
①安全,默认最多只丢失一秒数据
②aof文件,人类可操作,避免致命失误flushall
③aof文件,比rdb臃肿,占用磁盘空间大
④恢复时,速度慢

九、事务

Redis中的事务不同于关系型数据库中的事务!

Redis中的事务,将多条命令,一起组队,一起提交,防止多条命令按顺序执行时,被其他客户端发送的命令所打断。

命令:
multi : 开启一个事务块
exec :提交一个事务块执行
discard : 解散一个事务块

十、锁

锁是为了解决当多个线程同时操作同一资源时,竞争导致的数据错误问题!

悲观锁: 安全,在多线程环境下,效率低!
乐观锁: 在多读的场景,效率高。
在多写的场景,存在资源浪费。

Redis主要作为缓存数据库。缓存主要是读的场景,redis采用了乐观锁的设计。

加锁: watch key…
加锁需要和事务一起使用!

十一、Lua脚本

Lua脚本和事务类似。Lua脚本将多条命令,写入到一个脚本中。
提交执行这个脚本,就可以按顺序执行多条命令。

Lua脚本和事务不同的地方在于命令的原子性。
在事务中,每条命令是一个原子。
在Lua脚本中,整个脚本是一个原子(命令)

Lua脚本支持调用C/C++代码,也支持被C/C++代码调用。

十二、主从复制

适用于以下场景:
①避免单点故障
②提高并发读的能力

角色: master : 主机
slave : 从机

配置: slaveof 主机ip 主机port
slaveof no one ;解除主从关系

原则: 配从不配主

数据同步原理: 当从机执行slaveof时,向目标主机发送sync命令,请求同步主机所有的数据。
主机收到命令后,执行一次rdb备份,将备份后的快照文件发送给从机。
从机读取快照文件,拥有和主机一样的数据。
sync命令之后,主机新增的数据,主机会将写操作命令同步发送给从机,从机执行命令
保证数据一致。

细节: ①配置主从后,从机复制主机所有的数据
②主机宕机,从机依然在原地待命
③从机宕机,从机重启后,依然可以拥有宕机期间主机新增的记录
④如果主机向多个从机同步数据压力过大,可以通过主–从(主)----从模式解决

十三、哨兵模式

哨兵也是一个服务。哨兵服务主要用来监控主机从机的状态,当主机宕机时,自动主从切换。

状态标识: sdown : 主观下线,当前哨兵认为监控的机器已经下线
odown : 客观下线,所有哨兵在投票后,一旦sdown满足投票数,就认为当前机器已经odown
在主机标识为odown后,将执行主从切换

主从切换过程: ①哨兵监控到主机sdwon时,向其他哨兵发送消息,请求其他哨兵同步当前主机状态
②一旦sdown满足odown,这时,哨兵先执行选举,选举哨兵的leader
③哨兵选举后,由哨兵的leader提升一个从机为主机
④优先考虑slave-priority小的从机,如果优先级都相同,考虑偏移量大
否则再考虑pid小的
将从机提升为主机
⑤让其他存活的从机,从新认新主
⑥如果之前的主机,重启,需要变更身份,作为从机,认新主

十四、使用Jedis连接redis

  1. Jedis
  2. JedisPool.getResource()
  3. 哨兵模式,可以创建一个哨兵的连接池
    JedisSetinelPool.getResource()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值