在了解了Redis的基础数据结构以及一些特性和操作指令之后呢,和kafka及ES系列一样,我们不可能用指令去编程和完成业务逻辑,还是需要代码去操作指令的,java也封装了相关的代码,统一叫做Jedis,接下来本篇blog就来了解下Jedis的使用:
- Jedis简介:简单介绍下Jedis是什么,能干什么
- Jedis环境搭建:创建相关Java项目,完成第一个Jedis代码编写
- Jedis操作Redis:Jedis对Redis的一些操作指令
- Jedis综合案例实现:Jedis实现我们之前提到的综合案例
- Jedis简易工具类使用:方便后期Jedis和Redis的连接
- 可视化客户端:可以可视化查看的Redis客户端
接下来就来学习下Jedis的使用,为之后的接口调用打好基础。
Jedis简介
Jedis实际上就是Java语言操作Redis数据的工具,其实我们之前在用JDBC操作Mysql的时候也是一样的,实际上Redis不也是一个非关系型的数据库嘛!
Jedis有如下的一些优点:轻量,简洁,便于集成和改造;支持连接池;支持pipelining、事务、LUA Scripting、Redis Sentinel、Redis Cluster,但是需要注意,它不支持读写分离,需要自己实现
Jedis环境搭建
首先还是用idea来创建一个Jedis的maven项目,初始化一个Jedis:
需要maven加载的配置为:
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>org.example</groupId> <artifactId>Jedis</artifactId> <version>1.0-SNAPSHOT</version> <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> </project>
Jedis操作Redis
使用如下代码操作Redis,指令与Redis原生指令类似:
String类型
import org.junit.Test; import redis.clients.jedis.Jedis; public class JedisTest { @Test public void testJedis(){ //连接Redis Jedis jedis=new Jedis("127.0.0.1",6379); //操作Redis jedis.set("name","tml"); System.out.println(jedis.get("name")); //关闭Redis jedis.close(); } }
可以看到值被打印出来了
List类型
list操作也很类似,和指令一般无二:
@Test public void testList(){ //连接Redis Jedis jedis=new Jedis("127.0.0.1",6379); //操作Redis jedis.lpush("faith","tml"); jedis.lpush("faith","gcy"); jedis.lpush("faith","love"); List<String> list = jedis.lrange("faith", 0, -1); for (String item:list) { System.out.println(item); } //关闭Redis jedis.close(); }
Hash类型
@Test public void testHash(){ //连接Redis Jedis jedis=new Jedis("127.0.0.1",6379); //操作Redis jedis.hset("Hash","tml","1"); jedis.hset("Hash","gcy","2"); jedis.hset("Hash","love","3"); Map<String,String> map = jedis.hgetAll("Hash"); System.out.println(map); //关闭Redis jedis.close(); }
Set类型
@Test public void testSet(){ //连接Redis Jedis jedis=new Jedis("127.0.0.1",6379); //操作Redis jedis.sadd("set","tml"); jedis.sadd("set","gcy"); jedis.sadd("set","tml"); Set<String> set = jedis.smembers("set"); System.out.println(set); //关闭Redis jedis.close(); }
SortedSet类型
@Test public void testSortedSet(){ //连接Redis Jedis jedis=new Jedis("127.0.0.1",6379); //操作Redis jedis.zadd("sortedSet",100,"china"); jedis.zadd("sortedSet",99,"aa"); jedis.zadd("sortedSet",89,"cc"); Set<Tuple> tset= jedis.zrangeWithScores("sortedSet",0,-1); System.out.println(tset); //关闭Redis jedis.close(); }
Jedis综合案例实现
还是我们之前看的按次计时服务案例:
综合分析如下实现步骤:
实现代码如下:
import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisException; //业务服务和管理 public class JedisService { private String id; private int num; public JedisService(String id,int num){ this.id=id; this.num=num; } public void servie(){ //连接Redis Jedis jedis=new Jedis("127.0.0.1",6379); String value= jedis.get("compid"+id); try { if(value==null){ jedis.setex("compid"+id,5,Long.MAX_VALUE-num +""); }else { Long val=jedis.incr("compid"+id); business(id,num-(Long.MAX_VALUE-val)); } } catch (JedisException e){ System.out.println("使用已达上限"); return ; }finally { //关闭Redis jedis.close(); } } public void business(String id,Long val){ System.out.println("用户"+id+"执行业务操作第"+val+"次"); } } //线程管理服务 class MyThread extends Thread{ JedisService jedisService; MyThread(String id,int num){ jedisService =new JedisService(id,num); } public void run(){ while (true){ jedisService.servie(); try { Thread.sleep(300L); } catch (InterruptedException e) { e.printStackTrace(); } } } } class main{ public static void main(String[] args) { MyThread myThread=new MyThread("初级用户",10); MyThread myThread1=new MyThread("高级用户",30); myThread.start(); myThread1.start(); } }
Jedis简易工具类使用【Jedis连接池】
手动管理连接比较麻烦,使用类似JDBC的连接池方法:
代码实现如下:
import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisPools { @Test public static Jedis testJedisPool(){ //获得连接池配置对象,设置配置项 JedisPoolConfig config = new JedisPoolConfig(); // 最大连接数 config.setMaxTotal(30); //最大空闲连接数 config.setMaxIdle(10); //获得连接池 JedisPool jedisPool = new JedisPool(config,"localhost",6379); return jedisPool.getResource(); } }
更高级的使用方式是配置项放到配置文件,并且把连接池设置为静态资源:
然后读取连接池
import org.junit.Test; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; import java.util.ResourceBundle; class JedisPools { private static JedisPool jedisPool=null; static { ResourceBundle resourceBundle= ResourceBundle.getBundle("redis"); JedisPoolConfig config = new JedisPoolConfig(); String host=resourceBundle.getString("redis.host"); String port=resourceBundle.getString("redis.port"); String maxTotal=resourceBundle.getString("redis.maxTotal"); String maxIdle=resourceBundle.getString("redis.maxIdle"); config.setMaxTotal(Integer.parseInt(maxTotal)); config.setMaxIdle(Integer.parseInt(maxIdle)); jedisPool = new JedisPool(config,host, Integer.parseInt(port)); } @Test public static Jedis testJedisPool(){ return jedisPool.getResource(); } }
可视化客户端
使用redis Desktop Manager去查看redis的内容:选择官网下载https://redisdesktop.com/pricing,下载完成后可以看到界面如下所示: