首页 > 技术文章 > redis

fatRabbit- 2019-03-31 23:29 原文

  • Redis是一个key-value的nosql产品,与Memcached有些类似,但它存储的value类型相对更加丰富,包括string(字符串)、list(链表)、set(集合)、zset(sorted set有序集合)和hasg。与memcached一样,为了保证效率,数据都是缓存在内存中。区别的是redis会周期性的把内存中的数据写入到硬盘(被称为数据持久化),同时由于redis支持的value类型众多,也被称为结构化的nosql数据库。
  • NoSQL产品:redis、memcache、mongoDB等特点
    • 一般不使用严格的表结构(行和列的组合形成一个表)
    • 数据的查询一般都不再使用sql查询
  • 在Mac的安装Redis
    • 官网下载https://redis.io/download
    • 将解压后的文件放入/usr/local/控制台
      • 进入文件夹:cd /usr/local/redis-5.0.4
      • 编译测试:sudo make test
      • 编译安装:sudo make install
      • 启动redis:redis-server
      • 关闭redis:redis-cli shutdown
      • 启动客户端:redis-cli
      • 关闭客户端:quit
      • 在客户端里清屏:clear
  • Redis的string类型
    • 简单例子
      127.0.0.1:6379> set username admin
      OK
      127.0.0.1:6379> get username
      "admin"
      127.0.0.1:6379> 

       

    • incr属性,会向指定key值自增1
      127.0.0.1:6379> set id 1
      OK
      127.0.0.1:6379> get id
      "1"
      127.0.0.1:6379> incr id
      (integer) 2
      127.0.0.1:6379> get id
      "2"

       

    • decr属性,会向指定key值自减1
      127.0.0.1:6379> set id 1
      OK
      127.0.0.1:6379> get id
      "1"
      127.0.0.1:6379> incr id
      (integer) 2
      127.0.0.1:6379> get id
      "2"
      127.0.0.1:6379> decr id
      (integer) 1
      127.0.0.1:6379> 

       

    • incrby属性,会向指定key值自增指定数
      127.0.0.1:6379> get id
      "1"
      127.0.0.1:6379> incrby id 19
      (integer) 20
      127.0.0.1:6379> get id

       

    • decrby属性,会向指定key值自减指定数
      127.0.0.1:6379> get id
      "20"
      127.0.0.1:6379> decrby id 19
      (integer) 1
      127.0.0.1:6379> get id
      "1"

       

    • keys属性,获取redis全部的key
      127.0.0.1:6379> keys * 
      1) "username"
      2) "id"

       

    • key如何设置
      127.0.0.1:6379> set user:id:1:username admin
      OK
      127.0.0.1:6379> set user:id:1:password admin
      OK
      127.0.0.1:6379> set user:id:1:phone 131xx1212
      OK
      127.0.0.1:6379> set user:id:1:email 3xx@qq.com
      OK
      127.0.0.1:6379> set user:id:1:register_time 2019-01-02 
      OK
      127.0.0.1:6379> set user:id:1:root 0
      OK

       

    • key如何查看
      127.0.0.1:6379> keys user:id:1*
      1) "user:id:1:password"
      2) "user:id:1:username"
      127.0.0.1:6379> get user:id:1:username
      "admin"

       

  • Redis的hash类型
    • 简单例子
      127.0.0.1:6379> hset user username admin
      (integer) 1
      127.0.0.1:6379> hget user username
      "admin"

       

    • 设置及获取多个hash值
      127.0.0.1:6379> hmset user password admin phone 13xxx email 3xx@qq.com
      OK
      127.0.0.1:6379> hgetall user
      1) "username"
      2) "admin"
      3) "password"
      4) "admin"
      5) "phone"
      6) "13xxx
      7) "email"
      8) "3xx@qq.com"

       

  • Redis的list类型
    • lpush属性,向链表的头部放入数据
      127.0.0.1:6379> lpush link1 A
      (integer) 1
      127.0.0.1:6379> lpush link1 B
      (integer) 2
      127.0.0.1:6379> lpush link1 C
      (integer) 3
      127.0.0.1:6379> 

       

    • rpush属性,向链表的尾部放入数据
      127.0.0.1:6379> lpush link1 A
      (integer) 1
      127.0.0.1:6379> lpush link1 B
      (integer) 2
      127.0.0.1:6379> lpush link1 C
      (integer) 3
      127.0.0.1:6379> keys link1

       

    • lpop属性,移除头元素
      127.0.0.1:6379> lrange link1 0 -1
      1) "C"
      2) "B"
      3) "A"
      127.0.0.1:6379> loop link1
      (error) ERR unknown command `loop`, with args beginning with: `link1`, 
      127.0.0.1:6379> lpop link1
      "C"
      127.0.0.1:6379> lrange link1 0 -1
      1) "B"
      2) "A"
      127.0.0.1:6379> 

       

    • rpop属性,移除尾元素
      127.0.0.1:6379> lrange link1 0 -1
      1) "B"
      2) "A"
      127.0.0.1:6379> rpop link1
      "A"
      127.0.0.1:6379> lrange link1 0 -1
      1) "B"

       

    • 使用场景
      • 后台统计最近登录的10个用户
  • Redis的set类型
    • set类型被称为集合类型
    • 集合是数学里面常见的一个概念,可以理解是一类数据的集合
    • 特点
      • 无序性:集合里面的数据是没有顺序之分
      • 唯一性:集合里面的数据彼此是不能重复
      • 确定性:集合里面的数据的个数是确定
    • 集合常见运算
      • 集合A(1,2)、集合B(2,3)
      • 交集:集合公共的部分;例如上面集合A和集合B的交集是2
      • 并集:集合全部的部分;例如上面集合A和集合B的并集是1,2,3
      • 差集:A-B代表的含义是元素在A里面出现,但是不能在B里面出现,例如上面集合A-集合B结果是1  
    • sadd属性,向集合里面添加元素
      127.0.0.1:6379> sadd set1 1
      (integer) 1
      127.0.0.1:6379> sadd set1 2
      (integer) 1
      127.0.0.1:6379> sadd set1 3
      (integer) 1

       

    • smenbers属性,获取集合里面的元素
      127.0.0.1:6379> smembers set1
      1) "1"
      2) "2"
      3) "3"

       

    • srem属性,移除指定元素
      127.0.0.1:6379> smembers set1
      1) "1"
      2) "2"
      3) "3"
      127.0.0.1:6379> srem set1 2
      (integer) 1
      127.0.0.1:6379> smembers set1
      1) "1"
      2) "3"
      127.0.0.1:6379> 

       

    • spop属性,随机的弹出集合里面的某个元素
      127.0.0.1:6379> spop set1
      "3"
      127.0.0.1:6379> spop set1
      "1"

       

    • sinter属性,交集
    • sunion属性,并集
    • sdiff属性,差集
    • 应用场景:好友关系展示,例如好友推荐、共同好友
  • Redis的zset类型
    • zset类型被称为有序集合,
    • 需要给集合里面的每个元素一个排序的权重。例如:按照1-9或者a-z排序
    • zadd:添加元素
      127.0.0.1:6379> zadd class:phpRank 5 mark
      (integer) 1

       

    • arange:获取集合元素
      127.0.0.1:6379> zrange class:phpRank 0 -1
      1) "mark"

       

    • withscores:获取集合内容的时候,显示权重信息
      127.0.0.1:6379> zrange class:phpRank 0 -1 withscores
      1) "mark"
      2) "5"

       

    • redis安全认证
      • 设置redis密码,启动redis认证
        127.0.0.1:6379> config set requirepass "root"
      • 验证redis认证
        127.0.0.1:6379> auto "root"
    • redis的持久化功能
      • redis为了本身数据的安全和完整性,会把内存中的数据按照一定的方法同步到电脑的磁盘上面,这个过程被称为持久化操作。下次再次启动redis服务的时候,会把磁盘上面的数据重新的加载到内存里面
    • 常见的持久化方式
      • 基于快照的方式:redis会按照一定的周期把内存里面的数据同步到磁盘文件里面
        • 127.0.0.1:6379> save 900 1 
          • 含义:如果在900s内,对redis的key进行过一次操作,则会把内存里面的数据同步到磁盘文件
        • 127.0.0.1:6379> save 300 10  
          • 含义:如果在300s内,对redis的key进行过十次操作,则会把内存里面的数据同步到磁盘文件
        • 127.0.0.1:6379> save 60 10000 
          • 含义:如果在60s内,对redis的key进行过一万次次操作,则会把内存里面的数据同步到磁盘文件
        • 手工的出发基于快照的持久化操作
          127.0.0.1:6379> bgsave 

           

        • 保存到磁盘上到哪一个文件
          #基于快照持久化保存到文件的名称
          dbfilename dump.rdb
          
          # The working directory.
          #
          # The DB will be written inside this directory, with the filename specified
          # above using the 'dbfilename' configuration directive.
          #
          # The Append Only File will also be created inside this directory.
          #
          # Note that you must specify a directory here, not a file name.
          # 保存到目录,默认是相对于启动文件redis-server的位置
          dir ./

           

      • 基于日志文件的追加:redis会把对redis数据造成更改的命令记录到日志文件里面,然后再一次重启的时候,执行一下日志文件里面对redis写的操作,达到数据的还原
        • 编辑内容

          #开启基于文件追加方式的持久化操作
          appendonly yes
          
          # The name of the append only file (default: "appendonly.aof")
          
          #文件的名称
          appendfilename "appendonly.aof"

           

        • 备份文件的周期
          # 只要存在对redis数据造成更改的操作,都要记录到磁盘文件上
          # appendfsync always
          # 每1s中进行一次把对redis数据造成更改的操作,都记录到磁盘文件上
          appendfsync everysec
          # 完全交给操作系统来完成,意思就是操作系统不繁忙的时候会把对redis进行数据造成更改的操作,都记录到磁盘文件上,这种操作最不可靠
          # appendfsync no

           

推荐阅读