How to implement the Set command of Springboot integrated Tile client
set command syntax
SET key id [FIELD name value ...] [EX seconds] [NX|XX] (OBJECT geojson )|(POINT lat lon z)|(BOUNDS minlat minlon maxlat maxlon)|(HASH geohash)|(STRING value)
##set command is equivalent to # in redis The use of the ##hash
command is also a combination of key
and id
, but the difference is that Tile38’s set
command can also carry more Other attributes, such as customizing the FIELD
field, and setting the EX
validity period, etc., then we need to design a useful java api## for this syntax. # so that developers can better use Tile38.
Grammar analysis
SET
, we take this keyword as a separate part;2. The second part is
key id [FIELD name value ...] [EX seconds] [NX|XX]
3. The third part is the final target data object:
(OBJECT geojson)|(POINT lat lon z)|(BOUNDS minlat minlon maxlat maxlon)|(HASH geohash)|(STRING value)
1. We manage the first part of the command keywords through enumeration:Code design
1
2
3
4
5
6
7
8
9
10
11
12
13
14
enum Tile38Command
implements
ProtocolKeyword {
SET;
public
final
byte[] bytes;
static
final
String UNDERSCORE =
"_"
;
static
final
String SPACE =
" "
;
Tile38Command() {
String name = StringUtils.replace(this.name(), UNDERSCORE, SPACE);
this.bytes = name.getBytes(StandardCharsets.US_ASCII);
}
@Override
public
byte[] getBytes() {
return
this.bytes;
}
}
Copy after login
Because the redis client tool needs to encode all commands before sending them, all commands must implement the 1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
|
ProtocolKeyword
interface. If the starting keyword of the command is two or more words, then we will use underscores to connect them. When converting to bytes, we can use spaces to replace the underscores.2. We abstract the second part of the command into a specific class and describe it through related fields:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
|
z
, which is used to store additional business parameters and can be empty.1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
|
BOUNDS data type
BOUNDS is a rectangle, and its key fields are the lower left corner and upper right corner. We use coordinate1 and coordinate2 to represent the lower left corner and upper right corner;1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@AllArgsConstructor
public
class
Bounds
extends
Element {
private
double[] coordinate1;
private
double[] coordinate2;
@Override
public
List<String> commandArgs() {
List<String> result =
new
LinkedList<>();
result.add(
"BOUNDS"
);
result.add(String.valueOf(coordinate1[0]));
result.add(String.valueOf(coordinate1[1]));
result.add(String.valueOf(coordinate2[0]));
result.add(String.valueOf(coordinate2[1]));
return
result;
}
}
Copy after login
HASH and STRING data typesHASH and STRING are actually a separate string, but we still encapsulate it for developers to use;1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@AllArgsConstructor
public
class
Geohash
extends
Element {
private
String hash;
@Override
public
List<String> commandArgs() {
List<String> result =
new
LinkedList<>();
result.add(
"HASH"
);
result.add(this.hash);
return
result;
}
}
@AllArgsConstructor
public
class
RawString
extends
Element {
private
String raw;
@Override
public
List<String> commandArgs() {
List<String> result =
new
LinkedList<>();
result.add(
"STRING"
);
result.add(this.raw);
return
result;
}
}
Copy after login
OBJECT data TypeOBJECT is actually GeoJSON data. This type of data is a bit more complicated. There are six types in total. Friends who want to know more can see here geojson.org/1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
1
2
3
4
5
6
Point,
LineString,
Polygon,
MultiPoint,
MultiLineString,
MultiPolygon
Copy after login
In order for developers to To better use these six types, we also use the builder pattern to design the GeoJSON data type: 1 2 3 4 5 6 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 |
|
1 2 3 |
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
private
String setElement(SetOpts setOpts, Element element) {
List<String> args1 = setOpts.commandLine();
List<String> commandArgs = element.commandArgs();
return
execute(Tile38Command.SET, args1, commandArgs);
}
/**
* 设置点位
*
* @param setOpts
* @param point
* @return
*/
public
String setPoint(SetOpts setOpts, Point point) {
return
setElement(setOpts, point);
}
/**
* 设置对象
*
* @param setOpts
* @param geoJson
* @return
*/
public
String setObject(SetOpts setOpts, GeoJson.BaseGeoJson geoJson) {
return
setElement(setOpts, geoJson);
}
/**
* 设置矩形边界
*
* @param setOpts
* @param bounds
* @return
*/
public
String setBounds(SetOpts setOpts, Bounds bounds) {
return
setElement(setOpts, bounds);
}
/**
* 设置geohash
*
* @param setOpts
* @param geohash
* @return
*/
public
String setGeohash(SetOpts setOpts, Geohash geohash) {
return
setElement(setOpts, geohash);
}
/**
* 设置String
*
* @param setOpts
* @param string
* @return
*/
public
String setString(SetOpts setOpts, RawString string) {
return
setElement(setOpts, string);
}
Copy after login
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 |
|
The above is the detailed content of How to implement the Set command of Springboot integrated Tile client. For more information, please follow other related articles on the PHP Chinese website!

Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

Video Face Swap
Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1
Easy-to-use and free code editor

SublimeText3 Chinese version
Chinese version, very easy to use

Zend Studio 13.0.1
Powerful PHP integrated development environment

Dreamweaver CS6
Visual web development tools

SublimeText3 Mac version
God-level code editing software (SublimeText3)

Hot Topics



Introduction to Jasypt Jasypt is a java library that allows a developer to add basic encryption functionality to his/her project with minimal effort and does not require a deep understanding of how encryption works. High security for one-way and two-way encryption. , standards-based encryption technology. Encrypt passwords, text, numbers, binaries... Suitable for integration into Spring-based applications, open API, for use with any JCE provider... Add the following dependency: com.github.ulisesbocchiojasypt-spring-boot-starter2. 1.1Jasypt benefits protect our system security. Even if the code is leaked, the data source can be guaranteed.

Usage scenario 1. The order was placed successfully but the payment was not made within 30 minutes. The payment timed out and the order was automatically canceled. 2. The order was signed and no evaluation was conducted for 7 days after signing. If the order times out and is not evaluated, the system defaults to a positive rating. 3. The order is placed successfully. If the merchant does not receive the order for 5 minutes, the order is cancelled. 4. The delivery times out, and push SMS reminder... For scenarios with long delays and low real-time performance, we can Use task scheduling to perform regular polling processing. For example: xxl-job Today we will pick

Interpretation of MyBatis dynamic SQL tags: Detailed explanation of Set tag usage MyBatis is an excellent persistence layer framework. It provides a wealth of dynamic SQL tags and can flexibly construct database operation statements. Among them, the Set tag is used to generate the SET clause in the UPDATE statement, which is very commonly used in update operations. This article will explain in detail the usage of the Set tag in MyBatis and demonstrate its functionality through specific code examples. What is Set tag Set tag is used in MyBati

1. Redis implements distributed lock principle and why distributed locks are needed. Before talking about distributed locks, it is necessary to explain why distributed locks are needed. The opposite of distributed locks is stand-alone locks. When we write multi-threaded programs, we avoid data problems caused by operating a shared variable at the same time. We usually use a lock to mutually exclude the shared variables to ensure the correctness of the shared variables. Its scope of use is in the same process. If there are multiple processes that need to operate a shared resource at the same time, how can they be mutually exclusive? Today's business applications are usually microservice architecture, which also means that one application will deploy multiple processes. If multiple processes need to modify the same row of records in MySQL, in order to avoid dirty data caused by out-of-order operations, distribution needs to be introduced at this time. The style is locked. Want to achieve points

Springboot reads the file, but cannot access the latest development after packaging it into a jar package. There is a situation where springboot cannot read the file after packaging it into a jar package. The reason is that after packaging, the virtual path of the file is invalid and can only be accessed through the stream. Read. The file is under resources publicvoidtest(){Listnames=newArrayList();InputStreamReaderread=null;try{ClassPathResourceresource=newClassPathResource("name.txt");Input

SpringBoot and SpringMVC are both commonly used frameworks in Java development, but there are some obvious differences between them. This article will explore the features and uses of these two frameworks and compare their differences. First, let's learn about SpringBoot. SpringBoot was developed by the Pivotal team to simplify the creation and deployment of applications based on the Spring framework. It provides a fast, lightweight way to build stand-alone, executable

When Springboot+Mybatis-plus does not use SQL statements to perform multi-table adding operations, the problems I encountered are decomposed by simulating thinking in the test environment: Create a BrandDTO object with parameters to simulate passing parameters to the background. We all know that it is extremely difficult to perform multi-table operations in Mybatis-plus. If you do not use tools such as Mybatis-plus-join, you can only configure the corresponding Mapper.xml file and configure The smelly and long ResultMap, and then write the corresponding sql statement. Although this method seems cumbersome, it is highly flexible and allows us to

1. Customize RedisTemplate1.1, RedisAPI default serialization mechanism. The API-based Redis cache implementation uses the RedisTemplate template for data caching operations. Here, open the RedisTemplate class and view the source code information of the class. publicclassRedisTemplateextendsRedisAccessorimplementsRedisOperations, BeanClassLoaderAware{//Declare key, Various serialization methods of value, the initial value is empty @NullableprivateRedisSe
