一、Redis介紹:
Redis可以看作是一個key-value的存儲系統,它為我們提供了豐富的數據結構,包括lists,sets,ordered sets和hashes。還包括了對這些數據結構的豐富操作。
優點:
性能高:支持超過100+每秒的讀寫頻率。
支持豐富的數據理性。
原子性:Redis的所有操作都是原子性的。
豐富的特性:支持publish/subscribe,通知,過期等特性。
Windows下Reidis的安裝:
Redis下載地址:
http://www.newasp.net/soft/67186.html#downloads
在使用redis之前,首先需要運行redis-server.exe,然后運行redis-cli.exe。
二、Redis使用:
豐富的數據類型:
2.1.String類型:

String類型還支持批量的讀寫操作。

還可以存儲數字,並支持對數字的加減操作。

String類型還支持對其部分的修改和獲取操作

2.2 List
Redis能夠將數據存儲成一個鏈表,並能對這個鏈表進行豐富的操作
Redis對List集合的修改操作:
在某個值之前添加一項:

截取List集合中的幾個值:

2.3 集合Sets類型
Redis能夠將一些列不重復的值存儲成一個集合。
Sets結構也支持相應的修改操作:
刪除一個元素:

添加一個元素:

Redis還支持對集合的子交並補等操作:
交集:

並集:

補集:

2.4 有序集合(Sorted Sets類型)
Sorted Sets和Sets結構相似,不同的是存在Sorted Sets中的數據會有一個score屬性,並在寫入時就按這個score排好序。

其中,第一個參數為順序,第二個參數為值。
如果寫入的值已經存在,則返回失敗結果0。

查詢某個值在集合中的位置:

查詢在該范圍內的值得總數:

查詢:

2.5 Hash類型:能夠存儲key對多個屬性的數據。
三、Publish /Subscribe
Redis支持這樣一種特性,可以將數據推送到某個信息管道中,然后其他人可以通過訂閱這些管道來獲取推送過來的數據。
3.1訂閱信息管道:
從一個客戶端輸入如下命令:

從另外一個客戶端推送消息:

第一個客戶端就可以獲取到推送的消息

3.2按一定模式批量訂閱
用命令訂閱所有channel開頭兒的信息通道:

推送信息:

第一個客戶端收到的推送信息內容:

四、數據設置過期時間:
Redis支持按key設置過期時間,過期后值將被刪除(在客戶端看來是被刪除了的)
用TTL命令可以獲取某個key的過期時間(-1表示永不過期)
Exists:判斷key值是否存在
Expire:設置過期時間

還可以通過Redis設置某個時間點的過期時間:

五、事務性:
Redis中以nx結尾命令都是在判斷這個值存在不存在,如果不存在才會執行命令:
如下:setnx表示先觀察name值是否存在,如果不存在,再重新賦值。

Redis還支持自定義命令組合,通過multi和exec,可以將命令組合起來一起執行。可以用dicard
命令來中斷執行中的命令序列。

六、持久化
Redis中所有的數據都是存儲在內存中的,並支持數據的持久化。
6.1 數據快照
通過save命令將數據存到一個擴展名為rdb的數據文件。

在dump.rdb文件中:
七、管理命令
Redis支持多個DB,默認為16個,不同DB間數據具有隔離性。可以再多個DB間實現數據的移動。使用select 命令,選擇數據庫,使用move命令實現不同DB之間數據的移動。
Redis中的一些命令還可以獲取一些運行信息:
Dbsize:查看數據庫的大小

通過對flushdb命令對某個數據庫進行清除:

八、在Python中使用redis
在python中提供了操作redis的模塊。
#coding:utf-8
import redis
r=redis.Redis(host='127.0.0.1',port=6379,db=1)
info=r.info()
for key in info:
print "%s:%s"%(key,info[key])
print "-------------"*3
print "dbsize%s"%r.dbsize()
print "ping%s"%r.ping()
print "-------------"*3
print r.get('name')
#----------------------------------String操作------------------------
#設置元素
print "-------------"*3
r.set('name','aa')
print r.get('name')
#為c1設置值
print "-------------"*3
r['c1']='bar'
print r.getset('c1','jj')
#得到所有包含name的key的值
print "-------------"*3
print 'keys:',r.keys('name*')
#隨機取一個Key值
print "-------------"*3
print 'randomkey:',r.randomkey()
#查看數據是否存在 有則返回True ,沒有則返回Flase
print r.exists('name')
#刪除數據 刪除成功返回1
print 'delete:',r.delete('name')
print r.delete('c1')
#更改key的值:
print r.set('name','gina')
r.rename('name','new_name')
print r.get('new_name')
#設置數據過期時間
r.expire('c1',5)
#查看過期時間 永不過期返回-1
r.set('name','haha')
print r.ttl('name')
r.save()
#取最后一次save時間
print r.lastsave()
r.set('intv','9')
print r.incr('intv')
print r.incrby('intv','5')
r['c1']='aa'
r['c2']='bb'
#批量獲取數據
print r.mget('c1','c2')
#獲取開頭為c的key的值
print r.keys('*c*')
#---------------------對list集合進行操作---------------------
print r.lpush('students','gina')
print 'list len:',r.llen('students')
print r.lrange('students',start=0,end=3)
#取出一位
print 'list index 0:',r.lindex('gina',0)
#截取列表
print r.ltrim('students',start=0,end=3)
#--------------------對set集合進行操作-----------------------
r.sadd('s','a')
r.scard('s')
#判斷對象是否存在
print r.sismember('s','a')
print r.sinterstore('s1','s2','s3')
#求並集
r.sunion('s1','s2')
#在s1中有,但在s2,s3中沒有的數:
r.sdiff('s1','s2','s3')
#取一個隨機數
print r.srandmember('s1')
