redis入门到精通系列:Jedis--使用java操作redis详解
Posted edda
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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更简单,只需要以下三步:
- 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详解的主要内容,如果未能解决你的问题,请参考以下文章