redis中间件

redis中间件,第1张

文章目录
    • 作用
        • 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分担责任

1.由于mysql支持的并发访问数是有限的,所以mysql撑不起来的并发让redis承担一部分
2.数据从mysql中拿取要走磁盘io *** 作加载到内存,而redis直接把数据放到内存,提高响应时间

2.保证线程安全

要保证不同的进程上的线程安全问题,就要使用到一个脱离进程本身的第三方的同步控制,这是就用到了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本身出问题了,导致数据丢失

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/720529.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-04-25
下一篇2022-04-25

发表评论

登录后才能评论

评论列表(0条)

    保存