手记

ASP.NET新人学习笔记-数据库篇

1.SQL server数据库分页:

sql server作为高校课程中使用最多的数据库,也是目前很多新人唯一会用的数据库(mysql差不多算在一起把),基础的增删查改就不做多余的赘述了,先来说说sql的分页把。

方案一:(在sql2012以上版本时可以使用Offset/Fetch Next方法实现)

select [column1]

      ,[column2]

      ...    

     ,[columnN]

from [tableName]

order by [columnM]

offset(pageIndex-1)*pageSize rows

fetch next pageSize rows only

稍微解释一下吧,offset(pageIndex-1)*pageSize rows字面意思的是偏移量,就是指从第多少条数据开始检索,相当于skip的作用,

fetch next pageSize rows only从检索开始的位置取接下来的pageSize条数据

offset/fetch next这个语法再老版本的服务器上可能不支持,但是再sql2012之后推荐使用,性能比较不错

方案二:(利用ID大于多少和SELECT TOP分页)

SELECT TOP 页大小*

FROM TestTable

WHERE (ID >

          (SELECT MAX(id)

         FROM (SELECT TOP页大小*页数id

                 FROM表

                 ORDER BY id) AS T))

ORDER BY ID


其它方法,如使用rownumber,也是较为不错的方法,但使用环境局限,

Limit skip只有在mysql和特定的SQL server版本中可以使用,

Mysql差不多,但是mysql还有另外一个更简单的分页方法,使用limit,具体方法百度上有详细教程。


2.mongo数据分页

mongo对于很多在校大学生或者实习新人来说应该是陌生的,同样也是我第一款接触到的NoSql(Not Only SQL)即非关系型数据库,再刚开始用的时候可以说是完全找不到头绪。但是会用了之后,还是能明显感觉到nosql数据库再处理大量数据存储事务上,其效率还是要比传统的sql数据库快一些。但是相应的,nosql数据库对于数据的一致性的保持上是不如sql数据库的。

C#使用mongo有一点需要注意,不同版本的驱动,语法不同,redis也一样,

我这里使用的是

使用的驱动

前提:MongoCollection collection = db.GetCollection("Users");

方案一:条件查询 原生Query实现

var query =Query.GT(item => item.Amount, 2399927);

var result =collection.Find(query).SetLimit(100).SetSortOrder(SortBy.Ascending("amount")).ToList();

Console.WriteLine(result.First().ToJson());//BSON自带的ToJson

这个方法使用的其实是mongo数据库本身就带有的语法,封装到了Query类中,效率的话还是不错,

方案二:Skip原生Query实现

var result =collection.FindAll().SetSkip(100000).SetLimit(100).SetSortOrder(SortBy.Ascending("amount"));

Console.WriteLine(result.ToList().First().ToJson());

有一点需要注意的是,setlimit方法与setskip方法的使用需要注意其调用顺序

方案三:Linq 条件查询

var result =collection.AsQueryable().OrderBy(item => item.Amount).Where(item=>item.Amount>2399927).Take(100);Console.WriteLine(result.First().ToJson());

linq相信熟悉c#的都不会陌生了,这里使用了lambda表达式作为Linq查询的条件,

方案四:Linq Skip版本

var result =collection.AsQueryable().OrderBy(item =>item.Amount).Skip(100000).Take(100);Console.WriteLine(result.First().ToJson());

同方案三,都是使用了c#的linq,使用时要引用命名空间。



3.Redis连接与使用

redis作为一个在实际业务中广泛使用的数据库 ,其效率自然是不用说的,但一般是作为缓存库来用。自己做测试时需要注意的是,必须要把redis的服务运行起来,才能成功连接到redis数据库

连接

usingServiceStack;

usingServiceStack.Commands;

usingServiceStack.Text;

usingServiceStack.Redis;

//需要添加nuGet包里的serviceStack相关的包


private RedisClient redis = new RedisClient("127.0.0.1", 6379, "", 1);

//参数说明:连接地址,连接端口,连接密码,连接数据库(从数据库集合中通过index选择)

插入

redis.Add(key name, key value ,expired

time);//新增键名 键值 过期时间

实例:redis.Add(users.UserId.ToString(),

users,DateTime.Now.AddMilliseconds(1000*60*60*2));// Users是一个实体类

查询

redis.Get(key name);

实例:Users users =redis.Get(UserId.ToString());

删除

redis.Remove(key name);

更新

redis.Set(key name, new key value,expiredtime)

注意

这里需要注意到是,set会将该数据替换为新的数据,例如原数据为id:xxxx{xx:xx,yy:yy}新数据为id:xxxx{xx:yy}则更新后,结果并不是id:xxxx{xx:yy,yy:yy}而是id:xxxx{xx:yy},

redis非覆盖更新思路(仅供参考)

还有过期时间也会被重写,要保持过期时间不变,需要保存好

获取键名为KeyName的值的数据的剩余过期时间

mongo的update也是覆盖更新,要实现非覆盖更新可以再更新之前先将元数据保存下来,将要修改的数据更新到保存的数据中,再将这条数据写回去


mongo非覆盖更新思路(仅供参考)

4.MemCached连接与使用

memcached作为一款存储在内存中的数据库,作为缓存使用其效率也是非常的高

memcached的驱动也有很多版本,我这里使用的是enyim的,

usingEnyim.Caching;

usingEnyim.Caching.Memcached;

//需要添加nuGet包里的enyim


private MemcachedClient client = newMemcachedClient( );

static readonly object padlock = new object();

保存

client.Store(StoreMode.Set, KeyName,

KeyValue, DateTime.Now.AddMilliseconds(1000 * 60 * 5));//参数说明:模式,键名,键值,过期时间

删除

client.Remove(KeyName);

查询

client.Get(KeyName).ToString();

修改

client.Store(StoreMode.Replace, KeyName,KeyValue, DateTime.Now.AddMilliseconds(1000 * 60 * 5))



作者:久病_e3c3
链接:https://www.jianshu.com/p/908dbf83c3d6


0人推荐
随时随地看视频
慕课网APP