下面是一些看了,但觉得用处不大,不记下又可惜的东西。

Redis删除过期数据

redis通过expire/expireat(秒为单位)或者pexpire/pexpireat(毫秒为单位)来设置key的过期时间,reids是如何自动删除过期数据的呢?
当client主动访问key时,如果key已过期会立刻删除。对于没有被访问到key,redis后台每秒10次的执行如下操作:随机选取100个key校验是否过期,如果有25个以上的key过期,除对过期key删除外,立刻再额外随机选取100个key进行校验,直到过期key少于25,本次操作结束。
可见,过期数据不多每秒会有200条的数据被删除,每秒删除数量会随着过期数的增多而增多。但是一个过期的key不被client主动访问,在redis中的存活时间就不定了。

Redis的事务

redis通过multi、discard、exec和watch实现自己的事务。redis对内存的操作是单线程进行的,所以它在执行事务之间,其他客户端的命令都会被拒绝的。
其执行过程是:将多个命令排队打包,然后一次性、按顺序执行各命令。
  1. 开始事务(收到MULTI)
  2. 命令入队(客户端发过来的redis命令)
  3. 执行事务(收到EXEC)

注意:

事务开始执行后,不会处理其他客户端的其他命令,直到事务结束;
命令入队列的过程中,如果客户端发送了错误命令,如参数数量不对、命令错误,服务端会向客户端返回出错信息,并将该事务的状态置为REDIS_DIRTY_EXEC;
事务执行过程中发生错误,事务不会中断或失败,不影响已执行和后面要执行的命令
事务不可嵌套,一个客户端只能发送一次MULTI,在MULTI过程中,继续发送MULTI会被忽略,不会影响队列中的命令;
WATCH的作用:在事务开始前监视任意数量的可以(WATCH key [key ...]),当调用EXEC时,任一个被监视key发生修改,整个事务就不再执行,直接返回失败。

Redis淘汰机制

内存是有限的,当达到最大内存后redis需要淘汰一些数据(也可通过maxmemory <bytes>配置最大内存),选定要驱逐的某个键值对后,会删除数据并更新到AOF日志(如果打开)和slave。
淘汰策略有如下5种(通过maxmemory-policy配置,默认策略为 volatile-lru):
  • volatile-lru -> remove the key with an expire set using an LRU algorithm
  • allkeys-lru -> remove any key accordingly to the LRU algorithm
  • volatile-random -> remove a random key with an expire set
  • allkeys-random -> remove a random key, any key
  • volatile-ttl -> remove the key with the nearest expire time (minor TTL)
  • noeviction -> don't expire at all, just return an error on write operations

主要是LRU和Minimal TTL两个算法的应用,它们都不是严格按照LRU和Minimal TTL实现的,从候选集中随机抽取若干key,选出值最大的进行淘汰,并不是从全量数据集中进行保证。对于抽样的大小可以通过 maxmemory-samples来设置(默认为 maxmemory-samples 3)。

Redis系列-冷知识的更多相关文章

  1. redis系列--深入哨兵集群

    一.前言 在之前的系列文章中介绍了redis的入门.持久化以及复制功能,如果不了解请移步至redis系列进行阅读,当然我也是抱着学习的知识分享,如果有什么问题欢迎指正,也欢迎大家转载.而本次将介绍哨兵 ...

  2. Python 浮点数的冷知识

    本周的PyCoder's Weekly 上分享了一篇小文章,它里面提到的冷知识很有意思,我稍作补充,分享给大家. 它提到的部分问题,读者们可以先思考下: 若两个元组相等,即 a==b 且 a is b ...

  3. 【目录】redis 系列篇

    随笔分类 - redis 系列篇 redis 系列27 Cluster高可用 (2) 摘要: 一. ASK错误 集群上篇最后讲到,对于重新分片由redis-trib负责执行,关于该工具以后再介绍.在进 ...

  4. Redis系列文章-数据结构篇

    Redis系列文章 前言: 工作原因,在学习mybatis知识后,2个月没有补充新的知识了,最近拿起书本开始学习.打算写下这个Redis系列的文章. 目录结构如下: Redis内置数据结构 Redis ...

  5. Redis系列之key操作命令与Redis中的事务详解(六)

    序言 本篇主要目的有二: 1.展示所有数据类型中key的所有操作命令,以供大家学习,查阅,更深入的挖掘redis潜力. 2.掌握redis中的事务,让你的数据完整性一致性拥有更优的保障. redis命 ...

  6. 前端不为人知的一面--前端冷知识集锦 前端已经被玩儿坏了!像console.log()可以向控制台输出图片

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  7. 前端不为人知的一面–前端冷知识集锦 原文地址(http://web.jobbole.com/83473/);

    前端已经被玩儿坏了!像console.log()可以向控制台输出图片等炫酷的玩意已经不是什么新闻了,像用||操作符给变量赋默认值也是人尽皆知的旧闻了,今天看到Quora上一个帖子,瞬间又GET了好多前 ...

  8. Redis系列(2)之数据类型

    Redis系列(2)之数据类型 <Redis系列(1)之安装>中介绍了Redis支持以下几种数据类型,那么本节主要介绍学习下这几种数据类型的基本操作 字符串类型,string 散列类型,h ...

  9. Redis系列(1)之安装

    Redis系列(1)之安装 由于项目的需要,最近需要研究下Redis.Redis是个很轻量级的NoSql内存数据库,它有多轻量级的呢,用C写的,源码只有3万行,空的数据库只占1M内存.它的功能很丰富, ...

随机推荐

  1. project 2016 11 20 树的多项式

    #include <iostream>#include <stack>#include <cmath>#include <sstream> using ...

  2. vim的跨文件复制粘贴

    1.用vim打开一个文件,例如:a.cpp 2.在普通模式下,输入:":sp"(不含引号)横向切分一个窗口,或者":vsp"纵向切分一个窗口,敲入命令后,你将看 ...

  3. Java面试题整理

    1 Switch能否用string做参数? a.在 Java 7  之前, switch 只能支持byte,short,char,int 或者其对应的封装类以及 Enum 类型.在JAVA 7中,St ...

  4. Mysql主从架构的复制原理及配置详解

    一.简述Mysql复制 Mysql复制是通过将mysql的某一台主机的数据复制到其他主机(slaves)上,并且在slaves上重新执行一遍来实现.主服务器每次数据操作都会将更新记录到二进制日志文件, ...

  5. NetBeans无法使用编码GBK安全地打开该文件(改为默认UTF-8)

    用文本编辑器打开NetBeans安装目录下etc\netbeans.conf文件,找到”netbeans_default_options=”字段,在后面添加” -J-Dfile.encoding=UT ...

  6. AOP实现原理

    Spring 为解耦而生,其中AOP(面向切面编程)是很浓重的一笔. 本文来探讨一下AOP实现的原理. 一. 概述 代理模式是常用的java设计模式,他的特征是代理类与委托类有同样的接口,代理类主要负 ...

  7. 学习ES6--data2

    变量的解构: let [a, b, c] = [1, 2, 3] 等号左边的值等于等号右边的值,一一对应.假如右边没有相对应的值,如 let [a, b, c] = [1, 2, ] 这时候,c = ...

  8. zabbix利用mutt和msmtp配置邮件报警

    Mutt安装 yum –y install mutt msmtp安装 yum –y install openssl openssl-devel libntlm libntlm-devel cyrus- ...

  9. CentOS添加用户及赋予sudo权限

    在CentOS下添加一个用户假设用户名:username 密码:userpwd 新建用户: adduser username 修改密码: passwd username 根据提示重复输入两遍userp ...

  10. C#实现HttpPost提交文件

    先建立一个WebApplication Web.config <?xml version="1.0" encoding="utf-8"?> < ...