日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

Redis入门-基础键值对、list、set、hashlist基础操作

發(fā)布時間:2023/12/29 数据库 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis入门-基础键值对、list、set、hashlist基础操作 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

關(guān)于Redis

Redis是非關(guān)系型數(shù)據(jù)庫(NoSQL)的一種,區(qū)別于關(guān)系型數(shù)據(jù)庫。其內(nèi)部數(shù)據(jù)間相互獨立,性能表現(xiàn)優(yōu)秀。即使是在大量數(shù)據(jù)下性能也很好,這都得益于其數(shù)據(jù)結(jié)構(gòu)簡單,數(shù)據(jù)間相互獨立的特性。而這些特性都是關(guān)系型數(shù)據(jù)庫所望塵莫及的。

主流的NoSQL產(chǎn)品

NoSQL數(shù)據(jù)庫的四大分類

  • 鍵值對(Key-Value)存儲:Redis
    優(yōu):快速查詢
    劣:存儲的數(shù)據(jù)缺少結(jié)構(gòu)化
  • 列存儲:HBase
    優(yōu):快速查詢、擴展性強
    劣:功能相對局限
  • 文檔數(shù)據(jù)庫:MongoDB
    優(yōu):數(shù)據(jù)結(jié)構(gòu)要求不是很嚴格
    劣:查詢性能不高、缺少統(tǒng)一的查詢語法
  • 圖形數(shù)據(jù)庫:InfoGrid
    優(yōu):利用圖結(jié)構(gòu)相關(guān)算法
    劣:需要對整個圖做計算才能得出結(jié)果、不容易做分布式集群方案

NoSQL的特點

易擴展
靈活的數(shù)據(jù)模型
大數(shù)據(jù)量、高性能
高可用

Redis的概述

Redis是高性能鍵值對數(shù)據(jù)庫,支持的鍵值數(shù)據(jù)類型有:
字符串類型
列表類型
有序集合類型
散列類型
集合類型

Redis的應(yīng)用場景

緩存
任務(wù)隊列
網(wǎng)站訪問統(tǒng)計
數(shù)據(jù)過期處理
應(yīng)用排行榜
分布式集群架構(gòu)中的session分離

Redis使用方法

1. 字符串類型

""" set --設(shè)置值,返回True 或者False get --獲取值 mset --設(shè)置多個鍵值對,返回True 或者False mget --獲取多個鍵值對 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è)置多個鍵值對:return:"""d = {'user1': 'XH','user3': 'Bob','user4': 'Bobx'}rest = self.r.mset(d)print (rest) # 輸出 Truereturn restdef test_mget(self):"""mget --獲取多個鍵值對: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ù)下標,列表的每個數(shù)據(jù)格式可以不一樣,每push一次下標加1["1",""2,3,4",("safa"),{"name":"yangxiaoru"}]lrange(開始下標,結(jié)束下標) -- 獲取指定長度的數(shù)據(jù),獲取完了之后列表中還有數(shù)據(jù)ltrim -- 截取一定長度的數(shù)據(jù)lpop/rpop -- 移除最左/右的元素并返回lpushx/rpushx -- key存在的時候才插入數(shù)據(jù),不存在不做任何處理"""def __init__(self):self.r = redis.StrictRedis(host='localhost', port=6379, db=0)def test_push(self):"""lpush/rpush --從左/右插入數(shù)據(jù)lrange -- 獲取指定長度的數(shù)據(jù):return:"""t = ('Amy', 'Jhon')reset = self.r.lpush('l_eat2', *t)print (reset) #輸出2(2是起始下標)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') #從左邊彈出一個數(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()

注意事項
舉個栗子:當前有名字叫my_list的Redis列表如下:[0,1,2,3,4,5]
1、lrange(start,end),下標可以正向取,也可以負向取。但是參數(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的列表下標溢出之后不會報錯,她只取盡量多的數(shù)據(jù)即可
redis.lrange(6,7) #需要取下標為6和7的數(shù)據(jù) ,結(jié)果返回空。
redis.lrange(5,7) #需要取下標為5,6,7的數(shù)據(jù) ,結(jié)果返回[5]

3. 集合

class TestSet(Base):"""sadd/srem --添加/刪除元素sismember --判斷是否為set的一個元素smembers --返回該集合的所有成員sdiff --返回一個集合與其他集合的差異sinter --返回幾個集合的交集sunion --返回幾個集合的并集"""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') #沒有名字為“zoo2”的集合print (rest) #輸出0rest = self.r.smembers('zoo2')print (rest) #輸出 set(),即空集合def test_sinter(self):"""sinter --返回幾個集合對象的交集sunion --返回幾個集合對象的并集: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è)置/獲取多對散列值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è)置/獲取多對散列值: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基础操作的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。