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释放锁;如果大于锁设置的超时时间,则不需要再锁进行处理。
posted @ 2018-04-21 20:31  清水捞蟹  阅读(134)  评论(0编辑  收藏  举报