• Redis设计与实现--其他知识点


    1 事务

    WATCH命令监视某个键,该键有变动,会打开客户端的REDIS_DIRTY_CAS标志,事务提交时会失败。

    Redis不支持事务回滚。

    入队错误:出现命令不存在或者命令的格式不正确,Redis将拒绝执行这个事务。

    执行错误:执行过程中发生的错误,服务器不会中断事务的执行,已经执行的命令也不会受影响。

    只有服务器在AOF持久化模式下,并且appendfsync选项的值为always时,事务才具有持久性。

    2 排序

    SORT <key>

    SORT <key> ALPHA

    SORT <key> BY * 权重键

    SORT <key> BY * ALPHA

    ASC  DESC

    LIMIT  GET  STORE

    执行顺序:

    1)排序:ALPHA  ASC  DESC  BY

    2)限制结果集的长度:LIMIT

    3)获取外部键:GET

    4)保存排序结果集:STORE

    5)向客户端返回排序结果集:

    除了GET选项之外,调整选项的摆放位置不会影响SORT命令的排序结果。

    3 淘汰策略

    redis 提供 6种数据淘汰策略:
      . volatile-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(驱逐):禁止驱逐数据
      注意这里的6种机制,volatile和allkeys规定了是对已设置过期时间的数据集淘汰数据还是从全部数据集淘汰数据,后面的lru、ttl以及random是三种不同的淘汰策略,再加上一种no-enviction永不回收的策略。
      使用策略规则:
      1、如果数据呈现幂律分布,也就是一部分数据访问频率高,一部分数据访问频率低,则使用allkeys-lru
      2、如果数据呈现平等分布,也就是所有的数据访问频率都相同,则使用allkeys-random
      三种数据淘汰策略:
      ttl和random比较容易理解,实现也会比较简单。主要是Lru最近最少使用淘汰策略,设计上会对key 按失效时间排序,然后取最先失效的key进行淘汰 

    4 分布式锁

    使用redis的setnx()、get()、getset()方法

    1. setnx(lockkey, 当前时间+过期超时时间) ,如果返回1,则获取锁成功;如果返回0则没有获取到锁,转向2。
    2. get(lockkey)获取值oldExpireTime ,并将这个value值与当前的系统时间进行比较,如果小于当前系统时间,则认为这个锁已经超时,可以允许别的请求重新获取,转向3。
    3. 计算newExpireTime=当前时间+过期超时时间,然后getset(lockkey, newExpireTime) 会返回当前lockkey的值currentExpireTime。
    4. 判断currentExpireTime与oldExpireTime 是否相等,如果相等,说明当前getset设置成功,获取到了锁。如果不相等,说明这个锁又被别的请求获取走了,那么当前请求可以直接返回失败,或者继续重试。
    5. 在获取到锁之后,当前线程可以开始自己的业务处理,当处理完毕后,比较自己的处理时间和对于锁设置的超时时间,如果小于锁设置的超时时间,则直接执行delete释放锁;如果大于锁设置的超时时间,则不需要再锁进行处理。
  • 相关阅读:
    nodeJS grunt karma+jasmine+require 快速构建前台自动化测试环境搭建
    js闭包
    白鹭 接入vivo小游戏
    白鹭 字节跳动 接入小游戏
    白鹭声音播放问题汇总
    白鹭 有人好奇为什么hashcode 增长的那么快么?都创建了些什么?
    Mac node 安装
    白鹭 修改底层 egret.js 库后再次编译 成 新的库
    js 获取字典长度
    egret 性能优化
  • 原文地址:https://www.cnblogs.com/cheungchein/p/8903589.html
Copyright © 2020-2023  润新知