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、内存数据库、异步线程、多路复用、哨兵、集群

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



  • 相关阅读:
     随机选择数据库记录的方法
    交叉查询
    Delphi编辑器颜色设置
    Delphi Dll中多线程无法使用Synchronize同步的解决方法(转)
    Delphi FTP例子源码
    DELPHI之备忘四
    界面美化代码
    使Form响应滚轮事件
    配色卡
    Delphi http传输备忘
  • 原文地址:https://www.cnblogs.com/wangzhiyong/p/10499635.html
Copyright © 2011-2022 走看看