jfinal redis的使用

参考jfinal官方文档:http://www.jfinal.com/doc/8-2
首先:把redis下载下来,下载地址:https://github.com/MSOpenTech/redis/releases
选择需要版本下载解压并解压
在这里插入图片描述
在这里插入图片描述
启动redis:
在这里插入图片描述
首先cd到解压之后的文件位置,输入命令redis-server.exe redis.windows.conf即可
下面是jfinal中的使用:
首先,需要添加两个maven依赖,没有添加会报下面对应的两个错误
java.lang.ClassNotFoundException: redis.clients.jedis.JedisPoolConfig(没有加入依赖项目启动时报错)
java.lang.NoClassDefFoundError: org/nustaq/serialization/FSTObjectOutput (没有加入依赖使用时报错)

<dependency>
	<groupId>redis.clients</groupId>
	<artifactId>jedis</artifactId>
	<version>2.9.0</version>
</dependency>

<dependency>
	<groupId>de.ruedigermoeller</groupId>
	<artifactId>fst</artifactId>
	<version>2.50</version>
</dependency>

在config中的配置:

/**
 * 配置插件
 */
public void configPlugin(Plugins me) {
	// 配置 druid 数据库连接池插件
	DruidPlugin druidPlugin = new DruidPlugin(PropKit.get("jdbcUrl"), PropKit.get("user"), PropKit.get("password").trim());
	me.add(druidPlugin);
	
	// 配置ActiveRecord插件
	ActiveRecordPlugin arp = new ActiveRecordPlugin(druidPlugin);
	// 所有映射在 MappingKit 中自动化搞定
	_MappingKit.mapping(arp);
	me.add(arp);
	
	//邮件插件
	me.add(new MailPlugin(PropKit.use("mail.properties").getProperties()));
	
	// 配置定时任务
	QuartzPlugin quartzPlugin = new QuartzPlugin();
	quartzPlugin.setJobs("quartzJob.properties");
	me.add(quartzPlugin);
	
	// 配置redis
	RedisPlugin redisPlugin = new RedisPlugin("news", "localhost");
	me.add(redisPlugin);
}

然后是使用:

Cache newCache = Redis.use("news");
newCache.set(key, value);
newCache.get(key);
### Java项目中Redis的应用场景 #### 缓存机制 为了提高数据访问速度并减轻数据库压力,可以利用Redis作为缓存层存储频繁读取的数据。当应用程序请求特定资源时,先查询Redis;如果命中,则直接返回结果给客户端;如果没有找到对应记录再向关系型数据库发起查询并将获取到的结果写入Redis以便下次快速响应相同请求。 ```java // 使用Jedis连接池配置对象来初始化一个Jedis实例 JedisPoolConfig poolConfig = new JedisPoolConfig(); poolConfig.setMaxTotal(10); poolConfig.setMinIdle(5); try (Jedis jedis = new JedisPool(poolConfig, "localhost").getResource()) { String key = "cacheKey"; // 尝试从Redis获取缓存值 String cachedValue = jedis.get(key); if (cachedValue != null && !cachedValue.isEmpty()) { System.out.println("Cache hit! Value is: " + cachedValue); } else { // 如果未命中则模拟从DB加载数据,并设置其有效期为60秒 String dbLoadedData = loadFromDatabase(); // 自定义方法实现 jedis.setex(key, 60, dbLoadedData); // 设置键值对及其过期时间 System.out.println("Cache miss. Loaded from DB and stored in cache."); } } ``` #### 消息队列 通过发布/订阅模式或列表结构支持异步通信,在生产者消费者模型下有效解耦前后端业务逻辑流程。例如订单处理系统中的下单通知推送功能就可以借助于这种特性完成高效的消息传递任务[^2]。 ```java // 发布一条消息至名为'channelName'的频道 jedis.publish("channelName", "This is a message"); // 订阅指定的一个或多个频道等待接收消息 String[] channels = {"channelName"}; Thread subscriberThread = new Thread(() -> { try (Jedis subJedis = new Jedis("localhost")) { subJedis.subscribe(new JedisPubSub() { @Override public void onMessage(String channel, String message) { System.out.printf("Received %s : %s\n", channel, message); } }, channels); } }); subscriberThread.start(); // 向列表左侧添加元素形成先进后出(FILO)栈结构 jedis.lpush("queueList", "item1"); ``` #### 分布式锁 基于SETNX命令配合EXPIRE指令可轻松构建跨进程互斥同步控制方案,防止多线程环境下并发修改共享资源引发的一致性问题。比如限时抢购活动中确保同一商品不会被重复购买成功[^3]。 ```java public class DistributedLockExample { private static final long LOCK_EXPIRE_TIME_MS = 10 * 1000; // 锁超时时长设为十秒钟 /** * 获取分布式锁. */ boolean acquireDistributedLock(Jedis jedis, String lockKey){ return "OK".equals(jedis.set(lockKey, "", "NX", "PX", LOCK_EXPIRE_TIME_MS)); } /** * 释放已持有的分布式的锁. */ void releaseDistributedLock(Jedis jedis, String lockKey){ Long delResult = jedis.del(lockKey); if(delResult==null ||delResult<=0){ throw new RuntimeException("Failed to delete the lock or it does not exist!"); } } }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值