zoukankan      html  css  js  c++  java
  • redis过期策略+事务+分布式锁+单redis服务器锁

    过期策略

    相关知识:redis 内存数据集大小上升到一定大小的时候,就会施行数据淘汰策略。redis 提供 6种数据淘汰策略:

    • voltile-lru:从已设置过期时间的数据集(server.db[i].expires)中挑选最近最少使用的数据淘汰
    • volatile-ttl:从已设置过期时间的数据集(server.db[i].expires)中挑选将要过期的数据淘汰
    • volatile-random:从已设置过期时间的数据集(server.db[i].expires)中任意选择数据淘汰
    • allkeys-lru:从数据集(server.db[i].dict)中挑选最近最少使用的数据淘汰
    • allkeys-random:从数据集(server.db[i].dict)中任意选择数据淘汰 no-enviction(驱逐):禁止驱逐数据

    事务

     
    import redis
     
    pool = redis.ConnectionPool(host='10.211.55.4', port=6379)
     
    conn = redis.Redis(connection_pool=pool)
     
    # transaction默认为False,只可以完成批量提交的作用,节省网络延时
    # 改为True后可以实现事务功能
    # pipe = r.pipeline(transaction=False)
    pipe = conn.pipeline(transaction=True)
    # 开始事务
    pipe.multi()
     
    pipe.set('name''alex')
    pipe.set('role''sb')
    pipe.lpush('roless''sb')
     
    # 提交
    pipe.execute()

    单redis服务器锁

     
    import redis
    conn = redis.Redis(host='127.0.0.1',port=6379)
     
    # conn.set('count',1000)
    val = conn.get('count')
    print(val)
     
    with conn.pipeline(transaction=True) as pipe:
     
        # 监视,自己的值没有被修改过
        conn.watch('count')
     
        # 执行操作
        pipe.multi()
        old_count = conn.get('count')
        count = int(old_count)
        print('现在剩余的商品有:%s',count)
        input("问媳妇让不让买?")
        pipe.set('count', count - 1)
     
        # 执行,把所有命令一次性推送过去
        pipe.execute()

    分布式锁

    在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段。

    原理 : 设置一个值并设置过期时间,当其他的连接要修改数据时会去读取那个值,如果有说明是被锁住的.(需要注意过期时间, 防止加锁时,或者数据没有修改完成锁就失效)

    成功条件 : 超过一半的redis实例设置成功

    官方提供的包下载解压缩,切换到文件中

    • python setup.py build
    • python setup.py install

    使用 : 

     
    from redlock import Redlock
     
    dlm = Redlock(
        [
            {"host""localhost""port"6379"db"0},
            {"host""localhost""port"6379"db"0},
            {"host""localhost""port"6379"db"0},
        ]
    )
     
    # 加锁,acquire
    my_lock = dlm.lock("my_resource_name",10000# 第一个参数就是设置的键
    if  my_lock:
        # 进行操作
        # 解锁
        dlm.unlock(my_lock)
    else:
        print('获取锁失败')
  • 相关阅读:
    mysql数据库引擎myisam与innodb
    Java观察者模式的理解
    线程安全的单例模式
    线程相关
    java 线程读写锁
    原子变量AtomicInteger
    接口文档管理,版本管理工具,阿里RAP的windows下部署
    谷歌浏览器报错:跨域问题处理( Access-Control-Allow-Origin)_ 用于本地测试的快捷解决方法
    mysql bin-log日志记录
    阿里RDS中插入emoji 表情插入失败的解决方案
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/10138155.html
Copyright © 2011-2022 走看看