前言:

   不用说Map是Java中最流行的数结构。Redis提供了一个与Java的Map结构非常相似的数据结构,它吸引了许多Java开发者的兴趣。已经有越来越多的Java库与Redis进行对话,其中大多数都提供了与Redis哈希进行交互的方法。让我们通过使用三个最流行的Redi Java客户机JEDIS、Spring Data Redis和Redisson的例子,来比较Java中三种不同的与Redis Hash的交互方式。为了使它们易于理解和比较,每个示例都使用相同的流行二进制编解码器kryo来提供虚拟数据的序列化/反序列化。

1. Jedis

Jedis只处理原始二进制数据,因此每次调用redis命令时都需要编码/解码逻辑。每次调用任何命令之前,还需要从实例池中获取jedis实例。


private static byte[] encode(Kryo kryo, Object obj) {ByteArrayOutputStream objStream = new ByteArrayOutputStream();Output objOutput = new Output(objStream);kryo.writeClassAndObject(objOutput, obj);objOutput.close();return objStream.toByteArray();
}
private static <T> T decode(Kryo kryo, byte[] bytes) {return (T) kryo.readClassAndObject(new Input(bytes));
}
public static void main(String[] args) {JedisPool jedisPool = new JedisPool("127.0.0.1", 6379);Kryo kryo = new Kryo();kryo.register(MyKey.class);kryo.register(MyValue.class);Jedis jedis = jedisPool.getResource();MyKey key = new MyKey("Jhon", "+138129129113");byte[] keyArray = encode(kryo, key);MyValue value = new MyValue("Kremlin street", "Moscow");byte[] valueArray = encode(kryo, value);byte[] name = "myMap".getBytes();// putjedis.hset(name, keyArray, valueArray);// getbyte[] mappedValueArray = jedis.hget(name, keyArray);MyValue mappedValue = decode(kryo, mappedValueArray);MyValue newValue = new MyValue("Kremlin street", "Moscow");byte[] newValueArray = encode(kryo, newValue);// putIfAbsentjedis.hsetnx(name, keyArray, newValueArray);jedis.close();jedisPool.close();
}

2. Spring Data Redis

Spring Data  Redis允许您通过Redisserializer接口实现自己的数据序列化程序,并在其下使用Jedis Excutor。所以需要实现kryoserializer才能使用kryo编解码器。

KryoSerializer Implementation

public static class KryoSerializer<T> implements RedisSerializer<T> {private Kryo kryo;public KryoSerializer(List<Class<?>> classes) {kryo = new Kryo();for (Class<?> clazz : classes) {kryo.register(clazz);}}@Overridepublic byte[] serialize(T t) throws SerializationException {ByteArrayOutputStream objStream = new ByteArrayOutputStream();Output objOutput = new Output(objStream);kryo.writeClassAndObject(objOutput, t);objOutput.close();return objStream.toByteArray();}@Overridepublic T deserialize(byte[] bytes) throws SerializationException {return (T) kryo.readClassAndObject(new Input(bytes));}
}

Configuration

@Configuration
@ComponentScan
public static class Application {@BeanJedisConnectionFactory connectionFactory() {JedisConnectionFactory factory = new JedisConnectionFactory();factory.setUsePool(true);return factory;}@BeanRedisTemplate<?, ?> redisTemplate(JedisConnectionFactory factory) {RedisTemplate<Object, Object> template = new RedisTemplate<>();template.setDefaultSerializer(new KryoSerializer<>(Arrays.asList(MyKey.class, MyValue.class)));template.setConnectionFactory(factory);return template;}
}

Usage Example:

@Component
public static class MapBean {@Autowiredprivate RedisTemplate<String, Object> redisTemplate;public void execute() {Kryo kryo = new Kryo();kryo.register(MyKey.class);kryo.register(MyValue.class);MyKey key = new MyKey("Jhon", "+138129129113");MyValue value = new MyValue("Pushkina street", "Moscow");HashOperations<String, MyKey, MyValue> hashOperations = redisTemplate.opsForHash();hashOperations.put("myKey", key, value);MyValue mappedValue = hashOperations.get("myKey", key);MyValue newValue = new MyValue("Tverskaya street", "Moscow");hashOperations.putIfAbsent("myKey", key, newValue);}
}
public static void main(String[] args) {AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Application.class);context.getBean(MapBean.class).execute();context.close();
}

3. Redisson

Redisson支持许多流行的编解码器,包括Kryo。它维护集群、主/从服务器和单个Redis服务器的连接池和拓扑更新。Redisson API不仅涵盖了Redis哈希操作,还完全实现了java.util.map和java.util.concurrent.concurrent map接口。它还支持映射条目收回和映射实体的本地缓存。


public static void main(String[] args) {Config config = new Config();config.setCodec(new KryoCodec(Arrays.asList(MyKey.class, MyValue.class))).useSingleServer().setAddress("127.0.0.1:6379");RedissonClient redisson = Redisson.create(config);RMap<MyKey, MyValue> map = redisson.getMap("myMap");MyKey key = new MyKey("Jhon", "+138129129113");MyValue value = new MyValue("Broad street", "New York");map.put(key, value);MyValue mappedValue = map.get(key);MyValue newValue = new MyValue("Narrow street", "New York");map.fastPutIfAbsent(key, newValue);redisson.shutdown();
}

总结:

在代码简单性方面,与RediIs哈希一起使用时,Redisson是比其他Redis Java客户端更好的选择。

原文地址:https://dzone.com/articles/3-ways-to-use-redis-hash-in-java


Java中使用Redis Hash的3种方法相关推荐

  1. java 中lock,java中lock获取锁的四种方法

    在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...

  2. Java中的string定义的两种方法和区别

    java中的String定义的两种方法和区别 第一种:new方式 String s1 = new String("hello world"); String s2 = new St ...

  3. Java中遍历Set集合的三种方法

    Map集合:链接: Map集合的五种遍历方式及Treemap方法 Set集合:链接: Java中遍历Set集合的三种方法 TreeSet集合:链接: Java深入了解TreeSet,和迭代器遍历方法 ...

  4. Java中遍历Set集合的三种方法(实例代码)

    哈喽,欢迎来到小朱课堂,下面开始你的学习吧! Java中遍历Set集合的三种方法 废话不多说,直接上代码 1.迭代遍历: Set set = new HashSet(); Iterator it = ...

  5. JAVA中创建线程池的五种方法及比较

    之前写过JAVA中创建线程的三种方法及比较.这次来说说线程池. JAVA中创建线程池主要有两类方法,一类是通过Executors工厂类提供的方法,该类提供了4种不同的线程池可供使用.另一类是通过Thr ...

  6. java中从键盘输入的三种方法以及Console输入

    java中从键盘输入的三种方法: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStre ...

  7. Java 中验证时间格式的 4 种方法

    大家好,今天咱们来讲一下,Java 中如何检查一个字符串是否是合法的日期格式? 为什么要检查时间格式? 后端接口在接收数据的时候,都需要进行检查.检查全部通过后,才能够执行业务逻辑.对于时间格式,我们 ...

  8. Java中实现线程安全的几种方法

    我们知道Java有一个特性,多线程,它是一个同时运行多个线程的过程. 当多个线程处理相同的数据,并且我们的数据值发生变化时,这种情况不是线程安全的,我们会得到不一致的结果. 当一个线程已经在一个对象上 ...

  9. java中调用dll文件的两种方法

    https://www.cnblogs.com/huozhong/p/5830485.html JNA地址:http://blog.csdn.net/shendl/article/details/35 ...

最新文章

  1. React 组件生命周期
  2. 常见Linux面试题总结
  3. 苹果平板怎么卸载软件_苹果TF签名丨怎么卸载testflight下载的应用?
  4. php伪静态后301,动态地址rewrite伪静态,然后301跳转到伪静态时死
  5. alexa技能个数_如何改善Alexa技能的对话流程
  6. RabbitMQ的深入理解和最简单的用途说明
  7. poj 2387 Til the Cows Come Home dijkstra
  8. 如何用java实现使用电子邮件控制你的电脑
  9. KEIL软件安装教程
  10. python中if嵌套语句_选择结构-if..elif语句和if语句的嵌套
  11. html去除背景颜色怎么设置,word文档背景颜色怎么去掉,文档背景颜色怎么去掉
  12. 存算一体文献阅读笔记二:XNOR-RRAM architecture for BNN from Shimeng Yu in ASU 2017
  13. 激光雷达与自动驾驶详解
  14. Graham-Scan算法计算凸包的Python代码实现
  15. P1216 数字金字塔
  16. 价格为3000元的计算机的机型,2000-3000元左右的笔记本电脑推荐,性价比超高
  17. IMPERVA - WAF 如何配置Imperva SNMP
  18. python保存字典到xml文件_使用Python和BeautifulSoup从XML文件创建字典
  19. 计算机组成原理储存器系统实验,计算机组成原理实验存储器.ppt
  20. h5+app客户端获取服务器传过来的cookie

热门文章

  1. Flutter 中的自定义 AppBar
  2. Mosquitto 介绍和简单使用
  3. 下发策略,DFA算法优化---敏感词查询
  4. 基于PHP的DFA算法(敏感词过滤)
  5. MYSQL 清空表和截断表
  6. SecureCRT的使用教程
  7. 三角形主机即将登陆韩国市场
  8. echart通过ajax获取数据
  9. ntohs, ntohl, htons,htonl的比较和详解
  10. 甲骨文中国辟谣大面积裁员传闻 精简后集火云业务