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 sentinelConsole.WriteLine("Wenli.Drive.Redis test 进入哨兵模式---------------------");using (var redisHelper = RedisHelperBuilder.Build("ClusterConfig")){#region stringConsole.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 hashsetConsole.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 sortedsetConsole.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/subConsole.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);}#endregionConsole.ReadLine();redisHelper.GetRedisOperation().Unsubscribe("happy");}#endregion}else if (c.ToUpper() == "C"){#region clusterConsole.WriteLine("Wenli.Drive.Redis test 进入集群模式---------------------");var redisHelper = RedisHelperBuilder.Build("ClusterConfig");#region stringConsole.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 hashsetConsole.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/subConsole.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);}#endregionConsole.ReadLine();redisHelper.GetRedisOperation().Unsubscribe("happy");#endregion}else if (c.ToUpper() == "M"){#region default redisConsole.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 stringConsole.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 hashsetConsole.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 stringConsole.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 hashsetConsole.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 redisConsole.WriteLine("Wenli.Drive.Redis test 进入单实例模式---------------------");var redisHelper = RedisHelperBuilder.Build("RedisConfig");#region stringConsole.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 hashsetConsole.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/subConsole.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);}#endregionConsole.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
如果发现本文有什么问题和任何建议,也随时欢迎交流~
感谢您的阅读,如果您对我的博客所讲述的内容有兴趣,请继续关注我的后续博客,我是yswenli 。
redis成长之路——(一)相关推荐
- 从程序员到架构师的最佳技术成长之路
我把程序员到架构师的技术成长之路分为几个典型的阶段:工程师 - 高级工程师 - 技术专家 - 初级架构师 - 中级架构师 - 高级架构师,总的成长原则是每个阶段都需要"积累经验.拓宽视野.深 ...
- python linux运维教程 推荐_Linux运维人员成长之路学习书籍推荐
原标题:Linux运维人员成长之路学习书籍推荐 一.入门书: <鸟哥的私房菜(基础篇)> <鸟哥的私房菜(服务篇)> <Linux命令行与Shell脚本编程大全(第2版) ...
- 如何成为一名架构师,架构师成长之路(转)
转自http://blog.csdn.net/fei33423/article/details/61934514 如何成为一名架构师,架构师成长之路 原创 2017年03月13日 22:50:34 3 ...
- 昊鼎王五:高级运维工程师的成长之路,总有一款适合你^_^
#昊鼎王五:高级运维工程师的成长之路,总有一款适合你_ 本文关键词: 成长为高级运维工程师的打怪升级之路 本篇参考zhenliang同学的文章,一个从事多年运维的牛人,文章写的很好,人非常nice. ...
- Java架构师成长之路
目录导航 前言 一.源码分析专题 1.1 设计模式详解 1.2 Mybatis源码分析 1.3 Spring5源码分析 二.分布式架构专题 2.1 漫谈分布式架构 2.2 分布式架构的基础 2.3 分 ...
- 如何成为一名架构师,架构师成长之路
技术人人都是xx 父文章 人人都是面试_个人渣记录仅为自己搜索用的博客-CSDN博客 我的成长之路_个人渣记录仅为自己搜索用的博客-CSDN博客 相关文章 架构师好书推荐_个人渣记录仅为自己搜索用的博 ...
- JAVA程序员成长之路的总结
JAVA程序员成长之路的总结 看了篇推荐贴,JAVA程序员成长之路的总结,大致适用于各种初级JAVA程序员规划借鉴之用, 原文地址http://tieba.baidu.com/p/2017010306 ...
- 阿里技术分享:阿里自研金融级数据库OceanBase的艰辛成长之路
本文原始内容由作者"阳振坤"整理发布于OceanBase技术公众号. 1.引言 OceanBase 是蚂蚁金服自研的分布式数据库,在其 9 年的发展历程里,从艰难上线到找不到业务场 ...
- 精品课python_python工程师成长之路精品课程(全套)
python工程师成长之路精品课程(全套) 有需要联系我:QQ:1844912514 什么是Python? Python是一门面向对象的编程语言,它相对于其他语言,更加易学.易读,非常适合快速开发. ...
最新文章
- ORACLE DUAL
- 指尖下的js ——多触式web前端开发之二:处理简单手势
- 【html 及 HTML5所有标签汇总】★★★
- Caffe---Pycaffe进行网络结构(xxx.prototxt)可视化
- 使用Java处理除法运算的陷阱
- HTML5拖放(drag and drop)与plupload的懒人上传
- 二叉查找树(一)之 C语言的实现
- ibe加密原理_ibe 基于身份的IBE加密源代码,采用C++语言编写,能够运行。 Crypt_De algrithms 解密 238万源代码下载- www.pudn.com...
- STL源码剖析 序列式容器 slist
- [LOJ#6053]简单的函数 题解
- Power BI销售数据分析
- 计算机 host id是指,关于如何修改hostid的问题Windows系统 -电脑资料
- 开拓者队医当选年度最佳 球迷:罗伊情何以堪
- Deep Learning for UAV-based Object Detection andTracking: A Survey(论文翻译)
- Office2007 sp补丁包安装失败解决办法
- 转:『诡异的』VL10B创建外向交货单出错解决全过程
- 虚拟机由于硬盘存储空间过满导致启动异常+虚拟机扩容
- learnpythonthehardway.org_Python学习笔记LearnPythonHardWay
- 【图文教程】传统IDC部署网站
- 【接口测试实战(零)】接口测试简介
热门文章
- (0098)iOS开发之应用间的分享系列(3)
- 幼儿园python_[Python]猜数字游戏AI版的实现(幼儿园智商AI)
- vue结合Promise及async实现高效开发。
- 快速查看linux命令的用法----------TLDR
- 2015 HIAST Collegiate Programming Contest J
- iOS 11 UIScrollView的新特性(automaticallyAdjustsScrollViewInsets 不起作用了)
- 第七章 ReentrantLock总结
- wp7——sqlite数据库操作 from:http://blog.csdn.net/wp_lijin/article/details/7370790
- SqlSelect-在查询结果前面加一列序号列
- Highcharts Pie 饼图提示标签IE下重叠解决方法,及json数据绑定方法