Redis

Redis 是一款基于键值对的NoSQL(not only SQL )数据库,它的值支持多种数据结构:字符串、哈希、列表、集合、有序集合等

Redis将所有的数据都存放在内存中,所以读写性能十分惊人。
同时Redis还可以将内存中的数据以快照或者日志的形式保存到硬盘上,以保证数据的安全性。
快照,RDB。将当前数据直接原本的存到硬盘里。优点是数据体积小,恢复快。缺点是存数据时比较耗时间,存储时可能会产生阻塞,会对正在处理的其他业务有影响。不适合实时。
日志,AOF。每执行一个命令,就以日志的方式存下来。可以做到实时,但是以追加的方式存储,比较占磁盘空间。恢复时是将命令再跑一遍,恢复速度慢。
两种方式可以结合使用。

Redis的典型应用场景包括:缓存、排行榜、计数器、社交网络、消息队列等

下载安装

Redis官网提供的是Linux的安装包
windows 版本
https://github.com/tporadowski/redis/releases
下载安装,配置环境变量
在这里插入图片描述
在这里插入图片描述
通过命令行启动redis客户端
在这里插入图片描述

数据类型

在这里插入图片描述

常见命令

一些基本操作
16个库,0-15
在这里插入图片描述
String在这里插入图片描述
在这里插入图片描述
hash在这里插入图片描述
列表,左进右出
在这里插入图片描述
集合,列表有序,集合无序,不能重复
在这里插入图片描述
有序集合
在这里插入图片描述
一些全局操作
在这里插入图片描述

spring 整合redis

pom.xml中引入依赖
application.properties中进行配置
重写配置类RedisTemplate
Spring boot提供了RedisTemplate,但是键值对中的key是Object类型,更通用,但一般是用string,用起来不方便

Redis事务

redis中事务不完全满足ACID特性
Redis接受到命令后不是马上执行,而是将命令放入队列中,提交事务时统一执行,所以如果是查询命令不会马上得到结果,不要将查询命令放到事务里,而是在事务之前或之后
也支持声明式事务编程式事务,但一般都有编程式事务

过期策略

Redis会把设置了过期时间的key放入一个独立的字典里,在key过期时并不会立刻删除它。Redis会通过如下两种策略,来删除过期的key:
惰性删除
客户端访问某个key时, Redis会检查该key是否过期,若过期则删除。
定期扫描
Redis默认每秒执行10次过期扫描(配置hz选项),扫描策略如下:
1.从过期字典中随机选择20个key;
2.删除这20个key中已过期的key;
3.如果过期的key的比例超过25%,则重复步骤1;

淘汰策略

当Redis占用内存超出最大限制(maxmemory)时,可采用如下策略(maxmemory-policy) ,让Redis淘汰一些数据,以腾出空间继续提供读写服务:
noeviction:对可能导致增大内存的命令返回错误(大多数写命令,DEL除外);
volatile-ttl:在设置了过期时间的key中,选择剩余寿命(TTI)最短的key,将其淘汰;. volatile-lru:在设置了过期时间的key中,选择最少使用的key (LRU算法),将其淘汰;.
volatile-random:在设置了过期时间的key中,随机选择一些key,将其淘汰;
allkeys-lru:在所有的key中,选择最少使用的key (LRU),将其淘汰;
allkeys-random:在所有的key中,随机选择一些key,将其淘汰;
在这里插入图片描述

缓存问题

缓存穿透

·场景
查询根本不存在的数据,使得请求直达存储层,导致其负载过大,甚至宕机。
·解决方案
1.缓存空对象
存储层未命中后,仍然将空值存入缓存层。再次访问该数据时,缓存层会直接返回空值。2.布隆过滤器
将所有存在的key提前存入布隆过滤器,在访问缓存层之前,先通过过滤器拦截,若请求的是不存在的key,则直接返回空值。
在这里插入图片描述

缓存击穿

场景
一份热点数据,它的访问量非常大。在其缓存失效瞬间,大量请求直达存储层,导致服务崩溃。
解决方案
1.加互斥锁
对数据的访问加互斥锁,当一个线程访问该数据时,其他线程只能等待。
这个线程访问过后,缓存中的数据将被重建,届时其他线程就可以直接从缓存取值。
2.永不过期
不设置过期时间,所以不会出现上述问题,这是“物理”上的不过期。
为每个value设置逻辑过期时间,当发现该值逻辑过期时,使用单独的线程重建缓存。

缓存雪崩

场景
由于某些原因,缓存层不能提供服务,导致所有的请求直达存储层,造成存储层宕机。
解决方案.
1.避免同时过期
设置过期时间时,附加一个随机数,避免大量的key同时过期。
2.构建高可用的Redi s缓存
部署多个Redi s实例,个别节点宕机,依然可以保持服务的整体可用。
3.构建多级缓存
增加本地缓存,在存储层前面多加一-级屏障,降低请求直达存储层的几率。
4.启用限流和降级措施
对存储层增加限流措施,当请求超出限制时,对其提供降级服务。

分布式锁

场景
修改时,经常需要先将数据读取到内存,在内存中修改后再存回去。在分布式应用中,可能多个进程
同时执行上述操作,而读取和修改非原子操作,所以会产生冲突。增加分布式锁,可以解决此类问题。
基本原理
同步锁:在多个线程都能访问到的地方,做-一个标记, 标识该数据的访问权限。
分布式锁:在多个进程都能访问到的地方,做一个标记,标识该数据的访问权限。
实现方式
1.基于数据库实现分布式锁;
2.基于Redis实现分布式锁;
3.基于zookeeper实现分 布式锁;

Redis实现分布式锁的原则

1.安全属性:独享。在任- -时刻,只有一-个客户端持有锁。
2.活性A:无死锁。即便持有锁的客户端崩溃或者网络被分裂,锁仍然可以被获取。
3.活性B:容错。只要大部分Redis节点都活着,客户端就可以获取和释放锁。
在这里插入图片描述
在这里插入图片描述
该文章内容来自牛客网java项目课程

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值