ShiningDan的博客

redis入门

Redis 是一个key-value存储系统,值(value)可以是 字符串(String), 表(Hash), 列表(List), 集合(Sets) 和 有序集合(Sorted Sets)等类型。

Redis 简介

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

Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。

Redis 应用场景

因为 Redis 是基于内存来存储数据的,所以 Redis 对数据读取的速度远远大于使用硬盘来读取数据的速度,因此经常被用作缓存。

因为 Redis 的列表提供 POP 和 PUSH 操作,所以可以使用 Redis 作为队列。

虽然 Redis 是基于内存的,但是 Redis 提供了持久化机制,定期存储数据到硬盘中。

除此之外,Redis 还经常使用在应用排行榜、网站访问统计、数据过期处理、商品秒杀(队列机制)等地方。

Redis 配置

Redis 的配置文件位于 Redis 安装目录下,文件名为 redis.conf。
你可以通过 CONFIG 命令查看或设置配置项。

1
redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

比如:

1
2
3
redis 127.0.0.1:6379> CONFIG GET loglevel
1) "loglevel"
2) "notice"

使用 * 可以获得所有的配置

1
redis 127.0.0.1:6379> CONFIG GET *

关于所有的参数说明,可以参考 fRedis 配置

常用要修改的配置有:

1
2
daemonize yes      // 设置 Redis 后台启动
port 7200 // 设置 Redis 的启动端口

在 Mac 下面,可以使用

1
brew install redis

来安装 Redis,在 Mac 下面,安装完 Redis 之后,直接输入 redis-server 就可以使用 Redis 了,如果需要配置文件启动参数,可以使用和修改默认的参数:

1
redis-server /usr/local/etc/redis.conf

首先运行 redis-server 来启动一个 Redis,然后使用命令 redis-cli 来通过客户端连接 Redis。

1
2
3
redis-cli
127.0.0.1:6379>
/* 由于是本机连接,所以默认ip为127.0.0.1,默认端口为6379*/

如果设置了密码,或者配置了新的端口,则需要在使用 redis-cli 的时候声明端口和密码:

1
2
3
redis-cli -h host -p port -a password
// 举例
redis-cli -h 127.0.0.1 -p 6379 -a "mypass"

连接命令

查看 Redis 信息

获得 Redis 服务器的统计信息,可以输入:

1
127.0.0.1:6379> info

退出 Redis

在 redis-cli 里面输入 shutdown,就可以关闭 Redis 服务器,然后输入 exit 就可以退出 Redis 客户端。

Redis 键(key)

查看所有的 key

1
redis 127.0.0.1:6379> keys *

具体的解释可以查看Redis 键(key)

Redis 数据类型

Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及zset(sorted set:有序集合)。

查询所有 Redis 命令

String(字符串)

string是Redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。

string类型是二进制安全的。意思是Redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。

string类型是Redis最基本的数据类型,一个值最大能存储512MB。其他语言的数据类型都会被转换为 string 类型,并且在 Redis 中,键也是 string 类型的。String 类型的值可以包裹的是字符串,整数和浮点数,并且可以对整数和浮点数进行增减,对字符串进行操作

1
2
3
4
redis 127.0.0.1:6379> SET name 1
OK
redis 127.0.0.1:6379> GET name
"1"

Hash(哈希)

Redis hash 是一个键名对集合。
Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。值可以是 String 类型,也可以是 整数,或者 浮点数 类型

使用 HMSET 和 HGETALL 来设置和获取 Hash 值。

1
2
3
4
5
6
7
8
9
127.0.0.1:6379> HMSET user:1 username runoob password runoob points 200
OK
127.0.0.1:6379> HGETALL user:1
1) "username"
2) "runoob"
3) "password"
4) "runoob"
5) "points"
6) "200"

每个 hash 可以存储 2^32 -1 键值对(40多亿)。

List(列表)

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

其中 LINDEX 表示了在 Redis 中数据的下表是如何计算的,具体可以参考:LINDEX key index

1
2
3
4
5
6
7
8
9
10
11
redis 127.0.0.1:6379> lpush runoob redis
(integer) 1
redis 127.0.0.1:6379> lpush runoob mongodb
(integer) 2
redis 127.0.0.1:6379> rpush runoob rabitmq
(integer) 3
redis 127.0.0.1:6379> lrange runoob 0 10
1) "rabitmq"
2) "mongodb"
3) "redis"
redis 127.0.0.1:6379>

列表最多可存储 232 - 1 元素 (4294967295, 每个列表可存储40多亿)。

Set(集合)

Redis的Set是string类型的无序不重复集合。

  • SADD :添加数据
  • SMEMBERS:展示所有的数据
1
2
3
4
5
6
7
8
9
10
11
12
redis 127.0.0.1:6379> sadd runoob redis
(integer) 1
redis 127.0.0.1:6379> sadd runoob mongodb
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 1
redis 127.0.0.1:6379> sadd runoob rabitmq
(integer) 0
redis 127.0.0.1:6379> smembers runoob
1) "rabitmq"
2) "mongodb"
3) "redis"

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。

值可以是 String 类型,也可以是 整数,或者 浮点数 类型

不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。

zset的 value 是唯一的,但分数(score)却可以重复。 如果两个元素的 score 是一样的,则排名顺序按照这两个元素的 value 的字典排列顺序。

  • ZADD key score member:添加元素到集合
  • ZRANGEBYSCORE runoob start stop:显示分数 start 到 stop 的元素

HyperLogLog

Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。

什么是基数?

比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为 5。 基数估计就是在误差可接受的范围内,快速计算基数。

1
2
3
4
5
6
7
8
redis 127.0.0.1:6379> PFADD runoobkey "redis"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mongodb"
1) (integer) 1
redis 127.0.0.1:6379> PFADD runoobkey "mysql"
1) (integer) 1
redis 127.0.0.1:6379> PFCOUNT runoobkey
(integer) 3

发布订阅

Redis 发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收消息。

Redis 客户端可以订阅任意数量的频道。

事务

Redis 事务可以一次执行多个命令, 并且带有以下两个重要的保证:

  • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。
  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

以 MULTI 开始一个事务, 然后将多个命令入队到事务中, 最后由 EXEC 命令触发事务, 一并执行事务中的所有命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
redis 127.0.0.1:6379> MULTI
OK
redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"
QUEUED
redis 127.0.0.1:6379> GET book-name
QUEUED
redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"
QUEUED
redis 127.0.0.1:6379> SMEMBERS tag
QUEUED
redis 127.0.0.1:6379> EXEC
1) OK
2) "Mastering C++ in 21 days"
3) (integer) 3
4) 1) "Mastering Series"
2) "C++"
3) "Programming"

脚本

Redis 脚本使用 Lua 解释器来执行脚本。 Reids 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为 EVAL。

数据备份与恢复

Redis SAVE 命令用于创建当前数据库的备份。

1
2
redis 127.0.0.1:6379> SAVE 
OK

该命令将在 redis 安装目录中创建 dump.rdb 文件。

如果需要恢复数据,只需将备份文件 (dump.rdb) 移动到 Redis 安装目录并启动服务即可。获取 Redis 目录可以使用 CONFIG 命令,如下所示:

1
2
3
redis 127.0.0.1:6379> CONFIG GET dir
1) "dir"
2) "/usr/local/redis/bin"

默认路径就是在哪个文件夹下运行的 redis-server

安全

我们可以通过以下命令查看是否设置了密码验证:

1
2
3
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) ""

默认情况下 requirepass 参数是空的,这就意味着你无需通过密码验证就可以连接到 Redis 服务。
你可以通过以下命令来修改该参数:

1
2
3
4
5
127.0.0.1:6379> CONFIG set requirepass "runoob"
OK
127.0.0.1:6379> CONFIG get requirepass
1) "requirepass"
2) "runoob"

设置密码后,客户端连接 Redis 服务就需要密码验证,否则无法执行命令。

AUTH 命令基本语法格式如下:

1
127.0.0.1:6379> AUTH runoob

性能测试

redis 性能测试的基本命令如下:

1
redis-benchmark [option] [option value]

管道技术

Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

  • 客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
  • 服务端处理命令,并将结果返回给客户端。

Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

1
2
3
4
5
6
7
8
$(echo -en "PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n"; sleep 10) | nc localhost 6379

+PONG
+OK
redis
:1
:2
:3

以上实例中我们通过使用 PING 命令查看redis服务是否可用, 之后我们们设置了 runoobkey 的值为 redis,然后我们获取 runoobkey 的值并使得 visitor 自增 3 次。
在返回的结果中我们可以看到这些命令一次性向 redis 服务提交,并最终一次性读取所有服务端的响应

Redis的Java客户端Jedis的八种调用方式(事务、管道、分布式…)介绍