• Redis 数据库入门指南


    Redis 是一个开源数据库,它使用内存数据结构存储,可作为数据库、缓存和消息代理使用。Redis 支持丰富的数据结构,有:字符串(Strings)、哈希(Hashs)、列表(Lists)、集合(Sets)、有序集合(SortedSets)。Redis 内置了复制、Lua脚本、事务及不同级别的数据硬盘持久化机制,并提供了高可用的Redis Sentinel和自动分区的集群机制。是构建高性能、可扩展的 Web 应用程序的有效手段。

    1. 安装配置
    2. 数据类型
    3. 键操作
    4. 发布/订阅
    5. 事务
    6. 连接验证

    1. 安装配置

    1.1 安装

    依次执行以下命令,下载、解压、编译、安装Redis:

    $ wget http://download.redis.io/releases/redis-3.2.3.tar.gz
    $ tar xzf redis-3.2.3.tar.gz
    $ cd redis-3.2.3
    $ make & make install

    安装后,会在/usr/local/bin目录下生成以下几个文件,作用如下:

    • redis-server:Redis服务器端启动程序
    • redis-cli:Redis客户端操作工具。也可以用telnet根据其纯文本协议来操作
    • redis-benchmark:Redis性能测试工具
    • redis-check-aof:数据修复工具
    • redis-check-dump:检查导出工具

    1.2 配置

    Redis 配置文件在当前目录下,将其复制到/etc/目录下:

    $ cp redis.conf /etc/

    修改配置文件:

    $ vi /etc/redis.conf

    修改daemonize yes参数,使Redis可以后台运行:

    daemonize yes

    1.3 启动服务器

    启动Redis:

    $ /usr/local/bin/redis-server /etc/redis.conf

    可以使用ps命令查看启情况:

    $ ps -ef | grep redis

    如果看到类型如下输出,则表示启动成功:

    root     18443     1  0 13:05 ?        00:00:00 ./redis-server *:6379 

    为了使Redis能够开机自动运行,还需要将其加入开机启动项:

    echo "/usr/local/bin/redis-server /etc/redis.conf" >>/etc/rc.local

    Redis 安装配置的详细介绍请参考:Linux CentOS下安装Redis

    1.4 启动客户端

    redis-cli是一个Redis 命令行客户端程序,接下来我们使用这个程序进行一操作。启动这个程序:

    $ redis-cli

    启动后,可通过PING命令检查服务器是否连通:

    127.0.0.1:6379> PING
    PONG

    如果需要连接到一台远程Redids服务器,可以通过添加redis-cli参数指定。

    语法结构如下:

    $ redis-cli -h host -p port -a password

    如,主机127.0.0.1、端口6379上的远程服务器,并添加验证密码password

    $ redis-cli -h 127.0.0.1 -p 6379 -a password
    127.0.0.1:6379> ping
    PONG

    2. 数据类型

    Redis 支持字符串(Strings)、哈希(Hashs)、列表(Lists)、集合(Sets)、有序集合(SortedSets) 5种数据类型,本节介绍这5种数据类型的特点及使用方法。

    2.1 字符串(Strings)

    简介

    字符串(Strings)是最基本、使用最多的一种数据类型。Redis的字符串是二进制安全的,这意味着你可以使用Redis的字符串存储任何类型的数据,如:JPEG图片或序列化的Ruby 对象等。

    一个字符串类型的值最大长度为512 M。

    你可以使用Redis 的字符串类型做很多有用事情,如:

    • 字符串类型可以做为原子计数器使用,可使用的方法有:INCRDECRINCRBY
    • 使用APPEND命令向字符串追加内容
    • 使用字符串的GETRANGESETRANGE命令可以做为一个随机存取向量
    • 对很多在很小的空间数据,或创建一个Redis备份可以使用GETBIT 和 SETBIT命令

    使用示例

    设置与取值

    使用SET命令可以设置一个字符串类型的值,多次调会导致已存在key的值被修改。

    使用GET可以获取已存在字符串key的值:

    redis> set mySite itbilu
    OK
    redis> set mySite itbilu.com
    OK
    redis> get mySite
    "itbilu.com"

    自增、自减

    “字符串”类型中不仅可以存字符串值,还可存取整型值/浮点数值。

    Redis 提供了INCRDECR等命令,用于整型值的自增、自减等操作。而INCRBYFLOAT可以用于自增一个指定的浮点值:

    redis> set myInt 10
    OK
    redis> incr myInt
    (integer) 11
    redis> incrby myInt 2
    (integer) 13
    redis> decr myInt
    (integer) 12
    redis> decrby myInt 2
    (integer) 10
    redis> incrbyfloat myInt 1.2
    "11.2"

    批量操作

    字符串类型支持批量操作,使用MSETMSETNX可以批量设置字符串类型的key-valueMSETNX仅当不存在时才会设置。

    MGET可以用于获取多个字符串类型的值。

    redis> mset domain itbilu.com name IT笔录
    OK
    redis> mget domain name
    1) "itbilu.com"
    2) "ITxe7xacx94xe5xbdx95"

    字符串类型详细介绍请参考:Redis 字符串(String)类型

    2.2 哈希(Hashs)

    简介

    Redis 哈希(Hashs)是字符串字段和字符串值之间的映射,所以它十分适合用来表示一个对象类型。

    哈希在某些应用场景中是一个非常有用存储方式,你可以将数以百万计的对象存储在一个很小的 Redis实例中。

    一个Redis 哈希值可存储232-1(40亿)个键-值对。

    使用示例

    设置与取值

    设置哈希类型的值使用HSET,取值使用HGET获取单个哈希属性值,或使用HGETALL获取哈希属性和值:

    redis> hset site domain itbilu.com
    (integer) 1
    redis> hget site domain
    "itbilu.com"
    redis> hgetall site
    1) "domain"
    2) "itbilu.com"

    批量操作

    哈希同样支持批量操作。可以使用HMSET设置多个哈希属性和值,使用HMGET获取多个哈希属性和值:

    redis> hmset site domain itbilu.com name IT笔录
    OK
    redis> hmget site domain name
    1) "itbilu.com"
    2) "ITxe7xacx94xe5xbdx95"

    哈希类型详细介绍请参考:Redis 哈希(Hash)类型

    2.3 列表(Lists)

    简介

    Redis 列表(Lists)是简单的字符串列表,并根据插入顺序进行排序。

    你可以使用LPUSH方法向列表的开头插入新元素,或使用RPUSH方法向列表的结尾插入新元素。当于一个空键执行操作时,会创建一个新列表。同样的如果清空列表时,键也将键空间中移除。

    一个Redis 列表中最多可存储232-1(40亿)个元素。

    从时间复杂度来看,Redis 列表的主要特征是在列表开头和结尾添加或删除元素时,访问时间会非常的快。但如果要访问列表的中间的元素,则会相对缓慢。

    我们常对列表做的操作有:

    • 对于一个在社交网络的时间线模型,可使用LPUSH向用户时间线中依次添加新元素,并可以使用LRANGE取出一些最近插入的新元素。
    • 可以使用LPUSH 和 LTRIM 创建一个不超过指定元素的列表,但只存储最近的 N 个元素。
    • 列表可以做为原始消息传递,如Ruby 库Resque就将列表结构做为后台作业。
    • 列表结构还支持多种操作命令,包括阻塞命令BLPOP

    使用示例

    设置与取值

    设置一个列表类型值的方式较多。可以通过LPUSHLRUSH向列表的开头或结尾插入数据,也可以通过LSET对列表中指定索引位的元素进行操作。LSET不允许对不存在的列表进行操作。

    列表元素取值要以全用LINDEX获取指定索引位的元素,也可以使用LPOP返回并移除列表头部的元素,或使用RPOP返回并移除列表尾部的元素。

    redis> lpush mylist one
    (integer) 1
    redis> rpush mylist two
    (integer) 2
    redis> lset mylist 0 1
    OK
    redis> lindex mylist 0
    "1"
    redis> lpop mylist
    "1"
    redis> lindex mylist 0
    "two"

    2.4 集合(Sets)

    简介

    Redis 集合(Sets)是一个字符串无序集合,其添加、删除、测试成员的时间都是O(1)(无论元素多少,都是一个恒定时间)

    集合中不允许重复成员的存在。当多次添加一个元素时,其结果会设置单个成员多次。这样,我们就可不用检查元素是否存在而直接对元素进行操作。

    一个Redis 集合中最多可包含232-1(40亿)个元素。

    我们可以对Redis 集合进行的操作有:

    • 利用集合的唯一性,可以将所有唯一IP访问指定向一个博客贴子。这时只需要每次有页面访问时使用SADD 添加记录,就可确保IP的唯一性。
    • Redis 集合很好的表示了关系。你可以使用Redis 创建一个标签系统并使用集合来表示每一个标签。如:可以通过SADD命令,可以把所有对象的标签ID添加到集合中以表示指定的标签;如果希望每个对象可以同时有3个不同的人,可以全用SINTER
    • 通过SPOP 或 SRANDMEMBER 命令,可以随机的提取集合中的元素。

    使用示例

    设置与取值

    集合中的元素具有唯一性,所以我们可以向集合中多次添加同一个值,向集合中插入值使用SADD命令。

    获取集合中的元素使用SMEMBERS命令,也可以使用SPOP获取并删除一个随机值。

    redis> sadd db MySQL MongoDB Redis
    (integer) 3
    redis> smembers db
    1) "MySQL"
    2) "MongoDB"
    3) "Redis"
    redis> spop db
    "Redis"
    redis> smembers db
    1) "MySQL"
    2) "MongoDB"

    集合间的操作

    Redis 还提供了多个集合间操作的方法,如:可以通过SINTER查询集合间的交集、通过SUNION获取集间的并集,通过SDIFF获取集合间的差集。集合中的元素可以通过SMOVE命令从一个集合移到另一个集中。

    redis> sadd db MySQL MongoDB Redis
    (integer) 1
    redis> sadd sql MySQL MSSQL
    (integer) 1
    redis> sinter db sql
    1) "MySQL"
    redis> sunion db sql
    1) "MySQL"
    2) "MongoDB"
    3) "Redis"
    4) "MySql"
    5) "MSSQL"
    redis> sdiff db sql
    1) "MongoDB"
    2) "Redis"
    redis> smove sql MSSQL db
    (integer) 0
    redis> smembers db
    1) "MySQL"
    2) "MongoDB"
    3) "Redis"

    2.5 有序集合(SortedSets)

    简介

    Redis 有序集合(SortedSets)类似于集合,同样是表示字符串的集合。不同的是,有序集合中的每个元素都通过 score 进行关联,并用于集合的排序。对有序集合进行添加、移除、更新都会非常快,因为其中的元素都是有序的。也可以非常快的通过 score 或位置获取元素的范围。

    使用示例

    设置与取值

    有序集合类似于集合,对有序集合插入值时除了指定插入元素外,还要指定一个score参数,该参数可以认为是一个权重,也可以任何是一个排序的序号。

    对于有序集合,可以使用ZADD设置集合元素。

    有序集合并没有提供返回全部元素的方法,介可以通过ZRANGE集合指定范围内的元素,也可以通过ZRANK获取指定成员的排名,通过ZSCORE返回元素的权重(score)值。

    redis> zadd db 1 MySQL
    (integer) 1
    redis> zadd db 2 MongoDB 3 Redis
    (integer) 2
    redis> ZRANGE db 1 2
    1) "MongoDB"
    2) "Redis"
    redis> ZRANK db Redis
    (integer) 2
    redis> ZSCORE db Redis
    "3"

    3. 键操作

    除数据类型操作外,键操作也是Redis 中基本和非常重要的操作。Redis 提供很多键管理相关方法,如:KEYS键查找、EXPIREAT设置键的过期时间、RENAME对键重命名等。

    键查找相关操作

    在设置或添加某一类型元素前,一般需要先判断指定的key是否存在。判断键是否存使用EXISTS key命令:

    redis> exists dbs
    (integer) 0
    redis> exists db
    (integer) 1

    为防止数据类型错误,在设置数据值或向某一类型的key插入数据前进行数据类型的判断,这时可以使用TYPE key命令:

    redis> type db
    zset

    Redis 还提供了一个用于键管理的命令KEYS,该命令可以通过匹配模式在数据库中查找键:

    redis> keys d*
    1) "domain"
    2) "db"

    有效期

    有效期设置非常有用,我们可以对指定键设置一个生存时间,并在到期自动删除键。

    设置一个key有效期,可以使用EXPIREPEXPIRE设置有效期,EXPIRE通过秒数表示有期,而PEXPIRE使用毫秒设置key的有效期;还可以使用EXPIREATPEXPIREAT设置key的到期时间,二者通过一个UNIX 时间戳表示key到期时间,不同的是前者是一个秒级时间戳,后者是一个毫秒级时间戳。

    对于设置过有效期的键,我们可以通过TTLPTTL查看键的过期时间,前者使用秒数表示,后者使用毫秒数表示。

    设置键的到期时间后,还可以通过PERSIST命令移除到期时间。

    redis> set cache itbilu.com
    OK 
    redis> expire cache 120
    (integer) 1
    redis> ttl cache
    (integer) 114
    redis> pttl cache
    (integer) 110248
    redis> persist cache
    (integer) 0
    redis> ttl cache
    (integer) -1

    序列化

    为了方便网络传输,我们需要将数据库中存储对象进行序列化,或者将收到的数据进行反序列化。在Redis 中可以通过DUMP进行指定key值的序列化,并可以通过RESTORE进行反序列化。

    redis> set cache itbilu.com
    OK 
    > dump cache 
    "x00
    itbilu.comx06x00xbfxadxf4x86xca"x90xeb"
    redis> restore cache-again 0 "x00
    itbilu.comx06x00xbfxadxf4x86xca"x90xeb"
    OK
    redis> get cache-again
    "itbilu.com"

    其它操作

    当需要对键进行重命名时,可以使用RENAME命令。对于不再需要的键,可以通过DEL命令将期删除。Redis 还支持数据库间的key转移,key转移通过MOVE命名实现。

    redis> get cache-again
    "itbilu.com"
    redis> set cacha itbilu.com
    OK
    redis> rename cacha cahce
    OK
    redis> move cache 1
    (integer) 1
    redis> del cache
    (integer) 0

    4. 发布/订阅

    Redis 实现了通过发布/订阅(pub/sub)实现了类似邮件系统的工作机制,发送者(发布者)可以发送消息,而接收者(用户)能过订阅指定的通道(channel)可以实现消息的接收。Redis 客户端可以订阅任意数量的通道。

    发布/订阅是一种消息通信模式,其主要的目的是实现消息发布者和订阅者之间的解耦。Redis 做为一个发布/订阅服务器,可以实现消息订阅者和发布者之间的消息路由功能。

    在Redis 中,消息类型会做为通道(channel)。订阅者可以通过SUBSCRIBEPSUBSCRIBE命令订阅自己所需要的消息类型。当发布者通过PUBLISH向Redis 服务器发送特定类型的消息时,订阅该消息的客户端都会收到该消息。一个客户端可以同时是消息的发布者和订阅者,也可以是其中之一。一个客户端可以同时订单多个通道,也可以向多个通道发布消息。

    使用示例

    启动一个客户端(client1),并使用SUBSCRIBE命名订阅msg事件:

    redis> subscribe msg
    Reading messages... (press Ctrl-C to quit)
    1) "subscribe"
    2) "msg"
    3) (integer) 1

    在另一个客户端(client2)中使用PUBLISH命令向msg通道发送消息:

    redis> publish msg "hi, there"
    (integer) 1

    client1会收到如下消息:

    1) "message"
    2) "msg"
    3) "hi, there"

    5. 事务

    Redis 支持事务机制,Redis 中的事务是一组在单一步骤中执行的命令。事务有以下两个属性:

    • 在一个事务中,每个命令都是一个独立的操作,并按顺序执行。在事务的执行过程中,Redis 服务器不会处理其它客户端的请求。
    • Redis 事务具有原子性,在一个事务当中的命令要么全部执行成功,要么全部不执行。

    Redis 通过MULTI命令标记一个事务的开始,其后输入的所有命令会按照先后顺序被放进一个队列当中,然后通过EXEC命令原子性的执行。

    # 启动一个事务
    redis> MULTI
    OK
    # 这里会输入一些需要执行的命令
    redis> EXEC # 依次执行前面输入的命令

    如,我们可以像下面这样使用Redis 的事务:

    redis> multi
    OK
    redis> set domain itbilu.com
    QUEUED
    redis> get domain
    QUEUED
    redis> del domain
    QUEUED
    redis> exec
    1) OK
    2) "itbilu.com"
    3) (integer) 1

    6. 连接验证

    AUTH - 身份验证

    当连接到一个需要验证的Redis 服务器进,可以在启动客户端时指定连接主机、端口、认证密码等。可以在客户端启动后,通过AUTH命令进行验证。

    如,连接到一台本地Redis 服务器,并在连接进行验证:

    $ redis-cli
    redis> set name "my name"
    (error) NOAUTH Authentication required.
    redis> auth 21jieyan2015
    OK
    redis> set name "my name"
    OK

    PING - 服务器状态检测

    PING命令用于检测服务器状态,如果服务器运行正常会响应一个PONG消息:

    redis> ping
    PONG

    SELECT - 数据库切换

    SELECT命令用于切换到指定的数据库。Redis 中的数据库使用以0开始的索引号表示,默认为0

    如,切换到索引号为1的数据库:

    redis> set db_number 0
    OK
    redis> select 1
    OK
    redis[1]> get db_number
    (nil)
    redis[1]> select 0
    OK
    redis> get db_number
    "0"

    QUIT - 关闭连接

    操作完毕后,我们可以使用QUIT命令请求服务器关闭与当前客户端的连接。一旦所有等待中的回复(如果有)顺利写入到客户端,连接就会被关闭。

    redis> quit
    $ # 连接已断开

     转自:http://itbilu.com/database/redis/4JoBoVuKb.html

  • 相关阅读:
    bug案例 php 生成csv文件 下载打开文件 提示 文件格式与文件扩展名指定的格式不一致 提示 是SYLK 文件解决方法
    php 三元运算 ?: 和 ?? 认识
    mysql 索引知识
    算法 之 红黑平衡二叉树
    算法 计算机中树的分类 概念树
    mysql B+树
    算法 之 二叉树的前序 中序 后序遍历
    mysql B树分析
    mysql 坑位之 GROUP_CONCAT 函数使用
    HTTP请求:GET与POST方法的区别
  • 原文地址:https://www.cnblogs.com/sunxuchu/p/6043938.html
Copyright © 2020-2023  润新知