基礎拾遺
前言
這篇文章和以往的基礎拾遺有所不同,以前的介紹的都是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; } } }
(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>