拥抱变化,如今也走上了.net/java通吃的时代,下面就讲讲如何让.net/java都能正常访问分片的redis吧。

有几个关键点:一致性环哈希、哈希算法、序列化、反序列化

后两个都比较直接,只要选择一种跨语言的序列化方式就行了,如:json, protobuf, ace等,本文全略了

本文是基于jedis的一致性环哈希来修改的,.net选的是servicestack.redis组件来修改

无奈两个组件都有各自的一致性环哈希算法,不兼容,那就选一个作为标准,修改另一个咯。本文选择jedis的一致性环哈希作为标准,进而修改.net来适应jedis

jedis的逻辑是给每个redis节点构造160个虚拟节点,放入一颗二叉树中(key/value:key是一个long值,根据哈希算法算出来的一个long、value是节点id,是个string)。

OK,逻辑清楚了,那就简单了,给c#端写个一模一样的一致性环哈希算法。

public class Sharded{private object nodes_lock = new object();private RedBlackTreeMap<long, string> nodes = new RedBlackTreeMap<long, string>();private IHash hashAlgo = new MD5_LongSUM_Multiply_Hash();public void AddTarget(int index, string shard){lock (nodes_lock){for (int n = 0; n < 160; ++n){var hashKey = "SHARD-" + index + "-NODE-" + n;long hashValue = this.hashAlgo.Hash(hashKey);nodes.SetOrAddValue(hashValue, shard);}}}public string GetShardInfo(string key){long searchHashKey = this.hashAlgo.Hash(key);long nearestKey;string shard;lock (nodes_lock){if (this.nodes.NearestGreater(searchHashKey, out nearestKey)){shard = this.nodes.GetValue(nearestKey);return shard;}if (this.nodes.Least(out searchHashKey, out shard))return shard;}throw new Exception("GetShardInfo exception");}}

其中RedBlackTreeMap这个是TreeLib中的组件,需要在nuget上引用。

MD5_LongSUM_Multiply_Hash,这是个MD5算法,输入为string,输出为long。此处由于考虑到输出不是string,因此自己又改了改,让他输出long
public class MD5_LongSUM_Multiply_Hash : IHash{public long Hash(string key){var md5= Md5Hash(key);if (string.IsNullOrEmpty(md5))Log.GetLog().Info("Hash, md5 is null or empty");var convertedKeyBytes = Encoding.UTF8.GetBytes(md5);long value = 1;foreach(var b in convertedKeyBytes)value *= b*-1;return value;}private string Md5Hash(string input){MD5CryptoServiceProvider md5Hasher = new MD5CryptoServiceProvider();if (string.IsNullOrEmpty(input))Log.GetLog().Info("Md5Hash, input is null or empty");byte[] data = md5Hasher.ComputeHash(Encoding.Default.GetBytes(input));StringBuilder sBuilder = new StringBuilder();for (int i = 0; i < data.Length; i++){sBuilder.Append(data[i].ToString("x2"));}return sBuilder.ToString();}}

剩下的就是java端的这个输入string,输出long的算法,需要和.net的输入输出一致了。

那就也写一个哈希算法,让他输入string,输出long,和.net的一致,这里只要java/.net用同一种md5算法,后续的md5变成long就很容易了。

import org.springframework.security.authentication.encoding.MessageDigestPasswordEncoder;
import redis.clients.util.Hashing;
import redis.clients.util.SafeEncoder;import java.io.UnsupportedEncodingException;/*** Created by z on 2017/4/12.*/
public class MD5_SUM_Hash implements Hashing {MessageDigestPasswordEncoder encoder=new MessageDigestPasswordEncoder("MD5");public long hash(String key) {return this.hash(SafeEncoder.encode(key));}public long hash(byte[] bytes) {String converted_str= null;try {converted_str = new String(bytes, "UTF8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}String result=encoder.encodePassword(converted_str, null);try {bytes=result.getBytes("UTF8");} catch (UnsupportedEncodingException e) {e.printStackTrace();}long value = 1;for(byte b : bytes)value *= b*-1;return value;}
}

<dependency><groupId>org.springframework.security</groupId><artifactId>spring-security-core</artifactId></dependency>

OK,核心的就这些了。

转载于:https://www.cnblogs.com/aarond/p/jedis_servicestack_redis_communication.html

C# servicestack.redis 互通 java jedis相关推荐

  1. java .net 互通redis_C# servicestack.redis 互通 java jedis

    本文是基于jedis的一致性环哈希来修改的,.net选的是servicestack.redis组件来修改 无奈两个组件都有各自的一致性环哈希算法,不兼容,那就选一个作为标准,修改另一个咯.本文选择je ...

  2. centos部署Redis和Java开发(Jedis)

    centos部署Redis和Java开发(Jedis) 1.部署Redis 1)下载:http://redis.io/download    2)解压编译: $ tar xzf redis-3.2.3 ...

  3. java jedis使用_Java中使用Jedis操作Redis

    Java中使用Jedis操作Redis 使用Java操作Redis需要jedis-2.1.0.jar,下载地址:http://files.cnblogs.com/liuling/jedis-2.1.0 ...

  4. redis java客户端配置,Java的Redis客户端选择-jedis与Lettuce

    Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线 ...

  5. Java中使用Jedis操作Redis,java初级面试笔试题

    写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 参考 ...

  6. Redis的Java客户端之Jedis(Jedis)

    文章目录 Redis的Java客户端(Jedis) 一.简介 二.Jedis快速入门 1.引入依赖 2.建立连接 3.使用Jedis 4.释放资源 三.Jedis连接池 1.创建Jedis连接池配置 ...

  7. redis -Spring与Jedis集群 Sentinel

    2019独角兽企业重金招聘Python工程师标准>>> redis -Spring与Jedis集群 Sentinel 博客分类: 缓存 首先不得不服Spring这个宇宙无敌的开源框架 ...

  8. Redis介绍 Java客户端操作Redis

    Redis介绍 && Java客户端操作Redis 本文内容 redis介绍 redis的 shell 客户端简介 redis的 java 客户端简介 环境配置 redis 2.8.1 ...

  9. Redis介绍 Java客户端操作Redis

    分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow Redis介绍 & ...

最新文章

  1. 这里先发布一个,自己写得unityUI的适配的方案(插播)
  2. 洛谷P4413 R2
  3. C++实现最大堆最小堆
  4. php 图片 3d旋转图片,html5实现图片的3D旋转效果
  5. 168输出为861java_AcWing 861. 二分图的最大匹配-java-关键处注释
  6. 我乃平常客,本持平常心| 2021 年中总结
  7. 走进内存,走进汇编指令来看C/C++指针
  8. Flask:an ImportError was raised问题解决
  9. 过山车之星(Planet Coaster)的视角和编辑介绍
  10. 强大的Git客户端:Tower for Mac
  11. toolchain安装教程支持_【转】Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法...
  12. Python初级入门精讲-王大鹏-专题视频课程
  13. 达梦工具导出慢sqle的xcel表格方法
  14. python元组创建_python新建元组
  15. html 好看的数据表格,CSS制作好看的网页表格
  16. 操作系统学习之文件管理:
  17. 基于VBA实现Excel十字交叉高亮显示
  18. 简洁、快速的JavaScript框架/库:jQuery
  19. 记录一次油猴脚本开发的Demo(入门级)、开发过程
  20. python 图像等比例缩放

热门文章

  1. 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查
  2. Linux下安装Oracle11g服务器
  3. 008 - vue node rem
  4. 变量提升、作用域this实战(真题:看代码输出)
  5. ★LeetCode(292)——Nim 游戏(JavaScript)
  6. 零基础带你学习MySQL—字符串相关的函数(十三)
  7. android ndk 多线程mk,Android NDK 开发教程六: application.mk
  8. 月工资8000元无社保公积金,月工资6000元有社保公积金,怎么选?
  9. 没人可以通过勤劳工作发财致富
  10. 有些生意很偏门,也有一定门槛,但是效益非常好