这个例子中,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. shell脚本结构

    echo $? 代表上一次命令的状态返回值,‘0’则代表为真<执行成功>,‘非零’则代表为假<执行失败>. shell脚本: <判断老男孩的年纪> [root@bo ...

  2. 为什么企业需要IT资产管理

    为什么企业需要IT资产管理 为什么企业需要IT资产管理?其实这个问题,如同企业为什么要管理一样重要. 企业需要管理.因为有了管理,人.物可尽其用,在不同的位置.角色上发挥作用,然后按照一定的运维规则, ...

  3. Forth 采用CODE定义新词

    body, table{font-family: 微软雅黑; font-size: 13.5pt} table{border-collapse: collapse; border: solid gra ...

  4. Win强制删除文件windows批处理强行删除文件

    一般情况下选中文件或文件夹可以直接删除文件,但是有些情况下例如:文件非常规命名.找不到文件位置等就无法直接删除. 针对这种情况可以用 bat批处理文件 删除,一下就是该方法的步骤 新建一个文件:*** ...

  5. Xenserver7.6修改root密码

    一:重启xenserver服务器 进入此界面时,先用上下建随便动下,解除4S倒计时,后按e键

  6. python第三方库函数安装

    以安装pillow库为例 第一.在cmd环境中安装. 第二.输入pip -h(注意之间有个空格),会出现下图界面. 第三.输入pip install pillow,就会自动安装第三方库. 注意:这里面 ...

  7. sql中的内联和外联(简单用法)

    有两张表:user和department User表: CREATE TABLE `user` (    `id` int(11) NOT NULL AUTO_INCREMENT,    `name` ...

  8. vagrant package制作一个box镜像

    1.进入virtualbox安装目录,查看虚拟机的名称(第一列为虚拟机名称) # vboxmanage list vms 2. vagrant  package 打包命令 vagrant packag ...

  9. jquery移除元素时会自动解绑事件

    .html() When .html() is used to set an element's content, any content that was in that element is co ...

  10. 将文件夹中的图像路径自动生成txt文件(便于opencv遍历处理图像)

    代码: #include<iostream> #include<vector> #include<io.h> #include<fstream> usi ...