(一)前言

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

    导读 nginx从入门到精通,点我直达 下载nginx与安装 点我直达 安装依赖 yum -y install gcc zlib zlib-devel pcre-devel openssl opens ...

  2. for循环中创建线程执行问题

    先执行以一个简单的示例: static void Main(string[] args) { List<int> taskConsumes = new List<int>() ...

  3. Windows 常用配置

    安装IIS服务器 在服务器管理器中,选择"角色"添加角色 进入添加角色向导,在安装界面,选择服务器角色为:" Web服务器(IIS) " 角色服务勾选:应用程序 ...

  4. 使用Charles请求跳转可作为线上和线下环境的切换

    举个例子: 1.后端拿测试环境的客户端调试本地的代码 2.连接后端本地服务测试客户端和后端的交互 这样就可以改变客户端请求的测试环境换成其他的环境 一.配置 tools--Map remot... 这 ...

  5. S2-001漏洞分析

    前言 开始好好学Java,跟着师傅们的文章走一遍 Strust简介 Struts2是流行和成熟的基于MVC设计模式的Web应用程序框架. Struts2不只是Struts1下一个版本,它是一个完全重写 ...

  6. js深拷贝你还不会吗

    js深拷贝 在讲正题之前我们要先了解数据存储的方式 数据存储方式 在讲之前我们要先知道值类型和引用类型的存储方式. 在JavaScript数据类型中有两种数据类型. 值类型:字符串(String).数 ...

  7. Sqlserver中判断表是否存在

    在sqlserver(应该说在目前所有数据库产品)中创建一个资源如表,视图,存储过程中都要判断与创建的资源是否已经存在  在sqlserver中一般可通过查询sys.objects系统表来得知结果,不 ...

  8. Mac下Shell脚本使用学习笔记(一)

    参考文献 Shell 教程 MAC常用终端命令行 Mac下Shell脚本使用 1.使用终端创建test.sh: (1)进入指定文件夹路径(命令示例:cd Desktop/面向对象程序设计): (2)创 ...

  9. win10开机自启

    所有用户的开机自启文件夹 英文路径 # ProgramData目录是隐藏的 C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp 中 ...

  10. Java JDBC 理论笔记

    一.JDBC常用接口.类介绍 JDBC提供对独立于数据库统一的API,用以执行SQL命令.API常用的类.接口如下: DriverManager 管理JDBC驱动的服务类,主要通过它获取Connect ...