1 Redis的简介


1.1 了解什么是redis

        redis是一个开源的使用ANSI c语言编写、遵循BSA协议、支持网络、可基于内存亦可持久化的日志型、key-value数据库,
    并提供多种语言的API。
        他通常被称为数据结构服务器,因为值value可以是String、哈希(hash)、列表(list)、集合(sets)、和有序集合(sorted sets)等类型。  

1.2 redis的特点

    * Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。
    * Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
    * Redis支持数据的备份,即master-slave模式的数据备份。   

1.3 redis的优势

    * 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
    * 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
    * 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,
    即原子性,通过MULTI和EXEC指令包起来。
    * 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。    

1.4 Redis支持的数据类型

    * string(字符串)  
    * hash(哈希)
    * list(列表)
    * set(集合)
    * zset或sorted set(有序集合)  

2 Redis 命令

2.1 redis的运行

  1. Redis 命令用于在 redis 服务上执行操作。

    要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。
    
    Redis 客户端的基本语法为:
    
    $ redis-cli
    实例
    以下实例讲解了如何启动 redis 客户端:
    启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。
    
    $redis-cli
    redis 127.0.0.1:6379>
    redis 127.0.0.1:6379> PING
  2. 在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。 在远程服务上执行命令 如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令。 语法 $ redis-cli -h host -p port -a password

    实例
    以下实例演示了如何连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypass 的 redis 服务上。
    $redis-cli -h 127.0.0.1 -p 6379 -a "mypass"
    redis 127.0.0.1:6379>
    redis 127.0.0.1:6379> PING

2.2 通用命令

1. keys :遍历出所有key:keys * 如下图所示 :

    注意:keys命令一般不在生产环境使用,原因是假如key过多,会造成阻塞  
2. dbsize :计算key的总数;
3. exists :exists key :检查可以是否存在 ;存在返回1,不存在返回0
4. del :删除指定的key-value;存在删除返回1,不存在返回0;如下图所示

expire key seconds:key在seconds秒后过期;

5. ttl key:查看key剩余的过期时间 ;-1 代表key存在,并且没有设置过期时间;-2 代表key不存在
6. persist key:去掉key的过期时间;
7. type key:返回key的类型;返回类型有:string、hash、list、set、zset、none
    以上命令的时间复杂度:  
        keys     :O(n)  
        dbsize   :O(1)  
        del      :O(1)   
        exists   :O(1)  
        expire   :O(1)   
        type     :O(1)   

3 redis的数据结构和内部编码

3.1 内部编码

4 redis的单线程

    单线程为什么会这么快?    

        1. 纯内存    
        2. 非阻塞IO    
        3. 避免线程切换和竞太消耗    

    单线程注意什么?     
        1. 一次只运行一条命令    
        2. 拒绝长(慢)命令:keys,flushdb,slow lua script,mutil/exec,operate big vlalue(collection)  
        3. 其实不是单线程 如 fysnc file descriptor ,close file descriptor    

5 redis的字符串类型的命令解析

  • 结构和命令
  • 内部编码
  • 快速实战
  • 查缺补漏

5.1 Redis的键值对结构

    对于key-value:key是string,value是redis支持的数据结构  

5.2 场景

  • 缓存
  • 计数器
  • 分布式锁


5.3 get、set、del命令的解析

    get key:获取key对应的value    O(1)  
    set key value:设置key-value  O(1)
    del key :删除key-value       O(1)

5.4 incr、decr、incrby、decrby命令解析

    incr key : key自增1,如果可以key不存在,自增后get(key)=1 ;O(1)  
    decr key : key自减1,如果key不存在,自减后get(key)=-1  ; O(1)  
    incrby key k : key自增k,如果key不存在,自增后get(key) = k;O(1)   
    decrby key k : key自减k,如果key不存在,自减后get(key) = -k;O(1)  

5.5 setnx,set xx命令的解析

    setnx key value: 如果key不存在,则设置key-value;  
    set key value xx: 更新key值为key的value为vlaue    

5.6 mget、mset命令解析

    mget key1 key2...:批量获取key,原子操作 O(n)  
    mset key1 value key2 value:批量设置key-value O(n)   

5.7 getset、append、strlen命令的解析

    getset key newvalue:set key newvalue并返回旧的value O(1)   

    append key value: 将value追加在旧value的后面  O(1)  

    strlen key : 返回字符串的长度(注意中文)  

5.8 incrbyfloat、getrange、setrange命令解析

    incrbyfloat key 3.5 :增加key对应值的3.5 O(1)   

    getrange key start end:获取字符串指定下标所有值 O(1)  

    setrnage key index value:设置指定下标所有对应的值 O(1)   

5.9 字符串常用命令总结

6 redis的hash结构命令解析

所有hash的命令都是以h开头

6.1 命令解析

1. hget key field:获取hash key对应的field的value O(1)
2. hset key field value:设置hashkey对应field的value O(1)
3. hdel key field: 删除hash key对应field的value O(1)

命令演示如下图所示:

4. hexists key field:判断hash key是否有field O(1)
5. hlen key :获取hash key field的数量 O(1) 如下图所示

6. hmget key field1 field2… fieldN:批量获取hash key的一批field对应的值 O(1)
7. hmset key field1 value1 field2 value2… fieldN valueN O(n)
8. hgetall key:返回hash key对应所有的field和value O(n)
9. hvals key :返回hash key对应所有field的value O(n)
10. hkeys key:返回hash key对应所有field O(n)
    注意:小心使用hgetall  
            假如存放数据多,redis是单线程的特点,hgetal命令就会很慢  

6.1.1 hash命令的总结

6.2 实战

6.2.1场景描述

实现以下功能:
1 记录网站每个个人主页的访问量
2

6.2.2 使用的命令

hincrby user:1:info pageview count

7 redis的list结构命令解析

按照如下顺序详细解析list的命令,命令基本都是以”l”开头





7.1 插入命令解析

1. rpush key value1 value2…valueN:从列表右端插入(1~N)个值 O(1~n)
2. lpush key value1 value2…valueN:从列表左端插入(1~N)个值 O(1~n)
3. linsert key befor|after value newvalue:在list指定的值前|后插入newvalue O(n)

7.2 删除命令的解析

1. lpop key :从列表左侧弹出一个item O(1)
2. rpop key:从列表右侧弹出一个item O(1)
3. lrem key count value :根据count值,从列表中删除所有value相等的项,有一下几种情况
    (1)count>0,从左到右,删除最多count个value相等的项    
    (2)count<0,从右到左,删除最多Math.abs(count)个value相等的项    
    (3)count=0,删除所有value相等的项  
4. ltrim key start end:按照索引范围修剪列表 O(n)
5. lrange key start end(包含end):获取列表指定索引范围所有item O(n)
6. lindex key index:获取列表索引的item
7. llen key :获取列表长度

7.3 改命令解析

1. lset key index newvalue:设置列表指定索引为newvalue O(n)

7.4 查缺补漏

1. blpop key timeout:lpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞 O(1)
2. brpop key timeout:rpop阻塞版本,timeout是阻塞超时时间,timeout=0为永远不阻塞 O(1)

7.5 list命令总结

8 redis的集合结构命令解析

集合内的API,所有的命令都是以s开头的

8.1 命令解析

1. sadd key element:向集合key添加element(如果element已经存在,添加失败)O(1)
2. srem key element:将集合key中element移除掉 O(1)
3. scard 计算集合的大小
4. sismember key element:判断element是否在集合中
5. srandmember :从集合中随机挑count元素;语法:srandmember key count
6. spop key:从集合中随机弹出一个数
7. smembers key :获取集合中的所有数据 ,无序

8.2 set集合的总结