(一)前言

如果不把数据库和后端语言联系起来,就起不到数据库应该要起到的作用。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. .Net Core微服务——网关(1):ocelot集成及介绍

    网关是什么 简单来说,网关就是暴露给外部的请求入口.就和门卫一样,外面的人想要进来,必须要经过门卫.当然,网关并不一定是必须的,后端服务通过http也可以很好的向客户端提供服务.但是对于业务复杂.规模 ...

  2. 羽夏看Win系统内核——驱动篇

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  3. Charles--/安装/破解/支持https抓包

     一.安装破解Charles 1.下载charles4.0.2版本,下面的jar包需要和charles版本对应 2.下载地址:https://www.cr173.com/soft/494576.htm ...

  4. 终论到底该不该写isDebugEnabled

    以前: 很多日志框架都不支持{}模板的写法(如Log4j1.X, Apache Commons Logging),于是只能通过字符串拼接来输出日志内容: log.debug("debug日志 ...

  5. Java学习(十七)

    Java多态的学习差不多有3个小时,老师还夹杂着一些编译器运用的知识. 这是多态的基本知识: 我们可以创建父类引用指向子类对象,这就是多态的一种.(这种也叫向下转型) Pet c=new Cat(); ...

  6. 物联网3D,物业基础设施3D运维,使用webgl(three.js)与物联网设备结合案例。搭建智慧楼宇,智慧园区,3D园区、3D物业设施,3D楼宇管理系统——第八课

    写在前面的废话: 很久没有更新文章了,这段时间一直忙于项目落地,虽然很忙,但是感觉没有总结,没有提炼的日子,总是让人感觉飘飘忽忽的. 所幸放下一些事,抽出一些时间,把近期的项目做一些整理与记录.也算是 ...

  7. shell脚本训练

    *注:shell中的/data目录为自创练习目录 1,编写脚本systeminfo.sh,显示当前主机系统信息.包括主机名,IPV4地址,操作系统版本,内核版本,cpu型号,内存大小,硬盘大小 结果: ...

  8. [atARC070E]NarrowRectangles

    记$len_{i}=r_{i}-l_{i}$,即第$i$个区间的长度 用$f_{i,j}$表示前$i$个区间合法,第$i$个区间位于$[j,j+len_{i}]$的最小代价,暴力dp的时间复杂度为$o ...

  9. 应用SpringAOP及Tlog工具完成日志链路追踪、收集、持久化

    一.痛点 目前我司各系统的日志管理比较原始,使用logback打日志到log文件,虽然有服务管理平台,但记录的日志也仅仅是前置机调用后台系统的出入参,当遇到问题时查日志较为麻烦. 登录VPN-打开服务 ...

  10. js防止重复提交代码

    if (checkSubmitFlg == true) { console.log("禁止频繁操作.."); layer.close(ide); return false; } c ...