zoukankan      html  css  js  c++  java
  • 程序员眼中的Redis

    Redis 是用C语言编写的内存中的数据结构存储系统,可以用来作数据库、缓存、消息中间件.

    数据结构

    字符串(strings):值是任何种类的字符串

    散列(hashs):值是map 字典,数组+链表,不管读多还是写多都能很好的性能

    列表(lists):链表或队列或栈

    集合(sets):无序集合,可用交集、差集、并集

    有序集合(sorted sets):有序集合

    Key设计技巧

    可以类比表设计方法,比如 表名:主键:字段名

    key 不要设计太长也不要太短

    分布式锁

    在分布式系统里面,我们常常是先执行查询,如果查出结果满足条件则执行更新或插入等操作,因为查询是无锁状态,查询和更新或插入又不是原子操作,所以会出现幻读或脏读,即并发问题,以至影响我们的业务,比如对库存、积分、优惠劵等关键数据的控制;Redis 为我们提供 setnx (set if not exists )指令,来实现分布式锁效果,在同一时间只能有一个客户端访问处理数据,其它客户端进行等待,直到指定的expire 过期,对expire 要慎重设置,记住分布式锁是悲观锁,且无法解决超时问题.

    事务

    Redis 事务命令是multi 类似于开始事务;exec 类似于提交事务;discard 类似于回滚事务; 严格意义上不支持事务,因为它不满足事务的原子性原则,并且不支持回滚操作,即没有操作前的日志记录,如果使用事务,里面有个规则是执行多个命令语句,有任意一个命令语句错误(比如 set 命令写成 met ),则做exec 时全部命令执行失败,如果全部命令编写成功则做exec 时即便是执行失败的情况则也会有执行成功的命令,这个规则对于开发人员来说透明,因为开发人员更多的是通过封装的库或中间件来操作Reids ; 另外记住Redis 提供 Watch 命令来对key进行监控,即可实现乐观锁.

    持久化

    rdb Redis 通过多进程机制来实现快照持久化(rdb),在持久化时会fork 一个子进程来对数据进行读取并存到磁盘中,由于会遍历读取内存写磁盘所以会比较消耗服务器资源,由于不是实时保持数据且操作有可能持续比较长,所以会丢数据及重启服务数据比较慢. 

    aof 是重放redis 命令;底层是执行 操作系统的 fsync 函数来写磁盘,但是fsync 操作性能比较慢,所以Redis 有三种规则包含来调用fsync :

    1.定时调用

    2.决不调用

    3.执行一个命令就调用一次

    另外 aof 文件会比较长的问题,可以定期通过bgrewriteaof命令来减少aof 的长度.

    在实际使用当中,可以rdb 和 aof 混合使用提高重启效率,且多从库做持久化避免丢失数据.

    限流

    使用 Redis-Cell 模块实现漏斗算法限流.限流算法有两个关键点:一个是漏斗初始化容量,一个是限流最大限流速率(单位时间内请求量).

    单线程

    Redis 虽然是单线程但性能非常好,可了解下IO的多路复用模型,虽然Redis是单线程,但并不是一个线程,而且有些操作是异步线程完成的,比如 key 的过期策略,超过最大虚拟内存时使用的LRU 清除key 算法策略,持久化 等都使用了异步线程;另外记住这些Redis 命令在生产环境请禁用;keys*,del key ,flushdb , flushall ,aof  等;因为这些命令有可能会导致Redis 卡顿.

    tags: lru、过期key、内存数据库、异步线程、多路复用、哨兵、集群

     长按或扫码关注查看更多文章



  • 相关阅读:
    笔记44 Hibernate快速入门(一)
    tomcat 启用https协议
    笔记43 Spring Security简介
    笔记43 Spring Web Flow——订购披萨应用详解
    笔记42 Spring Web Flow——Demo(2)
    笔记41 Spring Web Flow——Demo
    Perfect Squares
    Factorial Trailing Zeroes
    Excel Sheet Column Title
    Excel Sheet Column Number
  • 原文地址:https://www.cnblogs.com/wangzhiyong/p/10499635.html
Copyright © 2011-2022 走看看