關(guān)于RedisTemplate常用方法封裝
更新時間:2024年12月09日 11:27:42 作者:點滴1993
文章總結(jié)了RedisTemplate的常用方法封裝,包括序列化配置、基礎(chǔ)常量和接口實現(xiàn),這些內(nèi)容是個人經(jīng)驗分享,旨在為讀者提供參考和支持
RedisTemplate常用方法封裝
1. 序列化和配置
package com.xxx.redis; import com.fasterxml.jackson.annotation.JsonAutoDetect; import com.fasterxml.jackson.annotation.PropertyAccessor; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.jsontype.impl.LaissezFaireSubTypeValidator; import com.xxx.redis.service.RedisService; import com.xxx.redis.service.impl.DefaultRedisServiceImpl; import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.data.redis.connection.RedisConnectionFactory; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.serializer.Jackson2JsonRedisSerializer; import org.springframework.data.redis.serializer.RedisSerializer; /** * RedisConfiguration * * @author xm.z */ @Configuration public class RedisConfiguration { @Bean public RedisSerializer<Object> redisSerializer() { // 創(chuàng)建 JSON 序列化器 Jackson2JsonRedisSerializer<Object> serializer = new Jackson2JsonRedisSerializer<>(Object.class); ObjectMapper objectMapper = new ObjectMapper(); objectMapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY); // 必須設(shè)置 否則無法將JSON轉(zhuǎn)化為對象 會轉(zhuǎn)化成Map類型 objectMapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL); serializer.setObjectMapper(objectMapper); return serializer; } @Bean public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory, RedisSerializer<Object> redisSerializer) { RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>(); redisTemplate.setConnectionFactory(redisConnectionFactory); redisTemplate.setKeySerializer(RedisSerializer.string()); redisTemplate.setValueSerializer(redisSerializer); redisTemplate.setHashKeySerializer(RedisSerializer.string()); redisTemplate.setHashValueSerializer(redisSerializer); redisTemplate.afterPropertiesSet(); return redisTemplate; } @Bean public RedisService redisService(RedisTemplate<String, Object> redisTemplate) { return new DefaultRedisServiceImpl(redisTemplate); } }
2. 基礎(chǔ)常量
package com.xxx.redis.constant; import org.springframework.data.redis.core.script.DefaultRedisScript; /** * RedisConstants * * @author xm.z */ public final class RedisConstants { /** * 遞增并設(shè)置過期時間的 lua 腳本 */ public static final DefaultRedisScript<Long> INCR_BY_EXPIRE_LUA_SCRIPT = new DefaultRedisScript<>( "local r = redis.call('INCRBY', KEYS[1], ARGV[1]) redis.call('EXPIRE', KEYS[1], ARGV[2]) return r", Long.class); /** * 遞減并設(shè)置過期時間的 lua 腳本 */ public static final DefaultRedisScript<Long> DECR_BY_EXPIRE_LUA_SCRIPT = new DefaultRedisScript<>( "local r = redis.call('DECRBY', KEYS[1], ARGV[1]) redis.call('EXPIRE', KEYS[1], ARGV[2]) return r", Long.class); private RedisConstants() { } }
3. 接口及實現(xiàn)
package com.xxx.redis.service.impl; import com.xxx.redis.service.RedisService; import lombok.extern.slf4j.Slf4j; import org.springframework.data.redis.core.*; /** * AbstractRedisService * * @author xm.z */ @Slf4j public abstract class AbstractRedisService implements RedisService { /** * Get Helper class that simplifies Redis data access code. * @return RedisTemplate 獲取 */ protected abstract RedisTemplate<String, Object> getTemplate(); public HashOperations<String, Object, Object> hashOps() { return this.getTemplate().opsForHash(); } public ValueOperations<String, Object> valueOps() { return this.getTemplate().opsForValue(); } public ListOperations<String, Object> listOps() { return this.getTemplate().opsForList(); } public SetOperations<String, Object> setOps() { return this.getTemplate().opsForSet(); } public ZSetOperations<String, Object> zSetOps() { return this.getTemplate().opsForZSet(); } public StreamOperations<String, Object, Object> streamOps() { return this.getTemplate().opsForStream(); } public GeoOperations<String, Object> geoOps() { return this.getTemplate().opsForGeo(); } }
package com.xxx.redis.service; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Distance; import org.springframework.data.geo.GeoResults; import org.springframework.data.geo.Point; import org.springframework.data.redis.connection.RedisGeoCommands; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.Set; /** * Redis 服務(wù) * * @author xm.z */ public interface RedisService { /** * 獲取所有符合指定表達(dá)式的 key * @param pattern 表達(dá)式 * @return java.util.Set * @see <a rel="external nofollow" rel="external nofollow" >Keys Command</a> */ Set<String> keys(String pattern); /** * 保存屬性 * @param key key值 * @param value value值 * @param time 時間戳 */ void set(String key, Object value, long time); /** * 保存屬性 * @param key key值 * @param value value值 */ void set(String key, Object value); /** * 獲取屬性 * @param key key值 * @return 返回對象 */ Object get(String key); /** * 從指定的 keys 批量獲取屬性 * @param keys keys * @return values list,當(dāng)值為空時,該 key 對應(yīng)的 value 為 null * @see <a rel="external nofollow" rel="external nofollow" >MGet Command</a> */ List<Object> mGet(Collection<String> keys); /** * 批量獲取 keys 的屬性,并返回一個 map * @param keys keys * @return map,key 和 value 的鍵值對集合,當(dāng) value 獲取為 null 時,不存入此 map */ Map<String, Object> mGetToMap(Collection<String> keys); /** * 刪除屬性 * @param key key值 * @return 返回成功 */ Boolean del(String key); /** * 批量刪除屬性 * @param keys key值集合 * @return 返回刪除數(shù)量 */ Long del(Collection<String> keys); /** * 設(shè)置過期時間 * @param key key值 * @param time 時間戳 * @return 返回成功 */ Boolean expire(String key, long time); /** * 獲取過期時間 * @param key key值 * @return 返回時間戳 */ Long getExpire(String key); /** * 判斷key是否存在 * @param key key值 * @return 返回 */ Boolean hasKey(String key); /** * 按delta遞增 * @param key key值 * @param delta delta值 * @return 返回遞增后結(jié)果 */ Long incr(String key, long delta); /** * 按delta遞增并設(shè)置過期時間 * @param key key值 * @param delta delta值 * @param timeout 過期時間(單位:秒) * @return 返回遞增后結(jié)果 */ Long incrAndExpire(String key, long delta, long timeout); /** * 按delta遞減 * @param key key值 * @param delta delta值 * @return 返回遞減后結(jié)果 */ Long decr(String key, long delta); /** * 按delta遞減并設(shè)置過期時間 * @param key key值 * @param delta delta值 * @param timeout 過期時間(單位:秒) * @return 返回遞減后結(jié)果 */ Long decrAndExpire(String key, long delta, long timeout); /** * 獲取Hash結(jié)構(gòu)中的屬性 * @param key 外部key值 * @param hashKey 內(nèi)部key值 * @return 返回內(nèi)部key的value */ Object hGet(String key, String hashKey); /** * 向Hash結(jié)構(gòu)中放入一個屬性 * @param key 外部key * @param hashKey 內(nèi)部key * @param value 內(nèi)部key的value * @param time 過期時間 * @return 返回是否成功 */ Boolean hSet(String key, String hashKey, Object value, long time); /** * 向Hash結(jié)構(gòu)中放入一個屬性 * @param key 外部key * @param hashKey 內(nèi)部key * @param value 內(nèi)部key的value */ void hSet(String key, String hashKey, Object value); /** * 直接獲取整個Hash結(jié)構(gòu) * @param key 外部key值 * @return 返回hashMap */ Map<Object, Object> hGetAll(String key); /** * 直接設(shè)置整個Hash結(jié)構(gòu) * @param key 外部key * @param map hashMap值 * @param time 過期時間 * @return 返回是否成功 */ Boolean hSetAll(String key, Map<String, Object> map, long time); /** * 直接設(shè)置整個Hash結(jié)構(gòu) * @param key 外部key * @param map hashMap值 */ void hSetAll(String key, Map<String, ?> map); /** * 刪除Hash結(jié)構(gòu)中的屬性 * @param key 外部key值 * @param hashKey 內(nèi)部key值 */ void hDel(String key, Object... hashKey); /** * 判斷Hash結(jié)構(gòu)中是否有該屬性 * @param key 外部key * @param hashKey 內(nèi)部key * @return 返回是否存在 */ Boolean hHasKey(String key, String hashKey); /** * Hash結(jié)構(gòu)中屬性遞增 * @param key 外部key * @param hashKey 內(nèi)部key * @param delta 遞增條件 * @return 返回遞增后的數(shù)據(jù) */ Long hIncr(String key, String hashKey, Long delta); /** * Hash結(jié)構(gòu)中屬性遞減 * @param key 外部key * @param hashKey 內(nèi)部key * @param delta 遞增條件 * @return 返回遞減后的數(shù)據(jù) */ Long hDecr(String key, String hashKey, Long delta); /** * 獲取Set結(jié)構(gòu) * @param key key * @return 返回set集合 */ Set<Object> sMembers(String key); /** * 向Set結(jié)構(gòu)中添加屬性 * @param key key * @param values value集 * @return 返回增加數(shù)量 */ Long sAdd(String key, Object... values); /** * 向Set結(jié)構(gòu)中添加屬性 * @param key key * @param time 過期時間 * @param values 值集合 * @return 返回添加的數(shù)量 */ Long sAdd(String key, long time, Object... values); /** * 是否為Set中的屬性 * @param key key * @param value value * @return 返回是否存在 */ Boolean sIsMember(String key, Object value); /** * 獲取Set結(jié)構(gòu)的長度 * @param key key * @return 返回長度 */ Long sSize(String key); /** * 刪除Set結(jié)構(gòu)中的屬性 * @param key key * @param values value集合 * @return 刪除掉的數(shù)據(jù)量 */ Long sRemove(String key, Object... values); /** * 獲取List結(jié)構(gòu)中的屬性 * @param key key * @param start 開始 * @param end 結(jié)束 * @return 返回查詢的集合 */ List<Object> lRange(String key, long start, long end); /** * 獲取List結(jié)構(gòu)的長度 * @param key key * @return 長度 */ Long lSize(String key); /** * 根據(jù)索引獲取List中的屬性 * @param key key * @param index 索引 * @return 對象 */ Object lIndex(String key, long index); /** * 向List結(jié)構(gòu)中添加屬性 * @param key key * @param value value * @return 增加后的長度 */ Long lPush(String key, Object value); /** * 向List結(jié)構(gòu)中添加屬性 * @param key key * @param value value * @param time 過期時間 * @return 增加后的長度 */ Long lPush(String key, Object value, long time); /** * 向List結(jié)構(gòu)中批量添加屬性 * @param key key * @param values value 集合 * @return 增加后的長度 */ Long lPushAll(String key, Object... values); /** * 向List結(jié)構(gòu)中批量添加屬性 * @param key key * @param time 過期時間 * @param values value集合 * @return 增加后的長度 */ Long lPushAll(String key, Long time, Object... values); /** * 從List結(jié)構(gòu)中移除屬性 * @param key key * @param count 總量 * @param value value * @return 返回刪除后的長度 */ Long lRemove(String key, long count, Object value); /** * 向bitmap中新增值 * @param key key * @param offset 偏移量 * @param b 狀態(tài) * @return 結(jié)果 */ Boolean bitAdd(String key, int offset, boolean b); /** * 從bitmap中獲取偏移量的值 * @param key key * @param offset 偏移量 * @return 結(jié)果 */ Boolean bitGet(String key, int offset); /** * 獲取bitmap的key值總和 * @param key key * @return 總和 */ Long bitCount(String key); /** * 獲取bitmap范圍值 * @param key key * @param limit 范圍 * @param offset 開始偏移量 * @return long類型集合 */ List<Long> bitField(String key, int limit, int offset); /** * 獲取所有bitmap * @param key key * @return 以二進(jìn)制字節(jié)數(shù)組返回 */ byte[] bitGetAll(String key); /** * 增加坐標(biāo) * @param key key * @param x x * @param y y * @param name 地點名稱 * @return 返回結(jié)果 */ Long geoAdd(String key, Double x, Double y, String name); /** * 根據(jù)城市名稱獲取坐標(biāo)集合 * @param key key * @param place 地點 * @return 坐標(biāo)集合 */ List<Point> geoGetPointList(String key, Object... place); /** * 計算兩個城市之間的距離 * @param key key * @param placeOne 地點1 * @param placeTow 地點2 * @return 返回距離 */ Distance geoCalculationDistance(String key, String placeOne, String placeTow); /** * 獲取附該地點附近的其他地點 * @param key key * @param place 地點 * @param distance 附近的范圍 * @param limit 查幾條 * @param sort 排序規(guī)則 * @return 返回附近的地點集合 */ GeoResults<RedisGeoCommands.GeoLocation<Object>> geoNearByPlace(String key, String place, Distance distance, long limit, Sort.Direction sort); /** * 獲取地點的hash * @param key key * @param place 地點 * @return 返回集合 */ List<String> geoGetHash(String key, String... place); }
package com.xxx.redis.service.impl; import lombok.RequiredArgsConstructor; import org.springframework.data.domain.Sort; import org.springframework.data.geo.Distance; import org.springframework.data.geo.GeoResults; import org.springframework.data.geo.Point; import org.springframework.data.redis.connection.BitFieldSubCommands; import org.springframework.data.redis.connection.RedisGeoCommands; import org.springframework.data.redis.core.RedisCallback; import org.springframework.data.redis.core.RedisTemplate; import java.util.*; import java.util.concurrent.TimeUnit; import static com.xxx.redis.constant.RedisConstants.DECR_BY_EXPIRE_LUA_SCRIPT; import static com.xxx.redis.constant.RedisConstants.INCR_BY_EXPIRE_LUA_SCRIPT; /** * 默認(rèn) Redis 服務(wù)實現(xiàn) * * @author xm.z */ @RequiredArgsConstructor public class DefaultRedisServiceImpl extends AbstractRedisService { private final RedisTemplate<String, Object> redisTemplate; /** * 獲取所有符合指定表達(dá)式的 key * @param pattern 表達(dá)式 * @return java.util.Set * @see <a rel="external nofollow" rel="external nofollow" >Keys Command</a> */ @Override public Set<String> keys(String pattern) { return redisTemplate.keys(pattern); } /** * 保存屬性 * @param key key值 * @param value value值 * @param time 時間戳 */ @Override public void set(String key, Object value, long time) { valueOps().set(key, value, time, TimeUnit.SECONDS); } /** * 保存屬性 * @param key key值 * @param value value值 */ @Override public void set(String key, Object value) { valueOps().set(key, value); } /** * 獲取屬性 * @param key key值 * @return 返回對象 */ @Override public Object get(String key) { return valueOps().get(key); } /** * 從指定的 keys 批量獲取屬性 * @param keys keys * @return values list,當(dāng)值為空時,該 key 對應(yīng)的 value 為 null * @see <a rel="external nofollow" rel="external nofollow" >MGet Command</a> */ @Override public List<Object> mGet(Collection<String> keys) { return valueOps().multiGet(keys); } /** * 批量獲取 keys 的屬性,并返回一個 map * @param keys keys * @return map,key 和 value 的鍵值對集合,當(dāng) value 獲取為 null 時,不存入此 map */ @Override public Map<String, Object> mGetToMap(Collection<String> keys) { List<Object> values = valueOps().multiGet(keys); Map<String, Object> map = new HashMap<>(keys.size()); if (values == null || values.isEmpty()) { return map; } Iterator<String> keysIterator = keys.iterator(); Iterator<Object> valuesIterator = values.iterator(); while (keysIterator.hasNext()) { String key = keysIterator.next(); Object value = valuesIterator.next(); if (value != null) { map.put(key, value); } } return map; } /** * 刪除屬性 * @param key key值 * @return 返回成功 */ @Override public Boolean del(String key) { return redisTemplate.delete(key); } /** * 批量刪除屬性 * @param keys key值集合 * @return 返回刪除數(shù)量 */ @Override public Long del(Collection<String> keys) { return redisTemplate.delete(keys); } /** * 設(shè)置過期時間 * @param key key值 * @param time 時間戳 * @return 返回成功 */ @Override public Boolean expire(String key, long time) { return redisTemplate.expire(key, time, TimeUnit.SECONDS); } /** * 獲取過期時間 * @param key key值 * @return 返回時間戳 */ @Override public Long getExpire(String key) { return redisTemplate.getExpire(key, TimeUnit.SECONDS); } /** * 判斷key是否存在 * @param key key值 * @return 返回 */ @Override public Boolean hasKey(String key) { return redisTemplate.hasKey(key); } /** * 按delta遞增 * @param key key值 * @param delta delta值 * @return 返回遞增后結(jié)果 */ @Override public Long incr(String key, long delta) { return valueOps().increment(key, delta); } /** * 按delta遞增并設(shè)置過期時間 * @param key key值 * @param delta delta值 * @param timeout 過期時間(單位:秒) * @return 返回遞增后結(jié)果 */ @Override public Long incrAndExpire(String key, long delta, long timeout) { return redisTemplate.execute(INCR_BY_EXPIRE_LUA_SCRIPT, Collections.singletonList(key), String.valueOf(delta), String.valueOf(timeout)); } /** * 按delta遞減 * @param key key值 * @param delta delta值 * @return 返回遞減后結(jié)果 */ @Override public Long decr(String key, long delta) { return valueOps().decrement(key, delta); } /** * 按delta遞減并設(shè)置過期時間 * @param key key值 * @param delta delta值 * @param timeout 過期時間(單位:秒) * @return 返回遞減后結(jié)果 */ @Override public Long decrAndExpire(String key, long delta, long timeout) { return redisTemplate.execute(DECR_BY_EXPIRE_LUA_SCRIPT, Collections.singletonList(key), String.valueOf(delta), String.valueOf(timeout)); } /** * 獲取Hash結(jié)構(gòu)中的屬性 * @param key 外部key值 * @param hashKey 內(nèi)部key值 * @return 返回內(nèi)部key的value */ @Override public Object hGet(String key, String hashKey) { return hashOps().get(key, hashKey); } /** * 向Hash結(jié)構(gòu)中放入一個屬性 * @param key 外部key * @param hashKey 內(nèi)部key * @param value 內(nèi)部key的value * @param time 過期時間 * @return 返回是否成功 */ @Override public Boolean hSet(String key, String hashKey, Object value, long time) { hashOps().put(key, hashKey, value); return expire(key, time); } /** * 向Hash結(jié)構(gòu)中放入一個屬性 * @param key 外部key * @param hashKey 內(nèi)部key * @param value 內(nèi)部key的value */ @Override public void hSet(String key, String hashKey, Object value) { hashOps().put(key, hashKey, value); } /** * 直接獲取整個Hash結(jié)構(gòu) * @param key 外部key值 * @return 返回hashMap */ @Override public Map<Object, Object> hGetAll(String key) { return hashOps().entries(key); } /** * 直接設(shè)置整個Hash結(jié)構(gòu) * @param key 外部key * @param map hashMap值 * @param time 過期時間 * @return 返回是否成功 */ @Override public Boolean hSetAll(String key, Map<String, Object> map, long time) { hashOps().putAll(key, map); return expire(key, time); } /** * 直接設(shè)置整個Hash結(jié)構(gòu) * @param key 外部key * @param map hashMap值 */ @Override public void hSetAll(String key, Map<String, ?> map) { hashOps().putAll(key, map); } /** * 刪除Hash結(jié)構(gòu)中的屬性 * @param key 外部key值 * @param hashKey 內(nèi)部key值 */ @Override public void hDel(String key, Object... hashKey) { hashOps().delete(key, hashKey); } /** * 判斷Hash結(jié)構(gòu)中是否有該屬性 * @param key 外部key * @param hashKey 內(nèi)部key * @return 返回是否存在 */ @Override public Boolean hHasKey(String key, String hashKey) { return hashOps().hasKey(key, hashKey); } /** * Hash結(jié)構(gòu)中屬性遞增 * @param key 外部key * @param hashKey 內(nèi)部key * @param delta 遞增條件 * @return 返回遞增后的數(shù)據(jù) */ @Override public Long hIncr(String key, String hashKey, Long delta) { return hashOps().increment(key, hashKey, delta); } /** * Hash結(jié)構(gòu)中屬性遞減 * @param key 外部key * @param hashKey 內(nèi)部key * @param delta 遞增條件 * @return 返回遞減后的數(shù)據(jù) */ @Override public Long hDecr(String key, String hashKey, Long delta) { return hashOps().increment(key, hashKey, -delta); } /** * 獲取Set結(jié)構(gòu) * @param key key * @return 返回set集合 */ @Override public Set<Object> sMembers(String key) { return setOps().members(key); } /** * 向Set結(jié)構(gòu)中添加屬性 * @param key key * @param values value集 * @return 返回增加數(shù)量 */ @Override public Long sAdd(String key, Object... values) { return setOps().add(key, values); } /** * 向Set結(jié)構(gòu)中添加屬性 * @param key key * @param time 過期時間 * @param values 值集合 * @return 返回添加的數(shù)量 */ @Override public Long sAdd(String key, long time, Object... values) { Long count = setOps().add(key, values); expire(key, time); return count; } /** * 是否為Set中的屬性 * @param key key * @param value value * @return 返回是否存在 */ @Override public Boolean sIsMember(String key, Object value) { return setOps().isMember(key, value); } /** * 獲取Set結(jié)構(gòu)的長度 * @param key key * @return 返回長度 */ @Override public Long sSize(String key) { return setOps().size(key); } /** * 刪除Set結(jié)構(gòu)中的屬性 * @param key key * @param values value集合 * @return 刪除掉的數(shù)據(jù)量 */ @Override public Long sRemove(String key, Object... values) { return setOps().remove(key, values); } /** * 獲取List結(jié)構(gòu)中的屬性 * @param key key * @param start 開始 * @param end 結(jié)束 * @return 返回查詢的集合 */ @Override public List<Object> lRange(String key, long start, long end) { return listOps().range(key, start, end); } /** * 獲取List結(jié)構(gòu)的長度 * @param key key * @return 長度 */ @Override public Long lSize(String key) { return listOps().size(key); } /** * 根據(jù)索引獲取List中的屬性 * @param key key * @param index 索引 * @return 對象 */ @Override public Object lIndex(String key, long index) { return listOps().index(key, index); } /** * 向List結(jié)構(gòu)中添加屬性 * @param key key * @param value value * @return 增加后的長度 */ @Override public Long lPush(String key, Object value) { return listOps().rightPush(key, value); } /** * 向List結(jié)構(gòu)中添加屬性 * @param key key * @param value value * @param time 過期時間 * @return 增加后的長度 */ @Override public Long lPush(String key, Object value, long time) { Long index = listOps().rightPush(key, value); expire(key, time); return index; } /** * 向List結(jié)構(gòu)中批量添加屬性 * @param key key * @param values value 集合 * @return 增加后的長度 */ @Override public Long lPushAll(String key, Object... values) { return listOps().rightPushAll(key, values); } /** * 向List結(jié)構(gòu)中批量添加屬性 * @param key key * @param time 過期時間 * @param values value集合 * @return 增加后的長度 */ @Override public Long lPushAll(String key, Long time, Object... values) { Long count = listOps().rightPushAll(key, values); expire(key, time); return count; } /** * 從List結(jié)構(gòu)中移除屬性 * @param key key * @param count 總量 * @param value value * @return 返回刪除后的長度 */ @Override public Long lRemove(String key, long count, Object value) { return listOps().remove(key, count, value); } /** * 向bitmap中新增值 * @param key key * @param offset 偏移量 * @param b 狀態(tài) * @return 結(jié)果 */ @Override public Boolean bitAdd(String key, int offset, boolean b) { return valueOps().setBit(key, offset, b); } /** * 從bitmap中獲取偏移量的值 * @param key key * @param offset 偏移量 * @return 結(jié)果 */ @Override public Boolean bitGet(String key, int offset) { return valueOps().getBit(key, offset); } /** * 獲取bitmap的key值總和 * @param key key * @return 總和 */ @Override public Long bitCount(String key) { return redisTemplate.execute((RedisCallback<Long>) con -> con.bitCount(key.getBytes())); } /** * 獲取bitmap范圍值 * @param key key * @param limit 范圍 * @param offset 開始偏移量 * @return long類型集合 */ @Override public List<Long> bitField(String key, int limit, int offset) { return redisTemplate.execute((RedisCallback<List<Long>>) con -> con.bitField(key.getBytes(), BitFieldSubCommands.create().get(BitFieldSubCommands.BitFieldType.unsigned(limit)).valueAt(offset))); } /** * 獲取所有bitmap * @param key key * @return 以二進(jìn)制字節(jié)數(shù)組返回 */ @Override public byte[] bitGetAll(String key) { return redisTemplate.execute((RedisCallback<byte[]>) con -> con.get(key.getBytes())); } /** * 增加坐標(biāo) * @param key key * @param x x * @param y y * @param name 地點名稱 * @return 返回結(jié)果 */ @Override public Long geoAdd(String key, Double x, Double y, String name) { return geoOps().add(key, new Point(x, y), name); } /** * 根據(jù)城市名稱獲取坐標(biāo)集合 * @param key key * @param place 地點 * @return 坐標(biāo)集合 */ @Override public List<Point> geoGetPointList(String key, Object... place) { return geoOps().position(key, place); } /** * 計算兩個城市之間的距離 * @param key key * @param placeOne 地點1 * @param placeTow 地點2 * @return 返回距離 */ @Override public Distance geoCalculationDistance(String key, String placeOne, String placeTow) { return geoOps().distance(key, placeOne, placeTow, RedisGeoCommands.DistanceUnit.KILOMETERS); } /** * 獲取附該地點附近的其他地點 * @param key key * @param place 地點 * @param distance 附近的范圍 * @param limit 查幾條 * @param sort 排序規(guī)則 * @return 返回附近的地點集合 */ @Override public GeoResults<RedisGeoCommands.GeoLocation<Object>> geoNearByPlace(String key, String place, Distance distance, long limit, Sort.Direction sort) { RedisGeoCommands.GeoRadiusCommandArgs args = RedisGeoCommands.GeoRadiusCommandArgs.newGeoRadiusArgs() .includeDistance() .includeCoordinates(); // 判斷排序方式 if (Sort.Direction.ASC == sort) { args.sortAscending(); } else { args.sortDescending(); } args.limit(limit); return geoOps().radius(key, place, distance, args); } /** * 獲取地點的hash * @param key key * @param place 地點 * @return 返回集合 */ @Override public List<String> geoGetHash(String key, String... place) { return geoOps().hash(key, place); } /** * Get Helper class that simplifies Redis data access code. * @return RedisTemplate 獲取 */ @Override protected RedisTemplate<String, Object> getTemplate() { return redisTemplate; } }
總結(jié)
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
Java中JSONObject和Map<String,?Object>的轉(zhuǎn)換方法
平時對接口時,經(jīng)常遇到j(luò)son字符串和map對象之間的交互,這篇文章主要給大家介紹了關(guān)于Java中JSONObject和Map<String,?Object>的轉(zhuǎn)換方法,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-07-07Java布爾值Boolean和boolean之間轉(zhuǎn)換實例用法
在本篇文章里小編給大家整理的是一篇關(guān)于Java布爾值Boolean和boolean之間轉(zhuǎn)換實例用法內(nèi)容,有需要的朋友們跟著學(xué)習(xí)參考下。2021-06-06

java實現(xiàn)html轉(zhuǎn)pdf方法步驟
這篇文章主要給大家介紹了關(guān)于java實現(xiàn)html轉(zhuǎn)pdf方法的相關(guān)資料,要將HTML轉(zhuǎn)換成PDF,我們需要借助Java中的第三方庫,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
2023-08-08 
Java?restTemplate發(fā)送get請求query參數(shù)傳遞問題解決
這篇文章主要為大家介紹了Java?restTemplate發(fā)送get請求query參數(shù)傳遞問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
2023-11-11 
SpringMVC實現(xiàn)前端后臺交互傳遞數(shù)據(jù)
本篇文章主要介紹了SpringMVC實現(xiàn)前端后臺傳遞數(shù)據(jù)的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下。
2017-03-03 
Springboot項目異常處理及返回結(jié)果統(tǒng)一
這篇文章主要介紹了Springboot項目異常處理及返回結(jié)果統(tǒng)一,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價值,需要的朋友可以參考一下
2022-08-08 
Java將List轉(zhuǎn)換為String的幾種常見方式
在實際開發(fā)中經(jīng)常遇到List轉(zhuǎn)為String字符串的情況,下面這篇文章主要給大家介紹了關(guān)于Java將List轉(zhuǎn)換為String的幾種常見方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
2024-03-03 
pom.xml中解決Provides?transitive?vulnerable?dependency?mave
這篇文章主要介紹了在pom.xml中如何解決Provides?transitive?vulnerable?dependency?maven:org.yaml:snakeyaml:1.33警告問題,需要的朋友可以參考下
2023-06-06