Redis 在开发中的应用

目录

Redis 下载

Redis 基本数据类型

1、 string

2、hash

3、list

4、set

5、sorted set

Redis 通用命令

在 Java 操作Redis

Jedis

Spring Data Redis

开发的实际问题

缓存穿透、缓存击穿、缓存雪崩解决方案?(高频)


Redis 下载

https://github.com/ServiceStack/redis-windows/tree/master/downloads

Redis 基本数据类型

Redis存储的是key-value结构的数据,其中key是字符串类型,value有5种常用的数据类型:

字符串(string):普通字符串,常用

哈希(hash):适合存储对象

列表(list):按照插入顺序排序,可以有重复元素

集合(set):无序集合,没有重复元素

有序集合(sorted set / zset):集合中每个元素关联一个分数(score),根据分数升序排序,没有重复元素

1、 string

常见命令:set、get、decr、incr、mget等。

基本特点:string数据结构是简单的key-value类型,value其实不仅可以是String,也可以是数字

应用场景:常规计数:微博数,粉丝数等。

2、hash

常用命令: hget、hset、hgetall等。

基本特点:hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,后续操作的时候,你可以直接仅仅修改这个对象中的某个字段的值。

应用场景:存储用户信息,商品信息等。

3、list

常用命令: lpush、rpush、lpop、rpop、lrange等。

基本特点:类似于Java中的list可以存储多个数据,并且数据可以重复,而且数据是有序的。

应用场景:存储微博的关注列表,粉丝列表等。

4、set

常用命令: sadd、spop、smembers、sunion 等

基本特点:类似于Java中的set集合可以存储多个数据,数据不可以重复,使用set集合不可以保证数据的有序性。

应用场景:可以利用Redis的集合计算功能,实现微博系统中的共同粉丝、公告关注的用户列表计算。

5、sorted set

常用命令: zadd、zrange、zrem、zcard 等。

基本特点:和set相比,sorted set增加了一个权重参数score,使得集合中的元素能够按score进行有序排列。

应用场景:在直播系统中,实时排行信息包含直播间在线用户列表,各种礼物排行榜等。

Redis 通用命令

Redis中的通用命令,主要是针对key进行操作的相关命令:

  • KEYS pattern 查找所有符合给定模式( pattern)的 key
  • EXISTS key 检查给定 key 是否存在
  • TYPE key 返回 key 所储存的值的类型
  • TTL key 返回给定 key 的剩余生存时间(TTL, time to live),以秒为单位
  • DEL key 该命令用于在 key 存在是删除 key

更多命令可以参考Redis中文网:https://www.redis.net.cn

在 Java 操作Redis

在Java中操作Redis 的方法有很多,我这里只用常见的两种

Jedis
  • Jedis是Redis的Java版本的客户端实现

  • 相关maven坐标

     <dependencies>
            <dependency>
                <groupId>redis.clients</groupId>
                <artifactId>jedis</artifactId>
                <version>2.8.0</version>
            </dependency>
     
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
            </dependency>
        </dependencies>
  • 使用Jedis操作Redis的步骤

    
    import org.junit.Test;
    import redis.clients.jedis.Jedis;
     
    public class JedisTest {
     
        @Test
        public void jedisTest() {
            // 1. 连接redis
            // 创建一个Jedis对象连接Redis数据库
            Jedis jedis = new Jedis("127.0.0.1", 6379);
            jedis.auth("123");
     
            // 2. 执行操作
            // 存储数据
            jedis.set("name", "coolman");
            // 获取数据
            System.out.println(jedis.get("name"));
     
            // 3. 关闭连接
            jedis.close();
        }
    }

Spring Data Redis
  • Spring Data Redis 是 Spring 的一部分,提供了在 Spring 应用中通过简单的配置就可以访问 Redis 服务,对 Redis 底层开发包进行了高度封装。在 Spring 项目中,可以使用Spring Data Redis来简化 Redis 操作

  • 官网

  • 相关maven坐标

    <dependency>
    	<groupId>org.springframework.data</groupId>
    	<artifactId>spring-data-redis</artifactId>
    	<version>2.4.8</version>
    </dependency>
    
    //SpringBoot也提供了对应的starter
    <dependency>
    	<groupId>org.springframework.boot</groupId>
    	<artifactId>spring-boot-starter-data-redis</artifactId>
    </dependency>

  • Spring Data Redis中提供了一个高度封装的类:RedisTemplate,针对 Jedis 客户端中大量api进行了归类封装,将同一类型操作封装为operation接口,具体分类如下:

    • ValueOperations:简单K-V操作
    • HashOperations:针对hash类型的数据操作
    • ListOperations:针对list类型的数据操作
    • SetOperations:set类型数据操作
    • ZSetOperations:zset类型数据操作

     提前初始化一个SpringBoot项目,其中的配置文件信息如下 :

redis:
  # redis数据库索引(默认为0),我们使用索引为3的数据库,避免和其他数据库冲突
  database: 3
  # redis服务器地址(默认为localhost)
  host: 192.168.91.128
  # redis端口(默认为6379)
  port: 6379
  # redis访问密码(默认为空)
  password: 1234
  # redis连接超时时间(单位毫秒)
  timeout: 10000
  # redis连接池配置
  pool:
    # 最大可用连接数(默认为8,负数表示无限)
    max-active: 8
    # 最大空闲连接数(默认为8,负数表示无限)
    max-idle: 8
    # 最小空闲连接数(默认为0,该值只有为正数才有用)
    min-idle: 0
    # 从连接池中获取连接最大等待时间(默认为-1,单位为毫秒,负数表示无限)
    max-wait: -1

开发的实际问题

缓存穿透、缓存击穿、缓存雪崩解决方案?(高频)

加入缓存以后的数据查询流程:


缓存穿透

概述:指查询一个一定不存在的数据,如果从存储层查不到数据则不写入缓存,这将导致这个不存在的数据每次请求都要到 DB 去查询,可能导致 DB 挂掉。

解决方案:

1、查询返回的数据为空,仍把这个空结果进行缓存,但过期时间会比较短

2、布隆过滤器:将所有可能存在的数据哈希到一个足够大的 bitmap 中,一个一定不存在的数据会被这个 bitmap 拦截掉,从而避免了对DB的查询

缓存击穿

概述:对于设置了过期时间的key,缓存在某个时间点过期的时候,恰好这时间点对这个Key有大量的并发请求过来,这些请求发现缓存过期一般都会从后端 DB 加载数据并回设到缓存,这个时候大并发的请求可能会瞬间把 DB 压垮。

解决方案:

1、使用互斥锁:当缓存失效时,不立即去load db,先使用如 Redis 的 setnx 去设置一个互斥锁,当操作成功返回时再进行 load db的操作并回设缓存,否则重试get缓存的方法

2、永远不过期:不要对这个key设置过期时间

缓存雪崩

概述:设置缓存时采用了相同的过期时间,导致缓存在某一时刻同时失效,请求全部转发到DB,DB 瞬时压力过重雪崩。与缓存击穿的区别:雪崩是很多key,击穿是某一个key缓存

解决方案:

将缓存失效时间分散开,比如可以在原有的失效时间基础上增加一个随机值,比如1-5分钟随机,这样每一个缓存的过期时间的重复率就会降低,就很难引发集体失效的事件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值