• Redis指南


    一、简介

    redis 和 memcached 都是高性能的键值缓存数据库服务,其中 memcached 支持多线程,而 redis 支持丰富的数据结构且能内置持久化机制。

    redis 数据都是以键值形式存储的,键是字符串类型,值有 7 种类型(本质上是5种,其中 HyperLogLog 是 string,而 GEO 是 zset,可以通过 object encoding keyname 查看,但由于功能上的差异较大,这里分为7种):

    1、string 字符串

    2、list 列表

    3、set 集合(所有命令均以 S 开头)

    4、hash 散列(所有命令均以 H 开头)

    5、zset 有序集合(所有命令均以 Z 开头)

    6、HyperLogLog

    7、GEO (redis 3.2)

    不同的值类型,甚至是同一种值类型,其底层实现也可能是不一样的(主要是考虑到不同情况下的效率优化),具体可以看 redis 源码。

    二、常见命令

    redis 的命令可以参考官网:https://redis.io/commands

    对英文不熟练的也可以看国人翻译的网站:http://redisdoc.com/

    以下对常见的命令进行列举

    1、键操作命令

     

    简单示例:

    127.0.0.1:6379> set age 18
    OK
    127.0.0.1:6379> dump age
    "x00xc0x12ax00xb2xebxabxbcx1dxebx911"
    127.0.0.1:6379> restore age1 5000 "x00xc0x12ax00xb2xebxabxbcx1dxebx911"
    OK
    127.0.0.1:6379> get age1
    "18"

    2、值操作命令:String

    3、值操作命令(List)

    4、值操作命令(Set)

     

    5、值操作命令(Hash)

    6、值操作命令(SortedSet)

    7、值操作命令(HyperLogLog)

    7、值操作命令(GEO) 

     

    三、发布与订阅

      redis 的发布与订阅,是以频道channel为中介,订阅者订阅相关channel,发布者向channel发送string类型消息,会通知到该channel相关的订阅者。在实际开发中,会有一些问题,其中一个问题是,客户端客观上会存在断线重连的情况,如果一个客户端在订阅了某个channel之后,断线重连了(已经不是原来的订阅者了),则需要重新订阅相关channel,而且会丢失断线期间的消息通知。另外,订阅的客户端会进行阻塞模式,一直监听 redis 通知的消息。取消订阅使用 unsubscribe ch1 [ch2] 命令,如果不带任何频道名,则表示退订所有频道,退订操作在官方提供的 redis-cli 中是无法模拟的,因为一旦执行订阅操作窗口就被阻塞了。
      

      基于 redis 发布与订阅功能,在 redis2.8后实现了键空间通知(keyspace)和键事件通知(keyevent)的功能,前者用于当指定模式的键发生了变化时进行通知,后者用于当发生指定的操作命令时进行通知。该功能需要消耗一定的CPU资源,默认是关闭,可通过修改 redis.conf 文件或执行 config set notify-keyspace-events AKE 来开启。命令中的 "AKE" 表示开启所有类型的通知,更细化的设置请参考官方手册,可以指定具体针对具体类型的键进行 keyspace 或 keyevent 通知。

      监视一个 keyspace/keyevent 的格式是 psubscribe __keyspace@<db>__:* 和 psubscribe __keyevent@<db>__:* ,如订阅 Users: 开头的键发生变化如下:

    psubscribe __keyspace@0__:Users:*

      而订阅删除事件的操作如下:

    psubscribe __keyevent@0__:del

      而如下的操作将会同时订阅 keyspace 和 keyevent,在执行类似 add key value 操作时,会收到两条通知消息:

    psubscribe __key*@0__:*

    四、事务

      redis 在一定程度上实现了事务逻辑(不支持回滚),通过 multi/exec 包含的命令集(顺序的将其中的命令入队,如果入队成功会返回 queued,如果入队失败则会导致事务失败,即使执行exec也会返回事务错误),将以原子操作执行(需要注意的是,如果事务队列中的某些命令执行成功,而某些命令执行失败是存在的,redis 并不会回滚。在事务命令入队时,redis只会检查严重的语法格式错误,逻辑错误是没法检测的,比如对一个string键执行 lpush 操作)。 multi 命令标记着事务的开始,exec 标记事务的结束并提交事务,discard 标记着事务的结束并放弃事务。与事务常常一起配合使用的有 watch 命令,该命令用于在事务开始前监视一个 key 的内容是否发生变化。 在执行 exec 命令提交事务时,redis会检测当前的 watch 队列中的数据是否发生变化,如果发生变化,则事务将不被执行(程序可以尝试重试操作,使用乐观锁是从效率考虑)。无论提交还是放弃(exec/discard)一个事务,都会清空当前的 watch 队列,如果需要在事务开始前取消一个之前watch的操作,可以使用 unwatch 命令。

      

      注意,如果 watch 的是一个带生存时间的键,那么即使该键过期了,redis 仍然认为其是没有变化的,事务仍可正常执行。

      redis 脚本是在 redis2.6 之后引入的另一种处理事务的方法,使用脚本要更简单,并且速度更快。redis 官方表示,短时间内并不会移除原有的事务功能,但未来如果脚本被广泛使用的话并不排除这种可能。

    五、服务器管理

    1、慢日志

      通过慢日志,可以记录执行时间较长的命令,从而便于找出项目的效率问题。

      通过下面的命令可以设置当命令耗时超过多少微秒时将被记录:

    config set slowlog-log-slower-than 10000 

      这些慢日志会记录到一个队列中,可以通过下面的命令设置队列的长度:

    CONFIG SET slowlog-max-len 1000

      查看慢日志可以用下面的命令,如果跟上数字,表示显示指定数量的日志:

    slowlog get [number]

      查看当前慢日志的数量:

    slowlog len

      清空慢日志:

    slowlog reset

    六、集群

    七、redis性能测试

    http://www.cnblogs.com/silent2012/p/4514901.html

  • 相关阅读:
    2. Add Two Numbers
    1. Two Sum
    22. Generate Parentheses (backTracking)
    21. Merge Two Sorted Lists
    20. Valid Parentheses (Stack)
    19. Remove Nth Node From End of List
    18. 4Sum (通用算法 nSum)
    17. Letter Combinations of a Phone Number (backtracking)
    LeetCode SQL: Combine Two Tables
    LeetCode SQL:Employees Earning More Than Their Managers
  • 原文地址:https://www.cnblogs.com/tianyajuanke/p/6134323.html
Copyright © 2020-2023  润新知