Redis入门-基础键值对、list、set、hashlist基础操作
關(guān)于Redis
Redis是非關(guān)系型數(shù)據(jù)庫(kù)(NoSQL)的一種,區(qū)別于關(guān)系型數(shù)據(jù)庫(kù)。其內(nèi)部數(shù)據(jù)間相互獨(dú)立,性能表現(xiàn)優(yōu)秀。即使是在大量數(shù)據(jù)下性能也很好,這都得益于其數(shù)據(jù)結(jié)構(gòu)簡(jiǎn)單,數(shù)據(jù)間相互獨(dú)立的特性。而這些特性都是關(guān)系型數(shù)據(jù)庫(kù)所望塵莫及的。
主流的NoSQL產(chǎn)品
NoSQL數(shù)據(jù)庫(kù)的四大分類(lèi)
- 鍵值對(duì)(Key-Value)存儲(chǔ):Redis
優(yōu):快速查詢
劣:存儲(chǔ)的數(shù)據(jù)缺少結(jié)構(gòu)化 - 列存儲(chǔ):HBase
優(yōu):快速查詢、擴(kuò)展性強(qiáng)
劣:功能相對(duì)局限 - 文檔數(shù)據(jù)庫(kù):MongoDB
優(yōu):數(shù)據(jù)結(jié)構(gòu)要求不是很?chē)?yán)格
劣:查詢性能不高、缺少統(tǒng)一的查詢語(yǔ)法 - 圖形數(shù)據(jù)庫(kù):InfoGrid
優(yōu):利用圖結(jié)構(gòu)相關(guān)算法
劣:需要對(duì)整個(gè)圖做計(jì)算才能得出結(jié)果、不容易做分布式集群方案
NoSQL的特點(diǎn)
易擴(kuò)展
靈活的數(shù)據(jù)模型
大數(shù)據(jù)量、高性能
高可用
Redis的概述
Redis是高性能鍵值對(duì)數(shù)據(jù)庫(kù),支持的鍵值數(shù)據(jù)類(lèi)型有:
字符串類(lèi)型
列表類(lèi)型
有序集合類(lèi)型
散列類(lèi)型
集合類(lèi)型
Redis的應(yīng)用場(chǎng)景
緩存
任務(wù)隊(duì)列
網(wǎng)站訪問(wèn)統(tǒng)計(jì)
數(shù)據(jù)過(guò)期處理
應(yīng)用排行榜
分布式集群架構(gòu)中的session分離
Redis使用方法
1. 字符串類(lèi)型
""" set --設(shè)置值,返回True 或者False get --獲取值 mset --設(shè)置多個(gè)鍵值對(duì),返回True 或者False mget --獲取多個(gè)鍵值對(duì) append --添加字符串 del --刪除,返回刪除成功的數(shù)據(jù)數(shù)量 incr/decr -- 增加/減少 1 """ #!/usr/bin/env python #-*- coding:utf-8 -*- import redis #python 操作str class TestString(object):def __init__(self):self.r = redis.StrictRedis(host='localhost', port=6379, db=0)def test_set(self):rest = self.r.set('user2', 'Amy')print ( rest) # 輸出 Truereturn restdef test_get(self):rest = self.r.get('user2')print (rest) # 輸出 Amyreturn restdef test_mset(self):"""mset --設(shè)置多個(gè)鍵值對(duì):return:"""d = {'user1': 'XH','user3': 'Bob','user4': 'Bobx'}rest = self.r.mset(d)print (rest) # 輸出 Truereturn restdef test_mget(self):"""mget --獲取多個(gè)鍵值對(duì):return:"""l = ['user1','user2','user3','user4','user6']rest = self.r.mget(l)print (rset) # 輸出[ b'XH', b'Amy', b'Bob', b'Bobx', None]return restdef test_del(self):"""del 刪除:return:"""rest = self.r.delete('user1')print (rest) #輸出1 return restdef main():str_obj = TestString()str_obj.test_set()str_obj.test_get()str_obj.test_mset()str_obj.test_mget()str_obj.test_del()if __name__ == '__main__':main()2. 列表
class TestList(object):"""lpush/rpush --從左/右插入數(shù)據(jù),返回插入成功的數(shù)據(jù)下標(biāo),列表的每個(gè)數(shù)據(jù)格式可以不一樣,每push一次下標(biāo)加1["1",""2,3,4",("safa"),{"name":"yangxiaoru"}]lrange(開(kāi)始下標(biāo),結(jié)束下標(biāo)) -- 獲取指定長(zhǎng)度的數(shù)據(jù),獲取完了之后列表中還有數(shù)據(jù)ltrim -- 截取一定長(zhǎng)度的數(shù)據(jù)lpop/rpop -- 移除最左/右的元素并返回lpushx/rpushx -- key存在的時(shí)候才插入數(shù)據(jù),不存在不做任何處理"""def __init__(self):self.r = redis.StrictRedis(host='localhost', port=6379, db=0)def test_push(self):"""lpush/rpush --從左/右插入數(shù)據(jù)lrange -- 獲取指定長(zhǎng)度的數(shù)據(jù):return:"""t = ('Amy', 'Jhon')reset = self.r.lpush('l_eat2', *t)print (reset) #輸出2(2是起始下標(biāo))reset = self.r.lrange('l_eat2', 0, -1) #獲取第一位到倒數(shù)第一位直接的數(shù)據(jù)(左右閉區(qū)間)print (reset) #輸出 [b'Jhon', b'Amy'],左邊插入,左邊取出,所以倒序了def test_pop(self):"""lpop/rpop -- 移除最左/右的元素并返回:return:"""rest = self.r.lpop('l_eat2') #從左邊彈出一個(gè)數(shù)據(jù)print (rest) #輸出 b'Jhon'reset = self.r.lrange('l_eat2', 0, -1)print (reset) # 輸出 [b'Amy']def main():# listlist_obj = TestList()list_obj.test_push()list_obj.test_pop()if __name__ == '__main__':main()注意事項(xiàng)
舉個(gè)栗子:當(dāng)前有名字叫my_list的Redis列表如下:[0,1,2,3,4,5]
1、lrange(start,end),下標(biāo)可以正向取,也可以負(fù)向取。但是參數(shù)中必須是start<=end。
lrange(2,2) #返回2
lrange(-4,-4) #返回2
lrange(1,2) #返回1,2
lrange(2,-2) #返回2,3,4
lrange(-3,-2) #返回3,4
以下方式都是取不到數(shù)據(jù)的:
lrange(2,1) #返回空
lrange(-2,-3) #返回空
2、Redis的列表下標(biāo)溢出之后不會(huì)報(bào)錯(cuò),她只取盡量多的數(shù)據(jù)即可
redis.lrange(6,7) #需要取下標(biāo)為6和7的數(shù)據(jù) ,結(jié)果返回空。
redis.lrange(5,7) #需要取下標(biāo)為5,6,7的數(shù)據(jù) ,結(jié)果返回[5]
3. 集合
class TestSet(Base):"""sadd/srem --添加/刪除元素sismember --判斷是否為set的一個(gè)元素smembers --返回該集合的所有成員sdiff --返回一個(gè)集合與其他集合的差異sinter --返回幾個(gè)集合的交集sunion --返回幾個(gè)集合的并集"""def __init__(self):self.r = redis.StrictRedis(host='172.17.20.144', port=6379, db=0)def test_sadd(self):"""sadd/srem --添加/刪除元素:return:"""l = ['Cats', 'Dogs']rest = self.r.sadd('zoo3', *l) print (rest) #輸出2rest = self.r.smembers('zoo3') print (rest) #輸出 {b'Dogs', b'Cats'}def test_srem(self):"""sadd/srem --添加/刪除元素:return:"""rest = self.r.srem('zoo2','Dogs') #沒(méi)有名字為“zoo2”的集合print (rest) #輸出0rest = self.r.smembers('zoo2')print (rest) #輸出 set(),即空集合def test_sinter(self):"""sinter --返回幾個(gè)集合對(duì)象的交集sunion --返回幾個(gè)集合對(duì)象的并集:return:"""rest = self.r.sunion('zoo2', 'zoo3')print (rest) #輸出 {b'Dogs', b'Cats'}rest = self.r.sinter('zoo2','zoo3')print (rest) #輸出set(),即空集合def main():test_obj = TestSet()test_obj.test_sadd()test_obj.test_srem()test_obj.test_sinter()if __name__ == '__main__':main()4. 散列
class TestHash(Base):"""hset/hget --設(shè)置/獲取散列值hmset/hmget --設(shè)置/獲取多對(duì)散列值hsetnx --如果散列已經(jīng)存在,則不設(shè)置hkeys/hvals --返回所有Keys/Valueshlen -- 返回散列包含域"""def test_set(self):"""hset/hget --設(shè)置/獲取散列值:return:"""reset = self.r.hset('stu:xxx01','name','Amy')print (reset) #輸出1,再次執(zhí)行的話輸出0reset = self.r.hexists('stu:xxx01','name')print (reset) #輸出Truereset = self.r.hget('stu:xxx01','name')print (reset)#輸出 b'Amy'def test_mset(self):"""hmset/hmget --設(shè)置/獲取多對(duì)散列值:return:"""m = {'name':'Bob','age':21,'grade':98}rest = self.r.hmset('stu:xxx03',m)print (rest) #輸出truerest = self.r.hkeys('stu:xxx03')print (rest) #輸出 [b'name', b'age', b'grade']def main():hash_obj = TestHash()hash_obj.test_set()hash_obj.test_mset()if __name__ == '__main__':main()總結(jié)
以上是生活随笔為你收集整理的Redis入门-基础键值对、list、set、hashlist基础操作的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 教学管理系统用况
- 下一篇: mysql闭环检查_安全大检查要形成闭环