在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项,也有多个 items: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