一.基本概念操作及应用
1.Linux 下 Redis 6.2.6 安装
https://blog.csdn.net/afreon/article/details/122572308
2.学习内容



3.存储形式

4.命令
-
String(字符串)
-
list(链表)
-
hash
-
set(集合)
-
zset
二.Redis协议与异步


1.redis pipeline
Redis是一发一收 模式**(即客户端发一条命令,服务端回复一个结果给客户端)**,但如果你想几条命令一块执行,就得redis pipeline,它是客户端发几条命令给服务端,服务端处理完所有命令才把处理的结果给客户端。
2.redis事务(了解,一般开发用lua脚本)
事务就是告诉系统这几条命令一起执行。
3.redis发布订阅
好几个客户端订阅一个频道,另一个客户端发布内容到这个频道,那其他人都会收到它发的内容。

示例:

缺点:
就是如果有一个客户端订阅了频道,但突然断开了,那它就不会收到其他客户端发来的内容。
4.ACID特性分析
- 原子性;事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败;redis不支持回滚;即使事务队列中的某个命令在执行期间出现了错误,整个事务也会继续执行下去,直到将事务队列中的所有命令都执行完毕为止。
- 一致性;事务使数据库从一个一致性状态到另外一个一致性状态;这里的一致性是指预期的一致性而不是异常后的一致性;所以redis也不满足;这个争议很大:redis 能确保事务执行前后的数据的完整约束;但是并不满足传统意义上的一致性;比如转账功能,一个扣钱一个加钱;可能出现扣钱执行错误,加钱执行正确,那么最终还是会加钱成功;系统凭空多了钱;
- 隔离性;事务的操作不被其他用户操作所打断;redis 是单线程执行,天然具备隔离性;
- 持久性;redis只有在 aof 持久化策略的时候,并且需要在 redis.conf appendfsync=always 才具备持久性;实际项目中几乎不会使用 aof 持久化策略;
5.lua脚本
lua 脚本实现原子性;redis中加载了一个 lua 虚拟机;用来执行 redis lua 脚本;redis lua 脚本的执行是原子性的;**当某个脚本正在执行的时候,不会有其他命令或者脚本被执行;**lua 脚本当中的命令会直接修改数据状态;

6.redis异步连接
同步连接方案采用阻塞io来实现;优点 是代码书写是同步的,业务逻辑没有割裂;缺点 是阻塞当前线程,直至redis返回结果;通常用多个线程来实现线程池来解决效率问题;
异步连接方案采用非阻塞io来实现;优点是没有阻塞当前线程,redis 没有返回,依然可以往redis发送命令;缺点是代码书写是异步的(回调函数),业务逻辑割裂,可以通过协程解决
(openresty,skynet);配合redis6.0以后的io多线程(前提是有大量并发请求),异步连接
池,能更好解决应用层的数据访问性能;
异步连接多线程实现方案:hiredis + libevent
三.Redis主从同步与对象模型
1.淘汰策略(expire/pexpire)
假如我们设置redis为32G内存,如果你数据已经32G了,你再想操作,就会返回错误,你就操作不了redis了。所以引出淘汰策略,根据**不同条件(例如:最长时间没有使用,最少使用次数,随机删除,最近过期)**来删除数据。
淘汰策略:

如何配置:

2.持久化
1.概念:
用于将内存中的数据保存到磁盘,防止服务重启后数据丢失。
2.持久化方式


3.持久化配置

3.高可用(保证数据库可用和数据完整)
1.主从复制(保证数据完整)
是一种数据同步机制,允许将一个 Redis 服务器(主节点/Master)的数据复制到一个或多个 Redis 服务器(从节点/Slave)。相当于备份操作。
2.Redis哨兵模式(了解)(保证数据库可用)
多个sentinel连接多个redis数据库,当主redis宕机时,sentinel会自动将从redis升为主redis。

3.cluster集群**(保证数据库可用)**
哨兵模式是一个主redis数据库,很多从数据库;而cluster集群是所有节点都是主数据库。数据存储在一个数据库中时,其他数据库也可以访问到这个数据。相当于人人都是主数据库。
1.集群配置
-
创建文件夹
# 创建 6 个文件夹 mkdir -p 7001 7002 7003 7004 7005 7006 cd 7001 vi 7001.conf # 7001.conf 中的内容如下
-
编辑 7001.conf
pidfile "/home/mark/redis-data/7001/7001.pid" logfile "/home/mark/redis-data/7001/7001.log" dir /home/mark/redis-data/7001/ port 7001 daemonize yes cluster-enabled yes cluster-config-file nodes-7001.conf cluster-node-timeout 15000
-
复制配置
cp 7001/7001.conf 7002/7002.conf cp 7001/7001.conf 7003/7003.conf cp 7001/7001.conf 7004/7004.conf cp 7001/7001.conf 7005/7005.conf cp 7001/7001.conf 7006/7006.conf
-
修改配
sed -i 's/7001/7002/g' 7002/7002.conf sed -i 's/7001/7003/g' 7003/7003.conf sed -i 's/7001/7004/g' 7004/7004.conf sed -i 's/7001/7005/g' 7005/7005.conf sed -i 's/7001/7006/g' 7006/7006.conf
-
创建启动配置
#!/bin/bash redis-server 7001/7001.conf redis-server 7002/7002.conf redis-server 7003/7003.conf redis-server 7004/7004.conf redis-server 7005/7005.conf redis-server 7006/7006.conf
-
智能创建集群
redis-cli --cluster create 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 127.0.0.1:7006 --cluster-replicas 1



