
- 作用
- 1.替mysql分担责任
- 2.保证线程安全
- 3.作为消息队列
- 数据类型
- 1.字符型
- 2.哈希值
- 3.List集合
- 4.set集合
- 5. zset
- java代码实现
- 1.集成springboot
- 服务端搭建模式
- 使用过程中可能产生的一些问题
- 1. 无法替mysql承担责任
- 1 缓存穿透:
- 2. 缓存击穿: mysql也没有数据
- 2. 无用数据堆满了,导致新的数据进不来
- 3. redis本身出问题了,导致数据丢失
1.由于mysql支持的并发访问数是有限的,所以mysql撑不起来的并发让redis承担一部分
2.数据从mysql中拿取要走磁盘io *** 作加载到内存,而redis直接把数据放到内存,提高响应时间
要保证不同的进程上的线程安全问题,就要使用到一个脱离进程本身的第三方的同步控制,这是就用到了redis。synchronized只能保证同一个java进程下线程的同步。思想是由一个线程设置一个key,处理完业务逻辑后把key删掉。处理过程中其他线程无法设置key成功,自然也就阻塞了。
RLock hello = redissonClient.getLock("hello");
hello.lock();
try {
//业务处理
}finally {
hello.unlock();
}
3.作为消息队列
数据类型
redis是按key-value存储数据,数据类型指的是value的类型,key都是字符型
1.字符型 2.哈希值 3.List集合 4.set集合 5. zset每个集合都对应一种数据结构,这就是数据结构的重要性
**1.压缩链表:**满足条件为当元素个数在128个之内,每个字符串元素大小在64之内。
**2.跳表:**链表的升级版,链表可以跨节点指针存储,比如第一个节点可以访问第五个节点。
java代码实现无论哪种实现第一步都是配置服务ip和端口:
spring.redis.host: 127.0.0.1
spring:
redis:
port: 6379
1.集成springboot
@Autowired
private StringRedisTemplate stringRedisTemplate;
stringRedisTemplate.opsForValue().get("stock");
stringRedisTemplate.opsForHash().get("","");
stringRedisTemplate.opsForZSet();
stringRedisTemplate.opsForSet();
stringRedisTemplate.opsForList();
//引入依赖
org.springframework.boot
spring-boot-starter-data-redis
2.2.4.RELEASE
```
#### 2 redisson
```java
@Configuration
@Slf4j
public class RedissonConfig extends CachingConfigurerSupport {
@Value("${spring.redis.host}")
private String host;
@Value("${spring.redis.port}")
private int port;
@Bean
public RedissonClient getRedisson() {
Config config = new Config();
config.useSingleServer().setAddress("redis://" + host + ":" + port);
return Redisson.create(config);
}
}
//在主类中使用客户端对象
@Autowired
private RedissonClient redissonClient;
redissonClient.getList(" ");``
服务端搭建模式
使用过程中可能产生的一些问题
1. 无法替mysql承担责任
1 缓存穿透:
mysql里有数据,同时期望redis里也有数据,但是redis没有,大量请求打到mysql导致mysql可能撑不住。
***解决:***在第一个请求到mysql查询时把数据往redis里存一份,这里为什么要在加锁之后再做一次判断呢,因为如果不加其他请求即使在mysql把数据同步到redis后还是会走mysql。
String custom = stringRedisTemplate.opsForValue().get("custom");
if(custom==null){
hello.lock();
if( stringRedisTemplate.opsForValue().get("custom")==null){
//sql查询
//往redis设置一份
}else {
stringRedisTemplate.opsForValue().get("custom");
}
}
2. 缓存击穿: mysql也没有数据
2. 无用数据堆满了,导致新的数据进不来
3. redis本身出问题了,导致数据丢失欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)