redis入门到精通系列(四):Jedis--使用java操作redis详解
(一)前言
如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用。Java语言通过JDBC操作mysql,用Jedis操作redis。当然了,java操作redis的方式不止jedis一种,现在我们主要使用Jedis来操作redis。
(二)第一个jedis项目
2.1 搭建项目
首先搭建一个空的maven项目,在pom.xml中导入redis的依赖,我同时还导入了junit的依赖用于测试,完整代码文末自取。
-
<dependencies>
-
<dependency>
-
<groupId>redis.clients</groupId>
-
<artifactId>jedis</artifactId>
-
<version>2.9.0</version>
-
</dependency>
-
<dependency>
-
<groupId>junit</groupId>
-
<artifactId>junit</artifactId>
-
<version>4.12</version>
-
</dependency>
-
</dependencies>
2.2 创建测试类
在test包下创建测试类JedisTest,操作redis比操作mysql更简单,只需要以下三步:
1.连接jedis
2.操作jedis
3.关闭连接
-
public class JedisTest {
-
@Test
-
public void testJedis(){
-
//1.连接jedis
-
Jedis jedis = new Jedis("127.0.0.1", 6379);
-
//2.操作jedis
-
jedis.set("name","sdxb");
-
String name = jedis.get("name");
-
System.out.println(name);
-
//3.关闭连接
-
jedis.close();
-
}
-
}
其中第二步操作jedis中的操作和redis语法一致。查看结果:

(三)请求调用次数的限制案例代码模拟
在之前的一篇博客中我用redis模拟了请求调用次数限制案例,这一次就用java真实模拟后端逻辑,代码逻辑和之前所讲的redis操作逻辑一致。详情请看:redis入门到精通系列(二):redis操作的两个实践案例
-
public class Service {
-
//请求模拟
-
public void call(){
-
System.out.println("调用服务");
-
}
-
//用户限制模拟,传入用户id
-
public void limitcall(String id){
-
Jedis jedis = new Jedis("127.0.0.1", 6379);
-
String value = jedis.get("user" + id);
-
//第一步,查看该值是否存在
-
try {
-
if (value==null){
-
//如果不存在,创建值,设置生命周期为20s
-
jedis.setex("user"+id,20,Long.MAX_VALUE-10+"");
-
}else{
-
//如果存在,则加1,直到超过最大值抛出异常
-
jedis.incr("user"+id);
-
call();
-
}
-
}catch (JedisDataException e){
-
//超过最大值(即每20s访问超过10次),执行异常
-
System.out.println("达到请求上限,稍后再试");
-
return;
-
}finally {
-
jedis.close();
-
}
-
}
-
}
-
//多线程一直调用服务
-
class MyThread extends Thread{
-
Service service=new Service();
-
@Override
-
public void run() {
-
while (true){
-
service.limitcall("用户A");
-
try {
-
Thread.sleep(1000L);
-
} catch (InterruptedException e) {
-
e.printStackTrace();
-
}
-
}
-
}
-
public static void main(String[] args) {
-
MyThread myThread=new MyThread();
-
myThread.run();
-
}
-
}
查看结果,当20秒内调用服务达到10次时,再调用就会执行异常

(四)搭建一个Jedis工具类
如果每一次要使用Jedis都生成连接一次Jedis对象,就显得很麻烦,因此有必要写一个工具类方便重复调用。工具类的编写不难,通过Jedis自带的线程池调用线程就行。
-
public class JedisUtil {
-
private static JedisPool jedisPool=null;
-
static {
-
//配置线程池
-
JedisPoolConfig config=new JedisPoolConfig();
-
//设置最大空闲等待数
-
config.setMaxIdle(10);
-
//设置最大连接数
-
config.setMaxTotal(30);
-
jedisPool=new JedisPool(config,"127.0.0.1",6379);
-
}
-
//通过该方法获取jedis对象
-
public static Jedis getJedis(){
-
return jedisPool.getResource();
-
}
-
}
在使用时将我们之前通过Jedis对象调用的方式换成工具类调用即可,修改上面案例的第八行:
-
// Jedis jedis = new Jedis("127.0.0.1", 6379);
-
Jedis jedis=JedisUtil.getJedis();
还有一个小问题,如果把配置的具体信息都写在程序内部,如果要修改就需要重新启动整个项目,所以可以将配置信息写到配置文件中。在resource文件下新建jedis.properties
-
redis.host = 127.0.0.1
-
redis.port = 6379
-
redis.maxidle = 10
-
redis.maxtotal = 30
修改工具类:
-
public class JedisUtil {
-
private static JedisPool jedisPool=null;
-
static {
-
//通过配置文件修改参数
-
ResourceBundle rb=ResourceBundle.getBundle("jedis");
-
String host = rb.getString("redis.host");
-
int port = Integer.parseInt(rb.getString("redis.port"));
-
int maxidle = Integer.parseInt(rb.getString("redis.maxidle"));
-
int maxtotal= Integer.parseInt(rb.getString("redis.maxtotal"));
-
//配置线程池
-
JedisPoolConfig config=new JedisPoolConfig();
-
//设置最大空闲等待数
-
config.setMaxIdle(maxidle);
-
//设置最大连接数
-
config.setMaxTotal(maxtotal);
-
jedisPool=new JedisPool(config,host,port);
-
}
-
//通过该方法获取jedis对象
-
public static Jedis getJedis(){
-
return jedisPool.getResource();
-
}
-
}
最后还是把这个项目的代码放在github下: github
redis入门到精通系列(四):Jedis--使用java操作redis详解的更多相关文章
- redis入门到精通系列(二):redis操作的两个实践案例
在前面一篇博客中我们已经学完了redis的五种数据类型操作,回顾一下,五种操作类型分别为:字符串类型(string).列表类型(list).散列类型(hash).集合类型(set).有序集合类型(so ...
- redis入门到精通系列(一)
(一)为什么要用Nosql 如果你是计算机本科学生 ,那么一定使用过关系型数据库mysql.在请求量小的情况下,使用mysql不会有任何问题,但是一旦同时有成千上万个请求同时来访问系统时,就会出现卡顿 ...
- redis入门到精通系列(九):redis哨兵模式详解
(一)哨兵概述 前面我们讲了redis的主从复制,为了实现高可用,会选择一台服务器作为master,多台服务器作为slave.现在有这样一种情况,master宕机了,这时系统会选择一台slave作为m ...
- redis入门到精通系列(五):redis的持久化操作(RDB、AOF)
(一)持久化的概述 持久化顾名思义就是将存储在内存的数据转存到硬盘中.在生活中使用word等应用的时候,如果突然遇到断电的情况,理论上数据应该是都不见的,因为没有保存的word内容都存放在内存里,断电 ...
- Jedis(java操作redis数据库技术)
Redis有什么命令,Jedis就有什么方法. 客户端无法连接时,需要考虑防火墙配置,比如6379端口是否开放,也可以直接关闭防火墙. Jedis连接池: import org.junit.Test; ...
- Redis进阶实践之十四 Redis-cli命令行工具使用详解第一部分
一.介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redis的东西要看的都差不多看完了.网上的东西也不多了.剩下来就看看官网的东西吧,一遍翻译,一遍测试. ...
- Redis进阶实践之十四 Redis-cli命令行工具使用详解
转载来源:http://www.cnblogs.com/PatrickLiu/p/8508975.html 一.介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redi ...
- redis入门到精通系列(三):key的通用操作和redis内部db的通用操作
五种数据类型都用到了key,key本身是一种字符串,通过key可以获取redis中保存的对象.这一篇博客就将介绍key的通用操作. (一)key基本操作 删除key del key key是否存在 e ...
- redis入门到精通系列(六):redis的事务详解
(一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ...
随机推荐
- uni-app视频组件设置圆角
无法实现,建议写个image在中间位置加个播放按钮,点击播放跳转新页面只需要在跳转参数里面把视频链接加上,在onLoad里面获取视频链接,自动播放视频,很多app目前都是这样做的,关闭页面后视频会自动 ...
- 《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...
- es聚合查询语法
{ "size": 0, "query": { "bool": { "filter ...
- Are we ready for learned cardinality estimation?
Are we ready for learned Cardinality Estimation 摘要 文章包括三大部分: 对于一个静态的数据库,本文将五种基于学习的基数估计方法与九中传统的基数估计方法 ...
- 从源码分析 XtraBackup 的备份原理
MySQL物理备份工具,常用的有两个:MySQL Enterprise Backup 和 XtraBackup. 前者常用于MySQL企业版,后者常用于MySQL社区版.Percona Server ...
- Django 小实例S1 简易学生选课管理系统 1 项目流程梳理与数据库设计
Django 小实例S1 简易学生选课管理系统 第1章--项目流程梳理与数据库设计 点击查看教程总目录 作者自我介绍:b站小UP主,时常直播编程+红警三,python1对1辅导老师. 1 项目流程梳理 ...
- Treevalue(0x03)——函数树化详细解析(下篇)
好久不见,再一次回到 treevalue 系列.本文将基于上一篇treevalue讲解,继续对函数的树化机制进行详细解析,并且会更多的讲述其衍生特性及应用. 树化方法与类方法 首先,基于之前的树化函数 ...
- UOJ 75 - 【UR #6】智商锁(矩阵树定理+随机+meet-in-the-middle)
题面传送门 一道很神的矩阵树定理+乱搞的题 %%%%%%%%%%%%%%% vfk yyds u1s1 这种题目我是根本想不出来/kk,大概也就 jgh 这样的随机化带师才能想到出来吧 首先看到生成树 ...
- 洛谷 P4708 - 画画(Burnside 引理+组合数学)
洛谷题面传送门 神仙题 %%%%%%%%%%%%%%%%%%%% 题解搬运人来了 首先看到本质不同(无标号)的图计数咱们可以想到 Burnside 引理,具体来说,我们枚举一个排列 \(p\),并统计 ...
- P2336 [SCOI2012]喵星球上的点名(SA+莫队)
题面传送门 一道还算有点含金量的 SA 罢-- 首先按照套路我们把读入的所有字符串都粘在一起,中间用分隔符隔开并建出后缀数组出来. 我们考虑对于一个固定的字符串 \(s\),什么样的字符串 \(t\) ...