pom.xml
<dependency>
<groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-data-redisartifactId> dependency> <dependency> <groupId>org.springframework.bootgroupId> <artifactId>spring-boot-starter-webartifactId> dependency> <dependency> <groupId>redis.clientsgroupId> <artifactId>jedisartifactId> <version>2.9.0version> dependency> <dependency> <groupId>com.dyuproject.protostuffgroupId> <artifactId>protostuff-coreartifactId> <version>1.1.3version> dependency> <dependency> <groupId>com.dyuproject.protostuffgroupId> <artifactId>protostuff-runtimeartifactId> <version>1.1.3version> dependency> <dependency> <groupId>com.alibabagroupId> <artifactId>fastjsonartifactId> <version>1.2.47version> dependency>
redis.properties
#redis地址 redis.host=127.0.0.1 #redis端口号 redis.port=6379 #redis的密码 redis.auth=test #是否使用JedisPool默认的配置,确定true,默认true defaultSetting=false; #jedisPool的timeout时间,默认2000 connectionTimeOut=2000 #连接耗尽时是否阻塞,false报异常,ture阻塞直到超时,默认true redis.blockWhenExhausted=true #设置的逐出策略类名, 默认DefaultEvictionPolicy(当连接超过最大空闲时间,或连接数超过最大空闲连接数) redis.evictionPolicyClassName=org.apache.commons.pool2.impl.DefaultEvictionPolicy #是否启用pool的jmx管理功能,默认true redis.jmxEnabled=true #是否启用后进先出,默认true redis.lifo=true #最大空闲连接数,默认8个 redis.maxIdle=8 #最大连接数,默认8个 redis.maxTotal=8 #获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常,小于零:阻塞不确定的时间,默认-1 redis.maxWaitMillis=-1 #逐出连接的最小空闲时间 默认1800000毫秒(30分钟) redis.minEvictableIdleTimeMillis=1800000 #最小空闲连接数,默认0 redis.minIdle=0 #每次逐出检查时 逐出的最大数目 如果为负数就是:1/abs(n),默认3 redis.numTestsPerEvictionRun=3 #对象空闲多久后逐出,当空闲时间>该值 且 空闲连接>最大空闲数时直接逐出,不再根据MinEvictableIdleTimeMillis判断(默认逐出策略) redis.softMinEvictableIdleTimeMillis=1800000 #在获取连接的时候检查有效性,默认false redis.testOnBorrow=false #在空闲时检查有效性,默认false redis.testWhileIdle=false #逐出扫描的时间间隔(毫秒)如果为负数,则不运行逐出线程,默认-1 redus.timeBetweenEvictionRunsMillis=-1
JedisPoolUtil.java
package com.example.demo; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.util.Properties; import org.apache.commons.pool2.impl.GenericObjectPoolConfig; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; public class JedisPoolUtil { private static final String PROPERTIES_PATH = "redis.properties"; private static JedisPool jedisPool; static { if (jedisPool == null) { try { init(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } } /** * 初始化Jedis连接池 * * @throws IOException */ private static void init() throws IOException { URL resource = JedisPoolUtil.class.getClassLoader().getResource(PROPERTIES_PATH); if (resource == null) { throw new FileNotFoundException("没有找到指定redis的配置文件:" + PROPERTIES_PATH); } //加载配置文件 InputStream input = new FileInputStream(resource.getFile()); Properties p = new Properties(); p.load(input); //开始配置JedisPool String host = (p.getProperty("redis.host").trim() == null || "".equals(p.getProperty("redis.host").trim())) ? "localhost" : p.getProperty("redis.host"); int port = (p.getProperty("redis.port").trim() == null || "".equals(p.getProperty("redis.port").trim())) ? 6379 : Integer.parseInt(p.getProperty("redis.port")); String auth = p.getProperty("redis.auth").trim(); int poolTimeOut = (p.getProperty("connectionTimeOut").trim() == null || "".equals(p.getProperty("connectionTimeOut").trim())) ? 2000 : Integer.parseInt(p.getProperty("connectionTimeOut").trim()); //判断使用默认的配置方式还是采用自定义配置方式, boolean isSetDefault = (p.getProperty("defaultSetting").trim() == null || "".equals(p.getProperty("defaultSetting").trim())) ? true : Boolean.parseBoolean(p.getProperty("defaultSetting")); if (isSetDefault) { jedisPool = new JedisPool(new GenericObjectPoolConfig(), host, port, poolTimeOut, auth); } else { JedisPoolConfig config = new JedisPoolConfig(); String blockWhenExhausted = p.getProperty("redis.blockWhenExhausted").trim(); if (blockWhenExhausted != null) { config.setBlockWhenExhausted(Boolean.parseBoolean(blockWhenExhausted)); } String evictionPolicyClassName = p.getProperty("redis.evictionPolicyClassName").trim(); if (evictionPolicyClassName != null) { config.setEvictionPolicyClassName(evictionPolicyClassName); } String jmxEnabled = p.getProperty("redis.jmxEnabled").trim(); if (jmxEnabled != null) { config.setJmxEnabled(Boolean.parseBoolean(jmxEnabled)); } String lifo = p.getProperty("redis.lifo").trim(); if (lifo != null) { config.setLifo(Boolean.parseBoolean(lifo)); } String maxIdle = p.getProperty("redis.maxIdle"); if (maxIdle != null) { config.setMaxIdle(Integer.parseInt(maxIdle)); } String maxTotal = p.getProperty("redis.maxTotal"); if (maxTotal != null) { config.setMaxTotal(Integer.parseInt(maxTotal)); } String maxWaitMillis = p.getProperty("redis.maxWaitMillis"); if (maxWaitMillis != null) { config.setMaxWaitMillis(Long.parseLong(maxWaitMillis)); } String minEvictableIdleTimeMillis = p.getProperty("redis.minEvictableIdleTimeMillis"); if (minEvictableIdleTimeMillis != null) { config.setMinEvictableIdleTimeMillis(Long.parseLong(minEvictableIdleTimeMillis)); } String minIdle = p.getProperty("redis.minIdle"); if (minIdle != null) { config.setMinIdle(Integer.parseInt(minIdle)); } String numTestsPerEvictionRun = p.getProperty("redis.numTestsPerEvictionRun"); if (numTestsPerEvictionRun != null) { config.setNumTestsPerEvictionRun(Integer.parseInt(numTestsPerEvictionRun)); } String softMinEvictableIdleTimeMillis = p.getProperty("redis.softMinEvictableIdleTimeMillis"); if (softMinEvictableIdleTimeMillis != null) { config.setSoftMinEvictableIdleTimeMillis(Long.parseLong(softMinEvictableIdleTimeMillis)); } String testOnBorrow = p.getProperty("redis.testOnBorrow"); if (testOnBorrow != null) { config.setTestOnBorrow(Boolean.parseBoolean(testOnBorrow)); } String testWhileIdle = p.getProperty("redis.testWhileIdle"); if (testWhileIdle != null) { config.setTestWhileIdle(Boolean.parseBoolean(testWhileIdle)); } String timeBetweenEvictionRunsMillis = p.getProperty("redus.timeBetweenEvictionRunsMillis"); if (timeBetweenEvictionRunsMillis != null) { config.setTimeBetweenEvictionRunsMillis(Long.parseLong(timeBetweenEvictionRunsMillis)); } jedisPool = new JedisPool(config, host, port, poolTimeOut, auth); } } public static Jedis getJedis() { return jedisPool.getResource(); } public static void closeJedis(Jedis jedis) { if (jedis != null) { jedis.close(); } } }
JedisUtil.java
package com.example.demo; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; import com.alibaba.fastjson.JSON; import com.dyuproject.protostuff.LinkedBuffer; import com.dyuproject.protostuff.ProtostuffIOUtil; import com.dyuproject.protostuff.runtime.RuntimeSchema; import redis.clients.jedis.GeoCoordinate; import redis.clients.jedis.GeoRadiusResponse; import redis.clients.jedis.GeoUnit; import redis.clients.jedis.Jedis; import redis.clients.jedis.exceptions.JedisDataException; import redis.clients.jedis.params.geo.GeoRadiusParam; /** * Created by Administrator on 2018/4/15. */ public class JedisUtil{ private static final int DEFAULT_SETEX_TIMEOUT = 60 * 60;// setex的默认时间 /** * 添加一个字符串值,成功返回1,失败返回0 * * @param key * @param value * @return */ public static int set(String key, String value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); if (jedis.set(key, value).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个字符串值,成功返回1,失败返回0,默认缓存时间为1小时,以本类的常量DEFAULT_SETEX_TIMEOUT为准 * * @param key * @param value * @return */ public static int setEx(String key, String value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); if (jedis.setex(key, DEFAULT_SETEX_TIMEOUT, value).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个字符串值,成功返回1,失败返回0,缓存时间以timeout为准,单位秒 * * @param key * @param value * @param timeout * @return */ public static int setEx(String key, String value, int timeout) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); if (jedis.setex(key, timeout, value).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个指定类型的对象,成功返回1,失败返回0 * * @param key * @param value * @return */ public static <T> int set(String key, T value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); byte[] data = enSeri(value); if (jedis.set(key.getBytes(), data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个指定类型的对象,成功返回1,失败返回0,默认缓存时间为1小时,以本类的常量DEFAULT_SETEX_TIMEOUT为准 * * @param key * @param value * @return */ public static <T> int setEx(String key, T value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); byte[] data = enSeri(value); if (jedis.setex(key.getBytes(), DEFAULT_SETEX_TIMEOUT, data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个指定类型的对象,成功返回1,失败返回0,缓存时间以timeout为准,单位秒 * * @param key * @param value * @param timeout * @return */ public static <T> int setEx(String key, T value, int timeout) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); byte[] data = enSeri(value); if (jedis.setex(key.getBytes(), timeout, data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 将一个数值+1,成功返回+后的结果,失败返回null * * @param key * @return * @throws JedisDataException */ public static Long incr(String key) throws JedisDataException { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.incr(key); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 将一个数值+n,成功返回+后的结果,失败返回null * * @param key * @return * @throws JedisDataException */ public static Long incrBy(String key, long integer) throws JedisDataException { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.incrBy(key,integer); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 将一个数值-1,成功返回-后的结果,失败返回null * * @param key * @return * @throws JedisDataException */ public static Long decr(String key) throws JedisDataException { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.decr(key); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 将一个数值-n,成功返回-后的结果,失败返回null * * @param key * @return * @throws JedisDataException */ public static Long decrBy(String key,long integer) throws JedisDataException { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.decrBy(key, integer); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个字符串值到list中,,成功返回1,失败返回0 * * @param key * @param value * @return */ public static int setList(String key, String... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Long result = jedis.rpush(key, value); if (result != null && result != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个字符串值到list中,全部list的key默认缓存时间为1小时,成功返回1,失败返回0 * * @param key * @param value * @return */ public static int setExList(String key, String... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Long result = jedis.rpush(key, value); jedis.expire(key, DEFAULT_SETEX_TIMEOUT); if (result != null && result != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个字符串值到list中,全部list的key缓存时间为timeOut,单位为秒,成功返回1,失败返回0 * * @param key * @param value * @return */ public static int setExList(String key, int timeOut, String... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Long result = jedis.rpush(key, value); jedis.expire(key, timeOut); if (result != null && result != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个类型对象值到list中,成功返回1,失败返回0 * * @param key * @param value * @return */ @SafeVarargs public static <T> int setList(String key, T... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); int res = 0; for (T t : value) { byte[] data = enSeri(t); Long result = jedis.rpush(key.getBytes(), data); if (result != null && result != 0) { res++; } } if (res != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个 类型对象值到list中,全部list的key默认缓存时间为1小时,成功返回1,失败返回0 * * @param key * @param value * @return */ @SafeVarargs public static <T> int setExList(String key, T... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); int res = 0; for (T t : value) { byte[] data = enSeri(t); Long result = jedis.rpush(key.getBytes(), data); if (result != null && result != 0) { res++; } } jedis.expire(key, DEFAULT_SETEX_TIMEOUT); if (res != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个 类型对象值到list中,全部list的key缓存时间为timeOut,单位秒,成功返回1,失败返回0 * * @param key * @param value * @return */ @SafeVarargs public static <T> int setExList(String key, int timeOut, T... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); int res = 0; for (T t : value) { byte[] data = enSeri(t); Long result = jedis.rpush(key.getBytes(), data); if (result != null && result != 0) { res++; } } jedis.expire(key, timeOut); if (res != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个List集合成功返回1,失败返回0 * * @param key * @param value * @return * @throws IOException * @throws RuntimeException */ public static <T> int setList(String key, List<T> value) throws RuntimeException, IOException { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); byte[] data = enSeriList(value); if (jedis.set(key.getBytes(), data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个List 集合,成功返回1,失败返回0,默认缓存时间为1小时,以本类的常量DEFAULT_SETEX_TIMEOUT为准 * * @param key * @param value * @return * @throws IOException * @throws RuntimeException */ public static <T> int setExList(String key, List<T> value) throws RuntimeException, IOException { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); byte[] data = enSeriList(value); if (jedis.setex(key.getBytes(), DEFAULT_SETEX_TIMEOUT, data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个List 集合,成功返回1,失败返回0,缓存时间以timeout为准,单位秒 * * @param key * @param value * @param timeout * @return * @throws IOException * @throws RuntimeException */ public static <T> int setExList(String key, List<T> value, int timeout) throws RuntimeException, IOException { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); byte[] data = enSeriList(value); if (jedis.setex(key.getBytes(), timeout, data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个字符串到set,如果key存在就在就最追加,如果key不存在就创建,成功返回1,失败或者没有受影响返回0 * * @param key * @param value * @return */ public static int setSet(String key, String... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Long result = jedis.sadd(key, value); if (result != null && result != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个字符串set,如果key存在就在就最追加,整个set的key默认一小时后过期,如果key存在就在可以种继续添加,如果key不存在就创建,成功返回1,失败或者没有受影响返回0 * * @param key * @param value * @return */ public static int setExSet(String key, String... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Long result = jedis.sadd(key, value); jedis.expire(key, DEFAULT_SETEX_TIMEOUT); if (result != null && result != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个字符串set,如果key存在就在就最追加,整个set的key有效时间为timeOut时间,单位秒,如果key存在就在可以种继续添加,如果key不存在就创建,,成功返回1,失败或者没有受影响返回0 * * @param key * @param value * @return */ public static int setExSet(String key, int timeOut, String... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Long result = jedis.sadd(key, value); jedis.expire(key, timeOut); if (result != null && result != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个 类型到set集合,如果key存在就在就最追加,成功返回1,失败或者没有受影响返回0 * * @param key * @param value * @return */ @SafeVarargs public static <T> int setSet(String key, T... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); int res = 0; for (T t : value) { byte[] data = enSeri(t); Long result = jedis.sadd(key.getBytes(), data); if (result != null && result != 0) { res++; } } if (res != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个 类型到set集合,如果key存在就在就最追加,整个set的key默认有效时间为1小时,成功返回1,失败或者没有受影响返回0 * * @param key * @param value * @return */ @SafeVarargs public static <T> int setExSet(String key, T... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); int res = 0; for (T t : value) { byte[] data = enSeri(t); Long result = jedis.sadd(key.getBytes(), data); if (result != null && result != 0) { res++; } } jedis.expire(key, DEFAULT_SETEX_TIMEOUT); if (res != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个 类型到set集合,如果key存在就在就最追加,整个set的key有效时间为timeOut,单位秒,成功返回1,失败或者没有受影响返回0 * * @param key * @param value * @return */ @SafeVarargs public static <T> int setExSet(String key, int timeOut, T... value) { if (isValueNull(key, value)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); int res = 0; for (T t : value) { byte[] data = enSeri(t); Long result = jedis.sadd(key.getBytes(), data); if (result != null && result != 0) { res++; } } jedis.expire(key, timeOut); if (res != 0) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 添加一个Map , V>集合,成功返回1,失败返回0 * * @param key * @param value * @return */ public static <K, V> int setMap(String key, Map<K, V> value) { if (value == null || key == null || "".equals(key)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); String data = JSON.toJSONString(value); if (jedis.set(key, data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个Map , V>集合,成功返回1,失败返回0,默认缓存时间为1小时,以本类的常量DEFAULT_SETEX_TIMEOUT为准 * * @param key * @param value * @return */ public static <K, V> int setExMap(String key, Map<K, V> value) { if (value == null || key == null || "".equals(key)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); String data = JSON.toJSONString(value); if (jedis.setex(key, DEFAULT_SETEX_TIMEOUT, data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 缓存一个Map , V>集合,成功返回1,失败返回0,缓存时间以timeout为准,单位秒 * * @param key * @param value * @param timeout * @return */ public static <K, V> int setExMap(String key, Map<K, V> value, int timeout) { if (value == null || key == null || "".equals(key)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); String data = JSON.toJSONString(value); if (jedis.setex(key, timeout, data).equalsIgnoreCase("ok")) { return 1; } else { return 0; } } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获取一个字符串值 * * @param key * @return */ public static String get(String key) { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.get(key); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得一个指定类型的对象 * * @param key * @param clazz * @return */ public static <T> T get(String key, Class<T> clazz) { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); byte[] data = jedis.get(key.getBytes()); T result = deSeri(data, clazz); return result; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得一个字符串集合,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 * 表示列表的第二个元素,以此类推。 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 * * @param key * @param start * @param end * @return */ public static List getList(String key, long start, long end) { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); List result = jedis.lrange(key, start, end); return result; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得一个 类型的对象集合,区间以偏移量 START 和 END 指定。 其中 0 表示列表的第一个元素, 1 表示列表的第二个元素,以此类推。 * 你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。 * * @param key * @param start * @param end * @return */ public static <T> List<T> getList(String key, long start, long end, Class<T> clazz) { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); List<byte[]> lrange = jedis.lrange(key.getBytes(), start, end); List<T> result = null; if (lrange != null) { for (byte[] data : lrange) { if (result == null) { result = new ArrayList<>(); } result.add(deSeri(data, clazz)); } } return result; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得list中存了多少个值 * * @return */ public static long getListCount(String key) { if (isValueNull(key)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.llen(key); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得一个List 的集合, * * @param key 键 * @param clazz 返回集合的类型 * @return * @throws IOException */ public static <T> List<T> getList(String key, Class<T> clazz) throws IOException { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); byte[] data = jedis.get(key.getBytes()); List<T> result = deSeriList(data, clazz); return result; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得一个字符串set集合 * * @param key * @return */ public static Set getSet(String key) { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Set result = jedis.smembers(key); return result; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得一个字符串set集合 * * @param key * @return */ public static <T> Set<T> getSet(String key, Class<T> clazz) { if (isValueNull(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Set<byte[]> smembers = jedis.smembers(key.getBytes()); Set<T> result = null; if (smembers != null) { for (byte[] data : smembers) { if (result == null) { result = new HashSet<>(); } result.add(deSeri(data, clazz)); } } return result; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得集合中存在多少个值 * * @param key * @return */ public static long getSetCount(String key) { if (isValueNull(key)) { return 0; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.scard(key); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获得一个Map ,k>的集合 * * @param key * @param v * @param k * @return */ public static <K, V> Map<K, V> getMap(String key, Class<K> k, Class<V> v) { if (key == null || "".equals(key)) { return null; } Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); String data = jedis.get(key); @SuppressWarnings("unchecked") Map<K, V> result = (Map<K, V>) JSON.parseObject(data); return result; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 判斷key是否存在 * @param key * @return */ public static boolean exists(String key){ Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.exists(key); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 判斷key是否存在 * @param keys * @return */ public static Long exists(String... keys){ Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.exists(keys); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 删除一个值 * * @param key */ public static void del(String... key) { Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); for (int i = 0; i < key.length; i++) { jedis.del(key); } } finally { JedisPoolUtil.closeJedis(jedis); } } // --------------------------公用方法区------------------------------------ /** * 检查值是否为null,如果为null返回true,不为null返回false * * @param obj * @return */ private static boolean isValueNull(Object... obj) { for (int i = 0; i < obj.length; i++) { if (obj[i] == null || "".equals(obj[i])) { return true; } } return false; } /** * 序列化一个对象 * * @param value * @return */ private static <T> byte[] enSeri(T value) { @SuppressWarnings("unchecked") RuntimeSchema<T> schema = (RuntimeSchema<T>) RuntimeSchema.createFrom(value.getClass()); byte[] data = ProtostuffIOUtil.toByteArray(value, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); return data; } /** * 反序列化一个对象 * * @param data * @param clazz * @return */ private static <T> T deSeri(byte[] data, Class<T> clazz) { if (data == null || data.length == 0) { return null; } RuntimeSchema<T> schema = RuntimeSchema.createFrom(clazz); T result = schema.newMessage(); ProtostuffIOUtil.mergeFrom(data, result, schema); return result; } /** * 序列化List集合 * * @param list * @return * @throws IOException */ private static <T> byte[] enSeriList(List<T> list) throws RuntimeException, IOException { if (list == null || list.size() == 0) { throw new RuntimeException("集合不能为空!"); } @SuppressWarnings("unchecked") RuntimeSchema<T> schema = (RuntimeSchema<T>) RuntimeSchema.getSchema(list.get(0).getClass()); ByteArrayOutputStream out = new ByteArrayOutputStream(); ProtostuffIOUtil.writeListTo(out, list, schema, LinkedBuffer.allocate(LinkedBuffer.DEFAULT_BUFFER_SIZE)); byte[] byteArray = out.toByteArray(); return byteArray; } /** * 反序列化List集合 * * @param data * @param clazz * @return * @throws IOException */ private static <T> List<T> deSeriList(byte[] data, Class<T> clazz) throws IOException { if (data == null || data.length == 0) { return null; } RuntimeSchema<T> schema = RuntimeSchema.createFrom(clazz); List<T> result = ProtostuffIOUtil.parseListFrom(new ByteArrayInputStream(data), schema); return result; } //----------------------geo start------------------------------------------ /** * 增加地理位置的坐标 * * @param key * @param coordinate * @param member * @return Long */ public static Long geoadd(String key, GeoCoordinate coordinate, String member) { Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.geoadd(key, coordinate.getLongitude(), coordinate.getLatitude(), member); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 批量添加地理位置 * * @param key * @param memberCoordinateMap * @return Long */ public static Long geoadd(String key, Map memberCoordinateMap) { Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.geoadd(key, memberCoordinateMap); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 根据给定地理位置坐标获取指定范围内的地理位置集合(返回匹配位置的经纬度 + 匹配位置与给定地理位置的距离 + 从近到远排序,) * * @param key * @param coordinate * @param radius * @return List<GeoRadiusResponse> */ public static List geoRadius(String key, GeoCoordinate coordinate, double radius) { Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.georadius(key, coordinate.getLongitude(), coordinate.getLatitude(), radius, GeoUnit.KM, GeoRadiusParam.geoRadiusParam().withDist().withCoord().sortAscending()); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 根据给定地理位置获取指定范围内的地理位置集合(返回匹配位置的经纬度 + 匹配位置与给定地理位置的距离 + 从近到远排序,) * * @param key * @param member * @param radius * @return List<GeoRadiusResponse> */ public List georadiusByMember(String key, String member, double radius) { Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); return jedis.georadiusByMember(key, member, radius, GeoUnit.KM, GeoRadiusParam.geoRadiusParam().withDist().withCoord().sortAscending()); } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 查询2位置距离 * * @param key * @param member1 * @param member2 * @param unit * @return Double */ public static Double geoDist(String key, String member1, String member2, GeoUnit unit) { Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); Double dist = jedis.geodist(key, member1, member2, unit); return dist; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 查询位置的geohash * * @param key * @param members * @return List<String> */ public static List geoHash(String key, String... members) { Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); List resultList = jedis.geohash(key, members); return resultList; } finally { JedisPoolUtil.closeJedis(jedis); } } /** * 获取地理位置的坐标 * * @param key * @param member * @return List<GeoCoordinate> */ public static List geopos(String key, String... member) { Jedis jedis = null; try { jedis = JedisPoolUtil.getJedis(); List result = jedis.geopos(key, member); return result; } finally { JedisPoolUtil.closeJedis(jedis); } } /* * 添加geo * @param key * @param longitude * @param latitude * @param name 位置名称 * @return */ /*public Long geoADD(String key,double longitude,double latitude,String eleName){ String[] params = new String[]{key,String.valueOf(longitude),String.valueOf(latitude),eleName}; int keyCount = 4; return (Long)jedis.eval("return redis.call('GEOADD',KEYS[1],KEYS[2],KEYS[3],KEYS[4])", keyCount,params); }*/ /** * 查询2位置距离 * @param key * @param d1 * @param d2 * @param unit * @return */ /*public Double geoDist(String key,String d1,String d2,String unit){ return Double.valueOf((String)jedis.eval("return redis.call('GEODIST',KEYS[1],KEYS[2],KEYS[3],KEYS[4])",4, key,d1,d2,unit)); }*/ /** * 查询位置的geohash * @param key * @param dName * @return */ /*public String geoHash(String key,String dName){ Object data = jedis.eval("return redis.call('GEOHASH',KEYS[1],KEYS[2])", 2, new String[]{key,dName});//GEOPOS 也可以? List resultList = (List)data; if(resultList!=null&&resultList.size() > 0){ return (String)resultList.get(0); } return null; }*/ /** * 查询位置坐标 * @param key * @param dName * @return */ /* public List geoPos(String key,String dName){ Object data = jedis.eval("return redis.call('GEOPOS',KEYS[1],KEYS[2])", 2, key,dName); List resultList = (List
if(resultList!=null&&resultList.size() > 0){ return resultList.get(0); } return null; }*/ /** * 查询附近坐标地址 * @param key * @param longitude * @param latitude * @param unit * @param asc * @return */ /*public List geoRadius(String key,double longitude,double latitude,int radius,String unit,boolean asc){ Object data = jedis.eval("return redis.call('GEORADIUS',KEYS[1],KEYS[2],KEYS[3],KEYS[4],KEYS[5],KEYS[6])", 6, key,String.valueOf(longitude), String.valueOf(latitude),String.valueOf(radius),unit,asc?"ASC":"DESC"); return (List)data; }*/ /** * 附近的成员们,根据距离 * * 根据位置查询附近点 * @param key * @param dName * @param unit * @param asc * @return */ /* public List geoNearByMembersByDistance(String key,String dName,int radius,String unit,boolean asc){ Object data = jedis.eval("return redis.call('GEORADIUSBYMEMBER',KEYS[1],KEYS[2],KEYS[3],KEYS[4],KEYS[5])", 5, key,dName,String.valueOf(radius),unit,asc?"ASC":"DESC"); return (List)data; }*/ //------------------------------geo end--------------------------------------- })data;