python操作Redis緩存

来源:https://www.cnblogs.com/guotianbao/archive/2018/04/01/8683037.html
-Advertisement-
Play Games

一、Redis的安裝 xshell連上伺服器,依次輸入以下代碼: 如果不巧發生以下截圖中的錯誤: 說明未安裝gcc,如果是centos系統,輸入:yum install gcc安裝gcc即可,然後再次輸入make執行。 輸入make後,很不幸,再次發生如下截圖錯誤: 推測是因為編譯庫的問題。 將ma ...


一、Redis的安裝

  xshell連上伺服器,依次輸入以下代碼:

wget http://download.redis.io/releases/redis-3.0.6.tar.gz
tar xzf redis-3.0.6.tar.gz
cd redis-3.0.6
make

 

  如果不巧發生以下截圖中的錯誤:

  說明未安裝gcc,如果是centos系統,輸入:yum install gcc安裝gcc即可,然後再次輸入make執行。

  輸入make後,很不幸,再次發生如下截圖錯誤:

  推測是因為編譯庫的問題。

  將make改為make MALLOC=libc 再次運行!好事多磨。

     終於安裝成功了!

  還有配置文件的修改什麼的先不折騰了,此時已然可以啟動Redis服務

src/redis-server # 啟動服務端

# 啟動客戶端的代碼如下
src/redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

     看到上面的圖像,說明服務端已經起來了!

  但是看到很多WARNING,沒錯,此時你用pycharm寫了連接redis服務端的代碼,但是你發現服務端竟然沒有響應

  OK,在服務端Ctrl + C ,先把服務斷開

  分別執行下麵的語句:

echo 511 > /proc/sys/net/core/somaxconn
echo "vm.overcommit_memory = 1" >> /etc/sysctl.conf
sysctl vm.overcommit_memory=1
echo never > /sys/kernel/mm/transparent_hugepage/enabled

  在/etc下的rc.local的最後添加:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

  最後的重點來了,折騰半天還是伺服器不鳥我,無奈之下試了試臨時關閉防火牆:

service iptables stop 

  唉呀呀,終於成功了!

  我在另一臺伺服器用了另一種搭建方法:傳送門也成功了,但是也不要忘記要臨時關掉防火牆。

 

二、Redis的兩種連接方式

1.簡單連接
import redis
conn = redis.Redis(host='207.148.120.229', port=6379)
conn.set('foo', 'Bar')
print(conn.get('foo'))
a = input('按任意鍵結束')
2.使用連接池  

  為了減少每次建立、釋放連接的開銷,推薦使用連接池

  redis使用connection pool來管理對一個redis服務的所有連接。

  多個redis實例可共用一個連接池。

import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.set('key', 'Hello World')
print(conn.get('key'))
a = input('按任意鍵結束')

三、五大數據類型

1.String操作  

  redis中的String在在記憶體中按照一個key對應一個value來存儲。以鍵值對的方式存儲。

 

  set(name, value, ex=None, px=None, nx=False, xx=False)

在Redis中設置值,預設,不存在則創建,存在則修改
參數:
     ex,過期時間(秒)
     px,過期時間(毫秒)
     nx,如果設置為True,則只有name不存在時,當前set操作才執行
     xx,如果設置為True,則只有name存在時,當前set操作才執行

import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.set('key', 'Hello World')
print(conn.get('key'))

   mset(*args, **kwargs) 批量設置值

# 批量設置值
import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.mset(k1='v1', k2='v2')
# conn.mset({'k1': 'v1', 'k2': 'v2'})

print(conn.get('k1'))
View Code

  get(name)  獲取值

print(conn.get('k1'))

  mget(keys, *args) 批量獲取值

# 批量獲取值
import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.mset(k1='v1', k2='v2')

print(conn.mget('k1','k2'))    # [b'v1', b'v2']
print(conn.mget(['k1','k2']))  # [b'v1', b'v2']
View Code

  getset(name, value) 設置新值並獲取原來的值

import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.mset(k1='v1', k2='v2')

ret = conn.getset('k1','value_1')
print(ret)             # b'v1'
print(conn.get('k1')) # b'value_1'
View Code

  getrange(key, start, end)  獲取name對應value的指定位元組

import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.set('k1','hello')

print(conn.getrange('k1',0,3)) # b'hell''
# 獲取子序列(根據位元組獲取,非字元)
# 參數:
    # name,Redis 的 name
    # start,起始位置(位元組)
    # end,結束位置(位元組)
# 如: "hello" ,0-3表示 "hell"
View Code

  setrange(name, offset, value) 從指定位元組開始替換新值

import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

print(conn.get('k1'))  # b'hello'
conn.setrange('k1',2,'long_time')
print(conn.get('k1'))  # b'helong_time'

# 修改字元串內容,從指定字元串索引開始向後替換(新值太長時,則向後添加)
# 參數:
    # offset,字元串的索引,位元組(一個漢字三個位元組)
    # value,要設置的值
View Code

  strlen(name) 獲取name對應的value的長度

import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.set('k1','hello')
conn.set('k2','天寶')

print(conn.strlen('k1'))  # 5
print(conn.strlen('k2'))  # 6  一個漢字占3個位元組
View Code

  incr(self, name, amount=1) name存在,則自增amount,否則設置name的value值為amount

import redis
pool = redis.ConnectionPool(host='207.148.120.229',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.set('k1','5')
conn.incr('k1',amount=3)

print(conn.get('k1'))  # b'8'

# 自增 name對應的值,當name不存在時,則創建name=amount,否則,則自增。

# 參數:
# name,Redis的name
# amount,自增數(必須是整數)

# 註:同incrby
View Code

  decr(self, name, amount=1) 自減(整數)

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.set('k1','5')
conn.decr('k1',amount=3)

print(conn.get('k1'))  # b'2'

# 自減 name對應的值,當name不存在時,則創建name=amount,否則,則自減。

# 參數:
# name,Redis的name
# amount,自減數(整數)
View Code

     append(key, value)

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.set('k1','hello_')
conn.append('k1','world')

print(conn.get('k1'))  # b'hello_world'

# 在redis name對應的值後面追加內容

# 參數:
# key, redis的name
# value, 要追加的字元串
View Code
2.Hash操作

 

  hset(name, key, value)  設置值

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.hset('n1','key_1','hello')
conn.hset('n1','key_2','world')

print(conn.hget('n1','key_1'))  # b'hello'
print(conn.hget('n1','key_2'))  # b'world'

# name對應的hash中設置一個鍵值對(不存在,則創建;否則,修改)

# 參數:
# name,redis的name
# key,name對應的hash中的key
# value,name對應的hash中的value

# 註:
# hsetnx(name, key, value),當name對應的hash中不存在當前key時則創建(相當於添加)
View Code 

  hmset(name, mapping) 批量設置值

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.hmset('n1',{'k1':'v1', 'k2': 'v2'})

print(conn.hget('n1','k1'))  # b'v1'
print(conn.hget('n1','k2'))  # b'v2'

# 在name對應的hash中批量設置鍵值對

# 參數:
# name,redis的name
# mapping,字典,如:{'k1':'v1', 'k2': 'v2'}

# 如:
# r.hmset('xx', {'k1':'v1', 'k2': 'v2'})
View Code

  hmget(name, keys, *args) 獲取多個值

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.hmset('n1',{'k1':'v1', 'k2': 'v2'})

print(conn.hmget('n1',['k1','k2']))  # [b'v1', b'v2']

# 在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'))
View Code

  hgetall(name)  獲取name對應hash的所有鍵值

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.hmset('n1',{'k1':'v1', 'k2': 'v2'})

print(conn.hgetall('n1'))  # {b'k1': b'v1', b'k2': b'v2'}
View Code

  hlen(name)  獲取name對應的hash中鍵值對的個數

  hkeys(name)  獲取name對應的hash中所有的key的值 

  hvals(name)  獲取name對應的hash中所有的value的值

  hdel(name,*keys)  將name對應的hash中指定key的鍵值對刪除

  hincrby(name, key, amount=1)  自增(整數)

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.hmset('n1',{'k1':'10', 'k2': '20'})
conn.hincrby('n1','k1',amount=5)

print(conn.hget('n1','k1'))  # b'15'

# 自增name對應的hash中的指定key的值,不存在則創建key=amount
# 參數:
    # name,redis中的name
    # key, hash對應的key
    # amount,自增數(整數)
View Code

  hincrbyfloat(name, key, amount=1.0) 自增(浮點數)

  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時,表示數據已經通過分片獲取完畢
View Code

  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
View Code
3.List操作

  lpush(name,values)  

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.lpush('ww',11)

print(conn.lindex('ww',0))  # b'11'  # 根據所有獲取值

# 在name對應的list中添加元素,每個新的元素都添加到列表的最左邊

# 如:
# r.lpush('oo', 11,22,33)
# 保存順序為: 33,22,11

# 擴展:
# rpush(name, values) 表示從右向左操作
View Code

  lpushx(name,value)

import redis
pool = redis.ConnectionPool(host='207.148.121.149',port=6379)
conn = redis.Redis(connection_pool=pool)

conn.lpushx('ww',22)

print(conn.lrange('ww',0,1))  # [b'22', b'22']

# 在name對應的list中添加元素,只有name已經存在時,值添加到列表的最左邊

# 更多:
# rpushx(name, value) 表示從右向左操作
View Code 

  llen(name)  name對應的list元素的個數

  linsert(name, where, refvalue, value))

# 在name對應的列表的某一個值前或後插入一個新值

# 參數:
#     name,redis的name
#     where,BEFORE或AFTER
#     refvalue,標桿值,即:在它前後插入數據
#     value,要插入的數據
View Code 

  r.lset(name, index, value)

# 對name對應的list中的某一個索引位置重新賦值

# 參數:
#     name,redis的name
#     index,list的索引位置
#     value,要設置的值
View Code 

  r.lrem(name, value, num)

# 在name對應的list中刪除指定的值

# 參數:
#     name,redis的name
#     value,要刪除的值
#     num,  num=0,刪除列表中所有的指定值;
#       num=2,從前到後,刪除2個;
#       num=-2,從後向前,刪除2個
View Code 

  lpop(name)

# 在name對應的列表的左側獲取第一個元素併在列表中移除,返回值則是第一個元素

# 更多:
#   rpop(name) 表示從右向左操作
View Code

  lindex(name, index)  在name對應的列表中根據索引獲取列表元素

  lrange(name, start, end)

# 在name對應的列表分片獲取數據
# 參數:
    # name,redis的name
    # start,索引的起始位置
    # end,索引結束位置
View Code 

  ltrim(name, start, end)

# 在name對應的列表中移除沒有在start-end索引之間的值
# 參數:
    # name,redis的name
    # start,索引的起始位置
    # end,索引結束位置
View Code 

  rpoplpush(src, dst)

# 從一個列表取出最右邊的元素,同時將其添加至另一個列表的最左邊
# 參數:
    # src,要取數據的列表的name
    # dst,要添加數據的列表的name
View Code 

  blpop(keys, timeout)

# 將多個列表排列,按照從左到右去pop對應列表的元素
 
# 參數:
    # keys,redis的name的集合
    # timeout,超時時間,當元素所有列表的元素獲取完之後,阻塞等待列表內有數據的時間(秒), 0 表示永遠阻塞
 
# 更多:
    # r.brpop(keys, timeout),從右向左獲取數據
View Code

  brpoplpush(src, dst, timeout=0)

# 從一個列表的右側移除一個元素並將其添加到另一個列表的左側
 
# 參數:
    # src,取出並要移除元素的列表對應的name
    # dst,要插入元素的列表對應的name
    # timeout,當src對應的列表中沒有數據時,阻塞等待其有數據的超時時間(秒),0 表示永遠阻塞
View Code

  自定義增量迭代

#

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在做JavaWeb的SSH框架開發的時候,遇到過很多的細節問題,這裡大概記錄下 我使用的IDE是Eclipse(老版本)三大框架:Spring4、Struts2、Hibernate5 1.web.xml的配置 1.ContextLoaderListener的作用: ContextLoaderList ...
  • 用 Go 編寫一個簡單的 WebSocket 推送服務 本文中代碼可以在 "github.com/alfred zhong/wserver" 獲取。 背景 最近拿到需求要在網頁上展示報警信息。以往報警信息都是通過簡訊,微信和 App 推送給用戶的,現在要讓登錄用戶在網頁端也能實時接收到報警推送。 依 ...
  • 項目地址 : https://github.com/racaljk/yvm 虛擬機現在已可運行(不過還有很多待發現待修複的bugs),已支持語言特性有: + Java基本算術運算,流程式控制制語句,面向對象。 + RTTI + 字元串拼接(+,+=符號重載) + 異常處理 詳細內容請參見項目 "READ ...
  • PHP不支持的高級OPP特性 對象克隆 克隆實例 __clone()方法 繼承 類繼承 繼承和構造函數 繼承與延遲靜態綁定 介面 實現一個介面 實現多個介面 抽象類 命名空間介紹 ...
  • 前言 隨著spring boot2.0的發佈。項目組的API介面已經考慮向spring boot轉型。底層介面我們一直用的mybatis,所以這篇文章我特意練習了下在spring boot種集成mybatis。 一、準備工作 1、pom.xml 2、項目結構 配置文件依然放在resources目錄下 ...
  • 介紹: Mybatis-Plus(簡稱MP)是一個 Mybatis 的增強工具,在 Mybatis 的基礎上只做增強不做改變,為簡化開發、提高效率而生。(摘自mybatis-plus官網)Mybatis雖然已經給我們提供了很大的方便,但它還是有不足之處,MP的存在就是為了稍稍彌補Mybatis的不足 ...
  • 動態庫後續補充, 本身內容有點多, 這裡簡單分享一下. 希望有魚漁 : ) ...
  • 在日常 python 開發過程中,瞭解一些常用工具很有必要。例如pip,pydoc等 pip pydoc 1、pip 安裝Module 從python 2.7.9 之後,引入了pip工具,用於安裝module。 基本使用: 如果你的Python還沒有安裝pip,可以先通過下麵命令安裝pip: pyt ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...