Redis 从入门到实战

来源:互联网 发布:数据统计软件 编辑:程序博客网 时间:2024/05/16 11:06

本文来自作者 JPM  GitChat 上分享 「Redis 从入门到实战」,阅读原文查看交流实录。

文末高能

编辑 | 哈比

REmote DIctionary Server(Redis) 是一个开源的,基于 key-value 键值对的持久化的非关系型数据库存储系统。

它支持的数据存储类型包括:字符串 (String), 哈希 (Map), 列表 (list), 集合 (sets) 和 有序集合 (sorted sets) 等。

在实际项目中可以用 Redis 做缓存或消息服务器,Redis 也是目前互联网中使用比较广泛的非关系型数据库。

本场 Chat 将从以下 6 个方面介绍 Redis 的使用

  1. Redis 的简介,特点,缺陷和应用场景;

  2. Redis 的安装,分别介绍 Windows 与 Linux 下安装 Redis;

  3. Redis 的配置 ,介绍 redis.conf 文件查看、修改和相关参数说明;

  4. Redis 的五种数据类型与使用,包括 key-value,String,Hash,List,Set,sorted set;

  5. Java 代码如何操作 Redis;

  6. Redis 集群简单介绍,主从、哨兵、集群。

通过本场 Chat 的学习,以达到 “从零开始轻松掌握 Redis,并且可以运用到项目中” 的目的。

一、Redis 的简介

Redis 是一个开源的使用 C 语言编写、支持网络、可基于内存亦可持久化的日志型、Key-Value 数据库,并提供多种语言的 API,推荐使用 Linux 进行部署。

官方网站:https://redis.io

1. Redis 有以下几个特点

Redis 支持数据的持久化:可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。

方式一(RDB):根据指定的规则,定时周期性的把内存中更新的数据写入到磁盘里。RDB 的方式是通过快照(snapshot)完成,当符合规则时 redis 会把内存的数据生成一个副本并存储在硬盘中,这个过程称之为 “快照”。

方式二(AOF):把修改的操作记录追加到文件里,默认情况 redis 没有开启 AOF 方式,可以通过 appendonly 命令来启用,如:appendonly ye。

两种方式的区别:RDB 方式性能较高,但是可能会引起一定程度的数据丢失,AOF 方式正好相反。

丰富的数据类型

Redis 不仅仅支持简单的 key-value 类型的数据,同时还提供 list,set,zset,hash 等数据结构的存储。

单进程单线程高性能服务器

启动一个实例只能用一个 CPU,所以用 Redis 可以用多个实例,一个实例用一个 CPU 以便提高效率。

crash safe 和 recovery slow

redis 崩溃后,数据相对安全,但是恢复起来比较缓慢,所以生产环境不建议一个 Redis 实例数据太多{(20-30)G 数据内存对应(96-128)G 实际内存)},这种 20%-23% 的比例比较合适,因为磁盘读到内存的恢复时间也很慢,可以使用 ssd 磁盘来提高磁盘读取速度。

性能极高

Redis 单机 qps(每秒的并发)可以达到的速度是 110000 次 /s,写的速度是 81000 次 /s,适合小数据量高速读写访问。

Redis 的原子性

Redis 的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过 MULTI 和 EXEC 指令包起来。

Redis 支持数据的备份即 master-slave 模式的数据备份。Redis 还支持 publish/subscribe, key 过期。

2. Redis 缺陷与陷阱

内存管理开销大(不要超过物理内存的 3/5)。buffer io 可能会造成系统内存溢出(OOM-Out of Memory)。

3. Redis 的应用场景

新浪(sina)使用 redis:

  1. 应用程序直接访问 Redis。

  2. Redis 当做内存,先访问 redis,redis 没有数据或访问失败时访问 MySql。

  3. 二次开发后实现 MySql 和 Redis 互相同步。

MySql 数据通过 RBR 解析 BINLOG 同步到 redis 中实现关系型数据转变成队列数据。

Redis 提供特定数据的读写,通过 replication 接口同时写入到 MySql。

二、Redis 的安装

Window 下安装 Redis

下载地址:https://github.com/MSOpenTech/redis/releases

Redis 支持 32 位和 64 位,这个需要根据你系统平台的实际情况选择,这里我们下载 Redis-x64-xxx.zip 压缩包到你的目录(我的是:D:\Java\Redis-3.2.100),解压后,将文件夹重新命名为 Redis-3.2.100,如下图:

打开一个 cmd 窗口,使用 cd 命令切换目录到 D:\Java\Redis-3.2.100 运行 redis-server.exe redis.windows.conf,可以启动 redis 服务。

如果想方便的话,可以把 redis 的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个 redis.windows.conf 可以省略,如果省略,会启用默认的。

配置环境变量后,可以直接在 cmd 窗口,启动 redis 服务,如下:

启动成功显示:

下面让我们来看一下,在 window 环境下使用 Redis。

这时候另启一个 cmd 窗口,原来的不要关闭,不然就无法访问服务端了。因为配置了环境变量,所以可以直接在运行窗口,输入 “redis-cli” 打开客户端,如下图:

在客户端界面,使用 redis,过程如下图:

到这里,windows 下安装 Redis 已经完成。

Linux 下安装 Redis

下载地址:https://redis.io/download

详细命令:

  • $ wget http://download.redis.io/releases/redis-4.0.2.tar.gz

  • $ tar -zxvf redis-4.0.2.tar.gz -C /usr/local/

  • $ cd redis-4.0.2

  • make

注意:直接 make 如果报错,如下图:

则执行 make MALLOC=libc,编译成功后,如下图:

Linux 下启动 redis 服务,命令:“./redis-server”,如下图:

Linux 下使用 redis 服务,命令:“./redis-cli” 如下图:

ping 命令检查是否成功启动 redis 服务:

如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令:redis-cli -h host -p port -a password

命令:redis-cli -h 127.0.0.1 -p 6379 -a “mypassword”
表示:连接到主机为 127.0.0.1,端口为 6379 ,密码为 mypassword 的 redis 服务上。

至此,Redis 的安装介绍完毕。

三、Redis 的配置

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。

1. redis.conf 文件使用说明

你可以通过 CONFIG get 命令查看或设置配置项,使用 config get * 获取所有配置项。

上面的命令是通过 config get dbfilename 来获取 redis.conf 文件中 dbfilename 的配置项的值。

你可以通过修改 redis.conf 文件或使用 CONFIG set 命令来修改配置。

下面通过命令 config set 来修改日志记录级别。

Redis 默认不是以守护进程的方式运行,可以通过修改 daemonize 配置项,使用 yes 启用守护进程,以达到 redis 在后台运行,如下图:

2. redis.conf 文件参数说明 *   标黄的要熟悉 *


四、Redis 的五种数据类型与使用

1. Redis 的 key-value 介绍

Redis key 值是二进制安全的,下面说一下 key 的几条规则:

太长的键值不好

例如 1024 字节的键值就不好,不仅因为消耗内存,在数据中查找这类键值的成本也很高。

太短的键值通常也不好

键值的设置应该像变量命名一样,能标识出它的含义,比如 “u:666:pwd” 就不如 “user:666:password” 更易阅读。

最好坚持一种模式

例如:“object-type:id:field”,“user:666:password”。设置编码为 666 的用户的密码为 666888,则可以使用如下命令:

set user:666:password 666888

key 建议


10 到 20 个字符。


value 建议

String 不要超过 2K。set 元素不要超过 5000,如果内容长度太多,可以根据内容长度规划不同的实例端口

Redis 的 key-value 使用说明

Redis 键命令的基本语法:COMMAND KEY_NAME。

下面截图是使用 Redis 键命令的示例:

Redis 的 keys 命令  (标黄的要熟悉)

2. Redis 的字符串 (String) 类型介绍 **

这是 Redis 最简单而且最常用的数据类型之一。如果只使用这种数据类型,那么 Redis 就是一个持久化的 memcached 服务器(memcached 的数据仅保存在内存中,服务器重启后,数据将丢失)。

在 Redis 中,我们通常用 set 设置一对 key-value 键值,然后用 get 来获取字符串的值。value 值可以是任何类型的字符串(包括二进制数据),但值的长度不能超过 1G。

String 类型也可以用来存储数字,并支持对数字的加减操作。

Redis 的字符串命令使用说明

Redis 的字符串命令  (标黄的要熟悉)

3. Redis 的哈希 (Hash) 类型介绍

Redis hash 是一个 string 类型的 field 和 value 的映射表,hash 特别适合用于存储对象,能够存储 key 对多个属性的数据。

Redis 的哈希 (Hash) 命令使用说明

Redis 的哈希 (Hash) 命令  (标黄的要熟悉)


4. Redis 的列表 (List) 类型介绍

列表就是有序元素的序列,1,2,3,4,5,6 就是一个列表。用数组实现的 List 和用 Linked List 实现的 List,在属性方面大不相同。

Redis Lists 基于 Linked List 实现。这意味着即使在一个 list 中有数百万个元素,在头部或尾部添加一个元素的操作,其时间复杂度也是常数级别的。

用 LPUSH 命令在十个元素的 list 头部添加新元素,和在千万元素 list 头部添加新元素的速度相同。

Redis 列表是简单的字符串列表,按照插入顺序排序。你可以添加一个元素到列表的头部(左边)或者尾部(右边)。

查看帮助 ,命令:help @list。

Redis 的列表 (List) 命令使用说明

Redis 的列表 (List) 命令  (标黄的要熟悉)

5. Redis 的集合 (Set) 类型介绍

Redis 的 Set 是 String 类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。

Redis 的集合 (Set) 命令使用说明

Redis 的集合 (Set) 命令  (标黄的要熟悉)

6. Redis 的有序集合 (sorted set) 类型介绍

Redis 有序集合和集合一样也是 string 类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数,redis 正是通过分数来为集合中的成员进行从小到大的排序。

Redis 的有序集合 (sorted set) 命令使用说明

通过 zrange 命令进行正向排序,通过 zrevrange 命令进行方向排序。

Redis 的有序集合 (sorted set) 命令  (标黄的要熟悉)

到此,Redis 的五种数据类型介绍完毕,大家可以自行练习一下,多练几次就熟悉了。

一般使用 String 类型的较多,多用于缓存服务器。

五、Java 代码如何操作 Redis

Java 代码操作 Redis,特别简单。首先你需要下载驱动包,下载 jedis.jar。

下载地址:https://mvnrepository.com/artifact/redis.clients/jedis

在你的 classpath 中包含该驱动包。连接 java 代码操作前的本地 redis 如下:

用 java 代码连接本地 redis,并设置一个 key 为 “redis” 的键,其值为 “I love redis!”。Java 代码如下:

代码运行结果如下:

通过 Java 代码操作后,观察 Redis 的数据,如下:

六、Redis 集群简单介绍

Redis 有 3 种集群策略

1. 主从

1 台机器可写作为主,另外 2 台可读,作为从,类似于 MySQL 的主从复制,不过 Redis 没有 BINLOG 机制。

2. 哨兵

增加一台机器作为哨兵,监控 3 台主从机器,当主节点挂机的时候,机器内部进行选举,从集群中从节点里指定一台机器升级为主节点,从而实现高可用。当主节点恢复的时候,加入到从节点中继续提供服务。

3. 集群

Redis3.0 以后增加了集群的概念,可以实现多主多从结构,实现正真的高可用。

到此,Redis 的 Chat 就结束了,文章有点长,希望对你有用,咱们下次再见,谢谢。

近期热文

《Web 安全:前端攻击 XSS 深入解析》

《300万粉丝,全国最大的线上抽奖平台,深度解析》

《高可用、高性能? 接口设计的 16 个原则》

【钓鱼】与【反钓鱼】的技术剖析

快速了解 Java 9 平台模块系统


「阅读原文」看交流实录,你想知道的都在这里

原创粉丝点击