• 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('获取锁失败')
  • 相关阅读:
    同样功能的SQL语句,写成参数和写成常量怎么效率会有那么大的差别
    遭遇钓鱼网站
    SQL Server 2005与Oracle同步注意NUMBER类型转换
    Oracle数据类型(转)
    如何使用枚举的组合值
    社保,交得越多亏得越多(转)
    使用OPENXML函数将XML文档转换为行结果集
    发布一个性能测试工具的破解补丁
    如何将SQLServer2005中的数据同步到Oracle中
    Repository模式
  • 原文地址:https://www.cnblogs.com/xiao-xue-di/p/10138155.html
Copyright © 2020-2023  润新知