基礎拾遺------redis詳解


基礎拾遺

基礎拾遺------特性詳解

基礎拾遺------webservice詳解

基礎拾遺------redis詳解

基礎拾遺------反射詳解

基礎拾遺------委托詳解

基礎拾遺------接口詳解

基礎拾遺------泛型詳解

基礎拾遺-----依賴注入

基礎拾遺-----數據注解與驗證

基礎拾遺-----mongoDB操作

基礎拾遺----RabbitMQ

基礎拾遺---CLR

前言

  這篇文章和以往的基礎拾遺有所不同,以前的介紹的都是c#基礎,今天介紹的是redis。因為項目中一只在使用,我想現在大部分項目中都會用到nosql,緩存,今天就介紹一下redis.。廢話少說下面開始正題。

1.redis是什么?

  Redis 是完全開源免費的,遵守BSD協議,是一個高性能的key-value數據庫

對的redis就是一個存鍵值對的數據庫,它不僅支持簡單的key-value類型的數據,同時還提供list,set,zset,hash等數據結構的存儲。【我習慣於存簡單的key-value(value都是寫成需要數據結構的對象)】。

2.redis使用場景

  1.取最新N個數據的操作

  2.排行榜應用,取TOP N 操作

  3.需要精確設定過期時間的應用

  4.計數器應用

  由於INCR等指令本身就具有原子操作的特性,所以我們完全可以利用redis的INCR、INCRBY、DECR、DECRBY等指令來實現原子計數的 效果,假如,在某種場景下有3個
客戶端同時讀取了mynum的值(值為2),然后對其同時進行了加1的操作,那么,最后mynum的值一定是5。不少網站 都利用redis的這個特性來實現業務上的統計計數需求。

  5.Uniq操作,獲取某段時間所有數據排重值

  6.實時系統,反垃圾系統

  7.Pub/Sub構建實時消息系統

  8.構建隊列系統

  9.緩存

最多的是用做緩存。他的操作所讀是mysql的10倍不止。SET操作每秒鍾 110000 次,GET操作每秒鍾 81000 次。

3.redis數據結構

上邊已經說了redis是一種高級的key:value存儲系統,其中value支持五種數據類型:

1.字符串(strings)
2.字符串列表(lists)
3.字符串集合(sets)
4.有序字符串集合(sorted sets)
5.哈希(hashes)

3.1.key

1.key不要太長,盡量不要超過1024字節,這不僅消耗內存,而且會降低查找的效率;
2.key也不要太短,太短的話,key的可讀性會降低;
3.在一個項目中,key最好使用統一的命名模式,例如power_loginname

3.2.字符串(strings)

strings類型是一個很基礎的數據類型,也是任何存儲系統都必備的數據類型.

操作如下:

set myredis 'kmonkeywyl'
get myredis

注:在遇到非字符串類型比如int,redis會默認轉為string.

3.3.字符串列表(lists)

  redis中的lists在底層實現上並不是數組,而是鏈表.所以插入數據快,但定位性能操作較差。

lists的常用操作包括lpush、rpush、lpush,lrange等

操作如下:

//新建一個list叫做mylist,並在列表頭部插入元素"1"
lpush mylist "1"
//在mylist右側插入元素"2"
rpush mylist "2"
//在mylist左側插入元素"0"
lpush mylist "0"
//列出mylist中從編號0到編號1的元素
lrange mylist 0 1
//列出mylist中從編號0到倒數第一個元素
lrange mylist 0 -1 

  注:上邊應用場景1,2,8都用到lists就會很方便,具體應用場景(消息隊列,分頁,博客評論)

3.3.字符串集合(sets)

集合對於我們來說應該不陌生,就是我們初中學的那個集合,針對於集合有幾個概念不知道你還熟悉不?取交集、取並集、取差,不熟悉的自己去熟悉去吧。

操作如下:

//向集合myset中加入新元素"wyl"
sadd myset "wyl"
(integer) 1
sadd myset "kmonkey"
(integer) 1
//列出集合myset中的所有元素
smembers myset
1) "wyl"
2) "kmonkey"
//判斷元素1是否在集合myset中,返回1表示存在
sismember myset "wyl"
(integer) 1
//判斷元素是否在集合myset中,返回0表示不存在
sismember myset "wangyanling"
(integer) 0
//新建一個新的集合yourset
sadd yourset "1"
(integer) 1
sadd yourset "2"
(integer) 1
smembers yourset
1) "1"
2) "2"
//對兩個集合求並集
sunion myset yourset
1) "1"
2) "wyl"
3) "2"
4) "kmonkey"

3.4.有序字符串集合(sorted sets)

和上邊的無須集合唯一的差別是有序的每個元素都有一個序號score,主要是便於排序

操作如下:

zadd myzset 1 baidu.com
(integer) 1
//向myzset中新增一個元素360.com,賦予它的序號是3
zadd myzset 3 360.com
(integer) 1
//向myzset中新增一個元素google.com,賦予它的序號是2
 zadd myzset 2 google.com
(integer) 1
//列出myzset的所有元素,同時列出其序號,可以看出myzset已經是有序的了。
zrange myzset 0 -1 with scores
1) "baidu.com"
2) "1"
3) "google.com"
4) "2"
5) "360.com"
6) "3"
//只列出myzset的元素
 zrange myzset 0 -1
1) "baidu.com"
2) "google.com"
3) "360.com"

3.5.哈希(hashes)

這就和結構數據庫類似了。我是不喜歡在redis中使用hashes的。

操作如下

//建立哈希,並賦值
HMSET user:001 username wylpassword 111 age 34
OK
//列出哈希的內容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "wyl"
3) "password"
4) "111"
5) "age"
6) "34"
//更改哈希中的某一個值
HSET user:001 password 12345
(integer) 0
//再次列出哈希的內容
127.0.0.1:6379> HGETALL user:001
1) "username"
2) "wyl"
3) "password"
4) "12345"
5) "age"
6) "34"

4.redis常用指令

4.1.鍵值相關命令

      keys * 取出當前所有的key

      exists key查看key是否存在

      del key刪除key

      expire key 設置key過期

      ttl key獲取key的有效時長

      select 0 選擇到0數據庫 redis默認的數據庫是0~15一共16個數據庫

      move key1 將當前數據庫中的key移動到其他的數據庫中

      persist key 移除key的過期時間

      random key 隨機返回數據庫里面的一個key

      rename key2 key3 重命名key2 為key3

      type key2 返回key的數據類型

4.2.服務器相關命令

      ping PONG返回響應是否連接成功

      echo 在命令行打印一些內容

      select 0~15 編號的數據庫

      quit  /exit 退出客戶端

      dbsize 返回當前數據庫中所有key的數量

      info 返回redis的相關信息

      config get dir/* 實時傳儲收到的請求

      flushdb 刪除當前選擇數據庫中的所有key

      flushall 刪除所有數據庫中的數據庫

4.3.字符串類型的操作

  set key value 存在就修改,不存在就創建

  get key 取值

  mset key1 value1 key2 value2 一次設置多個值

  mget key1 key2 :一次獲取多個值

簡單就這些大家可進一步去網上搜,因為太多我就部在這寫了。

5.c#實例

(1)首先是redis連接服務基類。

 public abstract class BaseRedis
    {
        private IRedisClient _client;
        private string _configuration_string;

        public BaseRedis()
        {
        }

        public BaseRedis(string configuration_string)
        {
            this._configuration_string = configuration_string;
        }

        public void set_configuration_string(string configuration_string)
        {
            this._configuration_string = configuration_string;
        }

        public IRedisClient rs
        {
            get
            {
                if (string.IsNullOrWhiteSpace(this._configuration_string))
                {
                    return null;
                }
                if (this._client == null)
                {
                    this._client = new RedisClient(this._configuration_string);
                }
                return this._client;
            }
        }
    }
View Code

(2)配置文件

  其中路徑可以直接寫服務器ip地址。我把他寫成字符串,是為了開發環境和正是環境都不用修改程序,直接做ip映射就行了。

(3)連接redis服務器

 public class DbPerfmon : RedisHelper
    {
        public DbPerfmon()
            : base()
        {
            string myredis = ConfigurationManager.AppSettings["Redis_Server_Url_Perfmon"].ToString();
            set_configuration_string(myredis);
        }

(4)簡單操作

  lock (sessionLocker)
            {
                if (string.IsNullOrEmpty(synKey) || user == null)
                    return string.Empty;
                SessionObject so = null;
                using (rs)
                {
//獲取redis值
                    so = rs.Get<SessionObject>(synKey);
                    if (so != null)
                    {
                        so.ResetLastTime();
                        if (!so.IsEffective())
                        {
                            so.SignType = signType;
                            so.User = user;
                        }
                    }
                    else
                    {
                        so = new SessionObject(user, signType, synKey);
                    }
                }
                DateTime dt = DateTime.Now.AddMinutes(30);
//添加redis
                rs.Set<SessionObject>(synKey, so);
//設置有效時長
                rs.ExpireEntryAt(synKey, dt);
                return so.Id;
            }

 

<div id="Copyright">
<p><span style="font-size: 14px;">作者:<a href="http://www.cnblogs.com/wyl1924/">王延領</a></span></p>
<p><span style="font-size: 14px;">出處:<a href="http://wyl1924.cnblogs.com/" target="_blank">http://wyl1924.cnblogs.com</a></span></p>
<p><span style="font-size: 14px;">本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接。</span></p>
</div>


免責聲明!

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



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