Redis简易教程

Redis

Redis是key-value类型的内存数据库。value可以是String, List, Set, Sorted Set, Hash等类型的数据结构。

PHPer: phpredis

理论支持

  • 缓存

    可以进行高速数据交换的存储器

  • 使用缓存目的(Web)

    减轻数据库的负担,在有限的资源下提供尽可能大的吞吐量

  • 常用应用层缓存技术

    • Memcached: 分布式内存缓存服务器

    • Redis *

    上面两个都是NoSQL系列缓存,它们到底是数据库软件还是缓存软件?

前期准备工作

  1. 安装

    • 方便快捷式*

      1
      sudo apt-get install redis-server
    • 编译安装

      1. https://redis.io/

      2. 解压

      3. cd到解压目录

      4. make

        make执行完,在当前目录下便会生成几个可执行文件,其中比较重要的是:

        • redis-server: Redis服务器程序

        • redis-cli: Redis命令行操作工具

      5. 安装Redis

        1
        2
        3
        sudo cp redis.conf /etc/
        sudo cp redis-benchmark redis-cli redis-server /usr/bin
  2. 修改配置文件

    自行去/etc/redis目录下查看redis.conf,通过网上查阅学习。

  3. 运行

    1
    2
    3
    redis-server || /usr/bin/redis-server /etc/redis.conf
    ps -x | grep redis #检查Redis是否启动

实际操作一把

运行redis-cli

1
2
set key1 hello
get key1

相关命令请自行去网上查阅教程。

Redis支持的数据类型

  1. String

    支持命令set、get、mset、mget、incr等。

    可使用String类型缓存一些静态文件,如图片文件、CSS文件等,可提高网站运行速度。

    支持incr操作,用作统计计算,如访问量等很方便

  2. List

    List的数据类型指key对应的value是一个双向链表结构,所以list支持所有的链表操作。

    List可以实现消息队列,减轻数据库的压力,每次有消息到达时就把消息队列放进尾部(rpush),取出时从队列头部取出(lpop)。

  3. Set

    Set数据类型是一种无序集合,在redis内部使用hashtable实现,查找和删除的时间复杂度为o(1)。

    set数据优点是快速查找元素是否存在,用于记录一些不能重复的数据

    set类型通常用于记录做过某些事情。

    如注册帐号时,检测重复用户名; 投票操作等。

  4. Sorted Set

    SortedSet属于有序集合,通过一个double类型的整数score进行排序,SortedSort通过SkipList(跳跃表)和HashTable组合完成,SkipList负责排序,HashTable负责保存数据。

    例如,应用在排行榜的顶帖次数排序。

  5. Hash

    Hash类型是每个key对应一个hashTable,添加删除和修改操作的时间复杂度都是o(1),hash类型适合用于存储对象。

    Redis使用zipmap存储数据,使用zipmap添加删除和修改的操作时间都是o(n),如果field和value大小超出一定限制,Redis在内部将zip-map替换为正常的hashmap存储。

    例如,应用保存用户信息,用户id作key值

    Hash类型存储结构

各类型支持的命令请自行查阅

Redis排序命令

Redis支持对List,Set,Sorted Set类型进行排序。

支持desc,asc,以及按照字母顺序排序(alpha选项)。

可以使用limit选项来限定返回结果的数量。

事务处理

一般情况下,Redis接收到一个客户端发来的命令,立刻执行返回结果,但是当发出multi命令,便连接进入一个事务的上下文,Redis把连接发来的命令存入一个队列中,当次连接发出exec命令, Redis便开始执行队列中的所有命令。

可调用discard命令取消一个事务,discard的命令是清空事务队列并退出事务上下文。

另外,Redis只能保证事务的每个命令能够连续执行,但是如果事务中有命令执行失败,Redis不进行回顾操作。

持久化

Redis是基于内存的数据库,内存数据库有个严重的弊端,突然宕机或停电内存的数据不会被保存,Redis提供了两种方式:内存快照和日志追加。

  • 内存快照

    内存快照是将内存中的数据以快照的方式写入二进制文件中

    Redis使用save,bgsave命令告诉redis需要做一次内存快照操作,save命令在主线程之间保存内存快照,redis由单线程处理所有请求,执行save命令可能阻塞其他客户端的请求。

  • 日志追加(aof)

    日志追加(aof)方式是把增加修改数据的命令通过write函数追加到文件尾部,Redis重启时读取appendonlf.aof文件中的命令并且执行,从而把数据写入到内存中,日志追加方式有效降低数据丢失的风险。

主从同步

VM(虚拟内存)

发布和订阅

具体看实例