僅作為學習記錄使用干跛,以及其他新人做參考稳析。
主要還是說一下數(shù)據(jù)庫分頁的東西把。作為剛剛大三出來實習的新人梳虽,數(shù)據(jù)庫的分頁上面還是不太熟練址芯,一下是最近的實習過程中使用到的和查閱資料總結(jié)的一些經(jīng)驗。如有錯誤窜觉,望指正
1.SQL server數(shù)據(jù)庫分頁:
sql server作為高校課程中使用最多的數(shù)據(jù)庫谷炸,也是目前很多新人唯一會用的數(shù)據(jù)庫(mysql差不多算在一起把),基礎的增刪查改就不做多余的贅述了禀挫,先來說說sql的分頁把旬陡。
方案一:(在sql2012以上版本時可以使用Offset/Fetch Next方法實現(xiàn))
select [column1]
????? ,[column2]
????? ...????
???? ,[columnN]
from [tableName]
order by [columnM]
offset(pageIndex-1)*pageSize rows
fetch next pageSize rows only
稍微解釋一下吧,offset(pageIndex-1)*pageSize rows字面意思的是偏移量语婴,就是指從第多少條數(shù)據(jù)開始檢索描孟,相當于skip的作用驶睦,
fetch next pageSize rows only從檢索開始的位置取接下來的pageSize條數(shù)據(jù)
offset/fetch next這個語法再老版本的服務器上可能不支持,但是再sql2012之后推薦使用匿醒,性能比較不錯
方案二:(利用ID大于多少和SELECT TOP分頁)
SELECT TOP 頁大小*
FROM TestTable
WHERE (ID >
????????? (SELECT MAX(id)
???????? FROM (SELECT TOP頁大小*頁數(shù)id
???????????????? FROM表
???????????????? ORDER BY id) AS T))
ORDER BY ID
其它方法场航,如使用rownumber,也是較為不錯的方法廉羔,但使用環(huán)境局限溉痢,
Limit skip只有在mysql和特定的SQL server版本中可以使用,
Mysql差不多憋他,但是mysql還有另外一個更簡單的分頁方法适室,使用limit,具體方法百度上有詳細教程举瑰。
2.mongo數(shù)據(jù)分頁
mongo對于很多在校大學生或者實習新人來說應該是陌生的捣辆,同樣也是我第一款接觸到的NoSql(Not Only SQL)即非關系型數(shù)據(jù)庫,再剛開始用的時候可以說是完全找不到頭緒此迅。但是會用了之后汽畴,還是能明顯感覺到nosql數(shù)據(jù)庫再處理大量數(shù)據(jù)存儲事務上,其效率還是要比傳統(tǒng)的sql數(shù)據(jù)庫快一些耸序。但是相應的忍些,nosql數(shù)據(jù)庫對于數(shù)據(jù)的一致性的保持上是不如sql數(shù)據(jù)庫的。
C#使用mongo有一點需要注意坎怪,不同版本的驅(qū)動罢坝,語法不同,redis也一樣搅窿,
我這里使用的是
前提:MongoCollection collection = db.GetCollection("Users")嘁酿;
方案一:條件查詢 原生Query實現(xiàn)
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數(shù)據(jù)庫本身就帶有的語法,封裝到了Query類中男应,效率的話還是不錯闹司,
方案二:Skip原生Query實現(xiàn)
var result =collection.FindAll().SetSkip(100000).SetLimit(100).SetSortOrder(SortBy.Ascending("amount"));
Console.WriteLine(result.ToList().First().ToJson());
有一點需要注意的是,setlimit方法與setskip方法的使用需要注意其調(diào)用順序
方案三: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作為一個在實際業(yè)務中廣泛使用的數(shù)據(jù)庫 ,其效率自然是不用說的筛峭,但一般是作為緩存庫來用铐刘。自己做測試時需要注意的是,必須要把redis的服務運行起來蜒滩,才能成功連接到redis數(shù)據(jù)庫
連接
usingServiceStack;
usingServiceStack.Commands;
usingServiceStack.Text;
usingServiceStack.Redis;
//需要添加nuGet包里的serviceStack相關的包
private RedisClient redis = new RedisClient("127.0.0.1", 6379, "", 1);
//參數(shù)說明:連接地址滨达,連接端口奶稠,連接密碼,連接數(shù)據(jù)庫(從數(shù)據(jù)庫集合中通過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會將該數(shù)據(jù)替換為新的數(shù)據(jù)锌订,例如原數(shù)據(jù)為id:xxxx{xx:xx,yy:yy}新數(shù)據(jù)為id:xxxx{xx:yy}則更新后,結(jié)果并不是id:xxxx{xx:yy,yy:yy}而是id:xxxx{xx:yy}画株,
還有過期時間也會被重寫辆飘,要保持過期時間不變,需要保存好
mongo的update也是覆蓋更新谓传,要實現(xiàn)非覆蓋更新可以再更新之前先將元數(shù)據(jù)保存下來蜈项,將要修改的數(shù)據(jù)更新到保存的數(shù)據(jù)中,再將這條數(shù)據(jù)寫回去
4.MemCached連接與使用
memcached作為一款存儲在內(nèi)存中的數(shù)據(jù)庫续挟,作為緩存使用其效率也是非常的高
memcached的驅(qū)動也有很多版本紧卒,我這里使用的是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));//參數(shù)說明:模式诗祸,鍵名跑芳,鍵值,過期時間
刪除
client.Remove(KeyName);
查詢
client.Get(KeyName).ToString();
修改
client.Store(StoreMode.Replace, KeyName,KeyValue, DateTime.Now.AddMilliseconds(1000 * 60 * 5))
以上都是個人見解直颅,若有錯誤博个,敬請指教,避免誤導他人功偿。