Redis五大數據類型以及操作
目錄:
一、redis的兩種鏈接方式
二、redis的字符串操作(string)
三、redis的列表操作(list)
四、redis的散列表操作(類似於字典里面嵌套字典)
五、redis的集合操作(set)
六、redis的有序集合操作(zset)
一、redis的兩種鏈接方式
1、簡單連接
import redis conn = redis.Redis(host='10.0.0.200',port=6379) conn.set('k1','年后') print(conn.get('k1'))
2、連接池
如果要連接redis的時候推薦用連接池的方式;如果每次操作都用同一個鏈接,可以用連接池鏈接
redis使用connection pool來管理對一個redis服務的所有連接,避免每次建立,釋放連接的開銷。默認 ,每個redis實例都會維護一個自己的鏈接池。可以直接建立一個連接池,
然后作為參數redis,這樣就可以實現多個redis實例共享一個連接池。
#連接池 import redis pool = redis.ConnectionPool(host='10.0.0.200',port=6379) conn = redis.Redis(connection_pool=pool) conn.set('a','lalla') print(conn.get('a'))
舉例
pool.py
import redis POOL = redis.ConnectionPool(host='10.0.0.200',port=6379)
view.py
from django.shortcuts import render,HttpResponse import redis from app01.pool import POOL # Create your views here. def index(request): pool = redis.Redis(connection_pool=POOL) #連接redis return HttpResponse('ok') def home(request): pool = redis.Redis(connection_pool=POOL) return HttpResponse('ok')
3、Django-redis組件
安裝:pip install django-redis
配置文件
CACHES = { "default": { "BACKEND": "django_redis.cache.RedisCache", "LOCATION": "redis://10.0.0.200:6379", "OPTIONS": { "CLIENT_CLASS": "django_redis.client.DefaultClient", #"PASSWORD": "asdfasdf", } } }
使用:
#利用django-redis組件進行連接 from django.core.cache import caches import os import django_redis os.environ['DJANGO_SETTINGS_MODULE'] = 'redis之集合練習.settings' conn = django_redis.get_redis_connection() conn.set('b','666')
二、redis的字符串操作(string)
String操作,redis中的String在在內存中按照一個name對應一個value來存儲。
1、set(name, value, ex=None, px=None, nx=False, xx=False) #設置值
在Redis中設置值,默認,不存在則創建,存在則修改 參數: ex,過期時間(秒) px,過期時間(毫秒) nx,如果設置為True,則只有name不存在時,當前set操作才執行 xx,如果設置為True,則只有name存在時,崗前set操作才執行
2、setnx(name, value)
設置值,只有name不存在時,執行設置操作(添加) #相當於只是添加,不能進行修改操作
3、setex(name, value, time)
# 設置值 # 參數: # time,過期時間(數字秒 或 timedelta對象)
4、psetex(name, time_ms, value)
# 設置值 # 參數: # time_ms,過期時間(數字毫秒 或 timedelta對象)
5、mset(*args, **kwargs)
批量設置值 如: mset(k1='v1', k2='v2') 或 mset({'k1': 'v1', 'k2': 'v2'})
6、get(name) 獲取值
7、mget(keys, *args)
批量獲取 如: mget('ylr', 'zzz') 或 r.mget(['ylr', 'zzz'])
8、getset(name, value) 設置新值並獲取原來的值
9、getrange(key, start, end)
# 獲取子序列(根據字節獲取,非字符) # 參數: # name,Redis 的 name # start,起始位置(字節) # end,結束位置(字節) # 如: "拉銷量" ,0-3表示 "拉"
待續。。
三、redis的列表操作(list)
四、redis的散列表操作
Hash操作,也叫做散列表操作。redis中Hash在內存中的存儲格式如下圖:
1、hset(name, key, value)
# name對應的hash中設置一個鍵值對(不存在,則創建;否則,修改) # 參數: # name,redis的name # key,name對應的hash中的key # value,name對應的hash中的value # 注: # hsetnx(name, key, value),當name對應的hash中不存在當前key時則創建(相當於添加)
2、hmset(name, mapping)
# 在name對應的hash中批量設置鍵值對 # 參數: # name,redis的name # mapping,字典,如:{'k1':'v1', 'k2': 'v2'} # 如: # r.hmset('xx', {'k1':'v1', 'k2': 'v2'})
3、hget(name,key)
# 在name對應的hash中獲取根據key獲取value
4、hmget(name, keys, *args)
# 在name對應的hash中獲取多個key的值 # 參數: # name,reids對應的name # keys,要獲取key集合,如:['k1', 'k2', 'k3'] # *args,要獲取的key,如:k1,k2,k3 # 如: # r.mget('xx', ['k1', 'k2']) # 或 # print r.hmget('xx', 'k1', 'k2')
5、hgetall(name) 獲取name對應的hash中的所有鍵值
6、hlen(name) 獲取name對應的hash中鍵值對的個數
7、hkeys(name) 獲取name對應的hash中所有的key的值
8、hvals(name) 獲取name對應的hash中所有的value的值
9、hexists(name, key) 檢查name對應的hash是否存在當前傳入的key
10、hdel(name,*keys) 將name對應的hash中指定key的鍵值對刪除
11、hincrby(name, key, amount=1) 吧原來的值自加1
hincrby ('xxx','slex',amount=-1) #吧原來的值自減1
# 自增name對應的hash中的指定key的值,不存在則創建key=amount # 參數: # name,redis中的name # key, hash對應的key # amount,自增數(整數)
12、hincrbyfloat(name, key, amount=1.0) 支持浮點型的
13、hscan(name, cursor=0, match=None, count=None)
# 增量式迭代獲取,對於數據大的數據非常有用,hscan可以實現分片的獲取數據,並非一次性將數據全部獲取完,從而放置內存被撐爆 # 參數: # name,redis的name # cursor,游標(基於游標分批取獲取數據) # match,匹配指定key,默認None 表示所有的key # count,每次分片最少獲取個數,默認None表示采用Redis的默認分片個數 # 如: # 第一次:cursor1, data1 = r.hscan('xx', cursor=0, match=None, count=None) # 第二次:cursor2, data1 = r.hscan('xx', cursor=cursor1, match=None, count=None) # ... # 直到返回值cursor的值為0時,表示數據已經通過分片獲取完畢
14、hscan_iter(name, match=None, count=None)
# 利用yield封裝hscan創建生成器,實現分批去redis中獲取數據 # 參數: # match,匹配指定key,默認None 表示所有的key # count,每次分片最少獲取個數,默認None表示采用Redis的默認分片個數 # 如: # for item in r.hscan_iter('xx'): # print item
# for item in r.hscan_iter('xx',match='*lx'): #匹配以lx結尾的 # print item
五、redis的集合操作
六、redis的有序集合操作