Redis入门指南1 —— 介绍、安装及配置

一段时间没有更新博客了。一方面确实是懒了一阵子,一方面是在忙其它的事。
现在重新把博客的事拾起来,主要还是促进自我学习提升。顺带也作为分享的一种形式。
接下来进入正题。

前言

引用新浪技术大牛对于 Redis 的评价:

杨海朝,新浪首席数据架构师:
随着互联网业务对性能需求日益强烈,作为Key/Value存储的Redis具有数据类型丰富和性能表现优异的特点。如果能够熟练地驾驭它,不管是把它用做缓存还是存储,对很多大型应用都很多帮助。新浪作为世界上最大的Redis使用者,体会到了Redis为高并发在线业务带来的好处,但同时也遇到了很多挑战,新浪为推动Redis这种NoSQL产品在中国互联网产品技术架构中的使用做出了卓越的贡献。

Redis简介

Redis是什么

Redis 官网,非常好记。

Redis是一个开源,使用C语言编写的、支持网络交互的、可基于内存也可持久化的Key-Value数据库(自行Google)。可运用于构建高性能,可扩展的Web应用程序的技术工具。

和普通的Key-Value结构不同,Redis的Key支持灵活的数据结构,除了strings,还有hashes、lists、 sets 和sorted sets等结构。正是这些灵活的数据结构,丰富了Redis的应用场景,能满足更多业务上的灵活存储需求。

Redis的数据都保存在内存中,而且底层实现上是自己写了epoll event loop部分,而没有采用开源的libevent等通用框架,所以读写效率很高。为了实现数据的持久化,Redis支持定期刷新(可通过配置实现)或写日志的方式来保存数据到磁盘。

Redis的特点

目前市面上有 9大 Key-Value存储数据库:

Redis从它的许多竞争继承来的三个主要特点:

  • Redis数据库完全在内存中,使用磁盘仅用于持久性。
  • 相比许多键值数据存储,Redis拥有一套较为丰富的数据类型。
  • Redis可以将数据复制到任意数量的从服务器。

Redis的优势

  • 异常快速:Redis的速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
  • 支持丰富的数据类型:Redis支持最大多数开发人员已经知道像列表,集合,有序集合,散列数据类型。这使得它非常容易解决各种各样的问题,因为我们知道哪些问题是可以处理通过它的数据类型更好。
  • 操作都是原子性:所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
  • 多功能实用工具:Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如Web应用程序会话,网页命中计数等。

Redis的应用场景列举

  • 先简单提一下NoSQL适用场景:

    1. High performance - 对数据高并发读写
    2. Huge storage - 对海量数据的高效率存储和访问
    3. High scalability && HighAvailability - 对数据的高可扩展性和高可用性
  • 再列举Redis适用的一些场景:

    1. 取最新N个数据的操作

    2. 排行榜应用,取TOP N操作
      这个需求与上面需求的不同之处在于,前面操作以时间为权重,这个是以某个条件为权重,比如按顶的次数排序,这时候就需要我们的sorted set出马了,将你要排序的值设置成sorted set的score,将具体的数据设置成相应的value,每次只需要执行一条ZADD命令即可。

    3. 需要精准设定过期时间的应用
      比如你可以把上面说到的sorted set的score值设置成过期时间的时间戳,那么就可以简单地通过过期时间排序,定时清除过期数据了,不仅是清除Redis中的过期数据,你完全可以把Redis里这个过期时间当成是对数据库中数据的索引,用Redis来找出哪些数据需要过期删除,然后再精准地从数据库中删除相应的记录。

    4. 计数器应用
      Redis的命令都是原子性的,你可以轻松地利用INCR,DECR命令来构建计数器系统。

    5. Uniq操作,获取某段时间所有数据排重值
      这个使用Redis的set数据结构最合适了,只需要不断地将数据往set中扔就行了,set意为集合,所以会自动排重。

    6. 实时系统,反垃圾系统
      通过上面说到的set功能,你可以知道一个终端用户是否进行了某个操作,可以找到其操作的集合并进行分析统计对比等。没有做不到,只有想不到。

    7. Pub/Sub构建实时消息系统
      Redis的Pub/Sub系统可以构建实时的消息系统,比如很多用Pub/Sub构建的实时聊天系统的例子。

    8. 构建队列系统
      使用list可以构建队列系统,使用sorted set甚至可以构建有优先级的队列系统。

    9. 缓存
      性能优于Memcached,数据结构更多样化

Redis安装及配置

Redis安装

  • 在官网下载页面下载选定Redis版本压缩包(博主下载的版本为:3.0.7)。下载地址

  • 将下载的压缩包解压到个人指定文件夹。

  • 进入redis-3.0.7文件夹,如下图会有如下文件及目录

    1
    2
    3
    4
    5
    6
    huangnxdeMacBook-Pro:redis-3.0.7 huangnx$ pwd
    /Users/huangnx/Desktop/hnx_工作文档/专业知识/java开发/workspace/Other/redis-3.0.7
    huangnxdeMacBook-Pro:redis-3.0.7 huangnx$ ls
    00-RELEASENOTES COPYING Makefile deps runtest-cluster src
    BUGS INSTALL README etc runtest-sentinel tests
    CONTRIBUTING MANIFESTO bin runtest sentinel.conf utils
    • 进入src目录。编译Redis

      1
      2
      3
      huangnxdeMacBook-Pro:redis-3.0.7 huangnx$ cd src/
      huangnxdeMacBook-Pro:src huangnx$ make
      huangnxdeMacBook-Pro:src huangnx$ make install

      注:

      • make完成后,有产生可执行文件
      • redis-server:redis服务器的启动程序
      • redis-cli:redis命令行工具,也可为客户端
      • redis-benchmark:redis性能测试工具(读写)
      • redis-stat:redis状态检测工具(状态参数延迟)
    • 移动文件,便于管理(非必须)

      1
      2
      3
      4
      5
      6
      huangnxdeMacBook-Pro:src huangnx$ pwd
      /Users/huangnx/Desktop/hnx_工作文档/专业知识/java开发/workspace/Other/redis-3.0.7/src
      huangnxdeMacBook-Pro:src huangnx$ mkdir –p ../bin
      huangnxdeMacBook-Pro:src huangnx$ mkdir –p ../etc
      huangnxdeMacBook-Pro:src huangnx$ mv redis.conf ../etc
      huangnxdeMacBook-Pro:src huangnx$ mv mkreleasehdr.sh redis-benchmark redis-check-aof redis-check-dump redis-cli redis-server ../bin

Redis初体验

  • 启动redis

    1
    2
    3
    4
    5
    6
    7
    huangnxdeMacBook-Pro:bin huangnx$ pwd
    /Users/huangnx/Desktop/hnx_工作文档/专业知识/java开发/workspace/Other/redis-3.0.7/bin
    huangnxdeMacBook-Pro:bin huangnx$ ./redis-server
    53310:C 29 Jun 09:42:05.928 # Warning: no config file specified, using the default config. In order to specify a config file use ./redis-server /path/to/redis.conf
    53310:M 29 Jun 09:42:05.929 * Increased maximum number of open files to 10032 (it was originally set to 256).
    53310:M 29 Jun 09:42:05.930 # Server started, Redis version 3.0.7
    53310:M 29 Jun 09:42:05.930 * The server is now ready to accept connections on port 6379

    注:

    • 启动时有警告,没有指定加载配置文件。会加载默认的配置文件
    • Redis服务端的默认连接端口是6379
    • Redis默认不是后台运行
    • 可以通过命令参数指定加载配置文件。比如:

      1
      huangnxdeMacBook-Pro:bin huangnx$ ./redis-server ../etc/redis.conf
  • 本地客户端连接

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    huangnxdeMacBook-Pro:bin huangnx$ pwd
    /Users/huangnx/Desktop/hnx_工作文档/专业知识/java开发/workspace/Other/redis-3.0.7/bin
    huangnxdeMacBook-Pro:bin huangnx$ ./redis-cli
    127.0.0.1:6379> keys *
    (error) NOAUTH Authentication required.
    127.0.0.1:6379> auth q123456
    OK
    127.0.0.1:6379> keys *
    (empty list or set)
    127.0.0.1:6379> flushdb
    OK

    注:

    • 打开客户端后尝试用keys*命令查看默认库的key-value键值对。但提示无权限,原因是Redis启动时加载了博主定义的配置,配置客户端连接需要鉴权。鉴权后能正常使用客户端命令

数据结构及其使用场景

  1. string 字符类型
  2. hash 散列类型
  3. list 列表类型
  4. set 集合类型
  5. sorted set 有序集合

在这里先附上官方的命令参考地址

string 字符串类型

字符串类型是redis最基础的数据类型,是其他4中数据类型的基础。

命令 描述 示例
SET key value 赋值 set foo 5 ==> OK
GET key 取值 get foo ==> “5”
INCR key 递增.键不存在时创建并赋0,否则+1 incr foo ==> 6
DECR key 递减 decr foo ==> 5
INCRBY key num 与incr一样,不过可以指定增加的数值 incrby foo 5 ==> 10
APPEND key value 追加,返回追加后字符串长度 append foo 24 ==> 4
STRLEN key 长度 strlen foo ==> 4
MSET key value[ key value…] 同时设置多个键值 mset key1 1 key2 2 ==> OK
MGET key[ key…] 同时获取多个键值 mget key1 key2 ==>”1” “2”

hash 散列类型

散列类型是一个键值数据结构,其值只能是字符串,也就是散列数据类型不支持嵌套其他数据类型。

命令 描述 示例
HSET key field value 设置或修改字段值 hset user name frek ==> 1
HGET key field 获取字段值 hget user name ==> “frek”
HMSET key field value[ field value..] 同时设置多个字段 hmset user name frek age 18 ==> OK
HMGET key field[ field..] 同时获取多个字段值 hmget user name age ==> “frek” “18”
HGETALL key 获取键中所有字段和值 hgetall user ==> “name” “frek” “age” “18”
HEXISTS key field 判断字段是否存在,存在返回1,否则返回0(如果键不存在也返回0) hexists user email ==> 0
HSETNX key field value 当字段不存在时赋值 hsetnx user name sam ==> 0 ; HSETNX user email xxx@xxx.com ==> 1
HINCRBY key field increment 参考incrby命令 hincrby user age 1 ==> 19
HKEYS key 获取键中所有字段名 hkeys user ==> “name” “age” “email”
HVALS key 获取所有的字段值 hvals user ==> “frek” “19” “xxx@xxx.com”
HLEN key 获取字段数量 hlen user ==> 3
HDEL key field[ field..] 删除一个或多个字段,返回删除的字段数 hdel user email age ==> 2

list 列表类型

列表类型可以存储一个有序的字符串列表

命令 描述 示例
LPUSH key value[ value..] 向列表的左边增加元素,返回增加元素后列表的长度 lpush users fred sam alice ==> 3
RPUSH key value[ value..] 向列表的右边增加元素 rpush users carl lisa nicesu ==> 6
LPOP key 从列表左边移除一个元素,并返回该元素值 lpop users ==> “fred”
RPOP key 从列表的右侧移除一个元素,并返回该元素值 rpop users ==> “nicesu”
LLEN key 返回列表元素个数,键不存在时返回0 llen users ==> 1
LRANGE key start stop 获取列表片段,start和stop支持负数,-1表示右数第一个 lrange users 0 -1 ==> “sam” “alice” “carl” “lisa”
LREM key count value 删除列表中指定的值,返回删除的元素个数 lrem users 2 sam ==> 1
LINDEX key index 获取指定索引元素值 lindex users 0 ==> “carl”
LSET key index value 设置指定索引的元素值 lset users 0 allen ==> OK
LTRIM key start end 只保留列表指定片段,删除其他元素 ltrim users 0 1 ==> OK
LINSERT key BEFORE/AFTER pivot value 向列表插入元素,返回插入后列表长度 linsert users after carl adam ==> 3
RPOPLPUSH source destination 将一个元素从一个列表转移到另一个列表,对source执行rpop,对destination执行lpush,返回被移动的元素值 rpoplpush users usernames ==> “adam”

集合类型

集合中的每个元素都不同,且没有顺序

命令 描述 示例
SADD key member[ member..] 增加一个或多个元素 sadd tags one two three two ==> 3
SREM key member[ member..] 移除一个或多个元素 srem tags two ==> 1
SMEMBERS key 获取集合中所有的元素 smembers tags ==> “three” “one”
SISMEMBER key member 判断元素是否存在集合中 sismember tags one ==> 1
SCARD key 获取集合的元素个数 scard tags ==> 2
SRANDMEMBER key[ count] 返回1个或count个随机元素 srandmember tags ==> “one”
SDIFF key[ key..] 集合差运算
SINTER key[ key..] 集合交集运算
SUNION key[ key..] 集合并集运算

有序集合类型

在集合类型的基础上有序集合类型为每个元素都关联了一个分数,这使我们可以使用集合类型的操作之外,还能做与分数有关的操作。

命令 描述 示例
ZADD key score member[ score member..] 增加一个带分数的元素,如果已存在,则替换分数 zadd scoreboard 60 fred 89 parker 76 tony 59 nicesu ==> 4
ZSCORE key member 获得元素分数 ZSCORE scoreboard nicesu ==> “59”
ZRANGE key start end[ WITHSCORES] 获得排名在某个范围内的元素,返回按score升序排序的元素 zrange scoreboard 0 -1 ==> “nicesu” “fred” “tony” “parker”
ZREVRANGE key start end[ WITHSCORES] 与zrange使用一致,返回按score降序的元素 zrevrange scoreboard 0 -1 withscores ==> “parker” “89” “tony” “76” “fred” “60” “nicesu” “59”
ZRANGEBYSCORE key min max[ WITHSCORES][LIMIT offset count] 获得指定分数范围内的元素 zrangebyscore scoreboard 60 100 ==> “fred” “tony” “parker”
ZREVRANGEBYSCORE key max min[ WITHSCORES][LIMIT offset count] 获得指定分数范围内的元素,降序排序 zrevrangebyscore scoreboard 100 60 ==> “parker” “tony” “fred”
ZINCREBY key increment member 增加某个元素的分数 zincrby scoreboard 1 nicesu ==> 60
ZCARD key 获取集合中元素个数 zcard scoreboard ==> 4
ZCOUNT KEY min max 获得指定分数范围内的元素个数 zcount scoreboard 80 100 ==> 1
ZREM key member[ member..] 删除一个或多个元素 zrem scoreboard nicesu ==> 1
ZRANK key member 获取分数从小到大排序的位置 zrank scoreboard parker ==> 2
ZREVRANK key member 同上 zrevrank scoreboard parker ==> 0
ZREMRANGEBYRANK key start stop 按照排名范围删除元素
ZREMRANGEBYSCORE key min max 按分数范围内删除元素

Redis的配置说明

  • 常用配置
配置key 配置参数值 配置说明
daemonize [param] yes/no Redis是否以守护进程的方式运行
pidfile [param] .pid文件地址 当Redis以守护进程方式运行时,Redis默认会把pid写入path.pid文件中
port [param] 端口号 指定Redis监听端口,默认端口为6379
timeout [param] 超时时间(毫秒) 当客户端闲置多长时间后关闭连接,如果指定为0,表示关闭该功能
databases [param] 数据库数量 设置数据库的数量,默认数据库为0
save[second][changes] 时间(秒)、更新次数 指定在多长时间内,有多少次更新操作,就将数据同步到数据文件,可以多个条件配合
rdbcompression [patam] yes/no 指定存储至本地数据库时是否压缩数据,默认为yes
dbfilename [param] 本地数据库文件名 指定本地数据库文件名,默认值为dump.rdb
dir [param] 数据库存放目录 指定本地数据库存放目录
slaveof [masterip][masterport] 主服务器ip、主服务器端口 设置当本机为slav服务时,设置master服务的IP地址及端口,在Redis启动时,它会自动从master进行数据同步
masterauth [master-password] slav服务连接master的密码 当master服务设置了密码保护时,slav服务连接master的密码
requirepass [param] redis连接密码 设置Redis连接密码
maxclients [param] 最大连接数 设置同一时间最大客户端连接数,默认无限制(maxclients 0)
maxmemory [bytes] bytes 指定Redis最大内存限制,Redis在启动时会把数据加载到内存中,达到最大内存后,Redis会先尝试清除已到期或即将到期的Key,当此方法处理 后,仍然到达最大内存设置,将无法再进行写入操作,但仍然可以进行读取操作
appendonly [param] yes/no 指定是否在每次更新操作后进行日志记录,Redis在默认情况下是异步的把数据写入磁盘,如果不开启,可能会在断电时导致一段时间内的数据丢失。因为 redis本身同步数据文件是按上面save条件来同步的,所以有的数据会在一段时间内只存在于内存中。默认为no
appendfilename [param] .aof文件文件名 指定更新日志文件名,默认为appendonly.aof
appendfsync [param] no/always/ everysec 指定更新日志条件。no:等操作系统进行数据缓存同步到磁盘(快);always:每次更新操作后将数据写到磁盘(慢,安全);everysec:表示每秒同步一次(折衷,默认值)默认:everysec
vm-enabled [param] yes/no 指定是否启用虚拟内存机制,默认值为no
vm-swap-file [param] 虚拟内存文件路径 虚拟内存文件路径,默认值为/tmp/redis.swap,不可多个Redis实例共享
vm-max-memory [param] 大小 设置Redis最大使用内存。当超出这个内存的时,Redis将一部分数据存入文件中,在内存中只保存使用频率高的数据(索引数据即key依旧存在内存中)
vm-page-size [param] page size Redis swap文件分成了很多的page,一个对象可以保存在多个page上面,但一个page上不能被多个对象共享,vm-page-size是要根据存储的 数据大小来设定的,建议如果存储很多小对象,page大小最好设置为32或者64bytes;如果存储很大大对象,则可以使用更大的page,如果不 确定,就使用默认值
vm-pages [param] 数量 设置swap文件中的page数量,由于页表(一种表示页面空闲或使用的bitmap)是在放在内存中的,,在磁盘上每8个pages将消耗1byte的内存
vm-max-threads [param] 数量 设置访问swap文件的线程数,最好不要超过机器的核数,如果设置为0,那么所有对swap文件的操作都是串行的,可能会造成比较长时间的延迟。默认值为4
glueoutputbuf [param] yes/no 设置在向客户端应答时,是否把较小的包合并为一个包发送,默认为开启
include [param] 配置文件路径 指定包含其它的配置文件,可以在同一主机上多个Redis实例之间使用同一份配置文件,而同时各个实例又拥有自己的特定配置文件

后记

本章我们对Redis有了基本的了解。并且学会了安装及配置以及Redis的客户端操作的一些基本命令。

但这只是一个开始。Redis仅仅作为技术工具,至于工具如何使用,如何最佳实践将是我们后续学习的目标。

最后附上参考文献:

坚持原创技术分享,您的支持将鼓励我继续创作!