一个java使用redis的简单案例
这个例子中,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的简单案例的更多相关文章
- 一个java解析xml的简单例子
java解析xml,主要是通过Dom4j实现的,很多场合都会用到此功能,需要解析XML文件. 下面是一个简单的解析XML文件的例子: import java.util.Iterator; import ...
- Servlet视频-开发第一个java web(最简单的java web程序)(二)
web项目有目录结构要求 WEB-INFO 文件夹 是一个Servlet规范,必须要这么命名,在换个文件夹里面如果创建一个jsp文件是不能直接访问的,在WEB-INfO文件夹之外创建的jsp可以直接访 ...
- Java中Redis的简单入门
1.下载redis服务器端程序: 在redis.io官网完成服务器端程序下载:可下载安装版或解压版,此处我下载的是解压版,下载完成后解压. 2.配置redis密码,开启redis服务端 在redis. ...
- 作为一个Java程序员连简单的分页功能都会写,你好意思嘛!
今天想说的就是能够在我们操作数据库的时候更简单的更高效的实现,现成的CRUD接口直接调用,方便快捷,不用再写复杂的sql,带吗简单易懂,话不多说上方法 1.Utils.java工具类中的方法 1 /* ...
- Java中JTree的简单案例
package ch12; import javax.swing.*; import javax.swing.tree.DefaultMutableTreeNode; /** * Created by ...
- 一个java内存泄漏的排查案例
这是个比较典型的java内存使用问题,定位过程也比较直接,但对新人还是有点参考价值的,所以就纪录了一下. 下面介绍一下在不了解系统代码的情况下,如何一步步分析和定位到具体代码的排查过程 (以便新人参考 ...
- Java编程-第一个Java程序
Java编程用到的IDE是Eclipse. 关于第一个Java程序实现的简单流程: (1) 下载eclipse (2) File-New-Java Project 命名工程名字:Hello ...
- JAVA_SE基础——5.第一个Java程序HelloWorld&注释的应用
配置完JDK&环境变量后,我们就可以开始写程序了,那么程序怎么写呢,用什么工具呢,我建议 为了方便学习,我们最好在一个磁盘下建立一个专门的文件来写java程序,比如就在D盘下建立一个名为&qu ...
- [刘阳Java]_第一个Java程序_第7讲
1. 其实第一个Java程序是很简单,但是当自己编写第一个Java程序时候需要注意如下几个内容: 理解Java程序的运行环境 校验你的Java环境变量是否能够运行你所写的第一个Java程序 理解Jav ...
随机推荐
- centos 安装composer
1 下载composer.phar curl -sS https://getcomposer.org/installer | php 2 设置全局调用 mv composer.phar /usr/lo ...
- <airsim文档学习> Street View Image, Pose, and 3D Cities Dataset
原文地址: https://github.com/amir32002/3D_Street_View 说明:个人学习笔记,翻译整理自github/airsim. 简介 该存储库共享包含6DOF相机姿态 ...
- caffe drawnet.py 用Python画网络框架
在caffe中可以使用draw_net.py轻松地绘制卷积神经网络(CNN,Convolutional Neural Networks)的架构图.这个工具对于我们理解.学习甚至查错都有很大的帮助. 1 ...
- centos6升级python
CentOS 6中,默认安装了Python 2.6.而pip,jupyter这样的常用工具是不支持Python 2.6的.为了使用这些工具,就必须将Python 2.6升级到Python 2.7以上的 ...
- js--函数声明和函数表达式--执行顺序
思考: notice:在写JS代码的时候,有两种写法,一种是函数表达式,另外一种是函数声明方式.我们需要重点注意的是,只有函数声明形式才能被提升. function hoistFunction() { ...
- mod_conference ESL控制二(事件)
根据上篇所述功能需求,esl需要处理以下几类事件: ESL_EVENT_CHANNEL_* #channel相关事件,用户判断参会者是否应答.计费 DTMF事件 #识别参会者按键,根据按键进行操作( ...
- Python语法教程总结规范
Python语法易错点记录 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- css后代选择器
后代选择器: <p><em>CSS</em>层叠样式</p> 使用后代选择器设置,之间用空格隔开: p em{font-size:40px;} 例子: ...
- CCF-Markdown-201703-3
这道题不存在递归结构 比如区块之间的相互嵌套 还有"[ [] ]" 链接的相互嵌套, 所以直接处理就好了 还可以 #include <bits/stdc++.h> us ...
- Xamarin Android 下拉列表
<Spinner android:id="@+id/spinner" android:layout_width="wrap_content" androi ...