• reids和memcache对比,Django对memcache的支持


    memcache&redis是什么?在内存中存取数据
    应用场景:
      缓存:实时性要求不高的数据,可以做缓存
      一般公司的首页是做了缓存的。

    memcache&redis相同点:
      都是k-v的形式

    memcache&redis有哪些区别?
    memcache:

      类型单一 v只能是字符串
    redis:五大类型

      k==“字符串”
      k==list
      k==hash
      k==set
      k==order set
    持久化:
      memcache:断电内存清空
      redis:支持持久化
    核心:redis单核,memcache多核

    如果只做页面缓存:用memcache就行,因为只缓存字符串
    -------------------------------------哪个好?--------------------------------------------------------------------
    Redis作者的原话:
    没有必要过多关心性能,因为二者的性能都已经足够高了。
    由于Redis只使用单核,而memcache可以使用多核,所以在比较上,平均
    每一个核上Redis在存储小数据时比memcache性能更高。而在100k以上的数据中
    memcache性能要高于redis,虽然redis也在存储大数据性能上进行优化,但比起memcache
    还是稍有逊色,说了这么多,结论是无论你使用哪一个,
    每秒处理请求的次数都不会成为瓶颈(比如瓶颈可能会在网卡)
    如果要说内存使用效率,使用简单的key-value存储的话,memcache的内存利用率更高,
    而如果redis采用hash结构来做key-value存储,由于其组合式的压缩,其内存利用率
    会高于memcache,当然这和你的应用场景和数据特性有关。
    如果你对数据持久化和数据同步有所要求,那么推荐你选择redis,因为这两个特性memcache都不具备
    即使你只是希望在升级或者重启系统后缓存数据不会丢失,选择redis也是明智的。
    如果需要缓存能够支持更复杂的结构和操作,redis是不错的选择

    -----------------------------------------------------------------------------------------------------------------------

    10、gets 和 cas

    如商城商品剩余个数,假设该值保存在memcache中,product_count = 900
    A用户刷新页面从memcache中读取到product_count = 900    ---> mc.get('product_count')==900
    B用户刷新页面从memcache中读取到product_count = 900    ---> mc.get('product_count')==900

    如果A、B用户均购买商品(A和B用户获取到的product_count都是一样的)

    A用户修改商品剩余个数 product_count=899   --> mc.set('product_count', 899)
    B用户修改商品剩余个数 product_count=899   --> mc.set('product_count', 899)

    如此一来缓存内的product_count便不在正确,两个用户购买商品后,商品剩余还是 899
    如果使用set和get来操作以上过程,那么程序就会如上述所示情况!

    如果想要避免此情况的发生,只要使用 gets 和 cas 即可,如:

    #!/usr/bin/env python
    # -*- coding:utf-8 -*-
    import memcache
    mc = memcache.Client(['10.211.55.4:12000'], debug=True, cache_cas=True)
     
    v = mc.gets('product_count')
    # ...
    # 如果有人在gets之后和cas之前修改了product_count,那么,下面的设置将会执行失败,剖出异常,从而避免非正常数据的产生
    mc.cas('product_count', "899")

    Ps:本质上每次执行gets时,会从memcache中获取一个自增的数字,通过cas去修改gets的值时,会携带之前获取的自增值和memcache中的自增值进行比较,如果相等,则可以提交,如果不想等,

    那表示在gets和cas执行之间,又有其他人执行了gets(获取了缓冲的指定值), 如此一来有可能出现非正常数据,则不允许修改。

    Django的缓存:

    Django缓存将一个某个views的返回值保存至内存或者memcache中,某时间段内再有人来访问时,则不再去执行view中的操作,而是直接从内存或者Redis中之前缓存的内容拿到,并返回。

    Django中提供了6种缓存方式:一般用后面三种

    • 开发调试(可以设置保存缓存的key格式)
    • 内存
    • 文件
    • 数据库
    • Memcache缓存(python-memcached模块)
    • Memcache缓存(pylibmc模块)
    • Redis缓存

    Memcache缓存(python-memcached模块)

    # 此缓存使用python-memcached模块连接memcache
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': '127.0.0.1:11211',
            }
        }
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': 'unix:/tmp/memcached.sock',
            }
        }   
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
                'LOCATION': [
                    '172.19.26.240:11211',
                    '172.19.26.242:11211',
                ]
            }
        }
    mem缓存-py-memcached模块

    Memcache缓存(pylibmc模块)

    # 此缓存使用pylibmc模块连接memcache
        
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
                'LOCATION': '127.0.0.1:11211',
            }
        }
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
                'LOCATION': '/tmp/memcached.sock',
            }
        }   
    
        CACHES = {
            'default': {
                'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
                'LOCATION': [
                    '172.19.26.240:11211',
                    '172.19.26.242:11211',
                ]
            }
        }
    mem缓存-pylibmc模块

    Redis缓存(依赖:pip3 install django-redis)

    CACHES = {
        "default": {
            "BACKEND": "django_redis.cache.RedisCache",
            "LOCATION": "redis://127.0.0.1:6379",
            "OPTIONS": {
                "CLIENT_CLASS": "django_redis.client.DefaultClient",
                "CONNECTION_POOL_KWARGS": {"max_connections": 100}
                # "PASSWORD": "密码",
            }
        }
    }
    redis缓存
    from django_redis import get_redis_connection
    conn = get_redis_connection("default")

    a. 全站使用

       使用中间件,经过一系列的认证等操作,如果内容在缓存中存在,则使用FetchFromCacheMiddleware获取内容并返回给用户,当返回给用户之前,判断缓存中是否已经存在,如果不存在则UpdateCacheMiddleware会将缓存保存至缓存,从而实现全站缓存
    
        MIDDLEWARE = [
            'django.middleware.cache.UpdateCacheMiddleware',
            # 其他中间件...
            'django.middleware.cache.FetchFromCacheMiddleware',
        ]
    
        CACHE_MIDDLEWARE_ALIAS = ""
        CACHE_MIDDLEWARE_SECONDS = ""
        CACHE_MIDDLEWARE_KEY_PREFIX = ""

    b. 单独视图缓存

        方式一:15分钟过期
            from django.views.decorators.cache import cache_page
    
            @cache_page(60 * 15)
            def my_view(request):
                ...
    
        方式二:
            from django.views.decorators.cache import cache_page
    
            urlpatterns = [
                url(r'^foo/([0-9]{1,2})/$', cache_page(60 * 15)(my_view)),
            ]

    c、局部视图使用

        a. 引入TemplateTag
    
            {% load cache %}
    
        b. 使用缓存
    
            {% cache 5000 缓存key %}
                缓存内容
            {% endcache %}
  • 相关阅读:
    WeTagger不封号的微信客服工具(一)——预告
    WeSender不封号的微信群发软件(六)——升级:第六版已经完成
    .net core系列(一)
    .net core系列整理收藏
    Ansible Windows模块学习
    Windows配置Ansible Host
    Alembic管理Sqlite3数据库版本
    高端VIPRION实物图
    Calendar 类 set() 方法使用要点
    Java 日期处理工具类
  • 原文地址:https://www.cnblogs.com/staff/p/13111458.html
Copyright © 2020-2023  润新知