Redis入门教程(三)— Java中操作Redis
在 Redis 的官网上,我们可以看到 Redis 的 Java 客户端众多
其中,Jedis 是 Redis 官方推荐,也是使用用户最多的 Java 客户端。
开始前的准备
- 使用 jedis 使用到的 jedis-2.1.0.jar,点击下载
- 如果使用 Redis 连接池的话,需要 commons-pool-1.5.4.jar,点击下载
- 如果你缺少 junit 的 jar 包,点击下载
创建项目
- 首先创建一个新的 Java Project,命名为 Jedis(你也可以给它你喜爱的名字)
- 在项目中新建一个 Folder(文件夹),命名为“lib”
- 将 jedis-2.1.0.jar、commons-pool-1.5.4.jar、junit-4.10.jar 复制到 lib 文件夹下
- 选中文件夹或者三个 jar 文件,右击找到 Build Path,选择菜单下的 Add to Build Path 加入到 Build Path 中
开始撸代码
继续之前,请务必阅读过Redis 入门教程(二)—基本数据类型,这将对你有很大的帮助。
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.junit.Before;
import org.junit.Test;
import redis.clients.jedis.BinaryClient.LIST_POSITION;
import redis.clients.jedis.Jedis;
/**
- @author dotleo
*/
public class Jedis_Test {
<span class="hljs-comment">//Java中操作Redis的对象</span>
<span class="hljs-keyword">private</span> Jedis jedis ;
<span class="hljs-meta">@Before</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">connection</span><span class="hljs-params">()</span> {
<span class="hljs-comment">//连接Redis服务器,参数1为ip,参数2为端口号,请根据自己实际情况赋值</span>
jedis = <span class="hljs-keyword">new</span> <span class="hljs-title class_">Jedis</span>(<span class="hljs-string">"192.168.1.233"</span>,<span class="hljs-number">6379</span>);
}
<span class="hljs-comment">/**
* redis字符串操作
*/</span>
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">stringTest</span><span class="hljs-params">()</span> {
<span class="hljs-comment">//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库</span>
<span class="hljs-comment">//特别注意:在开发中请勿如此操作</span>
jedis.flushDB();
<span class="hljs-comment">//添加字符串</span>
jedis.set(<span class="hljs-string">"age"</span>, <span class="hljs-string">"101"</span>);
System.out.println(<span class="hljs-string">"age = "</span> + jedis.get(<span class="hljs-string">"age"</span>));
<span class="hljs-comment">//批量添加字符串</span>
jedis.mset(<span class="hljs-string">"age1"</span>,<span class="hljs-string">"1"</span>,<span class="hljs-string">"age2"</span>,<span class="hljs-string">"2"</span>);
System.out.println(<span class="hljs-string">"age1 = "</span> + jedis.get(<span class="hljs-string">"age1"</span>));
System.out.println(<span class="hljs-string">"age2 = "</span> + jedis.get(<span class="hljs-string">"age2"</span>));
<span class="hljs-comment">//添加字符串(仅在不存在时)</span>
jedis.setnx(<span class="hljs-string">"price"</span>, <span class="hljs-string">"101"</span>);
System.out.println(<span class="hljs-string">"price = "</span> + jedis.get(<span class="hljs-string">"price"</span>));
<span class="hljs-comment">//加1操作</span>
jedis.incr(<span class="hljs-string">"price"</span>);
System.out.println(<span class="hljs-string">"price = "</span> + jedis.get(<span class="hljs-string">"price"</span>));
<span class="hljs-comment">//拼接字符串</span>
jedis.append(<span class="hljs-string">"age"</span>, <span class="hljs-string">"years"</span>);
System.out.println(<span class="hljs-string">"age = "</span> + jedis.get(<span class="hljs-string">"age"</span>));
<span class="hljs-comment">//截取字符串</span>
<span class="hljs-type">String</span> <span class="hljs-variable">str</span> <span class="hljs-operator">=</span> jedis.getrange(<span class="hljs-string">"age"</span>, <span class="hljs-number">0L</span>, <span class="hljs-number">5L</span>);
System.out.println(<span class="hljs-string">"age[0,5] = "</span> + str);
<span class="hljs-comment">//获取字符串长度</span>
<span class="hljs-type">Long</span> <span class="hljs-variable">len</span> <span class="hljs-operator">=</span> jedis.strlen(<span class="hljs-string">"age"</span>);
System.out.println(<span class="hljs-string">"age length = "</span> + len);
<span class="hljs-comment">//删除字符串</span>
jedis.del(<span class="hljs-string">"age"</span>);
System.out.print(<span class="hljs-string">"age = "</span> + jedis.get(<span class="hljs-string">"age"</span>));
}
<span class="hljs-comment">/**
* redis哈希操作
*/</span>
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">hashTest</span><span class="hljs-params">()</span> {
<span class="hljs-comment">//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库</span>
<span class="hljs-comment">//特别注意:在开发中请勿如此操作</span>
jedis.flushDB();
<span class="hljs-comment">//添加值</span>
jedis.hset(<span class="hljs-string">"student"</span>, <span class="hljs-string">"name"</span>, <span class="hljs-string">"zhangsan"</span>);
<span class="hljs-comment">//添加值(仅在不存在时)</span>
jedis.hsetnx(<span class="hljs-string">"student"</span>, <span class="hljs-string">"age"</span>, <span class="hljs-string">"12"</span>);
<span class="hljs-comment">//批量添加值</span>
Map<String,String> map = <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashMap</span><String,String>();
map.put(<span class="hljs-string">"sex"</span>, <span class="hljs-string">"boy"</span>);
map.put(<span class="hljs-string">"address"</span>, <span class="hljs-string">"beijing"</span>);
jedis.hmset(<span class="hljs-string">"student"</span>, map);
<span class="hljs-comment">//获取值</span>
<span class="hljs-type">String</span> <span class="hljs-variable">str</span> <span class="hljs-operator">=</span> jedis.hget(<span class="hljs-string">"student"</span>, <span class="hljs-string">"name"</span>);
System.out.println(<span class="hljs-string">"student:name = "</span> + str);
<span class="hljs-comment">//批量获取值</span>
List<String> list = jedis.hmget(<span class="hljs-string">"student"</span>, <span class="hljs-string">"name"</span>,<span class="hljs-string">"age"</span>);
System.out.println(<span class="hljs-string">"student:name = "</span> + list.get(<span class="hljs-number">0</span>));
System.out.println(<span class="hljs-string">"student:age = "</span> + list.get(<span class="hljs-number">1</span>));
<span class="hljs-comment">//获取key</span>
Set<String> set = jedis.hkeys(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student keys:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
<span class="hljs-comment">//获取值</span>
list = jedis.hvals(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student vals:"</span>);
<span class="hljs-keyword">for</span> (String string : list) {
System.out.println(string);
}
<span class="hljs-comment">//获取key和值</span>
map = jedis.hgetAll(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student keys vals:"</span>);
<span class="hljs-keyword">for</span> (String key:map.keySet()) {
System.out.println(key + <span class="hljs-string">" = "</span> + map.get(key));
}
<span class="hljs-comment">//删除值</span>
jedis.hdel(<span class="hljs-string">"student"</span>, <span class="hljs-string">"sex"</span>);
System.out.println(<span class="hljs-string">"student:sex = "</span> + jedis.hget(<span class="hljs-string">"student"</span>, <span class="hljs-string">"sex"</span>));
<span class="hljs-comment">//获取长度</span>
<span class="hljs-type">Long</span> <span class="hljs-variable">len</span> <span class="hljs-operator">=</span> jedis.hlen(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student length = "</span> + len);
}
<span class="hljs-comment">/**
* redis列表操作
*/</span>
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">listTest</span><span class="hljs-params">()</span> {
<span class="hljs-comment">//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库</span>
<span class="hljs-comment">//特别注意:在开发中请勿如此操作</span>
jedis.flushDB();
<span class="hljs-comment">//表头添加</span>
jedis.lpush(<span class="hljs-string">"student"</span>, <span class="hljs-string">"xiaoli"</span>,<span class="hljs-string">"xiaowang"</span>,<span class="hljs-string">"xiaoliu"</span>,<span class="hljs-string">"xiaozhang"</span>);
<span class="hljs-comment">//表尾添加</span>
jedis.rpush(<span class="hljs-string">"student"</span>, <span class="hljs-string">"zhangsan"</span>,<span class="hljs-string">"lisi"</span>,<span class="hljs-string">"wangwu"</span>);
<span class="hljs-comment">//通过索引获取元素</span>
<span class="hljs-type">String</span> <span class="hljs-variable">str</span> <span class="hljs-operator">=</span> jedis.lindex(<span class="hljs-string">"student"</span>, <span class="hljs-number">1L</span>);
System.out.println(<span class="hljs-string">"student 1st = "</span> + str);
<span class="hljs-comment">//在元素前或者后插入元素</span>
jedis.linsert(<span class="hljs-string">"student"</span>, LIST_POSITION.BEFORE, <span class="hljs-string">"xiaozhang"</span>, <span class="hljs-string">"zhangsan"</span>);
<span class="hljs-comment">//从表头弹出</span>
str = jedis.lpop(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student first = "</span> + str);
<span class="hljs-comment">//从表尾弹出</span>
str = jedis.rpop(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student end = "</span> + str);
<span class="hljs-comment">//删除</span>
jedis.lrem(<span class="hljs-string">"student"</span>, <span class="hljs-number">2</span>, <span class="hljs-string">"zhangsan"</span>);
<span class="hljs-comment">//获取所有值</span>
List<String> list = jedis.lrange(<span class="hljs-string">"student"</span>, <span class="hljs-number">0L</span>, -<span class="hljs-number">1L</span>);
System.out.println(<span class="hljs-string">"student vals:"</span>);
<span class="hljs-keyword">for</span> (String string : list) {
System.out.println(string);
}
}
<span class="hljs-comment">/**
* redis集合操作
*/</span>
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">setTest</span><span class="hljs-params">()</span> {
<span class="hljs-comment">//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库</span>
<span class="hljs-comment">//特别注意:在开发中请勿如此操作</span>
jedis.flushDB();
<span class="hljs-comment">//添加成员</span>
jedis.sadd(<span class="hljs-string">"student"</span>, <span class="hljs-string">"zhangsan"</span>,<span class="hljs-string">"lisi"</span>);
jedis.sadd(<span class="hljs-string">"monitor"</span>,<span class="hljs-string">"wangwu"</span>,<span class="hljs-string">"zhangsan"</span>);
<span class="hljs-comment">//获取成员数</span>
<span class="hljs-type">Long</span> <span class="hljs-variable">count</span> <span class="hljs-operator">=</span> jedis.scard(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student count = "</span> + count);
<span class="hljs-comment">//获取成员</span>
Set<String> set = jedis.smembers(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student members:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
<span class="hljs-comment">//是否为该集合的成员</span>
<span class="hljs-type">boolean</span> <span class="hljs-variable">bool</span> <span class="hljs-operator">=</span> jedis.sismember(<span class="hljs-string">"student"</span>, <span class="hljs-string">"zhangsan"</span>);
System.out.println(<span class="hljs-string">"member zhangsan exist?\n"</span> + bool);
<span class="hljs-comment">//交集</span>
set = jedis.sinter(<span class="hljs-string">"student"</span>,<span class="hljs-string">"monitor"</span>);
System.out.println(<span class="hljs-string">"student inter monitor members:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
<span class="hljs-comment">//并集</span>
set = jedis.sunion(<span class="hljs-string">"student"</span>,<span class="hljs-string">"monitor"</span>);
System.out.println(<span class="hljs-string">"student union monitor members:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
<span class="hljs-comment">//补集</span>
set = jedis.sdiff(<span class="hljs-string">"student"</span>,<span class="hljs-string">"monitor"</span>);
System.out.println(<span class="hljs-string">"student diff monitor members:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
<span class="hljs-comment">//随机返回成员</span>
<span class="hljs-type">String</span> <span class="hljs-variable">str</span> <span class="hljs-operator">=</span> jedis.srandmember(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"random member:\n"</span> + str);
<span class="hljs-comment">//移动成员</span>
jedis.smove(<span class="hljs-string">"student"</span>, <span class="hljs-string">"monitor"</span>, <span class="hljs-string">"lisi"</span>);
<span class="hljs-comment">//删除成员</span>
jedis.srem(<span class="hljs-string">"monitor"</span>, <span class="hljs-string">"zhangsan"</span>);
<span class="hljs-comment">//显示</span>
set = jedis.smembers(<span class="hljs-string">"student"</span>);
System.out.println(<span class="hljs-string">"student members:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
set = jedis.smembers(<span class="hljs-string">"monitor"</span>);
System.out.println(<span class="hljs-string">"monitor members:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
}
<span class="hljs-comment">/**
* redis有序集合操作
*/</span>
<span class="hljs-meta">@Test</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">sortSetTest</span><span class="hljs-params">()</span> {
<span class="hljs-comment">//为避免多次运行Redis中存在键,导致结果不符合预期,每次执行时清理当前库</span>
<span class="hljs-comment">//特别注意:在开发中请勿如此操作</span>
jedis.flushDB();
<span class="hljs-comment">//添加成员</span>
Map<Double,String> map = <span class="hljs-keyword">new</span> <span class="hljs-title class_">HashMap</span><Double,String>();
map.put(<span class="hljs-number">50d</span>, <span class="hljs-string">"zhangsan"</span>);
map.put(<span class="hljs-number">60d</span>, <span class="hljs-string">"lisi"</span>);
map.put(<span class="hljs-number">70d</span>, <span class="hljs-string">"wangwu"</span>);
map.put(<span class="hljs-number">80d</span>, <span class="hljs-string">"zhaoliu"</span>);
map.put(<span class="hljs-number">90d</span>, <span class="hljs-string">"yangqi"</span>);
map.put(<span class="hljs-number">120d</span>, <span class="hljs-string">"xiaoming"</span>);
map.put(<span class="hljs-number">130d</span>, <span class="hljs-string">"xiaozhang"</span>);
map.put(<span class="hljs-number">140d</span>, <span class="hljs-string">"xiaoli"</span>);
map.put(<span class="hljs-number">150d</span>, <span class="hljs-string">"xiaoliu"</span>);
jedis.zadd(<span class="hljs-string">"score"</span>, map);
<span class="hljs-comment">//更新分数</span>
jedis.zadd(<span class="hljs-string">"score"</span>, <span class="hljs-number">100d</span>, <span class="hljs-string">"zhangsan"</span>);
<span class="hljs-comment">//获取成员的分数值</span>
<span class="hljs-type">Double</span> <span class="hljs-variable">dou</span> <span class="hljs-operator">=</span> jedis.zscore(<span class="hljs-string">"score"</span>, <span class="hljs-string">"zhangsan"</span>);
System.out.println(<span class="hljs-string">"zhangsan score :\n"</span> + dou);
<span class="hljs-comment">//按照成员分数小到大返回索引区间的成员</span>
Set<String> set = jedis.zrange(<span class="hljs-string">"score"</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">1</span>);
System.out.println(<span class="hljs-string">"score member order:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
<span class="hljs-comment">//按照成员分数大到小返回索引区间的成员</span>
set = jedis.zrevrange(<span class="hljs-string">"score"</span>, <span class="hljs-number">0</span>, -<span class="hljs-number">1</span>);
System.out.println(<span class="hljs-string">"score member reverse:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
<span class="hljs-comment">//按照成员分数小到大返回分数值区间的成员</span>
set = jedis.zrangeByScore(<span class="hljs-string">"score"</span>, <span class="hljs-number">50d</span>, <span class="hljs-number">80d</span>);
System.out.println(<span class="hljs-string">"score member order:"</span>);
<span class="hljs-keyword">for</span> (String string : set) {
System.out.println(string);
}
<span class="hljs-comment">//返回有序集合中指定成员的索引</span>
<span class="hljs-type">Long</span> <span class="hljs-variable">index</span> <span class="hljs-operator">=</span> jedis.zrank(<span class="hljs-string">"score"</span>, <span class="hljs-string">"xiaoliu"</span>);
System.out.println(<span class="hljs-string">"xiaoliu index is:\n"</span> + index);
}
}
如果你读过我的Redis 入门教程(二)—基本数据类型,你会发现上面这些命令在其中都有提及,只是诸如参数传递的形式、返回值的类型等有少许不同,但方法名和文中的指令完全相同,其他方面也大同小异。因此在上面的代码中并没有像文章中一样尽可能多的列出所有的函数,还需你自己勤于练习、摸索。
Redis 连接池
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
/**
- @author dotleo
*/
public class RedisUtil {
<span class="hljs-comment">//Redis服务器ip地址</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">String</span> <span class="hljs-variable">IP_ADDRESS</span> <span class="hljs-operator">=</span> <span class="hljs-string">"192.168.1.233"</span>;
<span class="hljs-comment">//Redis端口号</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">int</span> <span class="hljs-variable">PORT</span> <span class="hljs-operator">=</span> <span class="hljs-number">6379</span>;
<span class="hljs-comment">//可用连接实例的最大数目,默认值为8;</span>
<span class="hljs-comment">//如果赋值为-1,则表示不限制;如果pool已经分配了maxActive个jedis实例,则此时pool的状态为exhausted(耗尽)。</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">int</span> <span class="hljs-variable">MAX_ACTIVE</span> <span class="hljs-operator">=</span> <span class="hljs-number">1024</span>;
<span class="hljs-comment">//控制一个pool最多有多少个状态为idle(空闲的)的jedis实例,默认值也是8。</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">int</span> <span class="hljs-variable">MAX_IDLE</span> <span class="hljs-operator">=</span> <span class="hljs-number">200</span>;
<span class="hljs-comment">//等待可用连接的最大时间,单位毫秒,默认值为-1,表示永不超时。如果超过等待时间,则直接抛出JedisConnectionException;</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">final</span> <span class="hljs-type">int</span> <span class="hljs-variable">MAX_WAIT</span> <span class="hljs-operator">=</span> <span class="hljs-number">10000</span>;
<span class="hljs-comment">//在borrow一个jedis实例时,是否提前进行validate操作;如果为true,则得到的jedis实例均是可用的; </span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-type">boolean</span> <span class="hljs-variable">TEST_ON_BORROW</span> <span class="hljs-operator">=</span> <span class="hljs-literal">true</span>;
<span class="hljs-comment">//Jedis连接池对象</span>
<span class="hljs-keyword">private</span> <span class="hljs-keyword">static</span> <span class="hljs-type">JedisPool</span> <span class="hljs-variable">jedisPool</span> <span class="hljs-operator">=</span> <span class="hljs-literal">null</span>;
<span class="hljs-comment">/**
* 初始化连接池
*/</span>
<span class="hljs-keyword">static</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-type">JedisPoolConfig</span> <span class="hljs-variable">conf</span> <span class="hljs-operator">=</span> <span class="hljs-keyword">new</span> <span class="hljs-title class_">JedisPoolConfig</span>();
conf.setMaxActive(MAX_ACTIVE);
conf.setMaxIdle(MAX_IDLE);
conf.setMaxWait(MAX_WAIT);
conf.setTestOnBorrow(TEST_ON_BORROW);
jedisPool = <span class="hljs-keyword">new</span> <span class="hljs-title class_">JedisPool</span>(conf, IP_ADDRESS, PORT);
} <span class="hljs-keyword">catch</span>(Exception ex) {
ex.printStackTrace();
}
}
<span class="hljs-comment">/**
* 获取Jedis实例
* <span class="hljs-doctag">@return</span> Jedis实例
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">synchronized</span> <span class="hljs-keyword">static</span> Jedis <span class="hljs-title function_">getJedis</span><span class="hljs-params">()</span> {
<span class="hljs-keyword">try</span> {
<span class="hljs-keyword">if</span> (jedisPool != <span class="hljs-literal">null</span>) {
<span class="hljs-type">Jedis</span> <span class="hljs-variable">resource</span> <span class="hljs-operator">=</span> jedisPool.getResource();
<span class="hljs-keyword">return</span> resource;
} <span class="hljs-keyword">else</span> {
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
} <span class="hljs-keyword">catch</span> (Exception e) {
e.printStackTrace();
<span class="hljs-keyword">return</span> <span class="hljs-literal">null</span>;
}
}
<span class="hljs-comment">/**
* 释放jedis资源
* <span class="hljs-doctag">@param</span> jedis Jedis对象
*/</span>
<span class="hljs-keyword">public</span> <span class="hljs-keyword">static</span> <span class="hljs-keyword">void</span> <span class="hljs-title function_">returnResource</span><span class="hljs-params">(<span class="hljs-keyword">final</span> Jedis jedis)</span> {
<span class="hljs-keyword">if</span> (jedis != <span class="hljs-literal">null</span>) {
jedisPool.returnResourceObject(jedis);
}
}
}