您好,登錄后才能下訂單哦!
單線程,通過epoll實現高并發,端口6379
linux下載地址:http://redis.io/download
windows下載地址:https://github.com/MSOpenTech/redis/releases
本文介紹的內容:
string:存字符串
hash:存名字和值
list:存列表
set:存集合
sort set:有序集合,帶權值排序的集合,可以應用到學生對應的分數
發布和訂閱
小技巧
系統下命令 | 參數 | 作用 | |
redis-cti -h ip port | ip:指定IP port:主機端口 | 在redis安裝目錄下運行,啟動redis實例 | |
set name value | name:鍵名 value:鍵值 | 設置鍵名和鍵值 | |
get name | name:鍵名 | 獲取鍵值 | |
set name value ex time | name :鍵名 value:鍵值 ex:指定存在時間 time:時間 | 設置鍵的存在時間,過期自動刪除 | |
Python下命令: | |||
ConnectionPool(host,port) | host:redis服務器地址 port:端口 | 連接到redis服務器 | pool=redis.ConnectionPool(host='192.168.1.1',port=6379) |
Redis(connection_pool) | connection_pool:上面的鏈接 | 綁定鏈接實例 | conn=(connection_pool=pool) |
pipeline(transaction) | transaction:redis鏈接 | 創建管道 | pipe=redis.pipeline(transaction=conn) |
execute() | 提交操作 | pipe.excute() | |
通用操作 | |||
select(db) | db:redis數據庫名。redis默認16個數據庫。名字是0~15 | 選取并使用redis的數據庫 | |
delete(*names) | *names | 刪除對應的name | |
exists(name) | name | 判斷key是否存在 | |
keys(pattern='*') | pattern:支持以正通配符 *:匹配任意多個字符 ?:只匹配一個字符 []:指定匹配[]的字符 以上可以搭配使用 | 匹配pattern指定的name
| |
expire(name,time) | name: time: | 為name設存活時間,過期自動刪除 | |
rename(src,dst) | src: dst: | 把name由src改成dst | |
move(name,db) | name: db: | 把name移動到指定的db下,如果目標db已存在相同name,則不移動 | |
type(name) | name: | 查看name的類型 | |
randomkey() | 隨機獲取一個name | ||
scan(cursor,match,count) | cursor:默認0 match:默認None count:默認None | 從cursor開始,匹配符合match條件,只匹配count條 | |
scan_iter(match,count) | match: count: | 匹配count個,符合match條件的name,返回迭代器 | |
Redis() | host: port: connection_pool: | 連接到redis服務器 | |
ConnectionPool() | host: port: | 創建鏈接憑據,供Redis()方法使用 | |
pipeline(transaction,shard_hint) | transaction:默認False,不每次都與服務器交互 shard_hint:默認None | 創建一個道對象,使用管道對象進行set后,必須使用execute()方法,才能上傳數據到redis服務端,減少了服務器和客戶端的交互次數 | pipe=r.pipeline() pipe.set(name,value) |
execute() | 提交管道內容到redis服務器 | pipe.execute() | |
STR操作 | |||
set() | name:key名 value:key值 ex:過期時間,秒 px:過期時間,毫秒 nx:False。True:name不存在則set xx:False。True:name存在則set | 設置key和key值 | |
setnx(name,value) | name:key名 value:key值 | 如果key不存在,設置key和key值 | |
setex(name,value,time_s)
| name:key名 value:key值 time_s:過期時間,秒 | 設置key和key的值,到時間自動刪除key | |
psetex(name,time_ms,value) | name:key名 value:key值 time_ms:過期時間,毫秒 | 設置key和key的值,到時間自動刪除key | |
mset(*args,**kwargs) | 批量設置 | mset(r1='1',r2='2') 或: mset({r1:'1',r2:'2'}) | |
setbit() | name:key名 offset:偏移量 value:值 | 設置string的ASCII碼,二進制位的值 | |
get() | name:key名 | 獲取鍵值 | |
mget() | *args:多個key名,逗號分割 | 獲取多個鍵值 | |
getset() | name:key名 value:值
| 獲取當前鍵值,并設置新值 | |
getbit() | name:key名 offset:偏移量 | 獲取string的ASCII碼二進制位的值 | |
bitop('operation',dest,*keys) | operation:and(與)or(或)not(非)xor(異或) dest:新的redis名字 *keys:要查找的redis名 |
把要查找的redis名按operation進行二進制位運算,結果存放在dest里面 | bitop('and','result','r1','r2','r3') |
incr(name,amount) | name:key名 amount:只能是整型,默認是1 | 每次運行把name增量加amount,運行幾次incr,name的值就是幾 | |
decr(name,amount) | name:key名 amount:只能是整型,默認是1 | 每次運行把name字段減amount,運行幾次decr,name就減幾次,可以減到負值 | |
imcrbyfloat(name,amount) | name:key名 amount:可以是浮點型,默認1.0 | ||
strlen() | name:key名 | 返回name的字符串長度 | |
append(name,str) | name:key名 str:追加的字符 | 把str追加到name的后面 | |
HASH操作 | |||
hset(name,key,value) | name:redis的name | hash以字典存儲 設置name[key]的值 | |
hsetnx(name, key, value) | name:redis的name | name中不存在當前key 設置key的值,存在則不修改 | |
hget(name,key) | name:redis的name key:name對應的hash中的key | 獲取neme中key的值 | |
hkeys(name) | name:redis的name | 獲取name對應的hash中所有的key的名字 | |
hvals(name) | name:redis的name | 獲取name對應的hash中所有的key的值 | |
hmset(name,dict) | name:redis的name dict:字典,如:{'k1':'v1', 'k2': 'v2'} | 批量設置name的哈希值 | |
hgetall(name) | name:redis的name | 獲取name對應hash的所有鍵值 | |
hmget(name,*keys) | name:redis的name *keys:['k1', 'k2']或'k1', 'k2' | 一次獲取指定的多個key值 | |
hdel(name,*keys) | name:redis的name *keys:['k1', 'k2']或'k1', 'k2' | 刪除name中的keys | |
hlen(name) | name: | 獲取name中keys的個數 | |
hexists(name,key) | name: key: | 檢查name的key是否存在 | |
hdel(name,*keys) | name: *keys: | 刪除 | |
hincrby(name,key,amount) | name: key: amount:默認1,可指定。 | 自增name中key的值,不存在則創建新key key=amount | |
hincrbyfloat(name,key,amount) | name: key: amount:默認1.0,可指定其浮點數。 | 自增name中key的值,不存在則創建新key key=amount | |
hscan(name,cursor,match,count) | name: cursor:默認0,指定游標位置。從哪開始查。 match:默認None,匹配表達式。 count:默認None | 查找指定key **增量式迭代獲取,對于數據大的數據非常有用,hscan可以實現分片的獲取數據,并非一次性將數據全部獲取完,從而放置內存被撐爆 | 從位置0開始,查找info中的包含a的字段,并且只找前三個 hscan('info',0,'*a*',3) |
hscan_iter(name,match,count) | name: match:匹配指定key,默認None 表示所有的key count:每次分片最少獲取個數,默認None表示采用Redis的默認分片個數 | 查找指定key,并返回迭代器,讀取時循環迭代器 | for item in r.hscan_iter('xx'): print item |
LIST操作 | |||
lpush(name,values) | name:表名 values:值。 1, 2, 3 | 向name表里存values,新的在左邊,先入后出 | |
lrange(name,start,end) | name: start:開始位置 end:結束位置 | 取列表 取所有start=0,end=-1 | |
rpush(name,values) | name:表名 values:值。 1, 2, 3 | 向name表里存values,新的在右邊,后入先出 | |
rrange(name,start,end) | |||
lpushx(name,values) | name:表名 values:值。 1, 2, 3 | 列表存在才存 | |
llen(name) | name:表名 | 返回列表個數 | |
linsert(name,where,refvalue,value) | name:表名 where:before或after refvalue:標桿值,在它的前或后插入 value:要插入的數據 | 在name表的某一個值前或后插入一個新值 | |
lset(name,index,value) | name:表名 index:修改索引第幾個參數,從0開始 value:修改的值 | 修改 | |
lrem(name,value,num) | name:表名 value:要刪除的值 num:0刪除表中所有的value指定值 2 從前到后,刪除兩個 -2 從后到前,刪除兩個 | 刪除 | |
lpop(name) | name: | 從左向右讀取一個值,并刪除 | |
lrange(name,start,end) | name: start: end: | 獲取name表分片數據 | |
lindex(name,index) | name: index:下標 | 讀取指定下標的值 | |
ltrim(name,start,end) | name: start: end: | 保留start到end之間的數據,其它刪除 | |
rpoplpush(src,dst) | src: dst: | 從src表的最右邊取出數據 存放到dst表的最左邊 | |
blpop(keys,timeout) | keys:redis name的集合 timeout:默認為0。超時時間,所有的元素取完以后,等待timeout秒,0為永遠阻塞 | 從列表左邊取出并刪除redis name所有元素,并等待timeout秒 等待期間,其它用戶放入值,會繼續刪除 | |
brpop(keys,timeout) | keys: timeout | 從列表右邊取出并刪除redis name所有元素,并等待timeout秒 | |
brpoplpush(src,dst,timeout) | src: dst: timeout: | 從src列表右邊取出并刪除元素,存入dst列表的左邊。 | |
SET操作 | |||
sadd(name,*values) | name: values: | 集合有去重特性,所以重復數據不能添加 | |
smembers(name) | name: | ||
scard(name) | name: | 獲取元素個數 | |
sdiff(*keys) | *keys:多個redis 的name
| 獲取前者的差集,只顯示第一個集合中,其它集合沒有的元素 | sdiff("name1","name2") |
sdiffstore(dst,*src) | dst: *src: | 將只存在src1集合里,不存在src2,src3等等的元素,存放到dst里。 | |
sinter(*keys) | *keys:多個redis 的name | 交集,顯示幾個keys里都有的元素 | |
sinterstore(dst,*src) | 交集,把幾個src中都有的元素存到dst里 | ||
sunion(*keys) | *keys: | 并集,把所有keys里的元素相加 | |
sunionstore(dst,*src) | dst: *src: | ||
sismember(name,value) | name: value: | 查找name里面的value成員 有返回1,沒有返回0 | |
smove(src,dst,value) | src: dst: value: | 將value從src移動到dst | |
spop(name) | name: | 從集合的后面刪除元素,并返回值 | |
srandmember(name,numbers) | name: numbers:默認1 | 隨機返回numbers個元素 | |
srem(name,value) | name: value: | 刪除name里指定的value | |
sscan(name,index,match,count) | name: index: match: count: | ||
sscan_iter(name,match,count) | name: match: count: | ||
有序集合 | |||
zadd(name,*args,**kwargs) | name: *args: **kwargs" | 把權重和值放入name里面 數越小,值越在前 如查value和權重值已存在,修改權重為當前權重 | redis.zadd('my-key', 'name1', 1.1, 'name2', 2.2, name3=3.3, name4=4.4) |
zcount(name,min,max) | name: min: max: | 獲取min到max分數的個數(包含min和max) | |
zcard(name) | name: | 統計name里元素的個數 | |
zrange(name,start,end,desc,withscores,score_cast_func) | name: start:元素起始位置 end: desc:默認False,從小到大排序,True從大到小排序。 withscores:默認False,只獲取元素的值。True獲取值和分數。 score_cast_func:默認float,可以對分數進行類型的轉換 | 取出name中,從start到end的元素 全取:0 -1
應用場景,可以保存成績。。。 | |
zrevrange(name,start,end,withscores,score_cast_func) | name: start:元素起始位置 end: withscores:默認False,只獲取元素的值。True獲取值和分數。 score_cast_func:默認float,可以對分數進行類型的轉換 | 獲取指定位置的值和分數,從大到小排序 | |
zrangebyscore(name,min,max,start,num,withscores,score_cast_func) | name: min: max: start:默認None num:默認None withscores:默認False,只獲取元素的值。True獲取值和分數。 score_cast_func:默認float,可以對分數進行類型的轉換 | 按照分數范圍,從start(value)位置開始,獲取name中的有序集合的元素,順序從小到大 | |
zrevrangebyscore(name,min,max,start,num,withscores,score_cast_func) | name: min: max: start:默認None num:默認None withscores:默認False,只獲取元素的值。True獲取值和分數。 score_cast_func:默認float,可以對分數進行類型的轉換 | 從大到小排序。 | |
zincrby(name,value,amount) | name: value: amount:默認1 | 運行一次,value的值增加amount指定的數值。 | |
zrank(name,value) | name: value: | 獲取value在name中的index(從0開始) | |
zrevrank(name,value) | name: value: | 獲取value在name中的index(從0開始), 從大到小 | |
zrangebylex(name,min,max,start,num) | name: min:左區間,+表示正無限,-表示負無限,(表示開區間,[表示閉區間。 max:右區間 start:默認None,對結果進行分片,從start開始。 num:默認None,對結果進行分片,從start開始顯示num個 | 當有相同的分數時,對value進行匹配。 | |
zrem(name,value) | name: value: | 刪除集合中value的元素 | |
zremrangebyrank(name,min,max) | name: min: max: | 刪除排行(index)從min到max范圍的元素 | |
zremrangebyscore(name,min,max) | name: min: max: | 刪除分數是min到max范圍的元素 | |
zremrangebylex(name,min,max) | name: min: max: | 刪除值是min到max范圍的元素 | |
zscore(name,value) | name: value: | 獲取value的分數 | |
zinterstore(dest,keys,aggregate) | dest: keys: aggregage:默認None,分數按sum。可以為sum,min,max | keys的交集,存儲到dest,keys對應的分數,按aggregage操作 | |
zunionstore(dest,keys,aggregate) | dest: keys: aggregage:默認None,可以為sum,min,max | 并集,存儲到dest, | |
zscan(name,cursor,match,count,score_cast_func) | name cursor: match: count: score_case_func:默認float,可以對分數進行類型的轉換 | 從cursor開始查找符合match的元素,查找count個 | |
zscan_iter(name,match,count,score_cast_func) | name: match: count: score_cast_func: | 從cursor開始查找符合match的元素,查找count個,返回迭代,需要循環讀取。 | |
發布和訂閱:
redis自帶命令 | |||
PSUBSCRIBE pattern [pattern ...] | 訂閱一個或多個符合給定模式(條件)的頻道。 支持*通配符 | ||
PUNSUBSCRIBE [pattern [pattern ...]] | 退訂所有給定模式(條件)的頻道 支持*通配符 | ||
PUBSUB <subcommand> [argument [argument ...]] | 查看訂閱與發布系統狀態 | ||
PUBLISH channel message | 將信息發送到指定的頻道。 | ||
SUBSCRIBE channel [channel ...] | 訂閱給定的一個或多個頻道的信息。 | ||
UNSUBSCRIBE channel [channel ...] | 命令用于退訂給定的一個或多個頻道的信息。 | ||
Python模塊命令 | |||
subscribe | |||
publish | |||
事務:
事務開始后,所有的操作必須提交,否則不保存到數據庫
MULTI | 事務開始 | ||
EXEC | 事務結束 | ||
問題:
1、1億在線用戶查詢:
把數據庫里的自增ID寫進offset,在線則設置為1,下線清除掉。一個用戶狀態只占一個二進制位。
setbit(n5,1,1)
setbit(n5,2,1)
......
統計用戶在線,使用bitcount(n5),就可以了。
查看用戶是否在線,使用getbit(n5,999),返回0,不在線;返回1在線。
2,驗證碼
我們經常在登錄一些網站或是進行付款等操作的時候,都會收到一些驗證碼,并且說10min后失效。
實際上就可以通過下面一條指令來實現:
set phone_num code ex 600
用手機號作為key,驗證碼作為值,超時6min。這樣當你輸入好驗證碼,提交的時候,后臺就可以了先get phone_num,再比較你的輸入和數據庫里面存的值,從而完成身份的驗證。
3,session
早前,網站通過cookie來保存用戶的用戶名和密碼,之后出現了很多的安全隱患,因此就提出了session的機制。
用戶登陸成功之后,本地的cookie會保留一個較長的隨機碼,而網站后的后臺則存儲了這個隨機碼和你的用戶id的對應關系。在你第二次登錄的時候,cookie會傳輸到后臺,而后臺則根據你的隨機碼,獲取你的用戶信息,如果符合,則自動登錄。這樣,即使網站上有不法分子獲取了你的cookie,也得不到你的任何信息,因為你的真實的有用的信息都存儲在網站的后臺。
我們在登錄郵箱的時候,通常都會有一個選項,7天內自動登錄。這其實就是給后臺存的session設置了一個超時。聰明的你是不是已經會自己實現了呢?
NX:(if Not eXist)只有鍵key不存在的時候才會設置key的值
XX:只有鍵key存在的時候才會設置key的值
NX通常用于實現鎖機制,XX的功能,小喵暫時木有頭緒。。。想到應用場景的筒子們可以留言告訴小喵,小喵看到了一定會更新的。
系統下命令參考:
http://www.runoob.com/redis/redis-tutorial.html
https://www.cnblogs.com/idiotgroup/p/5455282.html
https://www.cnblogs.com/xtsec/p/7000404.html
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。