redis成长之路——(一)
为什么使用redis
Redis适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached.
上面描述说的过于泛了,很多初次接触的码农可能不明白怎么回事;其实简单来说:如果业务中需要高性能、分布式、集群等场景的时候,redis就可以派上用场大显身手了!
redis简介
REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统。
Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。
它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。

常用结构

.net连接redis
StackExchange.Redis是.NET语言中一个高性能的通用redis客户端,一般都基于这个驱动来实现具体的操作业务
github地址:https://github.com/StackExchange/StackExchange.Redis
StackExchange.Redis封装
和ado.net一样,StackExchange.Redis只是一个provider,码农们直接用起来会很麻烦,不光要去理解它里面很多概念,还要根据不同的场景写不能的代码,所以在实际业务中,本人封装了一个drive.redis
github地址:https://github.com/yswenli/RedisDrive/tree/master/Wenli.Drive.Redis
Wenli.Drive.Redis的使用
本人封装的这个drive.redis是基于现有相关项目完善而成的,主要目的就是为码农们方便开展自已的业务,无需去关心中间相当部内容;使用可以参考md文件中的描述:
RedisDrive
RedisDrive这是一个.net 的redis集成驱动,支持单实例、云集群、哨兵等模式的数据操作,支持keys等命令
本驱动基于stackexcnage.redis完成,在此基础上强化使用的简洁性、可靠性
wenli.Drive.Redis使用方法:
1.添加wenli.Drive.Redis引用
2.添加stackexcnage.redis nuget包引用
3.添加Wenli.Drive.Redis、log4net配置节点,添加RedisClient appsettings
app.config(web.config)配置如下: <?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="RedisConfig" type="Wenli.Drive.Redis.RedisConfig, Wenli.Drive.Redis" />
<section name="SentinelConfig" type="Wenli.Drive.Redis.RedisConfig, Wenli.Drive.Redis" />
<section name="ClusterConfig" type="Wenli.Drive.Redis.RedisConfig, Wenli.Drive.Redis" />
<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler,log4net" />
</configSections>
<!--单点模式配置-->
<RedisConfig Type="0" Masters="127.0.0.1:6379" Slaves="127.0.0.1:6379" DefaultDatabase="0" />
<!--哨兵模式配置-->
<SentinelConfig Type="1" Masters="127.0.0.1:26379" ServiceName="mymaster" DefaultDatabase="0" />
<!--集群模式配置-->
<ClusterConfig Type="2" Masters="127.0.0.1:16379,127.0.0.1:16380,127.0.0.1:16381" />
<log4net>
<logger name="logerror">
<level value="ERROR" />
<appender-ref ref="ErrorAppender" />
</logger>
<logger name="loginfo">
<level value="INFO" />
<appender-ref ref="InfoAppender" />
</logger>
<logger name="logdebug">
<level value="DEBUG" />
<appender-ref ref="DebugAppender" />
</logger>
<appender name="ErrorAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="ErrorLog.log" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaximumFileSize" value="1MB" />
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>
<appender name="InfoAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="InfoLog.log" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaximumFileSize" value="1MB" />
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>
<appender name="DebugAppender" type="log4net.Appender.RollingFileAppender">
<param name="File" value="DebugLog.log" />
<param name="AppendToFile" value="true" />
<param name="MaxSizeRollBackups" value="100" />
<param name="MaximumFileSize" value="1MB" />
<param name="RollingStyle" value="Size" />
<param name="StaticLogFileName" value="true" />
<layout type="log4net.Layout.PatternLayout">
<param name="ConversionPattern" value="%-5p %d [%c] %m%n" />
</layout>
</appender>
</log4net>
<appSettings>
<add key="RedisClient" value="Wenli.Drive.Redis.Core.SERedisHelper;Wenli.Drive.Redis,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null" />
</appSettings>
<runtime>
<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
<dependentAssembly>
<assemblyIdentity name="System.Runtime" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.10.0" newVersion="2.6.10.0" />
</dependentAssembly>
<dependentAssembly>
<assemblyIdentity name="System.Threading.Tasks" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" />
<bindingRedirect oldVersion="0.0.0.0-2.6.10.0" newVersion="2.6.10.0" />
</dependentAssembly>
</assemblyBinding>
</runtime>
</configuration>
实例代码:
class Program
{
static void Main(string[] args)
{
Console.Title = "Wenli.Drive.Redis驱动测试";
Console.WriteLine("Wenli.Drive.Redis test");
Console.WriteLine("输入s 测试哨兵模式,输入c测试cluster模式,M为连续,其它为单实例模式");
while (true)
{
var c = Console.ReadLine();
if (c.ToUpper() == "S")
{
#region sentinel
Console.WriteLine("Wenli.Drive.Redis test 进入哨兵模式---------------------");
using (var redisHelper = RedisHelperBuilder.Build("ClusterConfig"))
{
#region string
Console.ReadLine();
Console.WriteLine("string get/set test");
redisHelper.GetRedisOperation().StringSet("abcabcabc", "123123");
Console.WriteLine("写入key:abcabcabc,value:123123");
var str = redisHelper.GetRedisOperation().StringGet("abcabcabc");
Console.WriteLine("查询key:abcabcabc,value:" + str);
redisHelper.GetRedisOperation().KeyDelete("abcabcabc");
Console.WriteLine("移除key:abcabcabc");
#endregion
#region hashset
Console.ReadLine();
Console.WriteLine("hashset get/set test");
var testModel = new DemoModel()
{
ID = Guid.NewGuid().ToString("N"),
Age = 18,
Name = "Kitty",
Created = DateTime.Now
};
redisHelper.GetRedisOperation().HashSet<DemoModel>(testModel.Name, testModel.ID, testModel);
Console.WriteLine(string.Format("写入hashid:{0},key:{1}", testModel.Name, testModel.ID));
testModel = redisHelper.GetRedisOperation().HashGet<DemoModel>(testModel.Name, testModel.ID);
Console.WriteLine(string.Format("查询hashid:{0},key:{1}", testModel.Name, testModel.ID));
redisHelper.GetRedisOperation().HashDelete(testModel.Name, testModel.ID);
Console.WriteLine("移除hash");
#endregion
#region 队列
Console.ReadLine();
Console.WriteLine("list test");
redisHelper.GetRedisOperation().Enqueue("list", "listvalue");
Console.WriteLine("入队:list,value:listvalue");
Console.WriteLine("list.coumt:" + redisHelper.GetRedisOperation().QueueCount("list"));
Console.WriteLine(string.Format("出队:list,value:{0}", redisHelper.GetRedisOperation().Dnqueue("list")));
Console.WriteLine("list.coumt:" + redisHelper.GetRedisOperation().QueueCount("list"));
#endregion
#region sortedset
Console.ReadLine();
Console.WriteLine("sortedset test");
Console.WriteLine(string.Format("sortedset add :{0}", redisHelper.GetRedisOperation().SortedSetAdd("sortedset", "sortedset", 0)));
var list = redisHelper.GetRedisOperation().GetSortedSetRangeByRankWithSocres("sortedset", 0, 10000, 1, 9999, true);
Console.WriteLine(string.Format("sortedset getlist :{0}", list));
Console.WriteLine(string.Format("sortedset remove :{0}", redisHelper.GetRedisOperation().RemoveItemFromSortedSet("sortedset", "sortedset")));
#endregion
#region pub/sub
Console.ReadLine();
Console.WriteLine("sub/pub test");
Console.WriteLine("订阅频道:happy");
redisHelper.GetRedisOperation().Subscribe("happy", (x, y) =>
{
Console.WriteLine(string.Format("订阅者收到消息;频道:{0},消息:{1}", x, y));
});
Console.WriteLine("发布频道happy 10 条测试消息");
for (int i = 1; i <= 10; i++)
{
redisHelper.GetRedisOperation().Publish("happy", "this is a test message" + i);
Thread.Sleep(400);
}
#endregion
Console.ReadLine();
redisHelper.GetRedisOperation().Unsubscribe("happy");
}
#endregion
}
else if (c.ToUpper() == "C")
{
#region cluster
Console.WriteLine("Wenli.Drive.Redis test 进入集群模式---------------------");
var redisHelper = RedisHelperBuilder.Build("ClusterConfig");
#region string
Console.ReadLine();
Console.WriteLine("string get/set test");
redisHelper.GetRedisOperation().StringSet("abcabcabc", "123123");
Console.WriteLine("写入key:abcabcabc,value:123123");
var str = redisHelper.GetRedisOperation().StringGet("abcabcabc");
Console.WriteLine("查询key:abcabcabc,value:" + str);
redisHelper.GetRedisOperation().KeyDelete("abcabcabc");
Console.WriteLine("移除key:abcabcabc");
#endregion
#region hashset
Console.ReadLine();
Console.WriteLine("hashset get/set test");
var testModel = new DemoModel()
{
ID = Guid.NewGuid().ToString("N"),
Age = 18,
Name = "Kitty",
Created = DateTime.Now
};
redisHelper.GetRedisOperation().HashSet<DemoModel>(testModel.Name, testModel.ID, testModel);
Console.WriteLine(string.Format("写入hashid:{0},key:{1}", testModel.Name, testModel.ID));
testModel = redisHelper.GetRedisOperation().HashGet<DemoModel>(testModel.Name, testModel.ID);
Console.WriteLine(string.Format("查询hashid:{0},key:{1}", testModel.Name, testModel.ID));
redisHelper.GetRedisOperation().HashDelete(testModel.Name, testModel.ID);
Console.WriteLine("移除hash");
#endregion
#region 队列
Console.ReadLine();
Console.WriteLine("list test");
redisHelper.GetRedisOperation().Enqueue("list", "listvalue");
Console.WriteLine("入队:list,value:listvalue");
Console.WriteLine("list.coumt:" + redisHelper.GetRedisOperation().QueueCount("list"));
Console.WriteLine(string.Format("出队:list,value:{0}", redisHelper.GetRedisOperation().Dnqueue("list")));
Console.WriteLine("list.coumt:" + redisHelper.GetRedisOperation().QueueCount("list"));
#endregion
#region pub/sub
Console.ReadLine();
Console.WriteLine("sub/pub test");
Console.WriteLine("订阅频道:happy");
redisHelper.GetRedisOperation().Subscribe("happy", (x, y) =>
{
Console.WriteLine(string.Format("订阅者收到消息;频道:{0},消息:{1}", x, y));
});
Console.WriteLine("发布频道happy 10 条测试消息");
for (int i = 1; i <= 10; i++)
{
redisHelper.GetRedisOperation().Publish("happy", "this is a test message" + i);
Thread.Sleep(400);
}
#endregion
Console.ReadLine();
redisHelper.GetRedisOperation().Unsubscribe("happy");
#endregion
}
else if (c.ToUpper() == "M")
{
#region default redis
Console.WriteLine("Wenli.Drive.Redis test 进入连续测试模式---------------------");
string value = "123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式123123进入连续测试模式";
var td1 = new Thread(new ThreadStart(() =>
{
using (var redisHelper = RedisHelperBuilder.Build("SentinelConfig"))
{
Parallel.For(0, 100000, countIndex =>
{
#region string
Console.WriteLine("string get/set test");
redisHelper.GetRedisOperation().StringSet(countIndex.ToString(), value);
Console.WriteLine("写入key:abcabcabc,value:123123");
var str = redisHelper.GetRedisOperation().StringGet(countIndex.ToString());
Console.WriteLine("查询key:abcabcabc,value:" + str);
redisHelper.GetRedisOperation().KeyDelete(countIndex.ToString());
Console.WriteLine("移除key:abcabcabc");
#endregion
#region hashset
Console.WriteLine("hashset get/set test");
var testModel = new DemoModel()
{
ID = Guid.NewGuid().ToString("N"),
Age = 18,
Name = "Kitty",
Created = DateTime.Now
};
redisHelper.GetRedisOperation().HashSet<DemoModel>(testModel.Name, testModel.ID, testModel);
Console.WriteLine(string.Format("写入hashid:{0},key:{1}", testModel.Name, testModel.ID));
testModel = redisHelper.GetRedisOperation().HashGet<DemoModel>(testModel.Name, testModel.ID);
Console.WriteLine(string.Format("查询hashid:{0},key:{1}", testModel.Name, testModel.ID));
redisHelper.GetRedisOperation().HashDelete(testModel.Name, testModel.ID);
Console.WriteLine("移除hash");
#endregion
});
}
}));
var td2 = new Thread(new ThreadStart(() =>
{
Parallel.For(0, 100000, countIndex =>
{
using (var redisHelper = RedisHelperBuilder.Build("SentinelConfig"))
{
#region string
Console.WriteLine("string get/set test");
redisHelper.GetRedisOperation().StringSet(countIndex.ToString(), value);
Console.WriteLine("写入key:abcabcabc,value:123123");
var str = redisHelper.GetRedisOperation().StringGet(countIndex.ToString());
Console.WriteLine("查询key:abcabcabc,value:" + str);
redisHelper.GetRedisOperation().KeyDelete(countIndex.ToString());
Console.WriteLine("移除key:abcabcabc");
#endregion
#region hashset
Console.WriteLine("hashset get/set test");
var testModel = new DemoModel()
{
ID = Guid.NewGuid().ToString("N"),
Age = 18,
Name = "Kitty",
Created = DateTime.Now
};
redisHelper.GetRedisOperation().HashSet<DemoModel>(testModel.Name, testModel.ID, testModel);
Console.WriteLine(string.Format("写入hashid:{0},key:{1}", testModel.Name, testModel.ID));
testModel = redisHelper.GetRedisOperation().HashGet<DemoModel>(testModel.Name, testModel.ID);
Console.WriteLine(string.Format("查询hashid:{0},key:{1}", testModel.Name, testModel.ID));
redisHelper.GetRedisOperation().HashDelete(testModel.Name, testModel.ID);
Console.WriteLine("移除hash");
#endregion
}
});
}));
td1.Start();
td2.Start();
while (td1.IsAlive || td2.IsAlive)
{
Thread.Sleep(50);
}
Console.WriteLine("Wenli.Drive.Redis test 任务已完成!---------------------");
#endregion
}
else
{
#region default redis
Console.WriteLine("Wenli.Drive.Redis test 进入单实例模式---------------------");
var redisHelper = RedisHelperBuilder.Build("RedisConfig");
#region string
Console.ReadLine();
Console.WriteLine("string get/set test");
redisHelper.GetRedisOperation(12).StringSet("abcabcabc", "123123");
Console.WriteLine("写入key:abcabcabc,value:123123");
var str = redisHelper.GetRedisOperation(12).StringGet("abcabcabc");
Console.WriteLine("查询key:abcabcabc,value:" + str);
redisHelper.GetRedisOperation(12).KeyDelete("abcabcabc");
Console.WriteLine("移除key:abcabcabc");
#endregion
#region hashset
Console.ReadLine();
Console.WriteLine("hashset get/set test");
var testModel = new DemoModel()
{
ID = Guid.NewGuid().ToString("N"),
Age = 18,
Name = "Kitty",
Created = DateTime.Now
};
redisHelper.GetRedisOperation().HashSet<DemoModel>(testModel.Name, testModel.ID, testModel);
Console.WriteLine(string.Format("写入hashid:{0},key:{1}", testModel.Name, testModel.ID));
testModel = redisHelper.GetRedisOperation().HashGet<DemoModel>(testModel.Name, testModel.ID);
Console.WriteLine(string.Format("查询hashid:{0},key:{1}", testModel.Name, testModel.ID));
redisHelper.GetRedisOperation().HashGetAll<DemoModel>(testModel.Name, 1, 1);
redisHelper.GetRedisOperation().HashDelete(testModel.Name, testModel.ID);
Console.WriteLine("移除hash");
#endregion
#region 队列
Console.ReadLine();
Console.WriteLine("list test");
redisHelper.GetRedisOperation().Enqueue("list", "listvalue");
Console.WriteLine("入队:list,value:listvalue");
Console.WriteLine("list.coumt:" + redisHelper.GetRedisOperation().QueueCount("list"));
Console.WriteLine(string.Format("出队:list,value:{0}", redisHelper.GetRedisOperation().Dnqueue("list")));
Console.WriteLine("list.coumt:" + redisHelper.GetRedisOperation().QueueCount("list"));
#endregion
#region pub/sub
Console.ReadLine();
Console.WriteLine("sub/pub test");
Console.WriteLine("订阅频道:happy");
redisHelper.GetRedisOperation().Subscribe("happy", (x, y) =>
{
Console.WriteLine(string.Format("订阅者收到消息;频道:{0},消息:{1}", x, y));
});
Console.WriteLine("发布频道happy 10 条测试消息");
for (int i = 1; i <= 10; i++)
{
redisHelper.GetRedisOperation().Publish("happy", "this is a test message" + i);
Thread.Sleep(400);
}
#endregion
Console.ReadLine();
redisHelper.GetRedisOperation().Unsubscribe("happy");
#endregion
}
}
Console.ReadLine();
}
}
当然也可将https://github.com/yswenli/RedisDrive/tree/master/DriveTest下载下来运行一下测试~
redis成长之路——(一)
redis成长之路——(二)
redis成长之路——(三)
redis成长之路——(四)
redis成长之路——(五)
redis成长之路——(六)
redis成长之路——(七)
转载请标明本文来源:http://www.cnblogs.com/yswenli/p/6235765.html
更多内容欢迎star作者的github:https://github.com/yswenli/RedisDrive
如果发现本文有什么问题和任何建议,也随时欢迎交流~
redis成长之路——(一)的更多相关文章
- redis成长之路——(二)
redis操作封装 针对这些常用结构,StackExchange.Redis已经做了一些封装,不过在实际应用场景中还必须添加一些功能,例如重试等 所以对一些常功能做了一些自行封装SERedisOper ...
- redis成长之路——(七)
扩展性封装 虽说现在StackExchange.Redis免费,万一到时候和servicestack.redis一样要收费呢,所以先留一口,后续的可以再处理 实例代码点击这里查看 redis成长之路- ...
- redis成长之路——(六)
redis配置 为了码农在代码上只关心业务以及代码上的统一性,wenli.drive.redis内部使用配置来完成那些不同的场景,也就是说随便填填配置就能适应不同的场景! 当然配置多了码农也会受不了, ...
- redis成长之路——(五)
单例.哨兵.Cluster redis应用广泛,主要体现于实际场景的可用化,但是对于码农来说初步入手很多理念难以理解:码农的想法就是:为什么我要管那么多,我只想用,能用就行!所以必须将三个场景透明化. ...
- redis成长之路——(三)
redis连接封装 StackExchange.Redis中有一些常功能是不在database对中,例如发布订阅.获取全部key(本代码中已封装到operation中了)等,而且StackExchan ...
- redis成长之路——(四)
加强redis连接的连接池 虽然StackExchange.Redis针对连接已经做了很多工作,不过在实际应用场景中还是不够的,比如多实例的vip就会导致只能连到其中一个实例上等:本实例中的连接池只能 ...
- java 成长之路[轉載u]
分享总结title: java 成长之路tags:grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒闭.这 ...
- java 成长之路
分享总结 title: java 成长之路 tags: grammar_cjkRuby: true 经验差异 1-3年 要求 建议 3-5年 建议 5年+ 经验差异 最近一年比较忙,经历了创业公司的倒 ...
- python工程师成长之路精品课程(全套)
python工程师成长之路精品课程(全套) 有需要联系我:QQ:1844912514 什么是Python? Python是一门面向对象的编程语言,它相对于其他语言,更加易学.易读,非常适合快速开发. ...
随机推荐
- SQL:指定名称查不到数据的衍伸~空格 换行符 回车符的批量处理
异常处理汇总-数据库系列 http://www.cnblogs.com/dunitian/p/4522990.html 先看看啥情况 复制查询到的数据,粘贴一下看看啥情况 那就批量处理一下~ 就这样 ...
- Hawk 6. 高级话题:子流程系统
子流程的定义 当流程设计的越来越复杂,越来越长时,就难以进行管理了.因此,采用模块化的设计才会更加合理.本节我们介绍子流程的原理和使用. 所谓子流程,就是能先构造出一个流程,然后被其他流程调用.被调用 ...
- 搭建属于自己的VIP积分系统(1)
很久没写博客了,如果有写得不好的地方,还请多多见谅. 架构设计 需求分析 这篇文章主要是介绍此VIP系统的基础架构.说实在的,我其实对 架构方面也不是很懂,我这套框架 还是拿别人的东西改过来的,并不是 ...
- 初学seaJs模块化开发,利用grunt打包,减少http请求
原文地址:初学seaJs模块化开发,利用grunt打包,减少http请求 未压缩合并的演示地址:demo2 学习seaJs的模块化开发,适合对seajs基础有所了解的同学看,目录结构 js — —di ...
- 走进缓存的世界(三) - Memcache
系列文章 走进缓存的世界(一) - 开篇 走进缓存的世界(二) - 缓存设计 走进缓存的世界(三) - Memcache 简介 Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用 ...
- C# 程序中嵌入百度地图
本例是对WinForm中使用百度地图的简要介绍.百度地图目前支持Android开发,IOS开发,Web开发,服务接口,具体可以参照'百度地图开放平台'. [动态加载百度地图]涉及到的知识点: WebB ...
- java 设计模式
目录: 设计模式六大原则(1):单一职责原则 设计模式六大原则(2):里氏替换原则 设计模式六大原则(3):依赖倒置原则 设计模式六大原则(4):接口隔离原则 设计模式六大原则(5):迪米特法则 设计 ...
- GSD_WeiXin(高仿微信)应用源码
高仿微信计划:已经实现功能 1.微信首页(cell侧滑编辑.下拉眼睛动画.下拉拍短视频.点击进入聊天详情界面) 2.通讯录(联系人字母排序.搜索界面) 3.发现(朋友圈) 4.我(界面) 待实现功能( ...
- 解决Ubuntu Kylin 1610安装ANSYS17.2的NVIDIA显卡驱动问题
Ubuntu Kylin 1610在安装完毕后,会自动安装显卡驱动,对于一般的图形图像使用来说自然不会有太大的问题,但是对于ANSYS17.2的一些模块,还是会出现问题.一个比较常见的问题就是Open ...
- Java版本:识别Json字符串并分隔成Map集合
前言: 最近又看了点Java的知识,于是想着把CYQ.Data V5迁移到Java版本. 过程发现坑很多,理论上看大部分很相似,实践上代码写起来发现大部分都要重新思考方案. 遇到的C#转Java的一些 ...