Redis
2023-12-26 09:25:49 49 举报
AI智能生成
Redis
作者其他创作
大纲/内容
Redis 是完全开源免费的,是一个高性能的key-value数据库,目前市面上主流的数据库Redis、Memcache、Tair(淘宝自研发)
什么是Redis
Redis单线线程模型
1、易于维护:都是使用表结构,格式一致;2、使用方便:SQL语言通用,可用于复杂查询;3、复杂操作:支持SQL,可用于一个表以及多个表之间非常复杂的查询。
优点
1、读写性能比较差,尤其是海量数据的高效率读写;2、固定的表结构,灵活度稍欠;3、高并发读写需求,传统关系型数据库来说,硬盘I/O是一个很大的瓶颈。
缺点
关系型数据库最典型的数据结构是表,由二维表及其之间的联系所组成的一个数据组织。
非关系型数据库严格上不是一种数据库,应该是一种数据结构化存储方法的集合,可以是文档或者键值对等。
关系型数据库与非关系型数据库
1.插件准备yum install gcc//临时关闭systemctl stop firewalld//禁止开机启动systemctl disable firewalldRemoved symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.2.解压tar包tar -zxvf redis-5.0.6.tar.gz3.安装cd redis-5.0.34.创建安装目录mkdir /usr/redis5.编译安装make install PREFIX=/usr/redis (安装指定目录)或者make install (安装默认目录/usr/local/bin)6.启动(前端启动)cd /usr/redis/bin./redis-server ./redis-server /redis-5.0.6/redis.conf ## 指定配置文件7.客户端连接./redis-cli #无密码方式./redis-cli -a \"123456\" #密码方式./redis-cli -h 127.0.0.1 -p 6379 -a \"123456\" #全量配置启动8.关闭redis-cli shutdown #无密码redis-cli -a \"123456\" shutdown #密码方式redis-cli -h 127.0.0.1 -p 6379 -a \"123456\" shutdown #全量配置停止## 复制cp /usr/redis-5.0.6/redis.conf /usr/redis/bin## 修改后端启动配置vi redis.conf daemonize yes## 重启启动Redis./redis-server ./redis.conf ## 找到redis进程ps aux | grep 'redis'
安装步骤
## 复制cp /usr/redis-5.0.6/redis.conf /usr/redis/bin## 修改后端启动配置vi redis.conf daemonize yes## 重启启动Redis./redis-server ./redis.conf ## 找到redis进程ps aux | grep 'redis'
将Redis设置为后台启动
注释掉bind 127.0.0.1protected-mode no ###允许外界访问
设置Reids允许ip访问
Linux
docker pull redisdocker run -di --name redis -p 6379:6379 redis//全量配置docker run -d --privileged=true -p 6379:6379 --restart=always -v /dockerdata/redis/conf/redis.conf:/etc/redis/redis.conf -v /dockerdata/redis/data:/data --name myredis redis redis-server /etc/redis/redis.conf --appendonly yes
docker安装
##下载https://github.com/tporadowski/redis/releases解压双击redis-server.exe启动即可##指定配置文件启动redis-server.exe redis.conf
安装包下载地址
windows
安装
Redis.conf配置文件内容解析
noeviction:当内存使用达到阈值的时候,执行命令直接报错。(默认)
allkeys-lru:在所有的key中,优先移除最近未使用的key。(推荐)
volatile-lru:在设置了过期时间的键空间中,优先移除最近未使用的key。
allkeys-random:在所有的key中,随机移除某个key。
volatile-random:在设置了过期时间的键空间中,随机移除某个key。
volatile-ttl:在设置了过期时间的键空间中,具有更早过期时间的key优先移除。
六种淘汰策略
# 默认为noevictionmaxmemory-policy volatile-lru
配置Redis淘汰策略
Redis内存淘汰策略
修改配置文件开启回调监听: notify-keyspace-events Ex
开启事件回调监听
Redis中的自动过期机制
原理简介
Token令牌的生成
短信验证码Cod
缓存查询数据(减轻数据库压力、但是存在数据不同步的问题)
网页计数器
分布式锁
延迟操作(秒杀抢购的时候,超时未支付)
分布式消息中间件
发布订阅
使用Redis提供的有序集合数据结构能方便的实现各种复杂的排行榜
排行榜
Redis列表LIST结构,LPUSH可以在列表头部插入一个内容ID作为关键字,LTRIM用来修建LIST以限制LIST的长度,这样列表永远为N个ID,无需查询最新的列表,直接根据ID去到对应的内容页即可
最新列表
可以使用Redis做session管理,以实现分布式下的session共享
分布式Session
点赞、踩、关注/被关注、共同好友等是社交网站的基本功能,社交网站的访问量通常来说比较大,而且传统的关系数据库类型不适合存储这种类型的数据,Redis提供的哈希、集合等数据结构能很方便的的实现这些功能。
社交网络
Redis的应用场景
String
Hash
List
Set
sorted set
命令大全
Redis数据结构
#dbfilename:持久化数据存储在本地的文件dbfilename dump.rdb#dir:持久化数据存储在本地的路径,如果是在/redis/redis-3.0.6/src下启动的redis-cli,则数据会存储在当前src目录下dir ./#配置定时执行策略save 900 1save 300 10save 60 10000##当snapshot时出现错误无法继续时,是否阻塞客户端“变更操作”,“错误”可能因为磁盘已满/磁盘故障/OS级别异常等 stop-writes-on-bgsave-error yes ##是否启用rdb文件压缩,默认为“yes”,压缩往往意味着“额外的cpu消耗”,同时也意味这较小的文件尺寸以及较短的网络传输时间 rdbcompression yes
save 900 1 # 在900秒(15分钟)之后,如果至少有1个key发生变化,则dump内存快照。save 300 10 # 在300秒(5分钟)之后,如果至少有10个key发生变化,则dump内存快照。save 60 10000 # 在60秒(1分钟)之后,如果至少有10000个key发生变化,则dump内存快照。
如何配置
将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可
如何恢复
redis-cli config set save \"\"
如何停止
使用单独子进程来进行持久化,主进程不会进行任何IO 操作,保证了 redis 的高性能,适合大规模的数据恢复,对数据完整性和一致性要求不高。
RDB 是间隔一段时间进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失。所以这种方式更适合数据要求不严谨的时候,Fork的时候,内存中的数据被克隆了一份,大致2倍的膨胀性需要考虑但上述成立有条件,Linux也有优化手段在 Linux 程序中, fork() 会产生一个和父进程完全相同的子进程,但子进程在此后多会 exec 系统调用,出于效率考虑,尽量避免膨胀。 Linux 中引入了“写时复制技术”, 一般情况父进程和子进程会共用同一段物理内存 ,只有进程空间的各段的内容要发生变化时,才会将父进程的内容复制一份给子进程,。
总结
RDB(全量同步)默认开启
appendfsync always #每次有数据修改发生时都会写入AOF文件,能够保证数据不丢失,但是效率非常低。
appendfsync everysec #每秒钟同步一次,可能会丢失1s内的数据,但是效率非常高。
appendfsync no #从不同步。高效但是数据不会被持久化。
三种同步方式
配置使用
将有数据的aof文件复制一份保存到对应目录(config get dir)重起redis
数据恢复
可以保持更高的数据完整性,如果设置追加file 的时间是 1s,如果 redis 发生故障,最多会丢失 1s 的数据;且如果日志写入不完整支持 redis-check-aof 来进行日志修复;AOF 文件没被 rewrite 之前(文件过大时会对命令进行合并重写),可以删除其中的某些命令(比如误操作的 flushall)。
AOF 文件比 RDB 文件大,且恢复速度慢。
AOF(增量同步)
RDB与AOF同步的区别
Redis持久化
如何使用
编译型异常事务中的所有命令都不会被执行(全体连坐)
银行信用卡可用余额问题
Watch 监听
取消事务跟回滚区别
Redis事务
主节点可以进行写操作,所有从节点都不允许进行写操作
动态主从
静态主从
如果从节点很多,一个数据存储就会通知很多从节点效率很低,可以采取树状形式配置
主从复制优化(薪火相传)
主从复制数据同步的过程
命令:SLAVEOF no one
反客为主
如果主节点存在了问题,整个Redis环境是不可以实现写的操作,需要人工更改配置变为主操作
缺陷
Redis主从复制
原理
哨兵如何判断是否为同一个集群
Master的故障发现 单个哨兵会向主的master节点发送ping的命令,如果master节点没有及时的响应,哨兵会认为该master节点为“主观不可用状态”会发送给其他都哨兵确认该Master节点是否不可用,当前确认的哨兵节点数>=quorum(可配置),会实现重新选举。
如何发现故障
原理解释
实现配置
每个节点都保存相同的同步的数据,可能会存在冗余的数据;其次只能允许有一个主的节点,属于中心化集群。
Redis哨兵机制
Redis Cluster模式中集群中采用分片集群模式,可以减少冗余数据,缺点就是构建该集群模式成本非常高,
RedisCluster集群的原理
创建目录
修改配置文件(每个服务)
启动
分配卡槽
连接
环境搭建
新建两个节点
添加master节点
添加从节点
加入集群(任意一台即可)
分配Redis槽位扩容(任意一台即可)
节点扩容
节点缩容
Redis Cluster集群
redis集群安装
添加依赖
参数配置
测试访问
基础使用
对象实体
实现序列化接口
自定义连接地址
不自定义连接地址
redis配置类
测试代码
redis存储对象类型
使用事务
配置文件
自定义 RedisTemplate
定义测试实体类
测试使用
lettuce集成(springboot2.x默认方式)
配置 JedisConnectionFactory
jedis集成
源码地址
SpringBoot2.0通过lettuce和jedis集成redis区别
官方文档
Springboot集成
使用 RList 操作 Redis 列表
使用 RMap 操作 Redis 哈希
使用 RLock 实现 Redis 分布式锁
使用 RAtomicLong 实现 Redis 原子操作
Redisson操作redis
1. 使用Redis Key自动过期出发事件通知2. 使用定时任务30分钟后检查3. 按照每分钟轮训检查
实现方案1
配置类
监听类
接口类
实体类
Mapper接口
代码实现
根据key有效期事件回调实现
实现方案2
应用:处理订单过期自动取消,比如下单30分钟未支付自动更改订单状态
多个不同的jvm 同时创建一个相同的标记使用Setnx命令,因为Rediskey必须保证是唯一的,只要谁能够创建成功谁就能够获取锁
获取锁
对我们的redis的key设置一个有效期(或者是主动删除该key)可以灵活的自动的释放该全局唯一的标记,其他的jvm重新进入到获取锁资源。
释放锁
等待获取锁的超时时间已经获取到锁 锁的有效期 5s
超时锁(没有获取锁、已经获取锁)
依赖
工具类
获取释放锁工具类
使用分布式锁
锁的超时时间根据业务场景来预估
可以自己延迟锁的时间
在提交事务的时候检查锁是否已经超时 如果已经超时则回滚(手动回滚)否则提交。(推荐)
如果我们业务逻辑5s内没有执行完毕呢?
代码实现(单机版本)
在集群环境下,保证只允许有一个jvm进行执行
相同点
实现方式
性能
可靠性
区别
与Zookeeper实现分布式锁比较
基于setnx
Redis实现分布式锁
实际应用示例
Redis
0 条评论
回复 删除
下一页