Redis常用數(shù)據(jù)類型包括:string(字符串),list(鏈表), Hash(哈希),set(集合)及zset(sorted set) (有序集合),Pub/Sub,Transactions
1 String 字符串
常用命令:set,get,decr(遞減),incr (遞增),mget
String是最常用的一種數(shù)據(jù)類型,普通的key/value存儲(chǔ)都可以歸為此類 。一個(gè)Key對(duì)應(yīng)一個(gè)Value,string類型是二進(jìn)制安全的。Redis的string可以包含任何數(shù)據(jù)。
示例(C#):
var cilent=new RedisClient("127.0.0.1",6379);
client.Set<string>("UserName","admin");//Set
string uName=client.Get<string>("Name");//Get
client.Set<int>("VoteUser_Admin",0);//模擬投票
client.Incr("VoteUser_Admin");//投一票 -遞增
2 Hash 哈希
常用命令:hget,hset,hgetall 等。
hash是一個(gè)string 類型的field和value的映射表。hash特別
適合存儲(chǔ)對(duì)象。相對(duì)于將對(duì)象的每個(gè)字段存成單個(gè)string 類型。一個(gè)對(duì)象存儲(chǔ)在hash類型中會(huì)占用更少的內(nèi)存,并且可以更方便的存取整個(gè)對(duì)象。
示例(C#):
// 存儲(chǔ)一個(gè) User 對(duì)象
//第一種方式 增加了序列化/反序列化的開(kāi)銷,并且在需要修改其中一項(xiàng)信息時(shí),需要把整個(gè)對(duì)象取回
var json = "user序列化字符串";
var hashId = "UserAdmin";
client.Set<string>(hashId, "json");
// 第二種方式
client.SetEntryInHash(hashId, "Name", "Admin");
client.SetEntryInHash(hashId, "IP", "127.0.0.1");
client.SetEntryInHash("UserAdmin", "Pwd", "127.0.0.1");
//獲取UserAdmin 的Name
var name = client.GetValueFromHash(hashId, "Name");
//獲取所有的UserAdmin Key
var keys = client.GetHashKeys(hashId);
//獲取所有UserAdmin value
var values = client.GetHashValues(hashId);
3 List 鏈表
常用命令:lpush,rpush,lpop,rpop,lrange等。
list是一個(gè)鏈表結(jié)構(gòu),主要功能是push,pop,獲取一個(gè)范圍的所有的值等,操作中key理解為鏈表名字。 Redis的list類型其實(shí)就是一個(gè)每個(gè)子元素都是string類型的雙向鏈表。我們可以通過(guò)push,pop操作從鏈表的頭部或者尾部添加刪除元素,這樣list既可以作為棧,又可以作為隊(duì)列。Redis list的實(shí)現(xiàn)為一個(gè)雙向鏈表,即可以支持反向查找和遍歷,更方便操作,不過(guò)帶來(lái)了部分額外的內(nèi)存開(kāi)銷,Redis內(nèi)部的很多實(shí)現(xiàn),包括發(fā)送緩沖隊(duì)列等也都是用的這個(gè)數(shù)據(jù)結(jié)構(gòu) 。
示例(C#):
#region List基礎(chǔ)使用
var key = "demolist";
client.AddItemToList(key, "123");
client.AddItemToList(key, "1234");
Console.WriteLine("List數(shù)據(jù)項(xiàng)條數(shù):" + client.GetListCount(key));
Console.WriteLine("List數(shù)據(jù)項(xiàng)第一條數(shù)據(jù):" + client.GetItemFromList(key, 0));
Console.WriteLine("List所有數(shù)據(jù)");
client.GetAllItemsFromList(key).ForEach(e => Console.WriteLine(e));
#endregion
#region 隊(duì)列使用
client.EnqueueItemOnList("name", "zhangsan");
client.EnqueueItemOnList("name", "lisi");
int count = client.GetListCount("name");
for (int i = 0; i < count; i++)
{
Console.WriteLine(client.DequeueItemFromList("name"));
}
#endregion
#region 棧使用
client.PushItemToList("name2", "wangwu");
client.PushItemToList("name2", "maliu");
int count = client.GetListCount("name2");
for (int i = 0; i < count; i++)
{
Console.WriteLine(client.PopItemFromList("name2"));
}
#endregion
4 Set 集合
常用命令:sadd,spop,smembers,sunion
應(yīng)用場(chǎng)景:提供一個(gè)列表的功能,set可以自動(dòng)排除重復(fù),當(dāng)需要存儲(chǔ)一個(gè)不重復(fù)的列表數(shù)據(jù),可以選擇set。set提供了一個(gè)判斷某個(gè)成員是否在一個(gè)set集合中。
5 ZSet 有序集合
常用命令:zadd,zrange ,zrem,zcard
場(chǎng)景:zset 提供一個(gè)優(yōu)先級(jí)參數(shù)來(lái)進(jìn)行排序,并且是插入有序的,自動(dòng)排序。需要一個(gè)有序的并且不重復(fù)的集合列表,可以選用。