Redis 插件实现

本贴最后更新于 2203 天前,其中的信息可能已经时移世易

整理了一下 redis 的使用,做成了一个包。方便自己在其他项目中使用。其中分布式锁的实现,jedis 是用最被人诟病的坑爹实现(set 和 过期不是原子操作),lettuce 采用 lua 脚本。目前已经发布在 github 上,希望有熟悉 redis 锁以及限流实现方案的大佬们给出建议。感谢!

🚀 方便的使用 redis

HitCount 
GitHub issues
License
Maven Central
Download

特性

- 简单易用
- 支持集群
- 自动配置
- 多种实现可自由切换
- 方便的 API
- 分布式锁
- 分布式限流

快速开始

1.引入依赖

<dependency>  
    <groupId>io.github.pleuvoir</groupId>  
    <artifactId>redis-plugin</artifactId>  
    <version>${latest.version}</version>  
</dependency>  

2. 配置文件

接着我们需要准备一份配置文件,它看起来是这样的,文件的名称我们先假定为 redis.properties

此处 redis.hostAndPort=127.0.0.1:6379 代表单机,如果是集群可以是 127.0.0.1:6379,127.0.0.1:6379,127.0.0.1:6379 这样的格式。

redis.hostAndPort=127.0.0.1:6379  
redis.database=1  
redis.password=  
redis.pool.maxIdle=4  
redis.pool.maxTotal=6  
redis.pool.maxWait=5000  
redis.cacheManager.prefix=redis-plugin:  

3. 使用 spring 进行管理

对于使用 xml 进行配置的项目,只需要如下声明,即可获得缓存能力。

<bean class="io.github.pleuvoir.JedisRedisConfiguration">  
    <property name="location" value="redis.properties"/>  
</bean>  

显然,这种实现是基于 Jedis 的,同时我们也支持 Lettuce,就像这样:

<bean class="io.github.pleuvoir.LettuceRedisConfiguration">  
    <property name="location" value="redis.properties"/>  
</bean>  

提示:使用 xml 注册的方式,可以不指定扫描包。

如果是使用注解的项目,建议使用自动配置。

只需在配置类中声明 @EnableRedisPlugin 即可,当然这是使用默认的配置。 EnableRedisPlugin 注解有几个重要的属性,分别是 location 以及 Type,其中 location 表示需要加载的配置文件位置,location 可以不声明,默认为 classpath 下的 redis.properties 文件。 Type 则表示可以选择内部的第三方  redis 实现,默认是 Lettuce ,目前支持 Jedis 和  Lettuce

4. API

配置完成后,缓存服务 CacheService 提供了一些操作数据的方法,详情请查看具体 API:

/**  
 * 添加缓存,使用默认失效时间  
 * @param key  
 * @param value  
 */  
public void set(String key, Object value);  
  
/**  
 * 取缓存  
 * @param key  
 * @return Object  
 */  
public Object get(String key);  
  
/**  
 * 当缓存中没有时存入,缓存中存在时不存入  
 * @param key  
 * @param value  
 * @return 缓存中没有时返回true,缓存中有时返回false  
 */  
boolean putIfExist(String key, Object value);  
  
...  

5. 分布式锁

锁的使用方法如下所指:

String key = "88250";  
  
if (lock.isLocked(key)) {  
    System.out.println(":sob:  this resource is locked .. ");  
    return;  
}  
  
try {  
    if (!lock.lock(key)) {  
        System.out.println("I got a lock fail ...");  
        return;  
    }  
    // do your bussiness  
    unpark();  
} finally {  
    lock.unlock(key);  
}  

6. 限流

limitExecutor.tryAccess("limit", "X-Y", 10, 3);  

流控正常时返回  true,被限流时返回 false,其中 limit 为资源的名称, X-Y 为限流 key , 10 和  3 代表 该资源 10 秒内可以访问 3 次

特别说明

如果项目使用  Profiles 来管理 spring 的环境,例如  Environment().setActiveProfiles("dev") ,自动配置会尝试将当前环境修饰符追加到文件名称后,即如果您使用了 @EnableRedisPlugin(location = "redis.properties") 进行自动配置,插件会去寻找名为   redis-dev.properties 的配置文件,确保文件存在即可。

使用 xml 注册的方式,不受此特性的影响。

TODO LIST

- [ ] 基于 jedis 的限流实现以及 aop 支持
- [ ] 消息中间件
- [ ] More API

开源协议

[Apache License](LICENSE)

  • Redis

    Redis 是一个开源的使用 ANSI C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API。从 2010 年 3 月 15 日起,Redis 的开发工作由 VMware 主持。从 2013 年 5 月开始,Redis 的开发由 Pivotal 赞助。

    286 引用 • 248 回帖 • 62 关注
  • Spring

    Spring 是一个开源框架,是于 2003 年兴起的一个轻量级的 Java 开发框架,由 Rod Johnson 在其著作《Expert One-On-One J2EE Development and Design》中阐述的部分理念和原型衍生而来。它是为了解决企业应用开发的复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许使用者选择使用哪一个组件,同时为 JavaEE 应用程序开发提供集成的框架。

    944 引用 • 1459 回帖 • 17 关注
  • Java

    Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。

    3187 引用 • 8213 回帖

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...