一,簡介
Redis 是由 Salvatore Sanfilippo 編寫的一個key-value存儲系統,是跨平台的非關系型數據庫。Redis是一個開源的,使用C語言編寫的,遵守BSD協議,支持網絡,可基於內存,分布式,可選持久性的鍵值對(key-value)存儲數據庫,並且提供了多種語言的API。
二,特性
1.基於內存存儲(不開啟持久化的情況),讀寫性能優異
2.支持持久化
3.數據類型豐富,滿足絕大部分常用的應用場景。
4.單線程
5.數據自動過期
6.發布訂閱模式
7.支持分布式
三.,數據結構及應用場景
1.String,適合簡單的key,value存儲結構,類似於之前使用過的cache,memcached的存儲結構。應用場景:短信驗證碼,配置信息等。
常用命令:
1.1 incr:自增
1.1 decr:自減
1.1 incrby:加(加上指定的值)
1.1 decrby:減(加上指定的值)
2.Hash ,一般key為id或者唯一標識,value存儲對應的詳情信息,應用場景:個人詳情,商品詳情等。、
2.1 hset:添加hash數據
2.2 hget:獲取hash數據
2.3 hmget:獲取多個hash 中key的數據
3.List,應為list是有序的,適合存儲一些格式相對固定的數據結構,應用場景:省市區,字典信息等。
常用命令:
3.1 lpush:從左邊推入
3.2 rpush:從右邊推入
3.3 lpop:從左邊彈出
3.4 rpop:從右邊彈出
3.4 llen:查看某個list集合的長度
4.Set,可以理解為ID-List 模式,set最厲害的地方是可以求兩個set集合的交集,並集,差集等,應用場景:相關好友,關注列表,收藏夾等。
4.1 sadd:添加數據
4.2 scard:查看set集合中元素的個數
4.3 sismember:判斷set集合中是否存在某個元素
4.4 srem:刪除某個元素
4.5 smembers:返回集合中所有成員
5.Sorted Set,set的升級版,增加了一個score參數,可以根據score參數進行排序。應用場景:排行榜數據等。
5.1 zadd:添加數據
5.2 zcard:查詢元素數量
5.3 zrange:對集合進行排序
四,其它常用應用場景
1.分布式鎖,因為redis是單線程處理,所有可以用來做分布式鎖,避免數據被重復處理
.net實現代碼如下:
public static void RedisLockV2() { var lockTimeout = 5000;//單位是毫秒 var currentTime = DateTime.Now.ToUnixTime(true); if (SetNxV2("lockkey",DateTime.Now.ToUnixTime(true)+lockTimeout)) { //設置過期時間 redisClient.Expire("lockkey", TimeSpan.FromMilliseconds(5000)); //TODO:一些業務邏輯代碼 Console.WriteLine("處理業務ing"); Thread.Sleep(100000); Console.WriteLine("處理業務ed"); //最后釋放鎖 Remove("lockkey"); } else { //未獲取到鎖,繼續判斷,判斷時間戳看看是否可以重置並獲取鎖 var lockValue = redisClient.Get("lockkey"); var time = DateTime.Now.ToUnixTime(true); if (!string.IsNullOrEmpty(lockValue) && time> lockValue.ToInt64()) { //再次用當前時間戳getset //返回固定key的舊值,舊值判斷是否可以獲取鎖 var getsetResult = redisClient.GetSet("lockkey", time); if (getsetResult == null || (getsetResult != null && getsetResult == lockValue)) { Console.WriteLine("獲取到Redis鎖了"); //真正獲取到鎖 redisClient.Expire("lockkey", TimeSpan.FromMilliseconds(5000)); //TODO:一些業務邏輯代碼 //..... //..... Console.WriteLine("處理業務"); //最后釋放鎖 Remove("lockkey"); } else { Console.WriteLine("沒有獲取到鎖"); } } else { Console.WriteLine("沒有獲取到鎖"); } } }