Redis是一個用c語言開發的非關系型(NoSQL)數據庫,它將數據以key-value的形式存儲在內存中,性能高並且開源、免費。
redis的應用場景:
redis的其他特點:
Ubuntu 下安裝:
在終端中執行:
sudo add-apt-repository ppa:redislabs/redis
sudo apt-get update
sudo apt-get install redis
windows 下安裝:
到官網下載安裝包,直接安裝即可。
測試是否安裝成功:
redis-cli ping
# 輸出:PONG,則表示安裝成功
這是redis官方提供的簡易redis客戶端,可以執行redis的各種命令,要退出,輸入:quit
後回車。
指定ip、端口和密碼:
redis-cli -h host -p port -a password
三種啟動方式:
默認啟動方式:
redis-server
指定參數啟動:
redis-server --port 6380 # 指定端口為6380
redis 的默認端口為6379。
指定配置文件啟動:
redis-server redis.conf # 文件需要自行創建,文件名隨意
常用配置:
# 是否以守護進程方式啟動
daemonize yes
# 端口號
port 6379
# ip地址,默認的 127.0.0.1 不支持遠程連接
bind 0.0.0.0
# 工作目錄
dir "路徑"
# 日志位置
logfile "路徑"
# 關閉保護模式
protected-mode no
# 設置密碼
requirepass 123456
# 最大內存使用量,默認為0,表示無限制
maxmemory 128M
關閉 redis-server:
redis-cli shutdown
使用python操作redis,可以安裝一個第三方庫,名字就叫做redis。它提供了一些接口,能夠使我們更加方便的操作redis。
安裝:
pip install redis
python操作redis,需要通過一個redis連接對象來進行:
import redis
# 創建連接對象
r = redis.Redis(host='localhost', port=6379, db=0)
# 執行具體操作
r.set('foo', 'bar') # 給key設置value
print(r.get('foo')) # 根據key獲取value
# 打印:b'bar'
默認情況下,Python 3中的所有響應都以字節的形式返回。默認的編碼是utf-8,但這可以通過指定redis的encoding
參數來定制。
連接池是一種提高性能的技術手段,它提前創建好一些連接並保存在池中。當有請求時,就從連接池中直接取出一個連接,用完再放回去。這樣就免去了創建連接和銷毀連接的過程。
import redis
# 創建連接池
pool = redis.ConnectionPool(host='localhost', port=6379,
db=0, max_connections=1000)
# 從連接池獲取連接對象
r = redis.Redis(connection_pool=pool)
# 像普通連接一樣使用即可
max_connections
指的是請求池中的最大連接數,默認是 2 31 2^{31} 231。
redis庫中的方法以及方法的參數與redis-cli的命令以及參數是一致的,方法名稱對應命令,方法參數對應命令參數。因此,學會了redis-cli的命令,就學會了redis庫的使用。
我們現在通過redis-cli 來學習一下redis的具體操作,它會提示參數,十分好用。
通過 redis-cli 連接 redis-server:
redis-cli [-p 端口 -h ip地址] # 默認連接本地地址和6379端口
如果設置了密碼:
redis-cli -a 密碼
也可以先正常連接,進入客戶端後,輸入auth
回車,再輸入密碼,完成驗證。
退出 redis-cli:
exit # 或quit
查看服務器詳細信息 :
info
查看redis配置信息:
config get *
修改redis配置:
config set requirepass 密碼
將所做的修改保存到配置文件:
config rewrite
查看所有連接到服務器的客戶端信息:
client list
關閉客戶端連接:
client kill ip:端口
清空所有數據庫:
flushall
清空當前數據庫:
flushdb
選擇一個數據庫:
select 數字
redis默認有16個數據庫,編號0~15,默認的是第0個。
實時監控服務器:
monitor
一般用於日志審計。
Redis的key是二進制安全的,這意味著我們可以使用任何二進制序列作為key,從像"foo"這樣的字符串到JPEG文件的內容,甚至是空字符串。key的大小最大允許 512 MB。
刪除指定的key:
DEL key1 key2 ...
key被刪除,value也就不復存在。
檢查指定的key是否存在:
EXISTS key1 key2 ...
存在幾個,就返回幾。
查看數據庫中key的總數:
DBSIZE
給key設置過期時間:
EXPIRE key 秒數
到達指定秒數後,該key就會被刪除(key刪除則value跟著一起消失)。
查看剩余有效期:
TTL key
去除過期限制:
PERSIST key
返回符合給定模式(pattern)的所有key:
KEYS A* # 返回以A開頭的key
KEYS * # 返回所有key
查看key所存儲的value的數據結構類型:
type key
重命名key:
RENAME OLD_KEY_NAME NEW_KEY_NAME
移動key到指定數據庫:
MOVE key db
隨機返回一個key:
RANDOMKEY
string 是 redis 最基本的類型,它可以包含任何數據。比如jpg圖片或者序列化的對象,string 類型的值最大能存儲 512MB。
為指定的key設置value:
SET key value [EX 參數] [NX|XX]
獲取指定key的value:
GET key
為多個key設置多個value:
MSET key1 value1 key2 value2 ...
獲取所有給定key的值:
MGET key1 key2 ...
給key設置一個新的value並返回舊的value:
GETSET key value # 返回舊value
給指定key的value切片,然後返回子字符串:
GETRANGE key 起始索引 結束索引
SET key1 hello,world
GETRANGE key1 0 4 # 返回"hello"
GETRANGE key1 -5 -1 # 返回"world"
重寫指定位置後面的value值:
SETRANGE key 起始位置 value
SET key1 hello,world
SETRANGE key1 4 ,redis
GET key1 # 返回"hell,redis"
將key的整數值增加1:
INCR key
key中的value不是整數或者字面值不是整數,則會報錯。
將key的整數值減少1:
DECR key
在value後面追加內容:
APPEND key 追加的內容
redis的哈希類型是一個==“字段-值(field-value)”的集合==,類似於python中的字典。
設置key的內容:
HSET key field1 value1 [field2 value2 ...]
獲取key中指定字段的內容:
HGET key field
獲取key中多個字段的值:
HMGET key field1 [field2 ...]
刪除一個或多個字段:
HDEL key field1 [field2 ...]
查看key中,指定字段是否存在:
HEXIETS key field
獲取指定key的所有字段和值(慎用):
HGETALL key
迭代獲取key中的所有字段和值(建議以此替代HGETALL):
HSCAN key cursor # 開始一次迭代時,cursor傳入0
返回值除了字段和值外,還有本次迭代後的游標(cursor)位置,我們需要在下一次調用中使用它作為游標參數。
而在開始一次全新的迭代時,游標的值應該傳入0;
獲取指定key中的所有字段:
HKEYS key
獲取指定key中的所有值:
HVALS key
獲取字段的數量:
HLEN key
讓字段的整數值加上一個增量:
HINCRBY key field 增量
這個增量可以是負數,以此實現減少的效果。
Redis鏈表是根據插入順序排序的字符串元素集合,它們是基於鏈表數據結構實現的。
在鏈表前面(左面)添加一個或多個元素:
LPUSH key element1 [element2 ...]
在鏈表後面(右面)添加一個或多個元素:
RPUSH key element1 [element2 ...]
獲取鏈表長度:
LLEN key
將元素插入鏈表的指定元素之前或之後:
LINSERT key BEFORE|AFTER 指定元素 要插入的元素
在指定位置放入元素:
LSET key 索引 element
新的元素會覆蓋原來的元素。
從鏈表移除元素:
LREM key count element
count > 0:表示從左往右移除count個與指定元素相等的元素;
count < 0:表示從右往左移除count個與指定元素相等的元素;
count = 0:表示移除所有與指定元素相等的元素;
移除並返回鏈表中的第一個或前幾個元素:
LPOP key [count]
移除並返回鏈表中的最後一個或後幾個元素:
RPOP key [count]
根據索引獲取指定元素:
LINDEX key index
刪除並返回鏈表中的第一個元素,沒有可用的元素就阻塞,直到有可用的元素:
BLPOP key [key ...] timeout
timeout指阻塞的最大秒數,是一個雙精度值,設置為0表示無時間限制。
Redis的Sets是唯一的、無序的字符串元素的集合,不能出現重復的數據。
向集合添加一個或多個成員:
SADD key member [memebr1 ...]
獲取一個集合中成員的數量:
SCARD key
返回集合中的所有成員:
SMEMBERS key
判斷給定的值是否是集合的成員:
SISMEMBER key member
返回多個集合的交集:
SINTER key [key ...]
返回多個集合的並集:
SUNION key [key ...]
返回一個集合與給定集合的差集的元素:
SDIFF key1 key2
從集合中隨機返回一個成員並從集合中移除:
SPOP key [count]
count用來設置隨機返回的數量,不寫就是1個。
從集合中刪除指定成員:
SREM key member [member ...]
Redis的Sorted Sets類似於上面的Sets,但每個字符串元素都與一個名為score的浮點數值相關聯。與Sets不同,Sorted Sets中的元素是按照它們的score從小到大排序,因此它可以檢索一個范圍內的元素(例如,獲取前10個或下10個)。
向有序集合添加一個或多個成員,如果已經存在,則更新其score:
ZADD key [NX|XX] score member
從有序集合中刪除若干個元素:
ZREM key member [member ……]
獲取成員的score:
ASCORE key member
增加成員的score值:
ZINCRBY key 增量 member
迭代有序集合中的元素:
ZSCAN key 游標
獲取有序集合中的成員數:
ZCARD key
按照索引獲取一個范圍內的成員:
ZRANGE key min max
按照score獲取一個范圍內的成員:
ZRANGEBYSCORE min max
獲取成員的索引(從0開始):
ZRANK key member
更多redis 命令請參考官方文檔:傳送門
Redis是一個使用客戶端-服務器模型的TCP服務器,也被稱為請求/響應協議。也就是說,redis每次執行一個請求,需要經過以下步驟:
如果現在有一堆命令等待執行,發送完一個請求,等待響應再發送下一個請求……就會造成時間上的浪費。所以,我們希望能夠一次就發送多條命令,以節省時間。而管道就能幫助我們實現這一需求。
通過管道可以在無需等待請求被響應的情況下,發送下一個請求。並且,通過管道還可以對事務進行部分支持(不支持回滾)。
使用方法(通過python的redis庫):
import redis
conn = redis.Redis("127.0.0.1", 6379)
pipe = conn.pipeline(transaction=True) # 參數代表使用事務
# 開啟事務塊
pipe.multi()
pipe.set('key', 'value')
# ......
# 執行事務塊
pipe.execute()
django是不支持redis作為緩存的,但我們可以使用上面的redis庫,也可以使用專門的django-redis庫添加支持。下面簡單說一下django-redis的使用方法。
安裝django-redis:
pip install django-redis
在項目配置文件中,配置CACHES後端:
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}
LOCATION
支持三種參數:
創建一個正常的TCP套接字連接:
redis://[[username]:[password]]@localhost:6379/0
;
創建一個SSL封裝的TCP套接字連接:
rediss://[[username]:[password]]@localhost:6379/0
;
創建一個unix domain套接字連接:
unix://[[username]:[password]]@/path/to/socket.sock?db=0
。
如果有密碼,在OPTIONS
中設置"PASSWORD":"密碼"
。
使用方法有兩種:
使用django提供的接口:
from django.core.cache import cache
cache.set("key", value, timeout=30)
cache.get("key", default="默認值")
使用django-redis:
from django-redis import get_redis_connection
conn = get_redis_connection("default")
conn.hgetall("key")
更加詳細的說明,請參考官方文檔:傳送門
先自我介紹一下,小編13年上師交大畢業,曾經在小公司待過,去過華為OPPO等大廠,18年進入阿裡,直到現在。深知大多數初中級java工程師,想要升技能,往往是需要自己摸索成長或是報班學習,但對於培訓機構動則近萬元的學費,著實壓力不小。自己不成體系的自學效率很低又漫長,而且容易碰到天花板技術停止不前。因此我收集了一份《java開發全套學習資料》送給大家,初衷也很簡單,就是希望幫助到想自學又不知道該從何學起的朋友,同時減輕大家的負擔。添加下方名片,即可獲取全套學習資料哦