Redis 常見使用場景詳解


一,簡介

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("沒有獲取到鎖");
                }
            }
            
        }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM