memcache存储数据后的多种读取方式

在django中使用memache存储数据,取出数据的几种方式

假设在django中存储了数据

from django.core.cache import cache
​
# 存储数据到Memcached
cache.set('my_key', 'my_value', timeout=None)  # timeout=None表示永不过期

一、django cache取数据

from django.core.cache import cache
​
# 从Memcached中获取数据
cached_value = cache.get('my_key')
​
if cached_value is not None:
    print(f"Value retrieved from cache: {cached_value}")
else:
    print("Key 'my_key' not found in cache or expired.")
​

二、python-memcache取数据

2.1 查看django源码,通过特定key取值,

查看django源码发现,在django中存储数据时, key前面加了前缀,:1:,

所以在取数据时只需要加前缀就可以

import memcache
​
mc = memcache.Client(['127.0.0.1:11211'], debug=True)
​
value = mc.get(":1:my_key")

2.2 遍历memcache的key,取值

先写如何取值的代码

import memcache
​
mc = memcache.Client(['127.0.0.1:11211'], debug=True)
# mc.set("foo", "bar")
# value = mc.get("foo")
# print(value)  # 输出bar
keys_list = []
a=mc.get_stats("items")
mem_use=a[0][1].keys()
l_num=[]
# 这个for是从items找到类似于items:27:number 39 这样的值,最后l_num存储的是items:27:number 这个值
for n in mem_use:
    if n.endswith("number"):
        l_num.append(n)
​
for i in l_num:
    print(a[0][1])
    b=a[0][1][i]   # 缓存数据个数
    c=i.split(":")[1]    # item的id
    d="cachedump" + " " + c +" " + b
    tmp_a=mc.get_stats(d)
#对某个slab中的所有keys获取keys值,对memcached所有keys进行get一次
    for n in tmp_a[0][1].keys():
         keys_list.append(mc.get(n))
​
print(keys_list)

下面解释每一步

第一步

mc.get_stats("items")

在Memcached中,使用 stats items 命令可以查看关于缓存项(items)的统计信息,这些信息包括每个项的详细信息和状态。每个缓存项都有一个唯一的标识符(item ID),通常是一个整数,用于区分不同的缓存项。有多个items:1:xxxx项,也有多个 item​s:num: xxxx

当你执行 stats items 命令时,会得到类似以下的输出:

STAT items:1:number 3     # 表示 item ID 为 1 的缓存项的数量为 3
STAT items:1:number_hot 0  表示 item ID 为 1 的缓存项中在热部分(hot part)的数量为 0
STAT items:1:number_warm 0 # 表示 item ID 为 1 的缓存项中在温部分(warm part)的数量为 0
STAT items:1:number_cold 3 # 表示 item ID 为 1 的缓存项中在冷部分(cold part)的数量为 3
STAT items:1:age_hot 0
STAT items:1:age_warm 0
STAT items:1:mem_requested 0
STAT items:1:evicted 0
STAT items:1:evicted_nonzero 0
STAT items:1:outofmemory 0
STAT items:1:tailrepairs 0
...
​
​
​
热部分(Hot Part)
热部分指的是在内存中频繁访问并且缓存命中率高的缓存项。热部分的特点包括:高频访问:高命中率:优先存储;
温部分(Warm Part)
温部分指的是相对较少访问但仍然被缓存的项。温部分的特点包括:较低频访问:中等命中率:缓存保留;
冷部分(Cold Part)
冷部分指的是很少访问甚至不被访问的缓存项。冷部分的特点包括:极低频访问:低命中率:淘汰可能性:系统可能会定期清理冷部分的缓存项,释放内存空间用于更频繁访问的数据。
​
age_hot:
含义: 表示处于热部分的缓存项的平均年龄(Age),即这些缓存项被存储在内存中并频繁访问的时间长短。
应用: 可用于了解热部分中数据的使用模式和频率,以便优化缓存策略。
​
age_warm:
含义: 表示处于温部分的缓存项的平均年龄(Age),即这些缓存项的存储时间和访问频率。
应用: 类似于 age_hot,用于监视和调整温部分中数据的存储策略。
​
mem_requested:
含义: 表示从 Memcached 请求的内存量,单位通常是字节。
应用: 用于监控 Memcached 的内存使用情况,帮助评估当前内存需求和未来扩展计划。
​
evicted:
含义: 表示因为内存不足而从缓存中驱逐的项的数量。
应用: 可用于了解缓存淘汰的频率,帮助调整缓存大小或优化缓存策略,减少缓存淘汰对性能的影响。
​
evicted_nonzero:
含义: 表示具有非零尺寸的驱逐项的数量。
应用: 可用于分析驱逐过程中真正释放内存的情况,而不仅仅是驱逐操作的数量。
​
outofmemory:
含义: 表示由于内存不足而导致的请求失败次数。
应用: 用于监控 Memcached 的内存压力,当出现频繁的 outofmemory 时,可能需要调整配置或者增加内存。
​
tailrepairs:
含义: 表示在LRU(Least Recently Used,最近最少使用)修复期间执行的修复操作数量。

第二步

遍历item结尾为number的item,只有number这种存储的才有数据,

在 Memcached 中,stats cachedump 命令用于获取指定缓存项(item)的详细信息,包括缓存项的键(key)、存储的数据大小和存储时间等。

命令格式:
stats cachedump <item_id> <limit>
​
<item_id>:这是指 Memcached 中缓存项的标识符(item ID)。在 stats items 命令的输出中,可以看到每个缓存项都有一个唯一的 item ID。
<limit>:表示要显示的缓存项数量的上限。如果设置为 0,则显示所有符合条件的缓存项;如果设置为 1,则只显示一条符合条件的缓存项。

得到的值为

[('192.168.226.161:11211 (1)', {':1:1721898329-time-cost': '[10 b; 1721898389 s]', xxxxx})]
​
​
':1:1721898329-time-cost' 是字典的一个键,通常格式为 :<item_id>:<timestamp>-time-cost,表示缓存项的标识和相关时间成本信息。
:1 可能是缓存项的 ID。
1721898329 是与缓存项相关的时间戳信息。
-time-cost 可能是描述缓存项成本或使用情况的标记。
'[10 b; 1721898389 s]' 是与键 ':1:1721898329-time-cost' 相关联的值,可能描述了缓存项的数据大小和存储时间。
[10 b] 可能表示缓存项的大小为 10 字节。
1721898389 s 可能表示缓存项存储的 UNIX 时间戳,即从 1970 年 1 月 1 日 00:00:00 UTC 起的秒数。

其中:1:1721898329-time-cost表示,我使用django cache存储了1721898329-time-cost这个key,django默认加了前缀:1:,若果是直接mc.set("test", "test"),那么获取的key就是test

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值