这个例子中,java使用Jedis来操作Redis

1、引入Jedis的依赖

<dependency>
    <groupId>redis.clients</groupId>
    <artifactId>jedis</artifactId>
    <version>3.0.1</version>
</dependency>

2、连接Redis,通过ping命令测试连接

package com.example.redisdemo.controller;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import redis.clients.jedis.Jedis;

@RestController
public class RedisTest {

    private Jedis jedis;

    RedisTest(){
        if(jedis == null){
            jedis = new Jedis("localhost");
            System.out.println(jedis);
        }else{
            System.out.println("jedis isn't null");
        }
    }

    @RequestMapping("/testconn")
    public String testConn(){
        String ping = jedis.ping();
        return ping;
    }

}

因为是本地测试,就直接通过jedis = new Jedis("localhost");创建Jedis实例了,对于远程连接的话,应该通过这种方式创建实例:

Jedis jedis = new Jedis(ip,端口号);
jedis.auth(访问密码);

运行结果:

3、set/get/del实例

@RequestMapping("/setKey")
public String setKey(@RequestParam("key")String key, @RequestParam("value")String value){
   String result = jedis.set(key, value);
   return result;
}

@RequestMapping("/getKey")
public String getKey(@RequestParam("key")String key){
   String username = jedis.get(key);
   System.out.print(username);
   return username;
}

@RequestMapping("delKey")
public Long delKey(@RequestParam("key")String key){
   Long result = jedis.del(key);
   return result;
}

新增键值:

查询键值:

删除键值:

删除键值后再查询,username返回的结果为null

4、队列+过期时间

Redis除了支持普通的String类型的键值对,还有稍微复杂些的列表,HashTable,无序/有序集合,这里写个复杂些的例子,即队列与过期时间,前者是任务队列常用的功能,后者是缓存常用的功能。

    @RequestMapping("/lpush")
    public Long lpush(@RequestParam("key") String key, @RequestParam("value") String value) {
        SetParams params = new SetParams();

        Long result = jedis.lpush(key, value);
        jedis.expire(key, 10000000);
        return result;
    }

    @RequestMapping("/rpop")
    public String rpop(@RequestParam("key") String key){
        String result = jedis.rpop(key);
        System.out.println(result);
        return result;
    }

往队列中添加两个值:

从队列中取出数据:

第三次取值返回null,因为队列中已经没有数据了。

上面的例子过期时间比较长,现在设置一个比较短的时间

jedis.expire(key, 5);  //5s后过期
//也可用方法jedis.expireAt设置过期时间

经测试,lpush后5秒内rpop可以取出数据。若5秒后再去值,则返回null

5、任务队列

任务队列常用于处理发送邮件等功能,这里做个小例子:

任务队列最简单也最浅显的实现方式是轮询任务队列,有人物则处理,无任务等待一段时间再接着查询队列。

public static void main(String[] args) throws InterruptedException {
    Jedis jedis = jedis = new Jedis("localhost");
    ;
    String task = "";
    while (true) {
        System.out.println();
        task = jedis.rpop("taskqueue");
        if (task == null) {
            //任务为空,等待10秒,避免频繁请求
            System.out.println("暂无任务处理");
            Thread.sleep();
        } else {
            System.out.println("任务是:" + task);
        }
    }
}

但如果使用redis的命令brpop,则可以在队列无任务的时候阻塞进程,而不需要一直轮询查询队列是否有任务

public static void main(String[] args) throws InterruptedException {
    Jedis jedis = jedis = new Jedis("localhost");

    ;
    List<String> taskList = new ArrayList<String>();
    while (true) {
        taskList = jedis.brpop(, "taskqueue1", "taskqueue2", "taskqueue3");
        Object[] taskArray = taskList.toArray();

        System.]);
        System.]);

        System.out.print("循环一次\n");
    }
}

执行该程序,程序会因为队列无任务阻塞。然后在redis队列中推送任务:

> lpush taskqueue3 "任务3"
(integer)
> lpush taskqueue1 "任务1"
(integer)
> lpush taskqueue2 "任务2"
(integer) 

可以看到控制台输出以下信息:

6、发布/订阅模式

发布功能比较简单:

    public static void main(String[] args) throws InterruptedException {
        Jedis jedis = jedis = new Jedis("localhost");

        //发布
        jedis.publish("channel", "I'm message");
    }

订阅:

package com.example.HnadleTaskQueue;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPubSub;

public class Handler {

    public static void main(String[] args) throws InterruptedException {
        Jedis jedis = jedis = new Jedis("localhost");

        Subscriber subscriber = new Subscriber();
        //订阅
        jedis.subscribe(subscriber,"channel1", "channel2", "channel3");
    }

    static class Subscriber extends JedisPubSub{
        public void onMessage(String channel, String message) {
            System.out.println("来自频道:" + channel + "的消息:" + message);
        }
    }
}

在redis终端发布信息:

> publish channel3 "channel3的消息"
(integer)
> publish channel1 "channel1的消息"
(integer)
> publish channel2 "channel3的消息"
(integer) 

客户端显示:

7、事务与watch命令

事务:

package com.example.HnadleTaskQueue;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class Handler {

    public static void main(String[] args) throws InterruptedException {
        Jedis jedis = jedis = new Jedis("localhost");

        Transaction multi = jedis.multi();
        multi.set("user:name", "jackson");
        multi.");
        multi.exec();
    }
}

watch命令:

package com.example.HnadleTaskQueue;

import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;

public class Handler {

    public static void main(String[] args) throws InterruptedException {
        Jedis jedis = jedis = new Jedis("localhost");

        jedis.watch("user:name");
        jedis.set("user:name", "jane");

        Transaction multi = jedis.multi();
        multi.set("user:name", "jackson");
        multi.");
        multi.exec();

    }
}

结果:

能看出,watch命令使事务未生效

一个java使用redis的简单案例的更多相关文章

  1. 一个java解析xml的简单例子

    java解析xml,主要是通过Dom4j实现的,很多场合都会用到此功能,需要解析XML文件. 下面是一个简单的解析XML文件的例子: import java.util.Iterator; import ...

  2. Servlet视频-开发第一个java web(最简单的java web程序)(二)

    web项目有目录结构要求 WEB-INFO 文件夹 是一个Servlet规范,必须要这么命名,在换个文件夹里面如果创建一个jsp文件是不能直接访问的,在WEB-INfO文件夹之外创建的jsp可以直接访 ...

  3. Java中Redis的简单入门

    1.下载redis服务器端程序: 在redis.io官网完成服务器端程序下载:可下载安装版或解压版,此处我下载的是解压版,下载完成后解压. 2.配置redis密码,开启redis服务端 在redis. ...

  4. 作为一个Java程序员连简单的分页功能都会写,你好意思嘛!

    今天想说的就是能够在我们操作数据库的时候更简单的更高效的实现,现成的CRUD接口直接调用,方便快捷,不用再写复杂的sql,带吗简单易懂,话不多说上方法 1.Utils.java工具类中的方法 1 /* ...

  5. Java中JTree的简单案例

    package ch12; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; /** * Created by ...

  6. 一个java内存泄漏的排查案例

    这是个比较典型的java内存使用问题,定位过程也比较直接,但对新人还是有点参考价值的,所以就纪录了一下. 下面介绍一下在不了解系统代码的情况下,如何一步步分析和定位到具体代码的排查过程 (以便新人参考 ...

  7. Java编程-第一个Java程序

    Java编程用到的IDE是Eclipse. 关于第一个Java程序实现的简单流程: (1)    下载eclipse (2)    File-New-Java Project 命名工程名字:Hello ...

  8. JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用

    配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...

  9. [刘阳Java]_第一个Java程序_第7讲

    1. 其实第一个Java程序是很简单,但是当自己编写第一个Java程序时候需要注意如下几个内容: 理解Java程序的运行环境 校验你的Java环境变量是否能够运行你所写的第一个Java程序 理解Jav ...

随机推荐

  1. PB测款方法 店铺运费模板 设置

    https://www.wishhack.com/article/44.html 子账号有权限设置运费

  2. java输入最大10位数,倒数输出(很鸡肋)

    public class D { public static void main(String[] args) { System.out.println("请输入数字(最大十位数):&quo ...

  3. Problem B: 平面上的点和线——Point类、Line类 (II)

    Description 在数学上,平面直角坐标系上的点用X轴和Y轴上的两个坐标值唯一确定,两点确定一条线段.现在我们封装一个“Point类”和“Line类”来实现平面上的点的操作. 根据“append ...

  4. raid的一些简单知识

    日一.RAID定义RAID(Redundant Array of Independent Disk 独立冗余磁盘阵列)技术是加州大学伯克利分校1987年提出,最初是为了组合小的廉价磁盘来代替大的昂贵磁 ...

  5. python基础08_set集合

    关于前几次课的回顾: #!/usr/bin/env python # coding:utf-8 ## 字符串 数字 列表 元组 字典 ## 可变:列表 字典 ## 不可变:字符串, 数字, 元组 na ...

  6. js带“.”的对象属性名怎么使用

    问题:这样的json对象(event) { "title": "title", "alert":"ding", &quo ...

  7. 大大维的游戏机计划1--贪吃蛇v1

    本文为大大维原创,最早于博客园发表,转载请注明出处!!! 虽然本人一直是个免费的游戏测试员(/手动滑稽),但一直有着一个游戏架构师的梦想.正如马爸爸所说,梦想还是要有的,万一实现了呢? 这些天放寒假, ...

  8. 剑指Offer 11. 二进制中1的个数 (其他)

    题目描述 输入一个整数,输出该数二进制表示中1的个数.其中负数用补码表示. 题目地址 https://www.nowcoder.com/practice/8ee967e43c2c4ec193b040e ...

  9. 条件分支语句(SWICH语句)

    语法 swich(条件表达式){ Case 表达式: 语句……. Break; Case 表达式: 语句……. Break; Case 表达式: 语句……. Break; default: 语句……. ...

  10. js调用app启动页

    第一步:添加js $(function () { var ua = window.navigator.userAgent.toLowerCase(); //微信 if(ua.match(/MicroM ...