(一)前言

如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用。Java语言通过JDBC操作mysql,用Jedis操作redis。当然了,java操作redis的方式不止jedis一种,现在我们主要使用Jedis来操作redis。

(二)第一个jedis项目

2.1 搭建项目

首先搭建一个空的maven项目,在pom.xml中导入redis的依赖,我同时还导入了junit的依赖用于测试,完整代码文末自取。


  1. <dependencies>
  2. <dependency>
  3. <groupId>redis.clients</groupId>
  4. <artifactId>jedis</artifactId>
  5. <version>2.9.0</version>
  6. </dependency>
  7. <dependency>
  8. <groupId>junit</groupId>
  9. <artifactId>junit</artifactId>
  10. <version>4.12</version>
  11. </dependency>
  12. </dependencies>

2.2 创建测试类

在test包下创建测试类JedisTest,操作redis比操作mysql更简单,只需要以下三步:

1.连接jedis

2.操作jedis

3.关闭连接


  1. public class JedisTest {
  2. @Test
  3. public void testJedis(){
  4. //1.连接jedis
  5. Jedis jedis = new Jedis("127.0.0.1", 6379);
  6. //2.操作jedis
  7. jedis.set("name","sdxb");
  8. String name = jedis.get("name");
  9. System.out.println(name);
  10. //3.关闭连接
  11. jedis.close();
  12. }
  13. }

其中第二步操作jedis中的操作和redis语法一致。查看结果:

(三)请求调用次数的限制案例代码模拟

在之前的一篇博客中我用redis模拟了请求调用次数限制案例,这一次就用java真实模拟后端逻辑,代码逻辑和之前所讲的redis操作逻辑一致。详情请看:redis入门到精通系列(二):redis操作的两个实践案例


  1. public class Service {
  2. //请求模拟
  3. public void call(){
  4. System.out.println("调用服务");
  5. }
  6. //用户限制模拟,传入用户id
  7. public void limitcall(String id){
  8. Jedis jedis = new Jedis("127.0.0.1", 6379);
  9. String value = jedis.get("user" + id);
  10. //第一步,查看该值是否存在
  11. try {
  12. if (value==null){
  13. //如果不存在,创建值,设置生命周期为20s
  14. jedis.setex("user"+id,20,Long.MAX_VALUE-10+"");
  15. }else{
  16. //如果存在,则加1,直到超过最大值抛出异常
  17. jedis.incr("user"+id);
  18. call();
  19. }
  20. }catch (JedisDataException e){
  21. //超过最大值(即每20s访问超过10次),执行异常
  22. System.out.println("达到请求上限,稍后再试");
  23. return;
  24. }finally {
  25. jedis.close();
  26. }
  27. }
  28. }
  29. //多线程一直调用服务
  30. class MyThread extends Thread{
  31. Service service=new Service();
  32. @Override
  33. public void run() {
  34. while (true){
  35. service.limitcall("用户A");
  36. try {
  37. Thread.sleep(1000L);
  38. } catch (InterruptedException e) {
  39. e.printStackTrace();
  40. }
  41. }
  42. }
  43. public static void main(String[] args) {
  44. MyThread myThread=new MyThread();
  45. myThread.run();
  46. }
  47. }

查看结果,当20秒内调用服务达到10次时,再调用就会执行异常

(四)搭建一个Jedis工具类

如果每一次要使用Jedis都生成连接一次Jedis对象,就显得很麻烦,因此有必要写一个工具类方便重复调用。工具类的编写不难,通过Jedis自带的线程池调用线程就行。


  1. public class JedisUtil {
  2. private static JedisPool jedisPool=null;
  3. static {
  4. //配置线程池
  5. JedisPoolConfig config=new JedisPoolConfig();
  6. //设置最大空闲等待数
  7. config.setMaxIdle(10);
  8. //设置最大连接数
  9. config.setMaxTotal(30);
  10. jedisPool=new JedisPool(config,"127.0.0.1",6379);
  11. }
  12. //通过该方法获取jedis对象
  13. public static Jedis getJedis(){
  14. return jedisPool.getResource();
  15. }
  16. }

在使用时将我们之前通过Jedis对象调用的方式换成工具类调用即可,修改上面案例的第八行:


  1. // Jedis jedis = new Jedis("127.0.0.1", 6379);
  2. Jedis jedis=JedisUtil.getJedis();

还有一个小问题,如果把配置的具体信息都写在程序内部,如果要修改就需要重新启动整个项目,所以可以将配置信息写到配置文件中。在resource文件下新建jedis.properties


  1. redis.host = 127.0.0.1
  2. redis.port = 6379
  3. redis.maxidle = 10
  4. redis.maxtotal = 30

修改工具类:


  1. public class JedisUtil {
  2. private static JedisPool jedisPool=null;
  3. static {
  4. //通过配置文件修改参数
  5. ResourceBundle rb=ResourceBundle.getBundle("jedis");
  6. String host = rb.getString("redis.host");
  7. int port = Integer.parseInt(rb.getString("redis.port"));
  8. int maxidle = Integer.parseInt(rb.getString("redis.maxidle"));
  9. int maxtotal= Integer.parseInt(rb.getString("redis.maxtotal"));
  10. //配置线程池
  11. JedisPoolConfig config=new JedisPoolConfig();
  12. //设置最大空闲等待数
  13. config.setMaxIdle(maxidle);
  14. //设置最大连接数
  15. config.setMaxTotal(maxtotal);
  16. jedisPool=new JedisPool(config,host,port);
  17. }
  18. //通过该方法获取jedis对象
  19. public static Jedis getJedis(){
  20. return jedisPool.getResource();
  21. }
  22. }

最后还是把这个项目的代码放在github下: github

redis入门到精通系列(四):Jedis--使用java操作redis详解的更多相关文章

  1. redis入门到精通系列(二):redis操作的两个实践案例

    在前面一篇博客中我们已经学完了redis的五种数据类型操作,回顾一下,五种操作类型分别为:字符串类型(string).列表类型(list).散列类型(hash).集合类型(set).有序集合类型(so ...

  2. redis入门到精通系列(一)

    (一)为什么要用Nosql 如果你是计算机本科学生 ,那么一定使用过关系型数据库mysql.在请求量小的情况下,使用mysql不会有任何问题,但是一旦同时有成千上万个请求同时来访问系统时,就会出现卡顿 ...

  3. redis入门到精通系列(九):redis哨兵模式详解

    (一)哨兵概述 前面我们讲了redis的主从复制,为了实现高可用,会选择一台服务器作为master,多台服务器作为slave.现在有这样一种情况,master宕机了,这时系统会选择一台slave作为m ...

  4. redis入门到精通系列(五):redis的持久化操作(RDB、AOF)

    (一)持久化的概述 持久化顾名思义就是将存储在内存的数据转存到硬盘中.在生活中使用word等应用的时候,如果突然遇到断电的情况,理论上数据应该是都不见的,因为没有保存的word内容都存放在内存里,断电 ...

  5. Jedis(java操作redis数据库技术)

    Redis有什么命令,Jedis就有什么方法. 客户端无法连接时,需要考虑防火墙配置,比如6379端口是否开放,也可以直接关闭防火墙. Jedis连接池: import org.junit.Test; ...

  6. Redis进阶实践之十四 Redis-cli命令行工具使用详解第一部分

    一.介绍       redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redis的东西要看的都差不多看完了.网上的东西也不多了.剩下来就看看官网的东西吧,一遍翻译,一遍测试. ...

  7. Redis进阶实践之十四 Redis-cli命令行工具使用详解

    转载来源:http://www.cnblogs.com/PatrickLiu/p/8508975.html 一.介绍 redis学了有一段时间了,以前都是看视频,看教程,很少看官方的东西.现在redi ...

  8. redis入门到精通系列(三):key的通用操作和redis内部db的通用操作

    五种数据类型都用到了key,key本身是一种字符串,通过key可以获取redis中保存的对象.这一篇博客就将介绍key的通用操作. (一)key基本操作 删除key del key key是否存在 e ...

  9. redis入门到精通系列(六):redis的事务详解

    (一)事务的概念 谈到数据库的高级应用,不可避免会谈到事务.熟悉mysql的朋友们对事务肯定不陌生,简单来讲事务就是控制一个数据库操作序列要么全部执行要么全部不执行.今天我们就来了解redis中的事务 ...

随机推荐

  1. 攻防世界 WEB 高手进阶区 NSCTF web2 Writeup

    攻防世界 WEB 高手进阶区 NSCTF web2 Writeup 题目介绍 题目考点 php基本函数语法 加密解密函数 base64_decode().str_rot13() 字符串反转函数 str ...

  2. Java8新特性Stream流应用示例

    Java8新特性介绍 过滤集合 List<String> newList = list.stream().filter(item -> item != null).collect(C ...

  3. Linux 下权限的管理

    Linux 下权限的管理 我们都知道,Linux系统对于用户的权限管理是十分严格的. 那么,我们就来具体了解一下. 一. 用户 在Linux中按照类型用户分为两种:1.超级用户 2.普通用户 那么它们 ...

  4. Java核心技术--Java程序设计

    Java术语 术语名 缩写 解释 Java Development Kit(Java开发工具包) JDK 编写Java程序的程序员使用的软件 Java Runtime Environment(Java ...

  5. [atARC080F]Prime Flip

    构造一个数组$b_{i}$(初始为0),对于操作$[l_{i},r_{i}]$,令$b_{l_{i}}$和$b_{r_{i}+1}$值异或1,表示$i$和$i-1$的差值发生改变,最终即要求若干个$b ...

  6. html+css第七篇-表格

    表格标签: table 表格 thead 表格头 tbody 表格主体 tfoot 表格尾 tr 表格行 th 元素定义表头 td 元素定义表格单元 表格样式重置 table{border-colla ...

  7. SpringBoot 动态代理实现三方接口调用

    目录 一.定义注解 二.建立动态代理类 三.注入spring容器 四.编写拦截器 五.创建客户端调用类 六.main方法测试 七.启动项目 在某些业务场景中,我们只需要业务代码中定义相应的接口或者相应 ...

  8. Jmeter——变量嵌套函数使用(__V)案例分析

    jmeter版本:5.3 __V官方函数解释: (https://jmeter.apache.org/usermanual/functions.html#__V) 图1-1 解决问题:实现字符串拼接 ...

  9. Codeforces 1392I - Kevin and Grid(平面图的欧拉定理+FFT)

    Codeforces 题面传送门 & 洛谷题面传送门 模拟赛考到一道和这题有点类似的题就来补了 神仙 GLBR I %%%%%%%%%%%%%%%%%%%% 不过感觉见过类似的题目之后就比较套 ...

  10. LG 11 月 月赛 II T4

    LG 11 月 月赛 II T4 看到膜数和 $ 10^5 $ 以及 $ n^2 $ 的部分分想到很可能是 NTT 于是开始推式子 首先看到式子可以化作, 如果 \(k = 0\) , $ f(l , ...