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