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() { // 创建 json 序列化器 jackson2jsonredisserializer<object> serializer = new jackson2jsonredisserializer<>(object.class); objectmapper objectmapper = new objectmapper(); objectmapper.setvisibility(propertyaccessor.all, jsonautodetect.visibility.any); // 必须设置 否则无法将json转化为对象 会转化成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. 基础常量
package com.xxx.redis.constant; import org.springframework.data.redis.core.script.defaultredisscript; /** * redisconstants * * @author xm.z */ public final class redisconstants { /** * 递增并设置过期时间的 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); /** * 递减并设置过期时间的 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. 接口及实现
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 服务 * * @author xm.z */ public interface redisservice { /** * 获取所有符合指定表达式的 key * @param pattern 表达式 * @return java.util.set * @see <a href="http://redis.io/commands/keys" 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,当值为空时,该 key 对应的 value 为 null * @see <a href="http://redis.io/commands/mget" rel="external nofollow" rel="external nofollow" >mget command</a> */ list<object> mget(collection<string> keys); /** * 批量获取 keys 的属性,并返回一个 map * @param keys keys * @return map,key 和 value 的键值对集合,当 value 获取为 null 时,不存入此 map */ map<string, object> mgettomap(collection<string> keys); /** * 删除属性 * @param key key值 * @return 返回成功 */ boolean del(string key); /** * 批量删除属性 * @param keys key值集合 * @return 返回删除数量 */ long del(collection<string> keys); /** * 设置过期时间 * @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 返回递增后结果 */ long incr(string key, long delta); /** * 按delta递增并设置过期时间 * @param key key值 * @param delta delta值 * @param timeout 过期时间(单位:秒) * @return 返回递增后结果 */ long incrandexpire(string key, long delta, long timeout); /** * 按delta递减 * @param key key值 * @param delta delta值 * @return 返回递减后结果 */ long decr(string key, long delta); /** * 按delta递减并设置过期时间 * @param key key值 * @param delta delta值 * @param timeout 过期时间(单位:秒) * @return 返回递减后结果 */ long decrandexpire(string key, long delta, long timeout); /** * 获取hash结构中的属性 * @param key 外部key值 * @param hashkey 内部key值 * @return 返回内部key的value */ object hget(string key, string hashkey); /** * 向hash结构中放入一个属性 * @param key 外部key * @param hashkey 内部key * @param value 内部key的value * @param time 过期时间 * @return 返回是否成功 */ boolean hset(string key, string hashkey, object value, long time); /** * 向hash结构中放入一个属性 * @param key 外部key * @param hashkey 内部key * @param value 内部key的value */ void hset(string key, string hashkey, object value); /** * 直接获取整个hash结构 * @param key 外部key值 * @return 返回hashmap */ map<object, object> hgetall(string key); /** * 直接设置整个hash结构 * @param key 外部key * @param map hashmap值 * @param time 过期时间 * @return 返回是否成功 */ boolean hsetall(string key, map<string, object> map, long time); /** * 直接设置整个hash结构 * @param key 外部key * @param map hashmap值 */ void hsetall(string key, map<string, ?> map); /** * 删除hash结构中的属性 * @param key 外部key值 * @param hashkey 内部key值 */ void hdel(string key, object... hashkey); /** * 判断hash结构中是否有该属性 * @param key 外部key * @param hashkey 内部key * @return 返回是否存在 */ boolean hhaskey(string key, string hashkey); /** * hash结构中属性递增 * @param key 外部key * @param hashkey 内部key * @param delta 递增条件 * @return 返回递增后的数据 */ long hincr(string key, string hashkey, long delta); /** * hash结构中属性递减 * @param key 外部key * @param hashkey 内部key * @param delta 递增条件 * @return 返回递减后的数据 */ long hdecr(string key, string hashkey, long delta); /** * 获取set结构 * @param key key * @return 返回set集合 */ set<object> smembers(string key); /** * 向set结构中添加属性 * @param key key * @param values value集 * @return 返回增加数量 */ long sadd(string key, object... values); /** * 向set结构中添加属性 * @param key key * @param time 过期时间 * @param values 值集合 * @return 返回添加的数量 */ long sadd(string key, long time, object... values); /** * 是否为set中的属性 * @param key key * @param value value * @return 返回是否存在 */ boolean sismember(string key, object value); /** * 获取set结构的长度 * @param key key * @return 返回长度 */ long ssize(string key); /** * 删除set结构中的属性 * @param key key * @param values value集合 * @return 删除掉的数据量 */ long sremove(string key, object... values); /** * 获取list结构中的属性 * @param key key * @param start 开始 * @param end 结束 * @return 返回查询的集合 */ list<object> lrange(string key, long start, long end); /** * 获取list结构的长度 * @param key key * @return 长度 */ long lsize(string key); /** * 根据索引获取list中的属性 * @param key key * @param index 索引 * @return 对象 */ object lindex(string key, long index); /** * 向list结构中添加属性 * @param key key * @param value value * @return 增加后的长度 */ long lpush(string key, object value); /** * 向list结构中添加属性 * @param key key * @param value value * @param time 过期时间 * @return 增加后的长度 */ long lpush(string key, object value, long time); /** * 向list结构中批量添加属性 * @param key key * @param values value 集合 * @return 增加后的长度 */ long lpushall(string key, object... values); /** * 向list结构中批量添加属性 * @param key key * @param time 过期时间 * @param values value集合 * @return 增加后的长度 */ long lpushall(string key, long time, object... values); /** * 从list结构中移除属性 * @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 状态 * @return 结果 */ boolean bitadd(string key, int offset, boolean b); /** * 从bitmap中获取偏移量的值 * @param key key * @param offset 偏移量 * @return 结果 */ 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 以二进制字节数组返回 */ byte[] bitgetall(string key); /** * 增加坐标 * @param key key * @param x x * @param y y * @param name 地点名称 * @return 返回结果 */ long geoadd(string key, double x, double y, string name); /** * 根据城市名称获取坐标集合 * @param key key * @param place 地点 * @return 坐标集合 */ 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 排序规则 * @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; /** * 默认 redis 服务实现 * * @author xm.z */ @requiredargsconstructor public class defaultredisserviceimpl extends abstractredisservice { private final redistemplate<string, object> redistemplate; /** * 获取所有符合指定表达式的 key * @param pattern 表达式 * @return java.util.set * @see <a href="http://redis.io/commands/keys" 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,当值为空时,该 key 对应的 value 为 null * @see <a href="http://redis.io/commands/mget" 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 的键值对集合,当 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 返回删除数量 */ @override public long del(collection<string> keys) { return redistemplate.delete(keys); } /** * 设置过期时间 * @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 返回递增后结果 */ @override public long incr(string key, long delta) { return valueops().increment(key, delta); } /** * 按delta递增并设置过期时间 * @param key key值 * @param delta delta值 * @param timeout 过期时间(单位:秒) * @return 返回递增后结果 */ @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 返回递减后结果 */ @override public long decr(string key, long delta) { return valueops().decrement(key, delta); } /** * 按delta递减并设置过期时间 * @param key key值 * @param delta delta值 * @param timeout 过期时间(单位:秒) * @return 返回递减后结果 */ @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结构中的属性 * @param key 外部key值 * @param hashkey 内部key值 * @return 返回内部key的value */ @override public object hget(string key, string hashkey) { return hashops().get(key, hashkey); } /** * 向hash结构中放入一个属性 * @param key 外部key * @param hashkey 内部key * @param value 内部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结构中放入一个属性 * @param key 外部key * @param hashkey 内部key * @param value 内部key的value */ @override public void hset(string key, string hashkey, object value) { hashops().put(key, hashkey, value); } /** * 直接获取整个hash结构 * @param key 外部key值 * @return 返回hashmap */ @override public map<object, object> hgetall(string key) { return hashops().entries(key); } /** * 直接设置整个hash结构 * @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); } /** * 直接设置整个hash结构 * @param key 外部key * @param map hashmap值 */ @override public void hsetall(string key, map<string, ?> map) { hashops().putall(key, map); } /** * 删除hash结构中的属性 * @param key 外部key值 * @param hashkey 内部key值 */ @override public void hdel(string key, object... hashkey) { hashops().delete(key, hashkey); } /** * 判断hash结构中是否有该属性 * @param key 外部key * @param hashkey 内部key * @return 返回是否存在 */ @override public boolean hhaskey(string key, string hashkey) { return hashops().haskey(key, hashkey); } /** * hash结构中属性递增 * @param key 外部key * @param hashkey 内部key * @param delta 递增条件 * @return 返回递增后的数据 */ @override public long hincr(string key, string hashkey, long delta) { return hashops().increment(key, hashkey, delta); } /** * hash结构中属性递减 * @param key 外部key * @param hashkey 内部key * @param delta 递增条件 * @return 返回递减后的数据 */ @override public long hdecr(string key, string hashkey, long delta) { return hashops().increment(key, hashkey, -delta); } /** * 获取set结构 * @param key key * @return 返回set集合 */ @override public set<object> smembers(string key) { return setops().members(key); } /** * 向set结构中添加属性 * @param key key * @param values value集 * @return 返回增加数量 */ @override public long sadd(string key, object... values) { return setops().add(key, values); } /** * 向set结构中添加属性 * @param key key * @param time 过期时间 * @param values 值集合 * @return 返回添加的数量 */ @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结构的长度 * @param key key * @return 返回长度 */ @override public long ssize(string key) { return setops().size(key); } /** * 删除set结构中的属性 * @param key key * @param values value集合 * @return 删除掉的数据量 */ @override public long sremove(string key, object... values) { return setops().remove(key, values); } /** * 获取list结构中的属性 * @param key key * @param start 开始 * @param end 结束 * @return 返回查询的集合 */ @override public list<object> lrange(string key, long start, long end) { return listops().range(key, start, end); } /** * 获取list结构的长度 * @param key key * @return 长度 */ @override public long lsize(string key) { return listops().size(key); } /** * 根据索引获取list中的属性 * @param key key * @param index 索引 * @return 对象 */ @override public object lindex(string key, long index) { return listops().index(key, index); } /** * 向list结构中添加属性 * @param key key * @param value value * @return 增加后的长度 */ @override public long lpush(string key, object value) { return listops().rightpush(key, value); } /** * 向list结构中添加属性 * @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结构中批量添加属性 * @param key key * @param values value 集合 * @return 增加后的长度 */ @override public long lpushall(string key, object... values) { return listops().rightpushall(key, values); } /** * 向list结构中批量添加属性 * @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结构中移除属性 * @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 状态 * @return 结果 */ @override public boolean bitadd(string key, int offset, boolean b) { return valueops().setbit(key, offset, b); } /** * 从bitmap中获取偏移量的值 * @param key key * @param offset 偏移量 * @return 结果 */ @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 以二进制字节数组返回 */ @override public byte[] bitgetall(string key) { return redistemplate.execute((rediscallback<byte[]>) con -> con.get(key.getbytes())); } /** * 增加坐标 * @param key key * @param x x * @param y y * @param name 地点名称 * @return 返回结果 */ @override public long geoadd(string key, double x, double y, string name) { return geoops().add(key, new point(x, y), name); } /** * 根据城市名称获取坐标集合 * @param key key * @param place 地点 * @return 坐标集合 */ @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 排序规则 * @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; } }
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持代码网。
发表评论