当前位置:网站首页>Redis理解
Redis理解
2022-08-04 22:05:00 【学习微站】
Redis
一、WHY
1、数据高并发读写 2、海量数据读写 3、不经常改变,但是对MySQL查询压力大的 4、想要使用分布式锁的解决方案,还有缓存,数据持久,事务,消息队列。
二、WHAT
nosql 非关系型数据库
Redis是一款内存高速缓存数据库。Redis全称为:Remote Dictionary Server (远程数据服务),使用C语言编写,Redis是一个key-value存储系统(键值存储系统),支持丰富的数据类型,如:String、list、set、zset、hash。
Redis跟memcache不同的是,储存在Redis中的数据是持久化的,断电或重启,数据也不会丢失。
三、HOW
Redisson(分布式)、Jedis、lettuce,
Jedis是Redis的Java实现的客户端,其API提供了比较全面的Redis命令的支持。
Redisson实现了分布式和可扩展的Java数据结构,和Jedis相比,功能较为简单,不支持字符串操作,不支持排序、事务、管道、分区等Redis特性。Redisson的宗旨是促进使用者对Redis的关注分离,从而让使用者能够将精力更集中地放在处理业务逻辑上
常用框架为:
Spring提供的Redis Client, StringRedisTemplate是用于操作Reids的API工具。
org.springframework.boot
spring-boot-starter-data-redis
和redis分布式锁
使用lock4j过程中遇到了很多问题,不推荐使用lock4j,推荐直接使用redisson的分布式锁。
com.baomidou
lock4j-redisson-spring-boot-starter
2.2.2
或者redisson自己的注解
org.redisson
redisson
3.5.0
或者spring-integration-redis中提供了Redis分布式锁的实现,
比如
@Configuration
public class RedisLockConfig {
@Bean
public RedisLockRegistry redisLockRegistry(RedisConnectionFactory redisConnectionFactory) {
return new RedisLockRegistry(redisConnectionFactory, “myRegistryKey”);
}
}
@Autowired
private RedisLockRegistry redisLockRegistry;
public void test() {
// 获取锁对象
Lock lock = redisLockRegistry.obtain(“myLockKey”);
// 加锁
boolean lockRsp = lock.tryLock(2, TimeUnit.SECONDS);
try {
// 业务逻辑
} catch (Exception ex) {
ex.printStackTrace();
} finally {
// 释放锁
lock.unlock();
}
}
另外 set是这样实现的
private final RedisTemplate<String, String> redisTemplate;
@Autowired
public RedisUtil(RedisTemplate<String, String> redisTemplate) {
this.redisTemplate = redisTemplate;
}
public void set(String field, T obj) {
final byte[] value = ProtoStuffUtil.serialize(obj);
redisTemplate.execute((RedisCallback) connection -> {
connection.set(field.getBytes(Charset.forName(“UTF8”)), value);
return null;
});
}
依赖如下
org.springframework.boot
spring-boot-starter-data-redis
四、深度
有些小伙伴认为,稍微把锁过期时间设置长一些就可以啦。其实我们设想一下,是否可以给获得锁的线程,开启一个定时守护线程,每隔一段时间检查锁是否还存在,存在则对锁的过期时间延长,防止锁过期提前释放。
当前开源框架Redisson解决了这个问题。我们一起来看下Redisson底层原理图吧:只要线程一加锁成功,就会启动一个watch dog看门狗,它是一个后台线程,会每隔10秒检查一下,如果线程1还持有锁,那么就会不断的延长锁key的生存时间。因此,Redisson就是使用Redisson解决了「锁过期释放,业务没执行完」问题。
六,redis为什么是单线程?
因为cpu不是Redis的瓶颈,Redis的瓶颈有可能是机器内存或者网络带宽。所以Redis都是单线程的。单核cpu一秒可以处理1百万个指令,大概对应几十万个请求。
七,什么是缓存穿透?怎么解决?
缓存穿透:指查询一个一定不存在的数据,由于缓存时不命中时需要从数据库查询,查不到的数据则不写入缓存,这将导致这个不存在的数据每次请求都要到数据库去查询,造成缓存穿透。
解决方案:如果一个查询返回的结果为空,把这个空结果进行缓存,但此过期时间设置较短,最长不超过5分钟。
八,怎么保证缓存和数据库数据的一致性?
合理设置缓存的过期时间,新增,修改,删除数据库操作时同步更新redis,可以使用事务机制来保证数据的一致性。
边栏推荐
猜你喜欢
【论文笔记KDD2021】MixGCF: An Improved Training Method for Graph Neural Network-based Recommender Systems
Open source summer | Cloud server ECS installs Mysql, JDK, RocketMQ
硬件开发定制全流程解析
双非读者,一举拿下阿里、字节、美团、京东、虾皮offer
基于声卡实现的音频存储示波器,可作为电磁学实验的测量仪表
Altium Designer 19.1.18 - Protecting Locked Objects
【Social Marketing】WhatsApp Business API: Everything You Need to Know
MQTT[一]基础知识介绍
ES6高级-Promise的用法
炽热如初 向新而生|ISC2022 HackingClub白帽峰会圆满举办!
随机推荐
MQTT[一]基础知识介绍
Exploration and Practice of Database Governance
EasyGBS接入最新版海康摄像头后无法传递告警信息该如何解决?
打卡第 1 天:正则表达式学习总结
ROS packages visualization
com.jacob.com.ComFailException: Invoke of: ActiveDocument
后排乘客不系安全带?事故瞬间被甩出
关于el-table列表渲染
LeetCode 199: 二叉树的右视图
[QT] Implementation of callback function
Arduino 电机测速
PowerBI scripture series
软测人面试 ,HR 会问到哪些问题?学会涨薪3000+
今天是七夕,来看看程序员的土味情话。
Altium Designer 19.1.18 - 画多边形铜皮挖空时,针对光标胡乱捕获的解决方法
Unknown point cloud structure file conversion requirements
CountDownLatch使用及原理
How to solve the problem that the alarm information cannot be transmitted after EasyGBS is connected to the latest version of Hikvision camera?
【C - 基本概念】
ES 数据聚合、数据同步、集群