当前位置:网站首页>Redis——基本使用(key、String、List、Set 、Zset 、Hash、Geo、Bitmap、Hyperloglog、事务 )
Redis——基本使用(key、String、List、Set 、Zset 、Hash、Geo、Bitmap、Hyperloglog、事务 )
2022-07-07 17:30:00 【m0_63544124】
Redis中文网https://www.redis.net.cn/
1. 概述
1.1 什么是NoSQL
1.2 NoSQL四大分类
1.3 3V+3高
1.4 Redis概述
Remote Dictionary Server ——即远程字典服务
2.安装及启动(Linux)
2.1 下载
1.下载
下载redis-6.0.6.tar.gz到/usr/local/src目录
2.解压
tar -zxvf redis-6.0.6.tar.gz
3.进入目录
cd /usr/local/src/redis-6.0.6
4、基本的环境安装
yum install -y gcc tcl
make
make install
2.2.修改配置文件
myconfig->redis.conf
2.3启动
1.进入安装目录
cd /usr/local/bin
2.指定配置文件开启
redis-server myconfig/redis.conf
3.常见命令
redis命令手册https://www.redis.net.cn/order/
3.1 服务器命令
命令 | 描述 |
---|---|
Redis Flushdb 命令 | 删除当前数据库的所有key |
Redis Flushall 命令 | 删除所有数据库的所有key |
Redis Dbsize 命令 | 返回当前数据库的 key 的数量 |
Redis Shutdown 命令 | 异步保存数据到硬盘,并关闭服务器 |
Redis Client Kill 命令 | 关闭客户端连接 |
3.2 连接命令
命令 | 描述 |
---|---|
Redis Echo 命令 | 打印字符串 |
Redis Select 命令 | 切换到指定的数据库 |
Redis Ping 命令 | 查看服务是否运行 |
Redis Quit 命令 | 关闭当前连接 |
Redis Auth 命令 | 验证密码是否正确 |
3.3 key命令
命令 | 描述 |
---|---|
Redis Type 命令 | 返回 key 所储存的值的类型。 |
Redis PEXPIREAT 命令 | 设置 key 的过期时间亿以毫秒计。 |
Redis PEXPIREAT 命令 | 设置 key 过期时间的时间戳(unix timestamp) 以毫秒计 |
Redis Rename 命令 | 修改 key 的名称 |
Redis PERSIST 命令 | 移除 key 的过期时间,key 将持久保持。 |
Redis Move 命令 | 将当前数据库的 key 移动到给定的数据库 db 当中。 |
Redis DEL 命令 | 该命令用于在 key 存在是删除 key。 |
Redis Renamenx 命令 | 仅当 newkey 不存在时,将 key 改名为 newkey 。 |
Redis EXISTS 命令 | 检查给定 key 是否存在。 |
Redis Keys 命令 | 查找所有符合给定模式( pattern)的 key 。 |
3.4 常见数据类型
3.4.1 String
命令 | 描述 |
---|---|
Redis Setnx 命令 | 只有在 key 不存在时设置 key 的值。 |
Redis Getrange 命令 | 返回 key 中字符串值的子字符 |
Redis Mset 命令 | 同时设置一个或多个 key-value 对。 |
Redis Setex 命令 | 将值 value 关联到 key ,并将 key 的过期时间设为 seconds (以秒为单位)。 |
Redis SET 命令 | 设置指定 key 的值 |
Redis Get 命令 | 获取指定 key 的值。 |
Redis Decr 命令 | 将 key 中储存的数字值减一。 |
Redis Decrby 命令 | key 所储存的值减去给定的减量值(decrement) 。 |
Redis Strlen 命令 | 返回 key 所储存的字符串值的长度。 |
Redis Msetnx 命令 | 同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。 |
Redis Incrby 命令 | 将 key 所储存的值加上给定的增量值(increment) 。 |
Redis Incrbyfloat 命令 | 将 key 所储存的值加上给定的浮点增量值(increment) 。 |
Redis Setrange 命令 | 用 value 参数覆写给定 key 所储存的字符串值,从偏移量 offset 开始。 |
Redis Psetex 命令 | 这个命令和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。 |
Redis Append 命令 | 如果 key 已经存在并且是一个字符串, APPEND 命令将 value 追加到 key 原来的值的末尾。 |
Redis Getset 命令 | 将给定 key 的值设为 value ,并返回 key 的旧值(old value)。 |
Redis Mget 命令 | 获取所有(一个或多个)给定 key 的值。 |
Redis Incr 命令 | 将 key 中储存的数字值增一。 |
3.4.2 Hash
命令 | 描述 |
---|---|
Redis Hmset 命令 | 同时将多个 field-value (域-值)对设置到哈希表 key 中。 |
Redis Hmget 命令 | 获取所有给定字段的值 |
Redis Hset 命令 | 将哈希表 key 中的字段 field 的值设为 value 。 |
Redis Hgetall 命令 | 获取在哈希表中指定 key 的所有字段和值 |
Redis Hget 命令 | 获取存储在哈希表中指定字段的值/td> |
Redis Hexists 命令 | 查看哈希表 key 中,指定的字段是否存在。 |
Redis Hincrby 命令 | 为哈希表 key 中的指定字段的整数值加上增量 increment 。 |
Redis Hlen 命令 | 获取哈希表中字段的数量 |
Redis Hdel 命令 | 删除一个或多个哈希表字段 |
Redis Hvals 命令 | 获取哈希表中所有值 |
Redis Hincrbyfloat 命令 | 为哈希表 key 中的指定字段的浮点数值加上增量 increment 。 |
Redis Hkeys 命令 | 获取所有哈希表中的字段 |
Redis Hsetnx 命令 | 只有在字段 field 不存在时,设置哈希表字段的值。 |
3.4.3 List
命令 | 描述 |
---|---|
Redis Lindex 命令 | 通过索引获取列表中的元素 |
Redis Rpush 命令 | 在列表中添加一个或多个值 |
Redis Lrange 命令 | 获取列表指定范围内的元素 |
Redis Rpoplpush 命令 | 移除列表的最后一个元素,并将该元素添加到另一个列表并返回 |
Redis Blpop 命令 | 移出并获取列表的第一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
Redis Brpop 命令 | 移出并获取列表的最后一个元素, 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
Redis Brpoplpush 命令 | 从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它; 如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。 |
Redis Lrem 命令 | 移除列表元素 |
Redis Llen 命令 | 获取列表长度 |
Redis Ltrim 命令 | 对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。 |
Redis Lpop 命令 | 移出并获取列表的第一个元素 |
Redis Lpushx 命令 | 将一个或多个值插入到已存在的列表头部 |
Redis Linsert 命令 | 在列表的元素前或者后插入元素 |
Redis Rpop 命令 | 移除并获取列表最后一个元素 |
Redis Lset 命令 | 通过索引设置列表元素的值 |
Redis Lpush 命令 | 将一个或多个值插入到列表头部 |
Redis Rpushx 命令 | 为已存在的列表添加值 |
3.4.4 Set
命令 | 描述 |
---|---|
Redis Sunion 命令 | 返回所有给定集合的并集 |
Redis Scard 命令 | 获取集合的成员数 |
Redis Srandmember 命令 | 返回集合中一个或多个随机数 |
Redis Smembers 命令 | 返回集合中的所有成员 |
Redis Sinter 命令 | 返回给定所有集合的交集 |
Redis Srem 命令 | 移除集合中一个或多个成员 |
Redis Smove 命令 | 将 member 元素从 source 集合移动到 destination 集合 |
Redis Sadd 命令 | 向集合添加一个或多个成员 |
Redis Sismember 命令 | 判断 member 元素是否是集合 key 的成员 |
Redis Sdiffstore 命令 | 返回给定所有集合的差集并存储在 destination 中 |
Redis Sdiff 命令 | 返回给定所有集合的差集 |
Redis Sscan 命令 | 迭代集合中的元素 |
Redis Sinterstore 命令 | 返回给定所有集合的交集并存储在 destination 中 |
Redis Sunionstore 命令 | 所有给定集合的并集存储在 destination 集合中 |
Redis Spop 命令 | 移除并返回集合中的一个随机元素 |
3.4.5 zset (有序集合)
命令 | 描述 |
---|---|
Redis Zrevrank 命令 | 返回有序集合中指定成员的排名,有序集成员按分数值递减(从大到小)排序 |
Redis Zlexcount 命令 | 在有序集合中计算指定字典区间内成员数量 |
Redis Zunionstore 命令 | 计算给定的一个或多个有序集的并集,并存储在新的 key 中 |
Redis Zremrangebyrank 命令 | 移除有序集合中给定的排名区间的所有成员 |
Redis Zcard 命令 | 获取有序集合的成员数 |
Redis Zrem 命令 | 移除有序集合中的一个或多个成员 |
Redis Zinterstore 命令 | 计算给定的一个或多个有序集的交集并将结果集存储在新的有序集合 key 中 |
Redis Zrank 命令 | 返回有序集合中指定成员的索引 |
Redis Zincrby 命令 | 有序集合中对指定成员的分数加上增量 increment |
Redis Zrangebyscore 命令 | 通过分数返回有序集合指定区间内的成员 |
Redis Zrangebylex 命令 | 通过字典区间返回有序集合的成员 |
Redis Zscore 命令 | 返回有序集中,成员的分数值 |
Redis Zremrangebyscore 命令 | 移除有序集合中给定的分数区间的所有成员 |
Redis Zscan 命令 | 迭代有序集合中的元素(包括元素成员和元素分值) |
Redis Zrevrangebyscore 命令 | 返回有序集中指定分数区间内的成员,分数从高到低排序 |
Redis Zremrangebylex 命令 | 移除有序集合中给定的字典区间的所有成员 |
Redis Zrevrange 命令 | 返回有序集中指定区间内的成员,通过索引,分数从高到底 |
Redis Zrange 命令 | 通过索引区间返回有序集合成指定区间内的成员 |
Redis Zcount 命令 | 计算在有序集合中指定区间分数的成员数 |
Redis Zadd 命令 | 向有序集合添加一个或多个成员,或者更新已存在成员的分数 |
3.5 特殊数据类型
3.5.1 HyperLogLog
命令 | 描述 |
---|---|
Redis Pgmerge 命令 | 将多个 HyperLogLog 合并为一个 HyperLogLog |
Redis Pfadd 命令 | 添加指定元素到 HyperLogLog 中。 |
Redis Pfcount 命令 | 返回给定 HyperLogLog 的基数估算值。 |
3.5.2 geo
命令 | 描述 |
---|---|
Redis GEOHASH 命令 | 返回一个或多个位置元素的 Geohash 表示 |
Redis GEOPOS 命令 | 从key里返回所有给定位置元素的位置(经度和纬度) |
Redis GEODIST 命令 | 返回两个给定位置之间的距离 |
Redis GEORADIUS 命令 | 以给定的经纬度为中心, 找出某一半径内的元素 |
Redis GEOADD 命令 | 将指定的地理空间位置(纬度、经度、名称)添加到指定的key中 |
Redis GEORADIUSBYMEMBER 命令 | 找出位于指定范围内的元素,中心点是由给定的位置元素决定 |
3.5.3 bitmap
getbit 命令 | 对 key 所储存的字符串值,获取指定偏移量上的位(bit)。 |
getbit 命令 | 对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。bitcount |
bitcount | 统计1的数量 |
bitcount | 统计1的数量 |
bitcount | 统计1的数量 |
4.事务
4.1 multi&exec
4.2 watch当做redis的乐观锁操作
5.Jedis
5.1 连接redis
1.引依赖
<dependencies>
<!-- https://mvnrepository.com/artifact/redis.clients/jedis -->
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>4.2.3</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-api -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.36</version>
</dependency>
<!-- https://mvnrepository.com/artifact/org.slf4j/slf4j-simple -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.25</version>
<scope>compile</scope>
</dependency>
</dependencies>
2. 连接远程redis
public class TestPing {
public static void main(String[] args) {
String host = "192.168.59.128";
int port = 6379;
Jedis jedis = new Jedis(host, port);
System.out.println(jedis.ping());
}
}
5.2 常见API
5.2.1 key
import redis.clients.jedis.Jedis;
import java.util.Set;
public class TestKey {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
jedis.set("username", "zhangsan");
jedis.set("age", "30");
jedis.set("address", "beijing");
System.out.println("===================================================");
Set<String> keys = jedis.keys("*");//获取所有的键
System.out.println(keys);//[age, username, address]
boolean exists = jedis.exists("username");//判断键是否存在
System.out.println(exists);//true
String type = jedis.type("username");//键的数据类型
System.out.println(type);//string
String key = jedis.randomKey();//随机返回一个键
System.out.println(key);//username
jedis.rename("username", "name");//更换键名
System.out.println(jedis.get("name"));//zhangsan
long size = jedis.dbSize();//key的数目
System.out.println(size);//3
jedis.set("hello","world");
System.out.println(jedis.get("hello"));
jedis.pexpireAt("hello", 60);//设置失效时间???????
System.out.println(jedis.get("hello"));
}
}
5.2.2 String
import redis.clients.jedis.Jedis;
public class TestString {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
System.out.println("===================================================");
jedis.set("username", "zhangsan");
jedis.mset("password", "123", "age", "30", "hobby", "swim");//批量设置键值对
System.out.println(jedis.get("username"));//zhangsan
System.out.println(jedis.mget("username", "age", "password"));//批量获取值 [zhangsan, 30, 123]
jedis.setnx("username", "lisi");//新增键值对防止覆盖原先值
System.out.println(jedis.get("username"));//zhangsan123
jedis.setnx("address", "beijing");
System.out.println(jedis.get("address"));//beijing
jedis.setex("color", 60, "red");//新增键值对并设置有效时间
jedis.del("hobby");//根据键删除
System.out.println(jedis.get("hobby"));//null
jedis.append("username", "123");//字符串拼接
System.out.println(jedis.get("username"));//zhangsan123
String age = jedis.getSet("age", "20");//将给定key的值设为value,并返回key的旧值(old value)。
System.out.println(age);//30
System.out.println(jedis.get("age"));//20
jedis.set("num", "0");
jedis.incr("num");//将key中储存的数字值增1。
System.out.println(jedis.get("num"));//1
jedis.incrBy("num", 3);//将key中储存的数字值加3。
System.out.println(jedis.get("num"));//4
jedis.decr("num");//将key中储存的数字值减1。
System.out.println(jedis.get("num"));//3
jedis.decrBy("num", 2);//将key中储存的数字值减2。
System.out.println(jedis.get("num"));//1
String getrange = jedis.getrange("username", 2, 4);//截取字符串
System.out.println(getrange);//zhangsan123 -> ang
long setrange = jedis.setrange("username", 5, "si");//字符串指定位置替换
System.out.println(setrange);//11
System.out.println(jedis.get("username"));//zhangsan123 -> zhangsin123
jedis.close();
}
}
5.2.3 List
import redis.clients.jedis.Jedis;
public class TestList {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
System.out.println("===================================================");
jedis.lpush("color", "red");//从左边入栈
jedis.lpush("color", "blue");
jedis.lpush("color", "yellow");
jedis.lpush("color", "green");
jedis.lpush("color", "green");
System.out.println(jedis.lrange("color", 0, -1));//[green, green, yellow, blue, red]
System.out.println(jedis.lrange("color", 0, 2));//[green, green, yellow]
jedis.rpush("color", "red");//从右边入栈
jedis.rpush("color", "blue");
jedis.rpush("color", "yellow");
jedis.rpush("color", "green");
jedis.rpush("color", "green");
System.out.println(jedis.lrange("color", 0, -1));
//[green, green, yellow, blue, red, red, blue, yellow, green, green]
jedis.lrem("color", 3, "green");//移除指定个数的元素
System.out.println(jedis.lrange("color", 0, -1));//[yellow, blue, red, red, blue, yellow, green]
jedis.lrem("color", 2, "red");//移除指定个数的元素
System.out.println(jedis.lrange("color", 0, -1));//[yellow, blue, blue, yellow, green]
String color = jedis.lindex("color", 3);//获取指定下标的元素
System.out.println(color);//yellow
jedis.ltrim("color",1,3);//截取下标为1到3的元素
System.out.println(jedis.lrange("color", 0, -1));//[blue, blue, yellow]
jedis.lpop("color");//从左边出栈
System.out.println(jedis.lrange("color", 0, -1));//[blue, yellow]
jedis.rpop("color");//从右边出栈
System.out.println(jedis.lrange("color", 0, -1));//[blue]
jedis.close();
}
}
5.2.4 Set
import redis.clients.jedis.Jedis;
import java.util.Set;
public class TestSet {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
System.out.println("===================================================");
jedis.sadd("color", "red");//向集合中添加元素(不重复)
jedis.sadd("color", "blue");
jedis.sadd("color", "yellow");
jedis.sadd("color", "green");
jedis.sadd("color", "green");
System.out.println(jedis.smembers("color"));//[yellow, red, blue, green]
jedis.srem("color","green");//删除指定元素
System.out.println(jedis.smembers("color"));//[blue, red, yellow]
boolean sismember = jedis.sismember("color", "green");//判断集合中是否包含某个元素
boolean sismember1 = jedis.sismember("color", "blue");
System.out.println(sismember);//false
System.out.println(sismember1);//true
long color = jedis.scard("color");//集合中的元素个数
System.out.println(color);//3
System.out.println(jedis.smembers("color"));//[red, blue, yellow]
System.out.println(jedis.smembers("color2"));//[]
jedis.smove("color","color2","red");//将某个元素移动到指定集合中
System.out.println(jedis.smembers("color"));//[blue, yellow]
System.out.println(jedis.smembers("color2"));//[red]
jedis.spop("color");//随机移除元素
System.out.println(jedis.smembers("color"));//[blue]
jedis.flushDB();
jedis.sadd("color1","red","blue","yellow");
jedis.sadd("color2","red","green");
Set<String> sinter = jedis.sinter("color1", "color2");//交集
System.out.println(sinter);//[red]
Set<String> sunion = jedis.sunion("color1", "color2");//并集
System.out.println(sunion);//[red, yellow, blue, green]
Set<String> sdiff1 = jedis.sdiff("color1", "color2");//差集
Set<String> sdiff2 = jedis.sdiff("color2", "color1");//差集
System.out.println(sdiff1);//[yellow, blue]
System.out.println(sdiff2);//[green]
jedis.close();
}
}
5.2.5 Zset
import redis.clients.jedis.Jedis;
import redis.clients.jedis.resps.Tuple;
import java.util.List;
public class TestZset {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
System.out.println("===================================================");
jedis.zadd("salary",3000,"zhangsan");//添加元素:权重+内容
jedis.zadd("salary",2500,"lisi");
jedis.zadd("salary",1500,"wangwu");
List<String> zrangeByScore1 = jedis.zrangeByScore("salary", "-inf", "+inf");//所有元素从小到大排列
System.out.println(zrangeByScore1);//[wangwu, lisi, zhangsan]
List<String> zrevrangeByScore1 = jedis.zrevrangeByScore("salary", "+inf", "-inf");//所有元素从小到大排列
System.out.println(zrevrangeByScore1);//[zhangsan, lisi, wangwu]
//所有元素从小到大排列并附带成绩
List<Tuple> salary1 = jedis.zrangeByScoreWithScores("salary", "-inf", "+inf");
System.out.println(salary1);//[[wangwu,1500.0], [lisi,2500.0], [zhangsan,3000.0]]
//所有元素从大到小排列并附带成绩
List<Tuple> salary2 = jedis.zrevrangeByScoreWithScores("salary", "+inf", "-inf");
System.out.println(salary2);//[[zhangsan,3000.0], [lisi,2500.0], [wangwu,1500.0]]
List<String> zrangeByScore2 = jedis.zrangeByScore("salary", "2000", "4000");//指定区间元素从小到大排列
System.out.println(zrangeByScore2);//[lisi, zhangsan]
List<String> zrevrangeByScore2 = jedis.zrevrangeByScore("salary", 4000, 2000);//指定区间元素从大到小排列
System.out.println(zrevrangeByScore2);//[zhangsan, lisi]
List<String> zrevrang = jedis.zrevrange("salary", 0, -1);//所有元素从大到小排列
System.out.println(zrevrang);//[zhangsan, lisi, wangwu]
long zcard = jedis.zcard("salary");//获取所有元素个数
System.out.println(zcard);//3
long zcount = jedis.zcount("salary", 1000, 2000);//获取指定区间的元素个数
System.out.println(zcount);//1
jedis.zrem("salary", "lisi");//移除指定元素
System.out.println(jedis.zrangeByScoreWithScores("salary", "-inf", "+inf"));//[[wangwu,1500.0], [zhangsan,3000.0]]
jedis.close();
}
}
5.2.6 Hash
import redis.clients.jedis.Jedis;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
public class TestHash {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
System.out.println("===================================================");
Map<String, String> map = new HashMap<String, String>();
map.put("key2","value2");
map.put("key3","value3");
map.put("key4","value4");
jedis.hset("hash","key1","key1");//添加单个元素
jedis.hmset("hash",map);//添加多个元素
String hget = jedis.hget("hash", "key3");//获取单个值
System.out.println(hget);//value3
List<String> hmget = jedis.hmget("hash", "key2", "key3");//获取多个值
System.out.println(hmget);//[value2, value3]
Set<String> hkeys = jedis.hkeys("hash");//获取所有的键
System.out.println(hkeys);//[key1, key2, key3, key4]
List<String> hvals = jedis.hvals("hash");//获取所有的值
System.out.println(hvals);//[key1, value2, value3, value4]
Map<String, String> hgetAll = jedis.hgetAll("hash");//获取所有的键值对
System.out.println(hgetAll);//{key1=key1, key2=value2, key3=value3, key4=value4}
long hlen = jedis.hlen("hash");//键值对的个数
System.out.println(hlen);//4
boolean hexists = jedis.hexists("hash", "key2");//判断键是否存在
System.out.println(hexists);//true
jedis.hincrBy("hash","key5",5);//指定增量,没有就添加
System.out.println(jedis.hgetAll("hash"));//{key1=key1, key2=value2, key5=5, key3=value3, key4=value4}
jedis.hincrBy("hash","key5",3);
System.out.println(jedis.hgetAll("hash"));//{key1=key1, key2=value2, key5=8, key3=value3, key4=value4}
jedis.close();
}
}
5.2.7 geo
import redis.clients.jedis.GeoCoordinate;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.args.GeoUnit;
import redis.clients.jedis.params.GeoRadiusParam;
import redis.clients.jedis.resps.GeoRadiusResponse;
import java.util.List;
public class TestGeo {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
System.out.println("===================================================");
/**
* geoadd 添加地理位置
规则:两级无法直接添加,我们一般会下载城市数据,直接通过java程序一次性导入!
有效的经度从-180度到180度。
效的纬度从-85.05112878度到85.05112878度。
当坐标位置超出上述指定范围时,该命令将会返回一个错误。
*/
jedis.geoadd("city", 116.40, 39.90, "beijing");
jedis.geoadd("city", 121.47, 31.23, "shanghai");
jedis.geoadd("city", 106.50, 29.53, "chongqing");
jedis.geoadd("city", 114.05, 22.52, "shenzhen");
jedis.geoadd("city", 120.16, 30.24, "hangzhou");
jedis.geoadd("city", 108.96, 34.26, "xian");
/**
* geopos 获得当前定位(一个或多个):一定是一个坐标值!
*/
List<GeoCoordinate> chongqing = jedis.geopos("city", "chongqing");
System.out.println(chongqing);//[(106.49999767541885,29.529999579006592)]
List<GeoCoordinate> beijingAndXian = jedis.geopos("city", "beijing", "xian");
System.out.println(beijingAndXian);//[(116.39999896287918,39.900000091670925), (108.96000176668167,34.2599996441893)]
/**
* geodist 两地之间的距离
单位:
m 表示单位为米。 默认
km 表示单位为千米。
mi 表示单位为英里。
ft 表示单位为英尺。
*/
Double geodist = jedis.geodist("city", "beijing", "shanghai");
System.out.println(geodist + "m");//1067378.7564m
Double geodist2 = jedis.geodist("city", "beijing", "shanghai", GeoUnit.KM);
System.out.println(geodist2 + "km");//1067.3788km
/**
* 获取位置的哈希值
*/
List<String> geohash = jedis.geohash("city", "beijing", "shanghai", "shenzhen");
System.out.println(geohash);//[wx4fbxxfke0, wtw3sj5zbj0, ws10578st80]
/**
* georadius 根据给定地理位置坐标,获取指定范围内的地理位置集合
返回:
匹配位置的名称
匹配位置的经纬度
匹配位置与给定地理位置的距离
从近到远排序
返回的数量
*/
List<GeoRadiusResponse> city = jedis.georadius("city", 110, 30, 1000,
GeoUnit.KM, GeoRadiusParam.geoRadiusParam().withCoord().withDist().sortAscending().count(3));
ParseGeoresponse(city);
//chongqing——距离:341.9374——经度:106.49999767541885——纬度:29.529999579006592
//xian——距离:483.834——经度:108.96000176668167——纬度:34.2599996441893
//shengzhen——距离:924.6408——经度:114.04999762773514——纬度:22.520000087950386
/**
* georadiusByMember 根据位置,获取指定范围内的地理位置集合
返回:
匹配位置的名称
匹配位置的经纬度
匹配位置与给定地理位置的距离
从近到远排序
返回的数量
*/
List<GeoRadiusResponse> city2 = jedis.georadiusByMember("city", "beijing", 1000,
GeoUnit.KM, GeoRadiusParam.geoRadiusParam().withCoord().withDist().sortAscending().count(2));
ParseGeoresponse(city2);
//beijing——距离:0.0——经度:116.39999896287918——纬度:39.900000091670925
//xian——距离:910.0565——经度:108.96000176668167——纬度:34.2599996441893
/**
* 用Zset操作
*/
List<String> list = jedis.zrange("city", 0, -1);
System.out.println(list);//[chongqing, xian, shenzhen, hangzhou, shanghai, beijing]
jedis.zrem("city","xian");
System.out.println(jedis.zrange("city",0,-1));//[chongqing, shenzhen, hangzhou, shanghai, beijing]
jedis.close();
}
/**
* 结果解析
*
* @param city
*/
private static void ParseGeoresponse(List<GeoRadiusResponse> city) {
for (GeoRadiusResponse geoRadiusResponse : city) {
String cityName = geoRadiusResponse.getMemberByString();
double distance = geoRadiusResponse.getDistance();
double longitude = geoRadiusResponse.getCoordinate().getLongitude();
double latitude = geoRadiusResponse.getCoordinate().getLatitude();
System.out.println(cityName + "——距离:" + distance + "——经度:" + longitude + "——纬度:" + latitude);
}
}
}
5.2.8 hyperloglog
import redis.clients.jedis.Jedis;
public class TestHyperloglog {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
System.out.println("===================================================");
//添加元素
jedis.pfadd("num1", "a", "b", "c", "d", "e", "a", "b");
jedis.pfadd("num2", "f", "g", "h", "k");
//统计不重复的元素
System.out.println(jedis.pfcount("num1"));//5
System.out.println(jedis.pfcount("num2"));//4
//将num1和num2的结果合并,放入num1中,并统计不重复的元素
jedis.pfmerge("num1","num2");
System.out.println(jedis.pfcount("num1"));//9
System.out.println(jedis.pfcount("num2"));//4
}
}
5.2.9 bitmap
import redis.clients.jedis.Jedis;
public class TestBitmap {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
System.out.println("===================================================");
//记录一周的打卡记录
jedis.setbit("daily",0,true);
jedis.setbit("daily",1,false);
jedis.setbit("daily",2,false);
jedis.setbit("daily",3,true);
jedis.setbit("daily",4,true);
jedis.setbit("daily",5,false);
jedis.setbit("daily",6,true);
boolean daily = jedis.getbit("daily", 2);//获取指定天的打卡记录
System.out.println(daily);//false
long bitcount = jedis.bitcount("daily");//记录为true的个数
System.out.println(bitcount);//4
jedis.close();
}
}
5.2.10 事务
import redis.clients.jedis.Jedis;
import redis.clients.jedis.Transaction;
public class TestTransaction {
public static void main(String[] args) {
Jedis jedis = new Jedis("192.168.59.128", 6379);
jedis.select(0);//更换数据库
jedis.flushDB();//清空当前数据库
System.out.println(jedis.dbSize());//0
jedis.set("money", "100");
System.out.println("===================================================");
jedis.watch("money");//开启监控
Transaction multi = jedis.multi();//开启事务
try {
multi.set("name", "zhangsan");
int i = 1 / 0;
multi.set("age", "30");
multi.incrBy("money", 10);
multi.exec();//执行事务,会比较监控的version
} catch (Exception e) {
multi.discard();//取消事务,都不会被执行
e.printStackTrace();
} finally {
System.out.println(jedis.get("name"));
System.out.println(jedis.get("age"));
System.out.println(jedis.get("money"));
jedis.close();
}
//java.lang.ArithmeticException: / by zero
//null
//null
//100
}
}
边栏推荐
- 一张图深入的理解FP/FN/Precision/Recall
- Is AI more fair than people in the distribution of wealth? Research on multiplayer game from deepmind
- tp6 实现佣金排行榜
- R语言使用ggplot2函数可视化需要构建泊松回归模型的计数目标变量的直方图分布并分析构建泊松回归模型的可行性
- Redis master-slave and sentinel master-slave switchover are built step by step
- 凌云出海记 | 赛盒&华为云:共助跨境电商行业可持续发展
- R语言ggplot2可视化:使用ggpubr包的ggecdf函数可视化分组经验累积密度分布函数曲线、linetype参数指定不同分组曲线的线型
- 让这个 CRMEB 单商户微信商城系统火起来,太好用了!
- Command mode - unity
- 从39个kaggle竞赛中总结出来的图像分割的Tips和Tricks
猜你喜欢
ES6 note 1
In the first half of 2022, I found 10 books that have been passed around by my circle of friends
Chief technology officer of Pasqual: analog quantum computing takes the lead in bringing quantum advantages to industry
让这个 CRMEB 单商户微信商城系统火起来,太好用了!
Kirin Xin'an with heterogeneous integration cloud financial information and innovation solutions appeared at the 15th Hunan Financial Technology Exchange Conference
多个kubernetes集群如何实现共享同一个存储
The top of slashdata developer tool is up to you!!!
小试牛刀之NunJucks模板引擎
SlashData开发者工具榜首等你而定!!!
Kunpeng developer summit 2022 | Kirin Xin'an and Kunpeng jointly build a new ecosystem of computing industry
随机推荐
R语言ggplot2可视化:使用ggpubr包的ggstripchart函数可视化分组点状条带图(dot strip plot)、设置position参数配置不同分组数据点的分离程度
tp6 实现佣金排行榜
Make insurance more "safe"! Kirin Xin'an one cloud multi-core cloud desktop won the bid of China Life Insurance, helping the innovation and development of financial and insurance information technolog
脑洞从何而来?加州大学最新研究:有创造力的人神经连接会「抄近道」
Jerry's headphones with the same channel are not allowed to pair [article]
R语言dplyr包mutate_at函数和min_rank函数计算dataframe中指定数据列的排序序号值、名次值、将最大值的rank值赋值为1
ES6笔记一
L1-019 who falls first (Lua)
AI写首诗
# 欢迎使用Markdown编辑器
杰理之关于 TWS 配对方式配置【篇】
让这个 CRMEB 单商户微信商城系统火起来,太好用了!
2022.07.05
凌云出海记 | 赛盒&华为云:共助跨境电商行业可持续发展
网易云信参与中国信通院《实时音视频服务(RTC)基础能力要求及评估方法》标准编制...
反爬虫的重点:识别爬虫
爬虫实战(七):爬王者英雄图片
Initial experience of cache and ehcache "suggestions collection"
Kunpeng developer summit 2022 | Kirin Xin'an and Kunpeng jointly build a new ecosystem of computing industry
歌单11111