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

歡迎訪問 生活随笔!

生活随笔

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

数据库

Redis, Memcache 基本使用

發布時間:2025/3/17 数据库 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Redis, Memcache 基本使用 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Redis, Memcache

Memcache

MemCache是一個自由、源碼開放、高性能、分布式的內存對象緩存系統,用于動態Web應用以減輕數據庫的負載。它通過在內存中緩存數據和對象來減少讀取數據庫的次數,從而提高了網站訪問的速度。

安裝

https://github.com/memcached/memcached/wiki/Install

啟動服務

memcached -d -m 10 -u root -l 10.211.55.4 -p 12000 -c 256 -P /tmp/memcached.pid參數說明:-d 是啟動一個守護進程-m 是分配給Memcache使用的內存數量,單位是MB-u 是運行Memcache的用戶-l 是監聽的服務器IP地址-p 是設置Memcache監聽的端口,最好是1024以上的端口-c 選項是最大運行的并發連接數,默認是1024,按照你服務器的負載量來設定-P 是設置保存Memcache的pid文件

測試時可以關閉防火墻,否則客戶端無法訪問:systemctl stop firewalld.service

python中操作MemCache

安裝API

pip install python-memcached -i https://pypi.douban.com/simple

操作測試

這里在Django項目中測試

from django.conf.urls import url from django.shortcuts import HttpResponse import memcachedef test(request):mc = memcache.Client(['192.168.14.16:12000'], debug=True)mc.set('name', 'Lena', time=5) # 超時5秒name = mc.get('name')return HttpResponse(name)urlpatterns = [url(r'^test/', test), ]

分布式緩存

配置多個服務端,并設置權重,權重越高,命中幾率越高。

mc = memcache.Client([('192.168.14.16:12000', 1), ('192.168.14.17:12000', 2), ('192.168.14.18:12000', 3)], debug=True) # 分別設置1,2,3權重

Memcache的分布式是由客戶端程序的一致性哈希實現的,更多參考:http://www.csdn.net/article/2016-03-16/2826609

MemCache常用方法

注意:

  • MemCache中存的值只支持字符串和數字
  • 超時設置的時間單位是秒,超時后取出結果是None
命 令作 用
get返回Key對應的Value值:mc.get(key)
add添加一個Key值,沒有則添加,有則報錯:mc.add(key, val, time=10) 添加鍵值,并設置超時10秒
set設置一個Key值,沒有就增加,有就覆蓋:mc.set(key, val, time=10)
replace按照相應的Key值替換數據,如果Key值不存在則會操作失敗:mc.replace(key, val)
delete刪除一個鍵值對:mc.delete(key)
stats返回MemCache通用統計信息
flush_all清空所有鍵值,但不會刪除items,所以此時MemCache依舊占用內存:mc.flush_all()

其它方法

set_multi 設置多個鍵值對

mc.set_multi({k1: v1, k2: v2})

del_multi刪除多個鍵值對

mc.set_multi([k1, k2])

incr & decr

將key對應的值增加/減小

mc.set('a', 10) mc.incr('a', 10) # 'a' = 20 mc.decr('a', 5) # 'a' = 15

append & prepend

在指定key值后面/前面追加

mc.set('name', 'Lena') # 'name'= 'Lena' mc.append('name', 'Ayhan') # 'name' = 'LenaAyhan'

cas & gets

為了避免兩個請求同時修改某個值,造成數據異常。gets和cas需要配合使用。

通過gets獲取值的時候(假設是val),會多返回一個數字,就叫做cas_id吧,當val改變時(比如期間有另一個請求修改了val),這個cas_id也會變。當執行cas(check and set)重新設置值時,將檢查cas_id是否和gets取出值時的cas_id匹配,如果匹配則修改,如果不匹配,表示期間有其它請求修改了val,則無法修改.

val = mc.gets(key) # ... # 如果在gets和cas之間有請求修改了key的值,那么,下面的cas將會檢查到cas_id變了,拋出異常,避免修改造成數據異常 mc.cas(key, new_val)

Redis

同MemCache一樣,Redis也是在服務器內存中保存的非關系型數據庫(緩存),但是二者還是有些區別:

如果你對數據持久化和數據同步有所要求,那么推薦你選擇Redis,因為這兩個特性Memcached都不具備。即使你只是希望在升級或者重啟系統后緩存數據不會丟失,選擇Redis也是明智的。

Redis相比Memcached來說,擁有更多的數據結構和并支持更豐富的數據操作。

Redis不僅可以支持分布式,還具有高可用的特點:可以將數據定時刷入硬盤,解決了內存斷電易失的問題。并且它支持更多的的數據類型:字符串,數字,列表,集合,字典,有序集合。

在python中使用Redis

centos服務端安裝

yum install redis

如果安裝不上,先安裝epel倉庫yum install epel-release,再執行上述安裝命令。

啟動服務端:

systemctl start redis

配置:

vim/etc/redis.conf# bind 127.0.0.1 這一行要注釋掉,否則客戶端連接不上 equirepass 123 # 設置密碼

客戶端安裝:

pip install redis

連接

方式一

import redis conn = redis.Redis(host=, port=, password='123')

不推薦,每次都會重新連接,創建新的對象。

方式二 推薦

推薦用連接池:

pool = redis.ConnectionPool(host=xx, port=xx, password='123') conn = redis.Redis(connection_pool = pool)

進階:單例模式

這里的host, port, password可以寫到配置文件中。

import redisclass Singleton(object):def __new__(cls, *args, **kwargs):# 如果當前類沒有_instance屬性,那么就調用父類的__new__方法實例化對象,新增_instance屬性并賦值if not hasattr(cls, "_instance"):cls._instance = super(Singleton, cls).__new__(cls)return cls._instanceclass SingleRedis(Singleton):def __init__(self, host='192.168.14.16', port=6379, password=123):pool = redis.ConnectionPool(host=host, port=port, password=password)self.conn = redis.Redis(connection_pool=pool)# 使用 redis = SingleRedis() redis.conn.set(key, val)

字符常用操作

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

為name設置value(字符/數字類型);

ex/px: 過期時間(秒/毫秒);

nx: 如果為True,那么只有當name對應的value不存在時,該操作才能成功(即如果name在Redis中已經有value,將不會設置新的value,保留原來的值);默認False,無論如何設置新值。

xx: 如果為True,那么只有當name對應的value已經存在時,該操作才能成功(即只能更新已存在的name)。

conn.mset(*args, **kwargs)

批量設置值

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

conn.get(name)

返回name對應的value,如果不存在返回None

conn.get(keys, *args)

批量獲取值

conn.mget(k1, k2) # 或者 conn.mget([k1, k2])

conn.incr/decr(name, amount=1)

將name對應的value增加/減少amount,如果name不存在,將創建并初始化值為amount

列表常用操作

conn.lpush(name, *values)

往name對應的列表中添加元素(依次添加到最左邊)

redis.conn.lpush('fruits', 'banana', 'orange') # fruits: ['orange', 'banana']

conn.rpush(name, *values)

往k對應的列表中添加元素(從右邊添加)

conn.llen(name)

name對應列表的長度

conn.lpop(name)

name對應列表的左邊彈出一個值并返回

conn.rpop(name)

name對應列表的右邊彈出一個值并返回

字典常用操作

conn.hset(name, key, value)

設置字典 name: {key: value};

conn.hset(name, key2, value2) name: {key: value, key2: value2} 字典

注意如果value是字典或其它格式,需要先序列化為字符串

conn.hget(name, key)

獲取name對應字典中key對應的value

conn.hdel(name, key)

刪除name對應字典中的key

集合操作

將前綴s改為z,即可變為有序集合

conn.sadd(name, *values)

往name集合中添加元素

conn.scard(name)

返回name集合中元素的個數

conn.smembers(name)

獲取name集合中的所有元素

conn.srem(name, *values)

刪除name集合中某些元素

其它操作

delete(*names)

刪除指定的keys

exists(name)

判斷name是否存在,返回True/False

expire(name, time)

為某個name設置超時時間,單位是秒

總結

以上是生活随笔為你收集整理的Redis, Memcache 基本使用的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。