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

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

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

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

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

copycode.gifpublic class Sharded

{        private object nodes_lock = new object();        private RedBlackTreeMap nodes = new RedBlackTreeMap();        private IHash hashAlgo = new MD5_LongSUM_Multiply_Hash();

public void AddTarget(int index, string shard)

{            lock (nodes_lock)

{                for (int n = 0; 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");

}

}

copycode.gif

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

68230-20170618222212696-555825592.pngMD5_LongSUM_Multiply_Hash,这是个MD5算法,输入为string,输出为long。

此处由于考虑到输出不是string,因此自己又改了改,让他输出long

copycode.gifpublic 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 

{

sBuilder.Append(data[i].ToString("x2"));

}            return sBuilder.ToString();

}

}

copycode.gif

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

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

copycode.gifimport 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;

}

}

copycode.gif

org.springframework.security

spring-security-core

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/575755.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 多重压缩下载_Java 多文件边压缩边下载

有时我们希望在后台实时生成文件并下载到客户端GetMapping(value "download")public void download(HttpServletResponse response) {try(OutputStream outputStream response.getOutputStream();ZipOutputStream zipOutputStream new ZipOutputStream(outputStre…

wdatepicker使用指南

wdatepicker使用指南 http://blog.csdn.net/zengxin2008/article/details/7248964#t63posted on 2013-09-22 15:45 moonfans 阅读(...) 评论(...) 编辑 收藏 转载于:https://www.cnblogs.com/moonfans/p/3333251.html

纵表、横表互转的SQL

纵表、横表互转的SQL By:大志若愚 1、建表: 纵表结构 Table_A create table Table_A (姓名 varchar(20),课程 varchar(20),成绩 int ) insert into Table_A(姓名,课程,成绩) values(张三,语文,60) insert into Table_A(姓名,课程,成绩) values(张三,数学…

java按照商品价格排序_按照指定的类型排序

比如有三本书,书名和价格分别如下:《猎物》18.4元、《大明王朝》59.0元、《快乐密码》25.0元。前几天的一篇文章中讲到按照中文拼音进行排序,这里如果想按照价格排序的话怎么办?其实这里就牵涉到在Java中怎样对对象进行排序处理&a…

6款帮助 滚动视差jquery插件

在网页设计中,视差滚动(Parallax Scrolling)是当下流行的网页设计技术,通过让多层背景以不同的速度或者不同的方向移动来形成非常有趣的 3D 运动效果。下面是一些运用视差滚动效果的优秀网页案例: 视差(Pa…

java i线程安全吗_Java中 i++ 是线程安全的么?为什么?

问题在 int i 0; i i; 语句中,i i是线程安全的么?如果不安全,请说明上面操作在JVM中的执行过程,为什么不安全?说出JDK中哪个类能达到以上的效果,并且是线程安全而且高效的,简述其原理。回答语…

EBS 多组织访问设置

如果想让你的职责下为单组织模式,那么你在Profile下只设置MO: Operating Unit的值,MO: Operating Unit提供只访问一个单独的OU。如果你想让你的职责下为多组织模式,你需要设置MO: Security Profile,MO: Security Profile提供多组织…

java第k小元素_java – 如何从对象列表中提取K“最小”元素?

我会对清单进行排序.然后,我将创建一个包含这10个最小对象的列表,并更改原始列表list1以包含其余对象.就像是:Collection.sort(list1);ArrayList yourSmallestElements (ArrayList)(list1.sublist(0, 9).clone());list1.removeAll(yourSmallestElements);注意&…

JQuery学习系列总结—菜单制作

1、页面中的菜单项可以通过嵌套的ul和li来表示 2、菜单最外层为ul,一层每个主菜单放在一个li中,如果有子菜单,在这个主菜单的li中建立新的ul,再依次嵌套即可构建多层的菜单 3、浏览器中ul和li元素默认情况下文字前都有圆点标识符&…

mysql 大量列 动态变量_aardio动态mysql变量设置

aardio动态mysql变量设置aardio动态mysql变量设置废话不多说,直接开始干活!从上午度娘到现在!终于有点结果!需求是从数据库读取数据,根据条件(变量)直接上代码,如有任何问题,欢迎老铁指正&#…

制作简单的java应用程序_使用exe4j工具制作简单的java应用程序

首先需要下载exe4j工具并进行安装,下面是利用exe4j工具制作应用程序的步骤。1.首先将工程导出为可运行的jar包,选择extract required libralies into generated java,会将引用到的jar包也打到里面。右键java工程--export--java--runnable jar…

HDU 4422 The Little Girl who Picks Mushrooms(简单题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid4422 题目大意:小姑娘背着5个包去山上采蘑菇,每座山上只能用一个背包采集。三个小精灵会要她3个背包,其里面蘑菇的数量必须是1024的倍数,否则5个背包都会被拿走。…

Java三维文字特效设计_jQuery实现3D文字特效的方法

本文实例讲述了jQuery实现3D文字特效的方法。分享给大家供大家参考。具体如下:这款基于jQuery的3D文字特效演示,不是真正的3D,是由多个文字形成的3D效果,如果首次加载网页出错的话,请刷新一下页面,当然在使…

MVC的传递数据的方法

1、使用ViewBag 1 #region 0.2 Action方法 ActionResult Index2()2 /// <summary>3 /// Action方法4 /// </summary>5 /// <returns></returns>6 public ActionResult Index2()7 {8 …

java 找不到构造函数_JAVA找不到符号构造函数

JAVA找不到符号构造函数关注:52 答案:2 mip版解决时间 2021-02-05 09:13提问者彼岸独舞2021-02-05 00:06class Rect{private double length;private double width;public Rect(double length,double width){this.widthwidth;this.lengthlength;}public double getLength(){re…

SRF之数据访问

数据访问组件实现实体类和数据表映射、SQL语句配置执行、动态sql语句等功能&#xff0c;ORM方式能实现简单的对象和表的映射&#xff08;配置类似hibernate&#xff09;&#xff0c;但比较单一&#xff08;不支持一对多、多对多的情况&#xff09;&#xff0c;下边不做介绍&…

java 抽象类 方法_java 抽象类

Java为什么使用抽象类和接口Java接口和Java抽象类代表的就是抽象类型&#xff0c;就是我们需要提出的抽象层的具体表现。OOP面向对象的编程&#xff0c;如果要提高程序的复用率&#xff0c;增加程序的可维护性&#xff0c;可扩展性&#xff0c;就必须是面向接口的编程&#xff…

JQuery Show()的几种效果

1 show()方法和hide()方法 $("selector").show() 从display:none还原元素默认或已设置的display属性$("selector").hide() 设置元素的display样式为none&#xff0c;等于$("selector").css("display","none")&#xff…

java 创建servlet出错_java-创建applicationContext.xml时出错:在Servlet...

我正在尝试使用Spring和Hibernate配置Java MVC Web应用程序,但是当我运行服务器时出现此错误,并且我不知道这是什么问题.ERROR: org.springframework.web.context.ContextLoader - Context initialization failedorg.springframework.beans.factory.BeanCreationException: Err…

POJ 2054 Color a Tree

贪心。。。。 Color a TreeTime Limit: 1000MS Memory Limit: 30000KTotal Submissions: 6647 Accepted: 2249Description Bob is very interested in the data structure of a tree. A tree is a directed graph in which a special node is singled out, called the "ro…