您当前的位置:首页 > 电脑百科 > 数据库 > Redis

Redis常用的八种场景

时间:2023-11-20 14:22:07  来源:微信公众号  作者:猿java

作为一名 JAVA后端人员,对 redis肯定并不陌生,Redis作为一种内存数据库,以其速度之快在编程的舞台上纵横多年,那么,Redis到底适合哪些业务场景?今天就来聊一聊。

Redis常用的八种场景

1. 缓存/数据库

缓存(Cache)是 Redis使用最广泛的场景之一,也是很多小伙伴结识 Redis的重要原因,在 8种10倍提升API性能的方式 文章中我们也强调了Redis可以作为缓存的来加速 API性能。如下图,在 WebServer和数据库之间会增加一层 Redis缓存,这样 WebServer可以直接从Redis中快速拿到数据返回,加快了 WebServer的响应速度。

Redis常用的八种场景

举例:

  • 电商领域,可以缓存一些热门商品的静态信息或用户数据,这样,在大流量访问时,不用查询数据库,加速访问速度。
  • 配置中心,业务开发中,经常会使用一些全局配置,而且配置更改的频率很低,因此,可以把配置都加载到 Redis内存中,加快查询数据。

需要说明的是:很多时候,我们都会把 Redis的持久化功能打开,因此,在把 Redis当作缓存的同时,同样把 Redis当作数据库在使用。

2. 分布式锁

分布式锁(Distributed Lock)也是 Redis使用最广泛的场景之一,分布式系统中,当我们在处理有并发的业务场景时,为了保证线程安全,通常通常会使用分布式锁,单机下,Redis通常使用 SET NX(if Not Exist)和 PX(过期时间)来创建锁,指令如下:

# 如果key不存,set key=value,
# 失效时间是 expiration毫秒
SET key value NX PX expiration

在 Java中,Redission是一个基于 Redis的分布式Java对象映射(Java Redis Client),它提供了丰富的特性和工具,示例代码展示了如何在 Redission框架中使用 Redis分布式锁:

import org.redisson.Redisson;
import org.redisson.api.RedissonClient;
import org.redisson.config.Config;

public class RedissonExample {
    public static void mAIn(String[] args) {
        Config config = new Config();
        config.useSingleServer().setAddress("redis://127.0.0.1:6379");
        RedissonClient redisson = Redisson.create(config);

        // 使用分布式锁
        String lockKey = "lockKey";
        boolean isLocked = redisson.getLock(lockKey).tryLock();
        if (isLocked) {
            // 获得锁,执行相关操作
            System.out.println("Lock acquired successfully");
            redisson.getLock(lockKey).unlock(); // 释放锁
        } else {
            System.out.println("Failed to acquire lock");
        }
        redisson.shutdown(); // 关闭连接
    }
}

需要说明的是:除了Redis,Zookeeper也是实现分布式锁比较常用的一种技术方案。

3. 限流

限流(Rate Limiter)也是 Redis使用比较多的一个场景,限流是保护系统免受过载的一种方法,它可以确保在指定时间内对系统的请求进行限制。在 Redis 中,可以使用 SET、EXPIRE 和 Lua 脚本来实现简单的限流功能。

示例代码展示了Java Jedis 库实现基于令牌桶算法的 Redis 限流:

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Response;
import redis.clients.jedis.Transaction;

public class RateLimiter {
    private final Jedis jedis;
    private final String key;
    private final int capacity;
    private final int tokensPerSecond;

    public RateLimiter(Jedis jedis, String key, int capacity, int tokensPerSecond) {
        this.jedis = jedis;
        this.key = key;
        this.capacity = capacity;
        this.tokensPerSecond = tokensPerSecond;
    }
   
    /**
    * 用于检查是否允许请求,根据当前令牌数量和容量进行判断
    */ 
    public boolean allowRequest() {
        long now = System.currentTimeMillis();
        Transaction transaction = jedis.multi();
        // Add current time with score
        transaction.zadd(key, now, String.valueOf(now)); 
        // Remove tokens that are older than 1 second
        transaction.zremrangeByScore(key, 0, now - 1000); 
        // Get current number of tokens
        Response<Long> sizeResponse = transaction.zcard(key); 

        transaction.exec();

        long size = sizeResponse.get();
        // Check if number of tokens is within capacity
        return size <= capacity; 
    }

    public static void main(String[] args) {
        Jedis jedis = new Jedis("localhost"); // Connect to Redis
        // Create rate limiter
        RateLimiter rateLimiter = new RateLimiter(jedis, "RateLimiterKey", 10, 5); 

        for (int i = 0; i < 15; i++) {
            boolean allowed = rateLimiter.allowRequest();
            if (allowed) {
                System.out.println("Request allowed");
            } else {
                System.out.println("Request denied");
            }
        }

        // Close Redis connection
        jedis.close(); 
    }
}

4. 会话存储

会话(Session)也是 Redis常见的一种功能,熟悉 Spring的小伙伴肯定知道它也有一个 Session功能,那么它和 Redis的 Session有什么区别呢?

Spring Session是一个抽象层,提供与存储后端衔接能力,至于后端采用内存、数据库还是Redis存储Spring Session不关注。而 Redis Session是 Spring Session的一种具体实现,将会话数据存储在Redis中。

举例:存储用户登录信息:

#将用户的登录信息存储在 Redis中,key:userId, value:user登录信息
SET user:userId {"username": "xxx", "password": "xxx",...}

5. 发布/订阅

发布/订阅(Sub/Pub)是 Redis中一个类似于消息中间件(MQ)的功能,当我们的业务中有需要通过事件触发的场景时可以使用该功能,不过 Redis的 Sub/Pub功能还是比较简陋,有复杂的业务场景时还是推荐MQ。

举例:

群聊,在实时聊天应用中,利用 Redis的发布/订阅功能实现消息广播。

实现事件通知系统,如新订单通知、新邮件提醒等。

#订阅频道
SUBSCRIBE channel_xxx
# 向频道中发送消息
PUBLISH channel_xxx "Message content"

6. 排名/排行榜

排名/排行榜(Rank/LeaderBoard)是 Redis中一个比较实用的功能,在文章热榜、游戏竞技或社区平台中,排行榜(Leaderboard)和排名(Ranking)系统是常见的功能,用于展示用户在特定活动、比赛或指标上的排名情况,而 Redis的有序集合(Sorted Set)是实现排行榜功能的理想数据结构,因为它可以存储每个成员的分数,并根据分数进行排序。

举例:

(1) 记录网站访问次数或文章阅读次数。

# 添加文章的点击量
#将 Article1 的值增加1。如果Article1 不存在于有序集合中,
# 该命令会将 Article1 添加到集合,并设置值为1
ZINCRBY leaderboard 1 "Article1"
ZINCRBY leaderboard 1 "Article2"
ZINCRBY leaderboard 1 "Article3"

# 获取 Article2的排名(从高到低排名)
ZREVRANK leaderboard "Article2" 

# 获点击量 Top10 的文章和点击量
ZREVRANGE leaderboard 0 9 WITHSCORES

(2) 实现用户积分排行榜。

7. 计数

在 Redis中,可以使用 INCR、DECR 等命令来进行简单的计数操作。这些命令用于对键的值进行递增或递减操作,常用于实现计数器等功能。

常用计数命令:

# 对 key进行 +1 操作
INCR key
# 对key 进行 -1 操作
DECR key

# 对 key进行 +n 操作
INCRBY key n
# 对 key进行 -n 操作
DECRBY key n

另外,在排名/排行榜中,ZINCRBY 是对 Sort set的一种计数方式。

举例:

  • 网站访问量计数器,可以实时统计网站的访问次数;
  • 点赞/喜欢计数器,对文章或内容的点赞或喜欢次数进行计数;
  • 用户在线状态统计,统计在线用户数量;

8. 地理位置应用

Redis的地理位置应用功能使用的场景比较有针对性,如果你不是在特定的领域,可能并不会使用该功能,它是 通过 Geo数据类型支持地理位置存储和检索,可以用于构建位置服务和地理位置相关的应用。

举例:

(1) 点过外卖的小伙伴肯定不陌生,外卖平台上,附近商家搜索功能。

# 查找经度12.087269,纬度39.412669 附近5 km的距离范围
GEORADIUS locations 12.087269 39.412669 5 km

(2) 打车平台,比如一些网约车平台,就可以把司机,乘客的位置信息(经纬度)通过Redis的Geo来实现距离计算等功能。

# 添加经纬度信息,经纬度是编造的,不一定真实
GEOADD locations 12.322389 39.125356 "Driver"
GEOADD locations 12.087269 39.412669 "Passenger"
# 计算司机和乘客两地点间的距离
GEODIST locations Driver Passenger

总结

本文介绍了Redis常见的 8种实用场景:

  • 缓存/数据库
  • 分布式锁
  • 限流
  • 会话存储
  • 发布/订阅
  • 排名/排行榜
  • 计数
  • 地理位置应用

如果你在业务中不确定是否需要引入 Redis时,可以参考本文,如果场景刚好命中其中一种,那么可以选择使用 Redis。如果你的业务场景不在这 8种常见场景中,不代表不能使用 Redis,可能需要你更多的技术调研来确认合适的技术方案。

最后,把猿哥的座右铭送给你:投资自己才是最大的财富。



Tags:Redis   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 &mdash;&mdash; 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  Search: Redis  点击:(11)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25  Search: Redis  点击:(9)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  Search: Redis  点击:(17)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 &mdash;&mdash; 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  Search: Redis  点击:(8)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  Search: Redis  点击:(47)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  Search: Redis  点击:(39)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  Search: Redis  点击:(55)  评论:(0)  加入收藏
深入Go底层原理,重写Redis中间件实战
Go语言以其简洁、高效和并发性能而闻名,深入了解其底层原理可以帮助我们更好地利用其优势。在本文中,我们将探讨如何深入Go底层原理,以及如何利用这些知识重新实现一个简单的Re...【详细内容】
2024-01-25  Search: Redis  点击:(66)  评论:(0)  加入收藏
批量执行Redis命令的四种方式!
前言在我们的印象中Redis命令好像都是一个个单条进行执行的,如果有人问你如何批量执行Redis命令,你能回答的上吗,或者说能答出几种方式呢?最容易想到的是Redis的一些批量命令,例...【详细内容】
2024-01-17  Search: Redis  点击:(57)  评论:(0)  加入收藏
Redis 实现多规则限流的思考与实践
市面上很多介绍redis如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如1分钟访问1次或者60分钟访问10次这种,但是如果想一个接口两种规则都需要满足呢,我们的...【详细内容】
2024-01-03  Search: Redis  点击:(109)  评论:(0)  加入收藏
▌简易百科推荐
Redis 不再 “开源”,未来采用 SSPLv1 和 RSALv2 许可证
Redis 官方于21日宣布修改开源协议 &mdash;&mdash; 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause...【详细内容】
2024-03-27  dbaplus社群    Tags:Redis   点击:(11)  评论:(0)  加入收藏
Redis“叛逃”开源,得罪了几乎所有人
内存数据库供应商Redis近日在开源界砸下了一块“巨石”。Redis即将转向双许可模式,并实施更为严格的许可条款。官方对此次变更的公告直截了当:从Redis 7.4版本开始,Redis将在Re...【详细内容】
2024-03-25    51CTO  Tags:Redis   点击:(9)  评论:(0)  加入收藏
如何使用 Redis 实现消息队列
Redis不仅是一个强大的内存数据存储系统,它还可以用作一个高效的消息队列。消息队列是应用程序间或应用程序内部进行异步通信的一种方式,它允许数据生产者将消息放入队列中,然...【详细内容】
2024-03-22  后端Q  微信公众号  Tags:Redis   点击:(17)  评论:(0)  加入收藏
Redis不再 “开源”
Redis 官方今日宣布修改开源协议 &mdash;&mdash; 未来所有版本都将使用 “源代码可用” 的许可证 (source-available licenses)。具体来说,Redis 将不再遵循 BSD 3-Clause 开...【详细内容】
2024-03-21  OSC开源社区    Tags:Redis   点击:(8)  评论:(0)  加入收藏
在Redis中如何实现分布式锁的防死锁机制?
在Redis中实现分布式锁是一个常见的需求,可以通过使用Redlock算法来防止死锁。Redlock算法是一种基于多个独立Redis实例的分布式锁实现方案,它通过协调多个Redis实例之间的锁...【详细内容】
2024-02-20  编程技术汇    Tags:Redis   点击:(47)  评论:(0)  加入收藏
手动撸一个 Redis 分布式锁
大家好呀,我是楼仔。今天第一天开工,收拾心情,又要开始好好学习,好好工作了。对于使用 Java 的小伙伴,其实我们完全不用手动撸一个分布式锁,直接使用 Redisson 就行。但是因为这些...【详细内容】
2024-02-19  楼仔  微信公众号  Tags:Redis   点击:(39)  评论:(0)  加入收藏
工作中Redis有哪些好用的运维工具
工作中使用 Redis 时,如果大家公司没有专业运维,可能开发人员就会面临这些运维的工作,包括 Redis 的运行状态监控,数据迁移,主从集群、切片集群的部署和运维等等。本文我就从这三...【详细内容】
2024-02-06  waynaqua    Tags:Redis   点击:(55)  评论:(0)  加入收藏
批量执行Redis命令的四种方式!
前言在我们的印象中Redis命令好像都是一个个单条进行执行的,如果有人问你如何批量执行Redis命令,你能回答的上吗,或者说能答出几种方式呢?最容易想到的是Redis的一些批量命令,例...【详细内容】
2024-01-17  小许code  微信公众号  Tags:Redis命令   点击:(57)  评论:(0)  加入收藏
Redis 实现多规则限流的思考与实践
市面上很多介绍redis如何实现限流的,但是大部分都有一个缺点,就是只能实现单一的限流,比如1分钟访问1次或者60分钟访问10次这种,但是如果想一个接口两种规则都需要满足呢,我们的...【详细内容】
2024-01-03  架构精进之路  微信公众号  Tags:Redis   点击:(109)  评论:(0)  加入收藏
一站式Redis解决方案
Redis是一个高效的内存数据库,它支持包括String、List、Set、SortedSet和Hash等数据类型的存储,在Redis中通常根据数据的key查询其value值,Redis没有模糊条件查询,在面对一些需...【详细内容】
2024-01-01  大雷家吃饭    Tags:Redis   点击:(66)  评论:(0)  加入收藏
站内最新
站内热门
站内头条