C# servicestack.redis 互通 java jedis
拥抱变化,如今也走上了.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相关推荐
- java .net 互通redis_C# servicestack.redis 互通 java jedis
本文是基于jedis的一致性环哈希来修改的,.net选的是servicestack.redis组件来修改 无奈两个组件都有各自的一致性环哈希算法,不兼容,那就选一个作为标准,修改另一个咯.本文选择je ...
- centos部署Redis和Java开发(Jedis)
centos部署Redis和Java开发(Jedis) 1.部署Redis 1)下载:http://redis.io/download 2)解压编译: $ tar xzf redis-3.2.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 ...
- redis java客户端配置,Java的Redis客户端选择-jedis与Lettuce
Lettuce 和 Jedis 的定位都是Redis的client,所以他们当然可以直接连接redis server. Jedis在实现上是直接连接的redis server,如果在多线程环境下是非线 ...
- Java中使用Jedis操作Redis,java初级面试笔试题
写在最前面,我总结出了很多互联网公司的面试题及答案,并整理成了文档,以及各种学习的进阶学习资料,免费分享给大家.扫码加微信好友进[程序员面试学习交流群],免费领取.也欢迎各位一起在群里探讨技术. 参考 ...
- Redis的Java客户端之Jedis(Jedis)
文章目录 Redis的Java客户端(Jedis) 一.简介 二.Jedis快速入门 1.引入依赖 2.建立连接 3.使用Jedis 4.释放资源 三.Jedis连接池 1.创建Jedis连接池配置 ...
- redis -Spring与Jedis集群 Sentinel
2019独角兽企业重金招聘Python工程师标准>>> redis -Spring与Jedis集群 Sentinel 博客分类: 缓存 首先不得不服Spring这个宇宙无敌的开源框架 ...
- Redis介绍 Java客户端操作Redis
Redis介绍 && Java客户端操作Redis 本文内容 redis介绍 redis的 shell 客户端简介 redis的 java 客户端简介 环境配置 redis 2.8.1 ...
- Redis介绍 Java客户端操作Redis
分享一下我老师大神的人工智能教程.零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!https://blog.csdn.net/jiangjunshow Redis介绍 & ...
最新文章
- 这里先发布一个,自己写得unityUI的适配的方案(插播)
- 洛谷P4413 R2
- C++实现最大堆最小堆
- php 图片 3d旋转图片,html5实现图片的3D旋转效果
- 168输出为861java_AcWing 861. 二分图的最大匹配-java-关键处注释
- 我乃平常客,本持平常心| 2021 年中总结
- 走进内存,走进汇编指令来看C/C++指针
- Flask:an ImportError was raised问题解决
- 过山车之星(Planet Coaster)的视角和编辑介绍
- 强大的Git客户端:Tower for Mac
- toolchain安装教程支持_【转】Ubuntu安装ARM架构GCC工具链(ubuntu install ARM toolchain)最简单办法...
- Python初级入门精讲-王大鹏-专题视频课程
- 达梦工具导出慢sqle的xcel表格方法
- python元组创建_python新建元组
- html 好看的数据表格,CSS制作好看的网页表格
- 操作系统学习之文件管理:
- 基于VBA实现Excel十字交叉高亮显示
- 简洁、快速的JavaScript框架/库:jQuery
- 记录一次油猴脚本开发的Demo(入门级)、开发过程
- python 图像等比例缩放
热门文章
- 前端使用AngularJS的$resource,后端ASP.NET Web API,实现增删改查
- Linux下安装Oracle11g服务器
- 008 - vue node rem
- 变量提升、作用域this实战(真题:看代码输出)
- ★LeetCode(292)——Nim 游戏(JavaScript)
- 零基础带你学习MySQL—字符串相关的函数(十三)
- android ndk 多线程mk,Android NDK 开发教程六: application.mk
- 月工资8000元无社保公积金,月工资6000元有社保公积金,怎么选?
- 没人可以通过勤劳工作发财致富
- 有些生意很偏门,也有一定门槛,但是效益非常好