文章目录
- 一、Redis简介
- 二、Redis特点
- 三、安装
- 四、使用
- 五、常用的五大基本数据类型
- 六、Hash
- 七、持久化
- 八、AOF备份
- 九、事务
- 十、锁
- 十一、Lua脚本
- 十二、主从复制
- 十三、哨兵模式
- 十四、使用Jedis连接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持久化
- 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
- Jedis
- JedisPool.getResource()
- 哨兵模式,可以创建一个哨兵的连接池
JedisSetinelPool.getResource()