(一)前言

如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用。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. Spring的轻量级实现

    作者: Grey 原文地址:Spring的轻量级实现 本文是参考公众号:码农翻身 的从零开始造Spring 教程的学习笔记 源码 github 开发方法 使用TDD的开发方法,TDD的开发流程是: 写 ...

  2. 「期末」一文带你系统回顾C 语言

    超详细 c 语言回顾 前言 c 语言是一种底层语言,是一种系统底层级的语言,例如Windows.Linux.Unix等操作系统就是使用c语言编写的.所以由此看来,不论是火爆了25年的Java,还是近年 ...

  3. <C#任务导引教程>练习十

    /*83,使用接口完成多继承问题 简化版*/using System;interface ITeacher{    string Name    {        get;        set;   ...

  4. [loj3343]超现实树

    定义1:两棵树中的$x$和$y$对应当且仅当$x$到根的链与$y$到根的链同构 定义2:$x$和$y$的儿子状态相同当且仅当$x$与儿子所构成的树与$y$与儿子所构成的树同构 根据题中所给的定义,有以 ...

  5. 分布式事务(七)之Seata简介

    在前面的文章中,我们介绍了分布式事务的概念以及一些解决方案.fenSeata是一款开源的分布式事务解决方案,致力于提供高性能和简单易用的分布式事务服务.Seata将为用户提供了AT.TCC.SAGA和 ...

  6. [源码解析] PyTorch 分布式(10)------DistributedDataParallel 之 Reducer静态架构

    [源码解析] PyTorch 分布式(10)------DistributedDataParallel之Reducer静态架构 目录 [源码解析] PyTorch 分布式(10)------Distr ...

  7. rocketmq 精华

    (ps:)通过本人语雀文档阅读体验更好哦--有目录 介绍 rocket mq 翻译成中文就是火箭消息队列,从名字就可以看出来,它是一个很快的消息队列... rocket mq 是 阿里巴巴研制的后面贡 ...

  8. 【JavaSE】异常

    Java异常 2019-07-06  22:16:29  by冲冲 1. 引例 任何程序都有出错的可能.比如代码少一个分号,那么运行的结果是 java.lang.Error.比如运行 System.o ...

  9. Orika - 类复制工具

    Orika 前言 类复制工具有很多,比较常用的有 mapstruct.Spring BeanUtils.Apache BeanUtils.dozer 等,目前我所在的项目组中使用的是 mapstruc ...

  10. BehaviorTree.CPP.行为树XML格式(六)

    The XML format XML模式的基础 在第一个教程中,介绍了这个简单的树. <root main_tree_to_execute = "MainTree" > ...