一:Redis 概述

  - Redis 是内存级别的数据库,在一台普通电脑上,Redis 3.X 便可以读取 10 万个键值对(现在的Redis官方版本已经更新到了5.X,性能会更好)。

二:关于Redis 和 Memcached 的性能问题。

  - 理论上 Memcached 为多线程模型,会比 Redis 性能好。

  - 但是,Redis的性能已经足够好,在大部分场合下性能都不会成为它的瓶颈。

  - 我们更应该关注的是 Redis 和 Memcached 的应用场景。

三:key 键名设计

  - 可读性和可管理性 

    -  以业务名(或数据库名)为前缀(防止key冲突),用冒号分隔,比如业务名:表名:id

  - 简洁性

    - 保证语义的前提下,控制key的长度,当key较多时,内存占用也不容忽视,如:( user:{uid}:friends:messages:{mid}简化为u:{uid}:fr:m:{mid} )

  - 不要包含特殊字符

    - 空格、换行、单双引号以及其他转义字符 等

四:value设计

  -  不要使用特别大的键(bigkey)

    - 虽然 Redis 官方说明了 key和string类型value限制均为512MB。

    - 但是防止网卡流量、慢查询,string类型控制在10KB以内,hash、list、set、zset元素个数不要超过5000。

  -  非字符串的bigkey,不要使用del删除,使用hscan、sscan、zscan方式渐进式删除

    - 同时要注意防止bigkey过期自动删除问题(例如一个200万的zset设置1小时过期,会触发del操作,造成阻塞。

    - 而且该操作不会不出现在慢查询中(latency可查)),查找方法和删除方法。

  - 选择适合的数据类型

    - 取代将数据存储为数千(或者数百万)独立的字符串,可以考虑使用哈希数据结构将相关数据进行分组。哈希表是非常有效率的,并且可以减少你的内存使用;

    - 同时,哈希还更有益于细节抽象和代码可读。

    - 合适时候,使用list代替set。如果你不需要使用set特性,List在使用更少内存的情况下可以提供比set更快的速度。

    - Sorted sets是最昂贵的数据结构,不管是内存消耗还是基本操作的复杂性。

      - 如果你只是需要一个查询记录的途径,并不在意排序这样的属性,那么建议使用哈希表

  - 控制key的生命周期

    - Redis不是垃圾桶,建议使用expire设置过期时间(条件允许可以打散过期时间,防止集中过期)。

    - 不过期的数据重点关注idletime。

 

五:命令使用

  -  O(N)命令关注N的数量

    - hgetall、lrange、smembers、zrange、sinter等并非不能使用,但是需要明确N的值。

    - 在N值过大时候,有遍历的需求可以使用hscan、sscan、zscan代替。

  - 禁用命令

    -  keys

      -  客户端可查询出所有存在的键。(键太多导致Redis崩溃,缓存被穿透)

    -  flushdb

      -  删除当前所选数据库的所有键。此命令永远不会失败。

    -  flushall

      -  删除所有现有数据库的所有键,而不仅仅是当前选定的数据库。此命令永远不会失败。

    - 禁止线上使用keys、flushall、flushdb等,通过redis的rename机制禁掉命令,或者使用scan的方式渐进式处理。

  

  - 使用批量操作提高效率

    - 原生命令:例如mget、mset。

      - 非原生命令:可以使用pipeline提高效率。   

      - 两者不同:

          - 原生是原子操作,pipeline是非原子操作。
        - pipeline可以打包不同的命令,原生做不到
        - pipeline需要客户端和服务端同时支持。
 
  

  - 不建议过多使用Redis事务功能

    - Redis的事务功能较弱(不支持回滚),而且集群版本(自研和官方)要求一次事务操作的key必须在一个slot上(可以使用hashtag功能解决)。

 

  - monitor命令

    - 必要情况下使用monitor命令时,要注意不要长时间使用。

六:设置合理的淘汰策略

  - 根据自身业务类型,选好maxmemory-policy(最大内存淘汰策略),设置好过期时间。

  - 默认策略是volatile-lru,即超过最大内存后,在过期键中使用lru算法进行key的剔除,保证不过期数据不被删除,但是可能会出现OOM问题(申请内存过大导致自杀)。

  - 具体

    - 

    - allkeys-lru:根据LRU算法删除键,不管数据有没有设置超时属性,直到腾出足够空间为止。

    - allkeys-random:随机删除所有键,直到腾出足够空间为止。

    - volatile-random:随机删除过期键,直到腾出足够空间为止。

    - volatile-ttl:根据键值对象的ttl属性,删除最近将要过期数据。如果没有,回退到noeviction策略。

    - noeviction:不会剔除任何数据,拒绝所有写入操作并返回客户端错误信息"(error) OOM command not allowed when used memory",此时Redis只响应读操作。

《Redis 使用规范》的更多相关文章

  1. 简单物联网:外网访问内网路由器下树莓派Flask服务器

    最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...

  2. 利用ssh反向代理以及autossh实现从外网连接内网服务器

    前言 最近遇到这样一个问题,我在实验室架设了一台服务器,给师弟或者小伙伴练习Linux用,然后平时在实验室这边直接连接是没有问题的,都是内网嘛.但是回到宿舍问题出来了,使用校园网的童鞋还是能连接上,使 ...

  3. 外网访问内网Docker容器

    外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...

  4. 外网访问内网SpringBoot

    外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...

  5. 外网访问内网Elasticsearch WEB

    外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...

  6. 怎样从外网访问内网Rails

    外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...

  7. 怎样从外网访问内网Memcached数据库

    外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...

  8. 怎样从外网访问内网CouchDB数据库

    外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...

  9. 怎样从外网访问内网DB2数据库

    外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...

  10. 怎样从外网访问内网OpenLDAP数据库

    外网访问内网OpenLDAP数据库 本地安装了OpenLDAP数据库,只能在局域网内访问,怎样从外网也能访问本地OpenLDAP数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动 ...

随机推荐

  1. Selenium Navigation

    Navigating Navigate a link with WebDriver: driver.get("http://www.google.com") 1.Interacti ...

  2. 一 期末架构1 centos7 简介

    一 centos7 安装 和差异 虚拟机配置好硬件  第一张网卡NAT添加第二张网卡选择LAN区段  安装前修改内核 变更网卡名  net.ifnames=0  biosdevname=0  回车   ...

  3. Niagara workbench (Basic )

    1.the basic information about workbench Last saved  station open in the workbench or opened  another ...

  4. Windows Internals 笔记——内核对象

    1.每个内核对象都只是一个内存块,它由操作系统内核分配,并只能由操作系统内核访问.这个内存块是一个数据结构,其成员维护着与对象相关的信息. 2.调用一个会创建内核对象的函数后,函数会返回一个句柄,它标 ...

  5. Mysql err 1055

    目录: 错误信息 原因分析 解决方案 操作示例 错误信息 [Err] 1055 - Expression #1 of ORDER BY clause is not in GROUP BY clause ...

  6. Javascript实现的数组降维——维度不同,怎么谈恋爱(修订版)

    数组的元素可能是数组,这样一层层嵌套,可能得到一个嵌套很深的数组,数组降维要做的事就是把嵌套很深的数组展开,一般最后得到一个一维数组,其中的元素都是非数组元素,比如数组[1, [2, 3, [4, 5 ...

  7. 使用Spring ThreadPoolTaskExecutor实现多线程任务

    我们为何使用多线程,之前已经有讲过了,为了更快的处理多个任务,分割任务,或者调用多个毫无关联的第三方服务 其实spring就提供了ThreadPoolTaskExecutor这个类来实现线程池,线程池 ...

  8. spark Transformations算子

    在java中,RDD分为javaRDDs和javaPairRDDs.下面分两大类来进行. 都必须要进行的一步. SparkConf conf = new SparkConf().setMaster(& ...

  9. C#订阅与发布标准实现

    大概看了下C#官方提供的IObservable接口以及IObserver接口来实现发布和订阅,写的很标准,很有代表性,做下笔记,以后要是项目需要用到发布订阅再基于自己的需求改: public clas ...

  10. 学习 Vim —— Vimtutor 总结笔记

    Lesson 2 2.1-2.3 删除 [dw] 删除从光标开始处至下一词开始前的部分,光标停在下一词的词首. [de] 删除从光标开始处至词尾的部分. [d$] 删除从光标开始处至行末的部分. 2. ...