准备
如果项目为maven项目,要添加Redis需要使用的包,下面是pom.xml配置文件
<?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>com.hyx</groupId>
<artifactId>test</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.7</maven.compiler.source>
<maven.compiler.target>1.7</maven.compiler.target>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/junit/junit -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.10.2</version>
<type>jar</type>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.junit.jupiter</groupId>
<artifactId>junit-jupiter-api</artifactId>
<version>5.3.1</version>
<scope>compile</scope>
</dependency>
</dependencies>
<build>
<pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
<plugins>
<plugin>
<artifactId>maven-clean-plugin</artifactId>
<version>3.0.0</version>
</plugin>
<!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_jar_packaging -->
<plugin>
<artifactId>maven-resources-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.7.0</version>
</plugin>
<plugin>
<artifactId>maven-surefire-plugin</artifactId>
<version>2.20.1</version>
</plugin>
<plugin>
<artifactId>maven-jar-plugin</artifactId>
<version>3.0.2</version>
</plugin>
<plugin>
<artifactId>maven-install-plugin</artifactId>
<version>2.5.2</version>
</plugin>
<plugin>
<artifactId>maven-deploy-plugin</artifactId>
<version>2.8.2</version>
</plugin>
</plugins>
</pluginManagement>
</build>
</project>
建立工具类与配置信息,使用连接池连接Redis数据库
配置文件
redis.maxTotal=100
redis.maxIdle=30
redis.minIdle=10
redis.url=主机名
redis.port=6379
工具类
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;
import redis.clients.jedis.JedisPoolConfig;
import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
public class JedisPoolUtil {
private static JedisPool pool = null;
static {
//加载配置文件
InputStream in = JedisPoolUtil.class.getClassLoader().getResourceAsStream("redis.properties");
Properties pro = new Properties();
try {
pro.load(in);
} catch (IOException e) {
e.printStackTrace();
System.out.println("加载文件失败");
}
JedisPoolConfig poolConfig = new JedisPoolConfig();
poolConfig.setMaxTotal(Integer.parseInt( pro.get("redis.maxTotal").toString()));
poolConfig.setMaxIdle(Integer.parseInt( pro.get("redis.maxIdle").toString()));
poolConfig.setMinIdle(Integer.parseInt( pro.get("redis.minIdle").toString()));
pool = new JedisPool(poolConfig, pro.get("redis.url").toString(),Integer.parseInt( pro.get("redis.port")
.toString()));
}
public static Jedis getJedis(){
return pool.getResource();
}
public static void release(Jedis jedis){
if(null != jedis){
jedis.close();
}
}
}
实现对String的操作
import org.junit.jupiter.api.Test;
import uilts.JedisPoolUtil;
import redis.clients.jedis.Jedis;
public class StringDemo {
private static Jedis jedis = JedisPoolUtil.getJedis();
//添加和获取
@Test
public void fun1(){
jedis.set( "num","1" );
System.out.println(jedis.get( "num" ));
}
//删除
@Test
public void fun2(){
jedis.del( "num" );
System.out.println(jedis.get( "num" ));
}
//自增和自减
@Test
public void fun3(){
jedis.set( "num","1" );
jedis.decr( "num" ); //i--
System.out.println(jedis.get( "num" ));
jedis.incr( "num" );//i++
}
//自增和自减 一个数
@Test
public void fun4(){
jedis.set( "num","1" );
jedis.decrBy( "num" ,5); //i=i-5
System.out.println(jedis.get( "num" ));
jedis.incrBy( "num",10 );//i= i+10;
System.out.println(jedis.get( "num" ));
}
//字符串拼接
@Test
public void fun5(){
jedis.set( "name","yx" );
Long append = jedis.append( "name", "h" ); //返回长度
System.out.println(append);
System.out.println(jedis.get( "name" ));//feisong
}
}
实现对Hash的操作
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import uilts.JedisPoolUtil;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
//Hash操作和JavaMap是一样
public class HashDemo {
private static Jedis jedis = JedisPoolUtil.getJedis();
//存储和获取
@Test
public void fun1(){
Long aLong = jedis.hset( "user", "uname", "sun");
System.out.println(aLong);
Long bLong = jedis.hset( "user", "age", "18" );
System.out.println(bLong);
String uname = jedis.hget( "user", "uname" );
System.out.println(uname);
}
//一次性存储多个key
@Test
public void fun2(){
HashMap<String, String> user = new HashMap<>();
user.put( "name","zs" );
user.put( "age","88" );
jedis.hmset( "user1",user );
}
//一次性或所有值
@Test
public void fun3(){
Map<String, String> user1 = jedis.hgetAll( "user1" );
System.out.println(user1);
}
//删除、增长,判定是否存储,获取键值对个数
@Test
public void fun4(){
Long hdel = jedis.hdel( "user1", "name" );
jedis.hincrBy( "user1","age",10 );
jedis.hexists( "user1","age" );
Long hlen = jedis.hlen( "user1" );
System.out.println(hdel);
}
//获取所有Keys、value
@Test
public void fun5(){
Set<String> keys = jedis.hkeys( "user" );
List<String> valus = jedis.hvals( "user" );
System.out.println(keys);
System.out.println(valus);
}
}
实现对List 的操作
import org.junit.jupiter.api.Test;
import redis.clients.jedis.BinaryClient;
import redis.clients.jedis.Jedis;
import uilts.JedisPoolUtil;
import java.util.List;
public class ListTest {
public static Jedis jedis = JedisPoolUtil.getJedis();
// lpush头部添加
// rpush尾部添加
@Test
public void fun1(){
jedis.lpush("mylist","list00","list01","list02");
jedis.rpush("mylist","list00","list01","list02");
}
@Test
// 查看列表 参数 名字 start end -1代表最后一个元素 -2倒数第二个
public void fun2(){
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
}
//查看第一个
@Test
public void fun3(){
String ltop = jedis.lpop("mylist");
System.out.println(ltop);
}
//查看最后一个
@Test
public void fun4(){
String llast = jedis.rpop("mylist");
System.out.println(llast);
}
@Test
//判断有没有存在的键有就插入没有就不插入,不会创建
public void fun5(){
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
Long num = jedis.lpushx("mylist", "1");
mylist = jedis.lrange("mylist1", 0, -1);
System.out.println(num);
System.out.println(mylist);
}
@Test
// 移除元素返回移除的个数>0从前往后删除 <0从后往前删除
//返回删除元素个数
public void fun6(){
Long num = jedis.lrem("mylist", 5, "list00");
System.out.println(num);
}
@Test
// 设置值
public void fun7(){
jedis.lset("mylist",2,"abasdfasdf");
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
}
@Test
// 在中间插入值 如果该值不存在则返回-1
// 如果存在返回这个list的长度
public void fun8(){
Long num = jedis.linsert("mylist", BinaryClient.LIST_POSITION.BEFORE, "123", "list01" );
System.out.println(num);
jedis.lset("mylist",3,"abasdfasdf");
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
}
@Test
// 在第一个列表尾巴中弹出,在第二个列表中压入头
/*
* 使用场景,这样做可以保证原有数据的安全性,如果
* 从第一个列表中拆出来,直接释放掉那么一旦发生了异常
* 数据就不能回复了,我们还可以加上一个守护进程,更加确保
* 数据的安全性
* */
public void fun9(){
String rpoplpush = jedis.rpoplpush("mylist", "mylist1");
List<String> mylist = jedis.lrange("mylist", 0, -1);
System.out.println(mylist);
List<String> mylist1 = jedis.lrange("mylist1", 0, -1);
System.out.println(mylist1);
System.out.println(rpoplpush);
}
}
操作Set
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import uilts.JedisPoolUtil;
import java.util.Set;
public class SetTest {
public static Jedis jedis = JedisPoolUtil.getJedis();
@Test
/*添加元素删除元素*/
public void fun(){
Long sadd = jedis.sadd("myset", "set1", "set3", "set2","5","set6");
System.out.println(sadd);
Long set1 = jedis.srem("myset","set1");
System.out.println(set1);
}
@Test
/*获得元素*/
public void fun1(){
Set<String> myset = jedis.smembers("myset");
System.out.println(myset);
}
@Test
/*移除元素*/
public void fun2(){
Long set1 = jedis.srem("myset","set1");
System.out.println(set1);
}
@Test
//判断是否这个set中存在某个值
public void fun3(){
Boolean sismember = jedis.sismember("myset", "set2");
System.out.println(sismember);
}
@Test
//获得A-B 获得差集合
public void fun4(){
Set<String> sdiff = jedis.sdiff("myset", "myadd");
System.out.println(sdiff);
}
@Test
//获得交集
public void fun5(){
Set<String> sinter = jedis.sinter("myset", "myadd");
System.out.println(sinter);
}
@Test
// 获得并集合
public void fun6(){
Set<String> sunion = jedis.sunion("myset", "myadd");
System.out.println(sunion);
}
@Test
// 成员数量
public void fun7(){
Set<String> smenmber = jedis.smembers("myset");
System.out.println("smenmber="+smenmber);
}
@Test
// 获得随机的一个成员
public void fun8(){
String srandmember = jedis.srandmember("myset");
System.out.println("srandmember= "+srandmember);
}
@Test
// 将相差的成员放到一个新的set中同理交集和并集都可以后面均
// 加上一个store即可
// 并返回新的长度
public void fun9(){
Set<String> sdiff = jedis.sdiff("myset", "myadd");
for(String s :sdiff){
Long sadd = jedis.sadd("newset", s);
System.out.println(sadd);
}
Set<String> newset = jedis.smembers("newset");
System.out.println(newset.size());
}
}
操作SortSet
import org.junit.Assert;
import org.junit.jupiter.api.Test;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Pipeline;
import redis.clients.jedis.ScanResult;
import redis.clients.jedis.Tuple;
import uilts.JedisPoolUtil;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
/*
和set极为的类似,他们是字符串的集合,没有重复的数据
差别是sortedset每个成员中都会有一个分数(score)与之关联
,redis正是通过分数来为集合中的成员进行从小到大的排序
sortedset中数据必须单一但是他的score可以是重复的
*/
public class SortedsetTest {
public static Jedis jedis = JedisPoolUtil.getJedis();
// 添加元素
@Test
public void fun(){
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<=10;i++){
map.put("value:"+i,Double.valueOf(i)); //覆盖了上面的赋值
}
jedis.zadd("sortedSet",map);
//返回共有多少元素
Long sortedSet = jedis.zcard("sortedSet");
//返回指定区域元素
Long sortedSet1 = jedis.zcount("sortedSet", 2, 6);
//返回指定区域所有键与值
Set<String> sortedSet2 = jedis.zrange("sortedSet", 0l, 10l);
System.out.println(sortedSet);
System.out.println(sortedSet1);
System.out.println(sortedSet2);
}
@Test
public void testZAddAndZCardAndZScore(){
//zadd 将一个或多个 member 元素及其 score 值加入到有序集 key 当中。
//zcard 返回有序集 key 的基数。
//zscore 返回有序集 key 中,成员 member 的 score 值。
jedis.zadd("sortedSet",1111,"value:10");
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<=10;i++){
map.put("value:"+i,Double.valueOf(i)); //覆盖了上面的赋值
}
jedis.zadd("sortedSet",map);
Assert.assertTrue(jedis.zscore("sortedSet","value:10")==10);
Assert.assertTrue(jedis.zcard("sortedSet")==11);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZCount(){
//zcount 返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
Long count = jedis.zcount("sortedSet",0,9);
System.out.println(count);
Assert.assertTrue(count==10);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZincrby(){
//zincrby 为有序集 key 的成员 member 的 score 值加上增量 increment 。
jedis.zadd("sortedSet",1111,"value:10");
jedis.zincrby("sortedSet",-111.1,"value:10");
Assert.assertTrue(jedis.zscore("sortedSet","value:10")==999.9);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRangeAndZRevRange(){
/** zrange
* 返回有序集 key 中,指定区间内的成员。
其中成员的位置按 score 值递增(从小到大)来排序。 rev则相反
具有相同 score 值的成员按字典序(lexicographical order )来排列。
*/
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Math.random()*100);
}
jedis.zadd("sortedSet",map);
Set<String> set = jedis.zrange("sortedSet",0,-1); //递增
Set<String> revSet = jedis.zrevrange("sortedSet",0,-1); //递减
for(String ss:set){
System.out.println(ss+":"+jedis.zscore("sortedSet",ss));
}
System.out.println("rev----------");
for(String ss:revSet){
System.out.println(ss+":"+jedis.zscore("sortedSet",ss));
}
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRangeByScoreAndZRevRangeByScore(){
//返回有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
//有序集成员按 score 值递增(从小到大)次序排列。 rev递减
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Math.random()*100);
}
jedis.zadd("sortedSet",map);
Set<String> set = jedis.zrangeByScore("sortedSet",25,75);
Set<String> revSet = jedis.zrevrangeByScore("sortedSet",75,25);
for(String ss:set){
System.out.println(ss+":"+jedis.zscore("sortedSet",ss));
}
System.out.println("rev----------");
for(String ss:revSet){
System.out.println(ss+":"+jedis.zscore("sortedSet",ss));
}
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRankAndZRevRank(){
//zrank 返回有序集 key 中成员 member 的排名。其中有序集成员按 score 值递增(从小到大)顺序排列。从0开始,rev表示从大到小
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
Assert.assertTrue(jedis.zrank("sortedSet","value:5")==5);
Assert.assertTrue(jedis.zrevrank("sortedSet","value:5")==4);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRem(){
//zrem 移除有序集 key 中的一个或多个成员,不存在的成员将被忽略。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
Assert.assertTrue(jedis.zrem("sortedSet","value:0","value:1","dertcfghvjbk")==2);
Assert.assertTrue(jedis.zcard("sortedSet")==8);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRemRangeByRank(){
//zremrangeByRank 移除有序集 key 中,指定排名(rank)区间内的所有成员。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
jedis.zremrangeByRank("sortedSet",1,3);
Assert.assertTrue(jedis.zcard("sortedSet")==7);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZRemRangeByScore(){
//zremrangeByScore 移除有序集 key 中,所有 score 值介于 min 和 max 之间(包括等于 min 或 max )的成员。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("sortedSet",map);
jedis.zremrangeByScore("sortedSet",1,3);
Assert.assertTrue(jedis.zcard("sortedSet")==7);
Assert.assertTrue(jedis.del("sortedSet")==1);
}
@Test
public void testZUnionStore(){
//计算给定的一个或多个有序集的并集,其中给定 key 的数量必须以 numkeys 参数指定,并将该并集(结果集)储存到 destination 。
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i));
}
jedis.zadd("keya",map);
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i+3));
}
map.put("adsad",123d);
jedis.zadd("keyb",map);
jedis.zunionstore("destination","keya","keyb");
Assert.assertTrue(jedis.zcard("destination")==11);
Assert.assertTrue(jedis.del("keya","keyb","destination")==3);
}
@Test
public void testZInterStore(){
//计算给定的一个或多个有序集的交集,其中给定 key 的数量必须以 numkeys 参数指定,并将该交集(结果集)储存到 destination
Map<String,Double> map = new HashMap<String,Double>();
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i)); //覆盖了上面的赋值
}
jedis.zadd("keya",map);
for(int i=0;i<10;i++){
map.put("value:"+i,Double.valueOf(i+3)); //覆盖了上面的赋值
}
map.put("adsad",123d);
jedis.zadd("keyb",map);
jedis.zinterstore("destination","keya","keyb");
Assert.assertTrue(jedis.zcard("destination")==10);
Assert.assertTrue(jedis.del("keya","keyb","destination")==3);
Assert.assertTrue(jedis.del("keya","keyb","destination")==3);
}
@Test
public void testZRangeByLex(){
//当有序集合的所有成员都具有相同的分值时, 有序集合的元素会根据成员的字典序(lexicographical ordering)来进行排序,
// 而这个命令则可以返回给定的有序集合键 key 中, 值介于 min 和 max 之间的成员。
jedis.zadd("中文",123d,"a");
jedis.zadd("中文",123d,"b");
jedis.zadd("中文",123d,"c");
jedis.zadd("中文",123d,"d");
jedis.zadd("中文",123d,"e");
Set<String> set = jedis.zrangeByLex("中文","(b","[e");
// Set<String> set = jedis.zrangeByLex("中文","-","+");
// System.out.println(set.toString());
Assert.assertTrue(set.size()==3);
Assert.assertTrue(jedis.del("中文")==1);
}
@Test
public void testZLexCount(){
//对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会返回该集合中, 成员介于 min 和 max 范围内的元素数量。
jedis.zadd("key",123d,"a");
jedis.zadd("key",123d,"b");
jedis.zadd("key",123d,"c");
jedis.zadd("key",123d,"d");
jedis.zadd("key",123d,"e");
Assert.assertTrue(jedis.zlexcount("key","-","+")==5);
Assert.assertTrue(jedis.zlexcount("key","(b","[e")==3);
Assert.assertTrue(jedis.del("key")==1);
}
@Test
public void testZRemRangeByLex(){
//对于一个所有成员的分值都相同的有序集合键 key 来说, 这个命令会移除该集合中, 成员介于 min 和 max 范围内的所有元素。
jedis.zadd("key",123d,"a");
jedis.zadd("key",123d,"b");
jedis.zadd("key",123d,"c");
jedis.zadd("key",123d,"d");
jedis.zadd("key",123d,"e");
Assert.assertTrue(jedis.zremrangeByLex("key","(b","[e")==3);
Assert.assertTrue(jedis.zlexcount("key","-","+")==2);
}
@Test
public void testZScan(){
Pipeline pipeline = jedis.pipelined();
for(int i=0;i<1000;i++){
pipeline.zadd("key",Math.random()*100,"value:"+i);
}
pipeline.sync();
int cursor = 0;
int count = 0;
do{
ScanResult<Tuple> result = jedis.zscan("key",cursor);
cursor = Integer.valueOf(result.getStringCursor());
for(Tuple tuple :result.getResult()){
// System.out.print(new String(tuple.getBinaryElement())+":"+tuple.getScore());
count++;
}
}
while (cursor!=0);
System.out.println(count);
}
}