jedis 是 Redis 官方推荐的Java连接开发工具;使用 Java 操作 redis 中间件;在企业中用的最多的就是Jedis。Jedis提供了完整Redis命令,而Redisson有更多分布式的容器实现。
如果使用jedis操作redis,那么需要对redis基本操作命令要十分熟悉;
对redis命令不熟悉的看这里:https://blog.csdn.net/weixin_44890938/article/details/118909055?spm=1001.2014.3001.5501
导入对应的依赖
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>3.6.3</version>
</dependency>
1.连接测试
代码示例:
package com.beyond;
import redis.clients.jedis.Jedis;
public class JedisCliTest {
public synchronized static void main(String[] args) throws InterruptedException {
Jedis jedis = new Jedis("192.168.204.128", 6379);
System.out.println("查看连接状态:" + jedis.ping());
System.out.println("切换数据库:" + jedis.select(2));
System.out.println("新增一个key:" + jedis.set("aa", "sasa"));
System.out.println("查看数据大小:" + jedis.dbSize());
System.out.println("查看当前数据库所有 key:" + jedis.keys("*"));
System.out.println("清空当前数据库:" + jedis.flushDB());
System.out.println("清空所有数据库:" + jedis.flushAll());
System.out.println("新增一个key:" + jedis.set("k", "v"));
System.out.println("新增一个key:" + jedis.set("b", "s"));
System.out.println("新增一个key:" + jedis.set("s", "aa"));
System.out.println("查看当前key是否存在:" + jedis.exists("k"));
System.out.println("查看当前key是否存在:" + jedis.exists("a"));
System.out.println("查看当前数据库所有 key:" + jedis.keys("*"));
System.out.println("设置当前key过期时间:" + jedis.expire("s", 5));
try {
Thread.sleep(2000);
System.out.println("休眠 2S 后查看当前key剩余过期时间:" + jedis.ttl("s"));
} catch (Exception e) {
} finally {
Thread.sleep(2000);
System.out.println("再次休眠 2S 后查看当前key剩余过期时间:" + jedis.ttl("s"));
}
System.out.println("移除当前的key:" + jedis.move("b", 1));
System.out.println("查看当前数据库所有 key:" + jedis.keys("*"));
System.out.println("查看当前key的类型:" + jedis.type("k"));
System.out.println("清空当前数据库:" + jedis.flushDB());
jedis.disconnect();
jedis.close();
}
}
运行结果:
查看连接状态:PONG
切换数据库:OK
新增一个key:OK
查看数据大小:1
查看当前数据库所有 key:[aa]
清空当前数据库:OK
清空所有数据库:OK
新增一个key:OK
新增一个key:OK
新增一个key:OK
查看当前key是否存在:true
查看当前key是否存在:false
查看当前数据库所有 key:[b, s, k]
设置当前key过期时间:1
休眠 2S 后查看当前key剩余过期时间:3
再次休眠 2S 后查看当前key剩余过期时间:1
移除当前的key:1
查看当前数据库所有 key:[s, k]
查看当前key的类型:string
清空当前数据库:OK
Process finished with exit code 0
2. String (字符串)
代码示例:
package com.beyond;
import redis.clients.jedis.Jedis;
public class JedisStringTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(4);
jedis.flushDB();
System.out.println("添加一个key: " + jedis.set("k1", "aaaaa"));
System.out.println("同时新增多个值: " + jedis.mset("k2", "v2", "k3", "v3", "k4", "v4", "k5", "v5"));
System.out.println("获取当前key的value: " + jedis.get("k3"));
System.out.println("同时获取多个值: " + jedis.mget("k1", "k4"));
System.out.println("查看所有key: " + jedis.keys("*"));
System.out.println("追加字符串,若当前key不存在,相当于新增当前key(set操作)");
System.out.println("追加字符串: " + jedis.append("k1", "ssbbsb"));
System.out.println(" 查看当前key的value的长度: " + jedis.strlen("k1"));
System.out.println("追加字符串: " + jedis.append("k6", "ssasdadsda"));
System.out.println("同时获取多个值: " + jedis.mget("k1", "k6"));
jedis.flushDB();
System.out.println("-------------------------------------");
jedis.mset("k2", "v2aaa", "k1", "v1dasdad");
System.out.println(jedis.set("kk", "0"));
System.out.println("incr 自增操作相当于 i++");
System.out.println(jedis.incr("kk"));
System.out.println("decr 自减操作相当于 i--");
System.out.println(jedis.decr("kk"));
System.out.println("incrby 设置步长,相当于 i+=n");
System.out.println(jedis.incrBy("kk", 10));
System.out.println("decrby 设置步长,相当于 i-=n");
System.out.println(jedis.decrBy("kk", 5));
System.out.println("k1: " + jedis.get("k1") + " k2" + jedis.get("k2"));
System.out.println("截取字符串: " + jedis.getrange("k1", 0, 3));
System.out.println("如果结束端点为负值的话,为获取全部字符串: " + jedis.getrange("k1", 0, -1));
System.out.println("替换字符串: " + jedis.setrange("k2", 0, "dasd"));
System.out.println(" k2: " + jedis.get("k2"));
System.out.println("替换字符串: " + jedis.setrange("k2", 0, "dasdadsadsad"));
System.out.println(" k2: " + jedis.get("k2"));
System.out.println("当前key不存在时创建: " + jedis.setnx("k", "sadada"));
System.out.println("当前key不存在时创建: " + jedis.setnx("k2", "sadada"));
System.out.println("设置过期时间: " + jedis.setex("as", 5, "dasdasda"));
System.out.println("同时处理多个,当前key不存在时创建: " + jedis.msetnx("k3", "v3", "k4", "v4"));
System.out.println("同时处理多个,当前key不存在时创建: " + jedis.msetnx("k3", "v3", "k5", "v5"));
jedis.flushDB();
System.out.println("-------------------------------------");
System.out.println("getset 先get后set " +
"1.如果当前key不存在,先返回null,然后创建" +
"2.如果当前key存在,先返回当前value,然后重新设置当前key的值");
System.out.println(jedis.getSet("v1", "aaaaa"));
System.out.println(jedis.getSet("v1", "bbbbb"));
System.out.println(jedis.get("v1"));
jedis.flushDB();
}
}
运行结果:
添加一个key: OK
同时新增多个值: OK
获取当前key的value: v3
同时获取多个值: [aaaaa, v4]
查看所有key: [k3, k4, k5, k1, k2]
追加字符串,若当前key不存在,相当于新增当前key(set操作)
追加字符串: 11
查看当前key的value的长度: 11
追加字符串: 10
同时获取多个值: [aaaaassbbsb, ssasdadsda]
-------------------------------------
OK
incr 自增操作相当于 i++
1
decr 自减操作相当于 i--
0
incrby 设置步长,相当于 i+=n
10
decrby 设置步长,相当于 i-=n
5
k1: v1dasdad k2v2aaa
截取字符串: v1da
如果结束端点为负值的话,为获取全部字符串: v1dasdad
替换字符串: 5
k2: dasda
替换字符串: 12
k2: dasdadsadsad
当前key不存在时创建: 1
当前key不存在时创建: 0
设置过期时间: OK
同时处理多个,当前key不存在时创建: 1
同时处理多个,当前key不存在时创建: 0
-------------------------------------
getset 先get后set 1.如果当前key不存在,先返回null,然后创建2.如果当前key存在,先返回当前value,然后重新设置当前key的值
null
aaaaa
bbbbb
Process finished with exit code 0
3.List(列表)
代码示例:
package com.beyond;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.ListPosition;
public class JedisListTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(5);
jedis.flushDB();
System.out.println("将一个值或者多个值插入列表头(左边)部 k1 :" + jedis.lpush("k1", "v1", "v2", "v3"));
System.out.println("获取列表的值(可获取列表区间的值) k1 :" + jedis.lrange("k1", 0, -1));
System.out.println(" 将一个值或者多个值插入列表尾(右边)部 s1 :" + jedis.rpush("s1", "a1", "a2", "a3"));
System.out.println("获取列表的值(可获取列表区间的值) s1 :" + jedis.lrange("s1", 0, -1));
System.out.println("移除列表的元素,从左边开始 :" + jedis.lpop("s1"));
System.out.println("s1 :" + jedis.lrange("s1", 0, -1));
System.out.println("移除列表的元素,从右边开始 :" + jedis.rpop("k1"));
System.out.println("k1 :" + jedis.lrange("k1", 0, -1));
System.out.println("获取列表索引处元素 k1 0 :"+ jedis.lindex("k1", 0));
System.out.println("获取列表索引处元素 s1 1 :" + jedis.lindex("s1", 1));
System.out.println(" 获取列表的长度 k1 :" + jedis.llen("k1"));
System.out.println("移除指定个数的value,精确匹配,删除1个 :" + jedis.lrem("k1", 1, "v2"));
System.out.println("添加元素 k1 :" + jedis.lpush("k1", "v1", "v2", "v2", "v2", "v3"));
System.out.println("获取列表的值(可获取列表区间的值) k1 :" + jedis.lrange("k1", 0, -1));
System.out.println("移除指定个数的value,精确匹配,删除多个 :" + jedis.lrem("k1", 2, "v2"));
System.out.println("获取列表的值(可获取列表区间的值) k1 :" + jedis.lrange("k1", 0, -1));
System.out.println("截取元素区间的值 :" + jedis.ltrim("s1", 0, 1));
System.out.println("获取列表的值(可获取列表区间的值) s1 :" + jedis.lrange("s1", 0, -1));
jedis.flushDB();
System.out.println(jedis.lpush("li", "one", "two", "three"));
System.out.println( jedis.lrange("li", 0, -1));
System.out.println("移除列表的最后一个元素,将它移动到新的列表中 :" + jedis.rpoplpush("li", "ki"));
System.out.println( jedis.lrange("li", 0, -1));
System.out.println(jedis.lrange("ki", 0, -1));
jedis.flushDB();
System.out.println(jedis.lpush("list", "one", "two", "three"));
System.out.println( jedis.lrange("list", 0, -1));
System.out.println("将列表指定下标替换为另一个值 :" + jedis.lset("list", 1, "four"));
System.out.println( jedis.lrange("list", 0, -1));
System.out.println("将某一个具体的值插入到列表中某个元素的前面 :" + jedis.linsert("list", ListPosition.BEFORE, "three", "aaa"));
System.out.println(jedis.lrange("list", 0, -1));
System.out.println("将某一个具体的值插入到列表中某个元素的后面 :" + jedis.linsert("list", ListPosition.AFTER, "three", "ddd"));
System.out.println(jedis.lrange("list", 0, -1));
jedis.flushDB();
}
}
运行结果:
将一个值或者多个值插入列表头(左边)部 k1 :3
获取列表的值(可获取列表区间的值) k1 :[v3, v2, v1]
将一个值或者多个值插入列表尾(右边)部 s1 :3
获取列表的值(可获取列表区间的值) s1 :[a1, a2, a3]
移除列表的元素,从左边开始 :a1
s1 :[a2, a3]
移除列表的元素,从右边开始 :v1
k1 :[v3, v2]
获取列表索引处元素 k1 0 :v3
获取列表索引处元素 s1 1 :a3
获取列表的长度 k1 :2
移除指定个数的value,精确匹配,删除1个 :1
添加元素 k1 :6
获取列表的值(可获取列表区间的值) k1 :[v3, v2, v2, v2, v1, v3]
移除指定个数的value,精确匹配,删除多个 :2
获取列表的值(可获取列表区间的值) k1 :[v3, v2, v1, v3]
截取元素区间的值 :OK
获取列表的值(可获取列表区间的值) s1 :[a2, a3]
-------------------------------------
3
[three, two, one]
移除列表的最后一个元素,将它移动到新的列表中 :one
[three, two]
[one]
-------------------------------------
3
[three, two, one]
将列表指定下标替换为另一个值 :OK
[three, four, one]
将某一个具体的值插入到列表中某个元素的前面 :4
[aaa, three, four, one]
将某一个具体的值插入到列表中某个元素的后面 :5
[aaa, three, ddd, four, one]
Process finished with exit code 0
4.Set(集合)
代码示例:
package com.beyond;
import redis.clients.jedis.Jedis;
public class JedisSetTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(6);
jedis.flushDB();
System.out.println(" 给集合中添加元素 : "+jedis.sadd("set", "aaa", "bbb", "ccc"));
System.out.println(" 查看指定集合的所有值 set : "+jedis.smembers("set"));
System.out.println(" 判断某一个值是否在此集合中 : "+jedis.sismember("set", "aaa"));
System.out.println(" 判断某一个值是否在此集合中 : "+jedis.sismember("set", "ddd"));
System.out.println(" 查看集合中的元素个数 : "+jedis.scard("set"));
System.out.println(" 移除集合中指定元素 : "+jedis.srem("set", "bbb"));
System.out.println(" 随机抽选元素(个数可指定) : "+jedis.srandmember("set",2));
System.out.println(" 随机删除集合中的某些元素,可指定多个 : "+jedis.spop("set", 2));
System.out.println("-------------------------------------");
jedis.flushDB();
jedis.sadd("s1","a1","b1","c1");
jedis.sadd("s2","a2","b2","c2");
System.out.println(" s1 : "+jedis.smembers("s1")+" s2 : "+jedis.smembers("s2"));
System.out.println(" 将一个指定的值移动到另一个集合中 : "+jedis.smove("s1", "s2", "a1"));
System.out.println(" s1 : "+jedis.smembers("s1")+" s2 : "+jedis.smembers("s2"));
System.out.println("-------------------------------------");
jedis.flushDB();
jedis.sadd("k1","v1","v2","v3");
jedis.sadd("k2","v2","v3","v4");
System.out.println(" k1 : "+jedis.smembers("k1")+" k2 : "+jedis.smembers("k2"));
System.out.println(" 取两个集合的差集 : "+jedis.sdiff("k1", "k2"));
System.out.println(" 取两个集合的交集 : "+jedis.sinter("k1", "k2"));
System.out.println(" 取两个集合的并集 : "+jedis.sunion("k1", "k2"));
}
}
运行结果:
给集合中添加元素 : 3
查看指定集合的所有值 set : [ccc, bbb, aaa]
判断某一个值是否在此集合中 : true
判断某一个值是否在此集合中 : false
查看集合中的元素个数 : 3
移除集合中指定元素 : 1
随机抽选元素(个数可指定) : [ccc, aaa]
随机删除集合中的某些元素,可指定多个 : [ccc, aaa]
-------------------------------------
s1 : [c1, b1, a1] s2 : [c2, b2, a2]
将一个指定的值移动到另一个集合中 : 1
s1 : [c1, b1] s2 : [c2, b2, a1, a2]
-------------------------------------
k1 : [v3, v1, v2] k2 : [v4, v3, v2]
取两个集合的差集 : [v1]
取两个集合的交集 : [v3, v2]
取两个集合的并集 : [v3, v1, v2, v4]
Process finished with exit code 0
5.Hash (哈希)
代码示例:
package com.beyond;
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.Map;
public class JedisHashTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(7);
jedis.flushDB();
Map<String, String> map = new HashMap<String, String>();
map.put("k1", "v1");
map.put("k2", "v2");
map.put("k3", "v3");
System.out.println(" 新增一个或多个key-Map : "+jedis.hset("hash", map));
System.out.println(" 获取一个key-Map : "+jedis.hget("hash", "k1"));
System.out.println(" 获取多个key-Map : "+jedis.hmget("hash", "k1","k2"));
System.out.println(" 获取全部key-Map : "+jedis.hgetAll("hash"));
System.out.println(" 查看当前hash的元素个数 : "+jedis.hlen("hash"));
System.out.println(" 删除hash指定的key字段,对应的value也会被删除 : "+jedis.hdel("hash", "k2"));
System.out.println(jedis.hgetAll("hash"));
System.out.println(" 获取当前hash的所有value : "+jedis.hvals("hash"));
System.out.println(" 获取当前hash的所有key : "+jedis.hkeys("hash"));
System.out.println(" 判断当前hash中指定key是否存在 : "+jedis.hexists("hash", "k1"));
System.out.println(" 判断当前hash中指定key是否存在 : "+jedis.hexists("hash", "k2"));
System.out.println("---------------------------------");
jedis.flushDB();
Map<String,String> m = new HashMap<String, String>();
m.put("k","0");
jedis.hset("ha",m);
System.out.println(jedis.hgetAll("ha"));
System.out.println(" 设置增量 +5 : "+jedis.hincrBy("ha", "k", 5));
System.out.println(jedis.hgetAll("ha"));
System.out.println(" 设置增量 -2 : "+jedis.hincrBy("ha", "k", -2));
System.out.println(jedis.hgetAll("ha"));
System.out.println("---------------------------------");
jedis.flushDB();
jedis.hset("has", "k1", "v1");
jedis.hset("has", "k2", "v2");
System.out.println(jedis.hgetAll("has"));
System.out.println(" 判断当前hash中是否存在此key,不存在即创建,存在创建失败 : "+jedis.hsetnx("has", "k3", "v3"));
System.out.println(" 判断当前hash中是否存在此key,不存在即创建,存在创建失败 : "+jedis.hsetnx("has", "k3", "v3"));
}
}
运行结果:
新增一个或多个key-Map : 3
获取一个key-Map : v1
获取多个key-Map : [v1, v2]
获取全部key-Map : {k3=v3, k1=v1, k2=v2}
查看当前hash的元素个数 : 3
删除hash指定的key字段,对应的value也会被删除 : 1
{k3=v3, k1=v1}
获取当前hash的所有value : [v3, v1]
获取当前hash的所有key : [k3, k1]
判断当前hash中指定key是否存在 : true
判断当前hash中指定key是否存在 : false
---------------------------------
{k=0}
设置增量 +5 : 5
{k=5}
设置增量 -2 : 3
{k=3}
---------------------------------
{k1=v1, k2=v2}
判断当前hash中是否存在此key,不存在即创建,存在创建失败 : 1
判断当前hash中是否存在此key,不存在即创建,存在创建失败 : 0
Process finished with exit code 0
6.Zset (有序集合)
代码示例:
package com.beyond;
import redis.clients.jedis.Jedis;
public class JedisZSetTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128",6379);
jedis.select(8);
jedis.flushDB();
jedis.zadd("zset", 100, "aaa");
jedis.zadd("zset", 120, "bbb");
System.out.println(" 添加元素 : "+jedis.zadd("zset", 150, "ccc"));
System.out.println(" 查看元素,默认从小到大 : "+jedis.zrange("zset", 0, -1));
System.out.println(" 查看元素,从大到小排序 : "+jedis.zrevrange("zset", 0, -1));
System.out.println("Double.NEGATIVE_INFINITY == 负无穷 || Double.POSITIVE_INFINITY == 正无穷");
System.out.println(" 根据当前Zset的key显示元素 [Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY]: "+jedis.zrangeByScore("zset", Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY));
System.out.println(" 根据当前Zset的key显示元素 [Double.NEGATIVE_INFINITY, 120]: "+jedis.zrangeByScore("zset", Double.NEGATIVE_INFINITY, 120));
System.out.println("-------------------------------------------");
jedis.flushDB();
jedis.zadd("z",89,"sadasdad");
jedis.zadd("z",105,"qwqwqs");
jedis.zadd("z",100,"sdsad");
jedis.zadd("z",132,"cdcdc");
jedis.zadd("z",77,"erwrwerw");
System.out.println(jedis.zrange("z", 0, -1));
System.out.println(" 删除当前Zset的指定的值 : "+jedis.zrem("z", "qwqwqs"));
System.out.println(jedis.zrange("z", 0, -1));
System.out.println(" 当前Zset中元素的个数 : "+jedis.zcard("z"));
System.out.println(" 获取当前Zset的key在某个区间内的个数 : "+jedis.zcount("z", 50, 100));
jedis.flushDB();
}
}
运行结果:
添加元素 : 1
查看元素,默认从小到大 : [aaa, bbb, ccc]
查看元素,从大到小排序 : [ccc, bbb, aaa]
Double.NEGATIVE_INFINITY == 负无穷 || Double.POSITIVE_INFINITY == 正无穷
根据当前Zset的key显示元素 [Double.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY]: [aaa, bbb, ccc]
根据当前Zset的key显示元素 [Double.NEGATIVE_INFINITY, 120]: [aaa, bbb]
-------------------------------------------
[erwrwerw, sadasdad, sdsad, qwqwqs, cdcdc]
删除当前Zset的指定的值 : 1
[erwrwerw, sadasdad, sdsad, cdcdc]
当前Zset中元素的个数 : 4
获取当前Zset的key在某个区间内的个数 : 3
Process finished with exit code 0
7.geospatial
代码示例:
package com.beyond;
import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.GeoUnit;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.params.GeoRadiusParam;
import java.util.HashMap;
import java.util.Map;
public class JedisGeospatialTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(9);
jedis.flushDB();
System.out.println(" 添加单个地理位置的坐标 : "+jedis.geoadd("city", 108.93425, 34.23053, "xian"));
Map<String, GeoCoordinate> map = new HashMap<String, GeoCoordinate>();
map.put("shangluo", new GeoCoordinate(109.94107, 33.86273));
map.put("ankang", new GeoCoordinate(109.02697, 32.6955));
map.put("hanzhong", new GeoCoordinate(107.03194, 33.06784));
map.put("tongchuan", new GeoCoordinate(109.07593, 35.06914));
System.out.println(" 添加多个地理位置的坐标 : "+jedis.geoadd("city", map));
System.out.println(" 获取单个地理位置的坐标 : "+jedis.geopos("city","shangluo"));
System.out.println(" 获取多个地理位置的坐标 : "+jedis.geopos("city","xian", "hanzhong"));
System.out.println(" 计算两个位置之间的距离 : "+jedis.geodist("city", "xian", "hanzhong"));
System.out.println(" 计算两个位置之间的距离 : "+jedis.geodist("city", "ankang", "tongchuan"));
System.out.println("-----------------------------------------------");
System.out.println(" 以108.01 33.01为坐标 查询直线距离300km的城市 : "+jedis.georadius("city", 108.01, 33.01, 300, GeoUnit.KM));
System.out.println(" 以108.01 33.01为坐标 查询直线距离150km的城市 : "+jedis.georadius("city", 108.01, 33.01, 150, GeoUnit.KM));
System.out.println(" 查询直线距离300km的城市,返回结果添加经度纬度和直线距离 : "+jedis.georadius("city", 108.01, 33.01, 300, GeoUnit.KM,
GeoRadiusParam.geoRadiusParam().withDist().withCoord()));
System.out.println(" 查询直线距离300km的城市,返回结果添加经度纬度和直线距离,结果只匹配二个元素 : "+jedis.georadius("city", 108.01, 33.01, 300, GeoUnit.KM,
GeoRadiusParam.geoRadiusParam().withDist().withCoord().count(2)));
System.out.println(" 找出距离指定元素的指定距离内的其他元素 : "+jedis.georadiusByMember("city", "xian", 200, GeoUnit.KM));
System.out.println(" 找出距离指定元素的指定距离内的其他元素 : "+jedis.georadiusByMember("city", "hanzhong", 200, GeoUnit.KM));
System.out.println(" geohash 返回一个或多个位置元素的 [Geohash] 表示 : "+jedis.geohash("city", "xian", "hanzhong"));
System.out.println("-----------------------------------------------");
System.out.println(" 获取全部元素 : "+jedis.zrange("city", 0, -1));
System.out.println(" 删除指定元素 : "+jedis.zrem("city", "tongchuan"));
System.out.println(" 获取全部元素 : "+jedis.zrange("city", 0, -1));
jedis.flushDB();
}
}
运行结果:
添加单个地理位置的坐标 : 1
添加多个地理位置的坐标 : 4
获取单个地理位置的坐标 : [(109.9410679936409,33.862730262164945)]
获取多个地理位置的坐标 : [(108.9342525601387,34.230530975990824), (107.03193873167038,33.067839171875086)]
计算两个位置之间的距离 : 218504.7803
计算两个位置之间的距离 : 264050.1287
-----------------------------------------------
以108.01 33.01为坐标 查询直线距离300km的城市 : [redis.clients.jedis.GeoRadiusResponse@306a30c7, redis.clients.jedis.GeoRadiusResponse@b81eda8, redis.clients.jedis.GeoRadiusResponse@68de145, redis.clients.jedis.GeoRadiusResponse@27fa135a, redis.clients.jedis.GeoRadiusResponse@46f7f36a]
以108.01 33.01为坐标 查询直线距离150km的城市 : [redis.clients.jedis.GeoRadiusResponse@421faab1, redis.clients.jedis.GeoRadiusResponse@2b71fc7e]
查询直线距离300km的城市,返回结果添加经度纬度和直线距离 : [redis.clients.jedis.GeoRadiusResponse@1a86f2f1, redis.clients.jedis.GeoRadiusResponse@3eb07fd3, redis.clients.jedis.GeoRadiusResponse@506c589e, redis.clients.jedis.GeoRadiusResponse@69d0a921, redis.clients.jedis.GeoRadiusResponse@446cdf90]
查询直线距离300km的城市,返回结果添加经度纬度和直线距离,结果只匹配二个元素 : [redis.clients.jedis.GeoRadiusResponse@799f7e29, redis.clients.jedis.GeoRadiusResponse@4b85612c]
找出距离指定元素的指定距离内的其他元素 : [redis.clients.jedis.GeoRadiusResponse@277050dc, redis.clients.jedis.GeoRadiusResponse@5c29bfd, redis.clients.jedis.GeoRadiusResponse@7aec35a, redis.clients.jedis.GeoRadiusResponse@67424e82]
找出距离指定元素的指定距离内的其他元素 : [redis.clients.jedis.GeoRadiusResponse@42110406, redis.clients.jedis.GeoRadiusResponse@531d72ca]
geohash 返回一个或多个位置元素的 [Geohash] 表示 : [wqj6wz7x210, wmuh5ef60u0]
-----------------------------------------------
获取全部元素 : [hanzhong, ankang, xian, shangluo, tongchuan]
删除指定元素 : 1
获取全部元素 : [hanzhong, ankang, xian, shangluo]
Process finished with exit code 0
8.hyperloglog
代码示例:
package com.beyond;
import redis.clients.jedis.Jedis;
/**
*redis-hyperloglog 基数统计的算法 (0.81%错误率),Redis 在 2.8.9 版本添加了 HyperLogLog 结构;
* 优点:占用的内存是固定的,2^64 不同元素的基数,只占用12kb内存;
*/
public class JedisHyperloglogTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(10);
jedis.flushDB();
System.out.println(" 创建第一组元素 : "+jedis.pfadd("hylog", "a", "b", "c", "d"));
System.out.println(" 统计第一组元素数量 : "+jedis.pfcount("hylog"));
System.out.println(" 创建第二组元素 : "+jedis.pfadd("hylogTwo", "c", "d", "e", "f"));
System.out.println(" 统计第二组元素数量 : "+jedis.pfcount("hylogTwo"));
System.out.println(" 合并第一组和第二组数据 : "+jedis.pfmerge("key", "hylog", "hylogTwo"));
System.out.println(" 合并后key3的元素数量 : "+jedis.pfcount("key"));
}
}
运行结果:
创建第一组元素 : 1
统计第一组元素数量 : 4
创建第二组元素 : 1
统计第二组元素数量 : 4
合并第一组和第二组数据 : OK
合并后key3的元素数量 : 6
Process finished with exit code 0
9.bitmap
代码示例:
package com.beyond;
import redis.clients.jedis.Jedis;
/**
* bitmaps 位图,数据结构;都是操作二进制来进行记录,只有0和1两个状态;
*/
public class JedisBitmapTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(11);
jedis.flushDB();
System.out.println("举例: user为用户 1,2,3,4,5,6,7 代表周一到周末 false-未打卡 true-打卡");
System.out.println(" 周一 : "+jedis.setbit("user", 1, true));
System.out.println(" 周二 : "+jedis.setbit("user", 2, true));
System.out.println(" 周三 : "+jedis.setbit("user", 3, true));
System.out.println(" 周四 : "+jedis.setbit("user", 4, true));
System.out.println(" 周五 : "+jedis.setbit("user", 5, true));
System.out.println(" 周六 : "+jedis.setbit("user", 6, false));
System.out.println(" 周日 : "+jedis.setbit("user", 7, false));
System.out.println("查看某一天是否有打卡");
System.out.println(" 查看周三 : "+jedis.getbit("user", 3));
System.out.println(" 查看周六 : "+jedis.getbit("user", 6));
System.out.println("统计打卡的天数");
System.out.println(+jedis.bitcount("user"));
jedis.flushDB();
}
}
运行结果:
举例: user为用户 1,2,3,4,5,6,7 代表周一到周末 false-未打卡 true-打卡
周一 : false
周二 : false
周三 : false
周四 : false
周五 : false
周六 : false
周日 : false
查看某一天是否有打卡
查看周三 : true
查看周六 : false
统计打卡的天数
5
Process finished with exit code 0
10.事务
reids事务是一个单独的隔离操作、没有隔离级别的概念、不保证原子性;对于事务的更多讲解可以去看上一篇博客 Redis 事务 详解 ,便于更好的理解 jedis 事务;
代码示例:
// 正常演示
public class JedisMultiTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(12);
jedis.flushDB();
Transaction multi = jedis.multi(); //开启事务
try {
multi.set("key", "value");
multi.mset("k1", "v1","k2","v2");
multi.exec();// 执行事务
}catch (Exception e){
multi.discard(); //放弃事务
e.printStackTrace();
}finally {
System.out.println(jedis.mget("k1", "k2"));
jedis.close();
}
jedis.flushDB();
}
}
//运行结果:
[v1, v2]
Process finished with exit code 0
-----------------------------------------------------------------------------------------
// 异常示例
public class JedisMultiTest {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.204.128", 6379);
jedis.select(12);
jedis.flushDB();
Transaction multi = jedis.multi(); //开启事务
try {
multi.set("key", "value");
multi.mset("k1", "v1","k2","v2");
String a = null; a.equals("aaa"); // 代码抛出异常,事务执行失败!
multi.exec();// 执行事务
}catch (Exception e){
multi.discard(); //放弃事务
e.printStackTrace();
}finally {
System.out.println(jedis.mget("k1", "k2"));
jedis.close();
}
jedis.flushDB();
}
}
//运行结果:
java.lang.NullPointerException
at com.beyond.JedisMultiTest.main(JedisMultiTest.java:19)
[null, null]
Process finished with exit code 0