类定义的时候使用泛型,可以使里面的成员方法,灵活的变成调用地方传入的类型
应用:
package com.houbank.incoming.service.impl; import com.houbank.incoming.service.redis.RedisTemplateDelegate; import org.springframework.beans.factory.annotation.Autowired; import com.alibaba.dubbo.config.annotation.Service; import com.houbank.basic.util.redis.RedisClient; import com.houbank.basic.util.redis.exception.RedisAccessException; import com.houbank.incoming.api.CacheFacade; import com.houbank.incoming.service.processor.cache.CodeLibaryCacheManage; import com.houbank.incoming.service.processor.cache.CoreBusinessTypeCacheManage; import com.houbank.incoming.service.processor.cache.OrgInfoCacheManage; import com.houbank.incoming.service.processor.cache.ProvinceCityCacheManage; import java.util.concurrent.TimeUnit; /** * * <p>缓存操作实现</p> * @author houzhanshan * @version $Id: CacheFacadeImp.java, v 0.1 2017年6月15日 下午6:29:25 Exp $ */ @Service public class CacheFacadeImp implements CacheFacade { @Autowired private RedisTemplateDelegate redisTemplateDelegate; @Autowired private CodeLibaryCacheManage codeLibaryCacheManage; @Autowired private CoreBusinessTypeCacheManage coreBusinessTypeCacheManage; @Autowired private ProvinceCityCacheManage provinceCityCacheManage; @Autowired private OrgInfoCacheManage orgInfoCacheManage; /** * 初始化指定表的缓存 */ @Override public void initAllCacheKey() { //codeLibaryCacheManage.initCache(); //coreBusinessTypeCacheManage.initCache(); //orgInfoCacheManage.initCache(); provinceCityCacheManage.initCache(); } @Override public void del(String key) throws RedisAccessException { // return redisClient.del(key); redisTemplateDelegate.delete(key); } @Override public void set(String key, String value) throws RedisAccessException { // return redisClient.set(key, value); redisTemplateDelegate.set(key, value); } @Override public Object get(String key) throws RedisAccessException { // return redisClient.get(key); return redisTemplateDelegate.get(key); } @Override public void set(String key, String value, int timeout) throws RedisAccessException { // return redisClient.set(key, value,timeout); redisTemplateDelegate.set(key, value,timeout); } @Override public void setObject(String key, Object object) throws RedisAccessException { // return redisClient.setObject(key, object); redisTemplateDelegate.set(key, object); } @Override public void setObject(String key, Object object, int timeout) throws RedisAccessException { // return redisClient.setObject(key, object,timeout); redisTemplateDelegate.set(key, object,timeout, TimeUnit.MINUTES); } @Override public Object getObject(String key) throws RedisAccessException { // return redisClient.getObject(key); return redisTemplateDelegate.get(key); } }
模板:
package com.houbank.incoming.service.redis; import lombok.extern.log4j.Log4j2; import org.apache.commons.lang.StringUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.data.redis.connection.DataType; import org.springframework.data.redis.connection.MessageListener; import org.springframework.data.redis.core.RedisConnectionUtils; import org.springframework.data.redis.core.RedisTemplate; import org.springframework.data.redis.core.ValueOperations; import org.springframework.data.redis.serializer.RedisSerializer; import org.springframework.data.redis.serializer.StringRedisSerializer; import redis.clients.jedis.Jedis; import redis.clients.jedis.JedisMonitor; import java.io.File; import java.io.FileOutputStream; import java.io.OutputStreamWriter; import java.io.UnsupportedEncodingException; import java.util.*; import java.util.concurrent.TimeUnit; /** * * <p>redis模板代理类</p> * @author houzhanshan * @version $Id: RedisTemplateDelegate.java, v 0.1 2017年5月26日 下午11:40:13 houzhanshan Exp $ */ @Log4j2 public class RedisTemplateDelegate<K,V> { private static final String LINE_SEPARATOR = System.getProperty("line.separator"); private static final String DEFAULT_CHARSET = "utf-8"; private static final byte[][] EMPTY_2D_BYTE_ARRAY = new byte[0][]; private static Logger log= LoggerFactory.getLogger(RedisTemplateDelegate.class); private RedisTemplate<String, V> redisTemplate; private ValueOperations<String, V> valueOperations; public void setRedisTemplate(RedisTemplate<String, V> redisTemplate) { this.redisTemplate = redisTemplate; this.valueOperations = redisTemplate.opsForValue(); RedisSerializer<String> stringSerializer = new StringRedisSerializer(); this.redisTemplate.setKeySerializer(stringSerializer); // this.redisTemplate.setHashKeySerializer(stringSerializer); } public void set(String key, V value) { valueOperations.set(key, value); } public boolean set(String key, V value, long timeout, TimeUnit unit) { try { valueOperations.set(key, value, timeout, unit); // redisTemplate.getConnectionFactory().getConnection().close(); } catch (Throwable e) { log.error("", e); return false; } return true; } public Boolean setIfAbsent(String key, V value) { return valueOperations.setIfAbsent(key, value); } public void multiSet(Map<? extends String, ? extends V> m) {//MSET valueOperations.multiSet(m); } public Boolean multiSetIfAbsent(Map<? extends String, ? extends V> m) { return valueOperations.multiSetIfAbsent(m); } public V get(String key) { // V temp=null; // try { return valueOperations.get(key); // }catch (Exception e){ // // }finally { // redisTemplate.getConnectionFactory().getConnection().close(); // } // return temp; } public V getAndSet(String key, V value) {//GETSET return valueOperations.getAndSet(key, value); } public List<V> multiGet(Collection<String> keys) {//MGET return valueOperations.multiGet(keys); } public Map<String, V> multiGetMap(List<String> keys) { int size = 0; if (keys == null || (size = keys.size()) <= 0) { return new HashMap<String, V>(); } Map<String, V> kvMap = new HashMap<String, V>(); List<V> values = valueOperations.multiGet(keys); for (int i = 0; i < size; i++) { kvMap.put(keys.get(i), values.get(i)); } return kvMap; } public Long increment(String key, long delta) { return valueOperations.increment(key, delta); } public Double increment(String key, double delta) { return valueOperations.increment(key, delta); } public Integer append(String key, String value) { return valueOperations.append(key, value); } public String get(String key, long start, long end) { return valueOperations.get(key, start, end); } public void set(String key, V value, long offset) { valueOperations.set(key, value, offset); } public Long size(String key) { return valueOperations.size(key); } public Boolean setBit(String key, long offset, boolean value) { return valueOperations.setBit(key, offset, value); } public Boolean getBit(String key, long offset) { return valueOperations.getBit(key, offset); } public void delete(String key) { this.redisTemplate.delete(key); } public void delete(Collection<String> keys) { this.redisTemplate.delete(keys); } public void remove(String key) { this.delete(key); } public void remove(Collection<String> keys) { this.delete(keys); } public Boolean hasKey(String key) { return this.redisTemplate.hasKey(key); } public Boolean persist(String key) { return this.redisTemplate.persist(key); } public Boolean expire(String key, final long timeout, final TimeUnit unit) { return this.redisTemplate.expire(key, timeout, unit); } public Boolean expireAt(String key, final Date date) { return this.redisTemplate.expireAt(key, date); } public Long getExpire(String key) { return this.redisTemplate.getExpire(key); } public Long getExpire(String key, final TimeUnit timeUnit) { return this.redisTemplate.getExpire(key, timeUnit); } public Boolean move(String key, final int dbIndex) { return this.redisTemplate.move(key, dbIndex); } public String randomKey() { return this.redisTemplate.randomKey(); } public void rename(String oldKey, String newKey) { this.redisTemplate.rename(oldKey, newKey); } public Boolean renameIfAbsent(String oldKey, String newKey) { return this.redisTemplate.renameIfAbsent(oldKey, newKey); } public DataType type(String key) { return this.redisTemplate.type(key); } public void restore(String key, final byte[] value, long timeToLive, TimeUnit unit) { this.redisTemplate.restore(key, value, timeToLive, unit); } public void publish(String channel, Object message) { redisTemplate.convertAndSend(channel, message); } /* private void multi() { this.redisTemplate.multi(); } private void discard() { this.redisTemplate.discard(); } private List<Object> exec() { return this.redisTemplate.exec(); }*/ /* public void multiSet(Map<? extends String, ? extends V> m, long timeout, TimeUnit unit) { transaction(new Executor<Object>() { @Override public Object run() { valueOperations.multiSet(m); for (String key : m.keySet()) { expire(key, timeout, unit); } return null; } }); }*/ public void monitor(String regex) { monitor(null, regex); } public void monitor(File file) { monitor(file, null); } public void monitor(File file, final String regex) { OutputStreamWriter osw = null; try { if (file != null) { osw = new OutputStreamWriter(new FileOutputStream(file), DEFAULT_CHARSET); } final OutputStreamWriter oswInner = osw; monitor(new JedisMonitor() { public void onCommand(String command) { //command example: 1489465990.254438 [0 127.0.0.1:53010] "set" "aaa" "bbb" String realCommand = command.substring(command.indexOf("]") + 2); if ((StringUtils.isNotEmpty(regex) && realCommand.matches(regex)) || (StringUtils.isEmpty(regex))) { System.out.println(command); if (oswInner != null) { try { oswInner.write(command + LINE_SEPARATOR); oswInner.flush(); } catch (Throwable e) { log.error("", e); } } } } }); } catch (Throwable e) { log.error("", e); } finally { try { if (osw != null) { osw.flush(); osw.close(); } } catch (Throwable e) { } } } public void monitor() { monitor(new JedisMonitor() { public void onCommand(String command) { System.out.println(command); } }); } public void monitor(final JedisMonitor jedisMonitor) { Jedis jedis = null; try { Object nativeConn = RedisConnectionUtils.getConnection(this.redisTemplate.getConnectionFactory()).getNativeConnection(); if (nativeConn instanceof Jedis) { jedis = (Jedis) nativeConn; jedis.monitor(jedisMonitor); } } catch (Throwable e) { if (jedis != null) { jedis.close(); } log.error("", e); } } public void subscribe(MessageListener listener, String... channels) { try { RedisConnectionUtils.getConnection(this.redisTemplate.getConnectionFactory()).subscribe(listener, serializeMulti(channels)); } catch (Throwable e) { log.error("", e); } } public void pSubscribe(MessageListener listener, String... patterns) { try { RedisConnectionUtils.getConnection(this.redisTemplate.getConnectionFactory()).pSubscribe(listener, serializeMulti(patterns)); } catch (Throwable e) { log.error("", e); } } private byte[][] serializeMulti(String... keys) throws UnsupportedEncodingException { if (keys == null) { return EMPTY_2D_BYTE_ARRAY; } byte[][] ret = new byte[keys.length][]; for (int i = 0; i < ret.length; i++) { ret[i] = keys[i].getBytes(DEFAULT_CHARSET); } return ret; } /*private <T> T transaction(Executor<T> executor) { return this.redisTemplate.execute(new SessionCallback<T>() { @Override public <OK, OV> T execute(RedisOperations<OK, OV> operations) throws DataAccessException { try { redisTemplate.multi(); T result = executor.run(); redisTemplate.exec(); return result; } catch (Throwable e) { log.error("", e); redisTemplate.discard(); return null; } } }); } */ public void watch(String key) { this.redisTemplate.watch(key); } public Set<String> keys(String pattern) {//keys pattern return this.redisTemplate.keys(pattern); } /*public List<V> multiGet(Collection<String> pattern) {//keys pattern return this.valueOperations.multiGet(pattern); }*/ /*public <HK, HV> HashOperations<HK, HV> hash(String key) { return new HashOperations<HK, HV>(this.redisTemplate.boundHashOps(key)); } public <HK, HV> HashOperations<HK, HV> map(String key) { return new HashOperations<HK, HV>(this.redisTemplate.boundHashOps(key)); } public ListOperations<V> list(String key) { return new ListOperations<V>(this.redisTemplate.boundListOps(key)); } public SetOperations<V> set(String key) { return new SetOperations<V>(this.redisTemplate.boundSetOps(key)); } public ZSetOperations<V> zset(String key) { return new ZSetOperations<V>(this.redisTemplate.boundZSetOps(key)); }*/ }
相关推荐
本文将深入探讨泛型类、泛型方法、泛型接口和泛型委托,并通过实例来阐述它们的应用。 首先,我们来看泛型类。泛型类是具有一个或多个类型参数的类。类型参数是在定义类时使用的占位符,实际的类型在创建类的实例时...
【Flutter】Dart 泛型 ( 泛型类 | 泛型方法 | 特定类型约束的泛型 ) https://hanshuliang.blog.csdn.net/article/details/114059611 博客源码快照
Java集合类中的泛型使用有几种常见形式: - **无界通配符**:`?` 表示可以接受任何类型的对象。例如,`List<?>` 可以表示任何类型的列表。 - **上限通配符**:`? extends T` 表示可以接受T或T的子类对象。例如,`...
C# 工具类 泛型转JSON 使用 Newtonsoft.Json 转换JSON
在Java编程语言中,泛型是一种强大的特性,它允许我们在类、接口和方法中使用类型参数,从而提高代码的灵活性和安全性。当我们谈论“继承泛型类”时,这意味着一个类(子类)正在扩展一个已经定义了泛型的类(父类)...
在C#编程语言中,泛型是...通过使用泛型类、方法、接口和委托,我们可以编写灵活且类型安全的代码,适用于多种数据类型,同时减少运行时类型检查和转换的成本。在实际开发中,熟练掌握泛型能极大提升代码质量和维护性。
想象一个基于Spring框架的Java应用程序,其中使用了泛型的DAO层来处理各种实体类的数据操作。在这样的场景下,`GenericUtil`类可以被用来动态获取每个DAO实例所处理的实体类型,进而执行特定于该类型的数据库操作,...
本篇文章将深入探讨如何在C#中使用和继承泛型类。 首先,让我们理解什么是泛型类。泛型类是一种模板或蓝图,它定义了参数化类型,这些类型在类实例化时可以被具体的类型替换。在C#中,我们使用尖括号`<>`来声明泛型...
本篇文章将深入探讨C#中的泛型使用方法,帮助你更好地理解和应用这一关键概念。 首先,我们需要理解什么是泛型。泛型允许我们在定义类、接口、委托和方法时,不指定具体的类型参数,而是使用一个占位符,如`T`、`K`...
泛型是Java SE 5.0引入的新特性,它允许在类、接口和方法中使用类型参数。类型参数类似于函数参数,但它们代表的是类型而不是值。例如,`List<T>`中的`T`就是一个类型参数,`T`代表某种具体的类型,如`String`、`...
1. **类型参数**:定义泛型类或接口时,使用尖括号`<T>`表示类型参数,T是占位符,代表任意类型。 2. **通配符**:如`?`,表示未知类型,常用于方法参数,提供更大的灵活性。 3. **边界**:`<T extends SomeClass>`...
Java 泛型使用详细分析 Java 泛型是 Java 语言中的一种类型系统特性,允许开发者在编译期检查类型安全,以避免在运行时出现类型相关的错误。在本文中,我们将详细介绍 Java 泛型的使用方法和实现原理。 一、泛型的...
当我们谈论继承非泛型类时,意味着子类继承了一个没有使用泛型的父类。泛型是Java SE 5.0引入的新特性,用于提供类型安全和减少强制类型转换,但并不是所有类都必须使用泛型。 非泛型类通常定义为不包含类型参数的...
除了使用内置的泛型集合类之外,还可以自定义泛型类。例如: ```csharp public class ItemList { private List<T> items = new List(); public void Add(T item) { items.Add(item); } public T Get(int ...
4. **利用`Class<T>`作为泛型约束**:有时候,我们可以在泛型类中使用`Class<T>`作为参数或字段,这样可以在运行时获取类型信息。例如: ```java public class MyClass<T> { private final Class<T> clazz; ...
对于框架设计者来说,便捷的代码,是很重要的一部分。 反射和泛型是一种重要的解决途径。 此代码是一个生成泛型对象的类。...希望能帮助那些为查找泛型构造器、非静态内部泛型类的对象生成而烦恼的童鞋。
C#中的泛型接口如`IEnumerable<T>`和泛型类如`List<T>`、`Dictionary, TValue>`是泛型集合的基础。这些接口和类定义了操作数据的一般方法,而`T`则代表一个未指定的类型参数,可以在实例化时指定具体类型。 2. **...
总的来说,这个项目涉及了ASP.NET Web Forms、C#编程、数据库交互、泛型使用以及分层架构的设计。通过使用泛型,可以创建灵活且类型安全的函数,处理多种类型的数据,同时实现DropDownList的无极分类功能,提高代码...
泛型方法是泛型技术在类方法层面的应用,它允许我们定义一个可以处理多种数据类型的通用方法。下面我们将深入探讨Java泛型方法的概念、语法以及使用示例。 **一、泛型方法概念** 泛型方法是一种具有类型参数的方法...
C#中的泛型类是编程中的一个重要概念,它允许我们创建可以处理多种数据类型的类,提高了代码的重用性和效率。下面将详细讲解泛型类的各个方面。 1. **泛型类的基本应用** 泛型类的核心在于类型参数,这使得类能够...