redis总结

redis数据结构

redis是一个c语言编写的开源的高性能菲关系行键值对数据库。他的数据是存放在内存中的,所以读写速度非常快。
string、list、set、Zset、Hash

  1. string字符串、整形、浮点型(简单的键值对)
  2. 哈希类型 hash : map格式 ,更像一个对象
  3. 列表类型 list : linkedlist格式。支持重复元素
  4. 集合类型 set : 不允许重复元素无序集合
  5. 有序集合类型 sortedset:不允许重复元素,且元素有顺序

为什么这么快?

  • 完全基于内存,绝大数请求时纯粹的内存操作。
  • 数据结构简单,对数据操作简单,比关系db快很多数量级
  • 采用单线程,避免了上下文切换和竞争,不用切换CPU,不用考虑锁问题
  • 多路IO复用模型,非阻塞式IO

例题:从海量数据查询某一固定前缀的key__值

询问:数据量、返回条数等信息
方式1KEYS k1*

  • KEYS指令一次性返回所有匹配的key
  • 键的数量过大会使服务卡顿

方式2SCAN 开始迭代 MATCH k1* COUNT 10 //开始扫描k1打头的10条,返回数据不一定是10个(只是部分数据),他返回的是一个新的迭代位置和k1开头的部分数据,可以在利用那个信息的迭代位置继续scan

  • 基于游标的迭代器,需要基于上一次的游标延续之前的迭代过程
  • 以0作为游标开始一次新的迭代,直到命令返回游标0完成一次遍历
  • 不保证每次执行都返回某个给定数量的元素,支持模糊查询
  • 一次返回的数量不可控,只能是大概率符合count参数

如何通过redis实现分布式锁

分布式锁要解决的问题:?互斥性 ?安全性 ?死锁 ?容错。注意点如下:

  • 设置原子性SET key value [EX seconds] [PX milliseconds] [NX|XX]//这个指令将设置值和设置过期时间揉在一起,保证了原子性:set lock 123 ex 10 nx;
  • 保证异常情况仍能释放锁:try-finally优化,将delete指令放在finally块中
  • 保证自己加的的锁由自己释放:设置的值可以为线程id作为lock的value。在finally释放锁时判断值和当前线程id是否相等,相等则说明是当前线程自己上的锁可以释放。
  • 保证自己加的的锁由自己释放:可以在业务线程(秒杀线程)中开一个分线程去做定时任务,每隔一小段时间去检查一下这个锁还在不在,如果在就给他“续命”,重新设置超时时间,当主业务线程执行完后,会释放锁,定时任务线程销毁。(redisson框架)就是这个思路。

如何使用redis实现异步队列

方式1
使用List作为队列, rpush生产消息, lpop消费消息
缺点:不会等等待队列里有值才会消费,
弥补:可以通过在应用层弓|入Sleep机制去调用LPOP重试,或使用blpop key timeout 指令去消费,这个指令阻塞直到队列有消息或者超时。blpop testlist 30 //阻塞等待值,超过30秒停止阻塞。这种方式的缺点是只能让1个消费者消费。
方式2:
pub/sub :主题订阅者模式

  • 发送者(pub)发送消息,订阅者(sub)接收消息
  • 订阅者可以订阅任意数量的频道

例如:

  1. 启两个redis客户端
  2. 均使用subscribe myTopic //两个redis客户端均订阅myTopic频道
  3. 再开启一个redis客户端subscribe anotherTopic//订阅其他频道
  4. 开启一个客户端publish myTopic “hello”//在myTopic频道发布消息
  5. 订阅myTopic的redis客户端就可以收到hello这个消息,但是anotherTopic收不到。(一条消息可以供n个消费者消费,消费者也只获取到他们关系的数据)

缺点:消息发布是无状态的无法保证可达。他的发送是即发即失的。(在传输过程中丢失,或者发送后客户端下线,均无法再次获取,解决这问题就需要专业的消息队列如kafuka等)

应用场景(项目中)

  1. 经常使用但是不经常改变的数据,例如历史评论信息
  2. banner图片、视频信息等,可以降低mysq的读写压力。
  3. 可以和SpringSession+redis实现session共享。
  4. 短信验证码一分钟过期。

缓存雪崩:大批量的数据过期。

  1. 设置随机的过期时间,防止同一时间大量数据过期
  2. 分布式部署,将数据均匀的分布在不同的缓存数据库中
  3. 设置热点数据,永远不会过期

缓存击穿:缓存中没有数据库中有。

  1. 设置热点数据永不过期
  2. 加互斥锁。

缓存穿透:缓存和数据库都没有的数据。

  1. 在接口层增加校验,如用户鉴权校验,
  2. 将key-value对写为key-null,防止反复用同一个key进行暴力攻击

项目中的使用?

  • 在spring的配置文件中,配置redis连接池得到配置参数jedisPoolConfig(最大连接数、最大等待时间等)、redis连接工厂jedisConnectionFactory(主机、ip等)、redis操作模板(redisTemplate)
  • 在对应controller中进行注入redisTemplate对象操作redis。
  1. redis存储的是组装好的树形评论,用根评论id作为key,组装内容为值。
  2. 每次获取只需要根据根评论id,进行获取即可
  3. 每次添加评论时,先往数据库中进行添加该条数据,在进行重新组装,然后删除redis中的根评论id数据,将组装好的跟评论信息存入redis中

项目中redis使用场景

引入依赖,并对redis进行配置
在对应的接口方法上加@Cacheable(value="",key=“selectIndexList”)注解,表示该方法的返回结果是可以缓存的,下次,使用相同参数调用方法时,会返回缓存中的值,不会直接执行方法。在redis中key实际为key::selectIndexList,value为实际返回值。

https://thinkwon.blog.csdn.net/article/details/103522351

短信服务

  • 开通阿里元的短信服务
  • 设置短信的签名管理和模板管理,并且进行申请模板
  • 填写表单点击发送验证码,成功发送验证码后,存储到redis中,并设置有效时间为1分钟。在一分钟内让用户输入

持久化

RDB

redisDatebase快照。redis默认的持久化方式,按照一定时间将内存中的数据以快照的形式保存到硬盘中,在配置文件中有save指令,例如:save 900 1表示900秒内有一条写指令就备份一次,对应产生的数据文件是dump.rdb。
优点:1. 只有一个dump.rdb文件方便持久化。
缺点:数据安全性低,RDB间隔一段时间进行持久化,在这段时间内可能发送redis故障数据丢失。所以更适合数据要求不严谨的时候。
save 900 1//900秒内有一条写指令就备份一次
save 300 10//300秒内有10条写指令就备份一次
save 60 10000//60秒内有10000条写指令就备份一次
多条规则配置原因:在某一时段redis的读写请求不均衡,平衡性能和数据安全就配置多条规则。可以根据自身业务进行配置
RDB (快照)持久化:保存某个时间点的全量数据快照

  • SAVE :阻塞Redis的服务器进程,直到RDB文件被创建完毕
  • BGSAVE : Fork出一个子进程来创建RDB文件,不阻塞服务器进程

AOF

将redis执行的每次写命令记录到单独的日志文件中,重启redis会持久化日志文件恢复数据。当两种方式同时开启时,数据恢复会优先选择AOf恢复。
优点:1. 数据安全,没进行一次命令就会记录到aof文件中。2.通过append模式写文件,中途宕机也可以使用redis-check-aof工具解决一直性问题。3.AOF具有rewrite模式,AOF 文件没被 rewrite 之前(文件过大时会对命令 进行合并重写),可以删除其中的某些命令(比如误操作的 flushall))
缺点:AOF文件比RDB文件大,恢复速度慢。

AOF ( Append-Only-File )持久化:保存写状态

  • 记录下除了查询以外的所有变更数据库状态的指令
  • 以append的形式追加保存到AOF文件中(增量)
  • 修改配置文件中appendonly no 为appendonly yes即可生效
  • 配置aof文件的写入方式appendsync always表示一旦缓存发送变化总是及时的写入aof中,appendsync everysec(推荐)每隔一秒写入aof中,appendsync no是交由操作系统决定,一般操作系统会等待缓冲区被填满时才写入aof中

日志重写解决AOF文件大小不断增大的问题,原理如下:

  • 调用fork() ,创建一个子进程
  • 子进程把新的AOF写到一个临时文件里,不依赖原来的AOF文件
  • 主进程持续将新的变动同时写到内存和原来的AOF里
  • 主进程获取子进程重写AOF的完成信号,往新AOF同步增量变动
  • 使用新的AOF文件替换掉旧的AOF文件

总结:1.AOF文件比RDB更新频率高,优先使用AOF还原数据。2.AOF比RDB更安全也更大。 3.RDB性能比AOF好。4.如果两个都配了优先加载AOF。

  • RDB优点:全量数据快照,文件小,恢复快
  • RDB缺点:无法保存最近一次快照之后的数据
  • AOF优点:可读性高,适合保存增量数据,数据不易丢失
  • AOF缺点:文件体积大,恢复时间长
    在这里插入图片描述

redis集群原理

如何从海量数据里快速找到所需?

  • 分片:按照某种规则去划分数据,分散存储在多个节点上
  • 常规的按照哈希划分无法实现节点的动态增减
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值