一、前言
Redis(REmote DIctionary Server)是一个开源(BSD 许可)、内存存储的数据结构服务器,可用作数据库来存储 Key-Value 数据,它支持字符串、哈希表、列表、集合、有序集合、位图、地理空间信息等数据类型,同时也可以作为高速缓存和消息队列代理。Redis 的所有数据都保存在内存中,然后不定期的通过异步方式保存到磁盘上。它与其他 NoSQL 相比,独特之处在于支持复杂的数据结构:string(字符串)、list(列表)、hash(字典)、set(集合)、zset(有序集合)等。
二、下载并运行 Redis
Redis 安装完毕,在 src 目录下有以下两个常用命令:
redis-server,启动 Redis 服务器,默认会监听 6379 端口;
redis-cli,Redis 自带的客户端管理工具。
进入Redis 安装目录,启动 Redis 服务端:
Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:UsersAdministrator>cd F:software edis F:software edis>redis-server.exe redis.windows.conf
显示结果:
_._ _.-``__ ''-._ _.-`` `. `_. ''-._ Redis 3.2.100 (00000000/0) 64 bit .-`` .-```. ```/ _.,_ ''-._ ( ' , .-` | `, ) Running in standalone mode |`-._`-...-` __...-.``-._|'` _.-'| Port: 6379 | `-._ `._ / _.-' | PID: 16248 `-._ `-._ `-./ _.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | http://redis.io `-._ `-._`-.__.-'_.-' _.-' |`-._`-._ `-.__.-' _.-'_.-'| | `-._`-._ _.-'_.-' | `-._ `-._`-.__.-'_.-' _.-' `-._ `-.__.-' _.-' `-._ _.-' `-.__.-' [16248] 08 Feb 11:11:54.754 # Server started, Redis version 3.2.100 [16248] 08 Feb 11:11:54.763 * DB loaded from disk: 0.009 seconds [16248] 08 Feb 11:11:54.764 * The server is now ready to accept connections on p ort 6379
进入Redis 安装目录,启动 Redis 客户端:
Microsoft Windows [Version 6.1.7601] Copyright (c) 2009 Microsoft Corporation. All rights reserved. C:UsersAdministrator>cd F:software edis F:software edis>redis-cli.exe -h 127.0.0.1 -p 6379 127.0.0.1:6379>
三、使用 Redis
输入 ping 命令,用来检验 Redis 服务器是否正常启动,服务器返回 PONG 来应答服务器正常运行。
127.0.0.1:6379> ping PONG 127.0.0.1:6379>
通过 kyes 命令可以查询 Redis 中所有的 Key:
127.0.0.1:6379> keys * 1) "myKey" 2) "friend:lucy-xiandafu" 3) "friend:xiandafu" 4) "friend:lucy" 5) "cache"
通过 exists 来判断 Key 是否存在,可以有多个 Key,用空格分开。操作结果是累计起来的结果。:
127.0.0.1:6379> exists myKey (integer) 1
返回1表示存在,0表示不存在。
可以通过 del 命令删除 Key-Value,也可使用 expire 之多少秒后 Key-Value 自动删除。
3.1 字符串 string
string 是 redis最基本的类型,你可以理解成与 Memcached 一模一样的类型,一个 key 对应一个 value。string 类型是二进制安全的,意思是 redis 的 string 可以包含任何数据。比如 jpg 图片或者序列化的对象。string 类型是 Redis 最基本的数据类型,一个键最大能存储512MB。常用操作如下:
SET key value,设置指定 key 的值;
GET key,获取指定 key 的值;
MSET key value [key value ...],同时设置一个或多个 key-value 对;
MGET key1 [key2..],获取所有(一个或多个)给定 key 的值。
127.0.0.1:6379> set java redis OK 127.0.0.1:6379> get java "redis" 127.0.0.1:6379>
3.2 列表 list
Redis List 类型类似 Java 的 LinkedList,通过链表来完成,向其添加元素速度非常快,但按照索引方式获取元素比较慢。因此 List 结构适合那种大数据量,要求插入速度极快的场景。常用操作如下:
RPUSH key value1 [value2],向列表尾部添加一个或多个值(可理解为从 List 右边放入);
LPUSH key value1 [value2],将一个或多个值插入到列表头部(可理解为从 List 左边放入);
LRANGE key start stop,从左到右获取列表指定范围内的元素;
RPOP key,移除并获取列表最后一个元素;
LPOP key,移出并获取列表的第一个元素;
LLEN key,获取列表长度。
127.0.0.1:6379> rpush program java c c# c++ (integer) 4 127.0.0.1:6379> lpush program python (integer) 5 127.0.0.1:6379> llen program (integer) 5 127.0.0.1:6379> lrange program 0 2 1) "python" 2) "java" 3) "c" 127.0.0.1:6379> lrange program 0 10 1) "python" 2) "java" 3) "c" 4) "c#" 5) "c++" 127.0.0.1:6379> rpop program "c++" 127.0.0.1:6379> lpop program "python" 127.0.0.1:6379> llen program (integer) 3
List 结构可以用在多个场合,比如消息服务,通过 Rpush 追加消息,其他客户端可以通过 Lpop 或者 Rpop 读取 List 的消息。
再比如网站的新闻列表,记录可以通过 Lpush 放到新闻列表中,然后访问用户可以通过 Lrange 0 9 来读取最新的 10 条记录。
3.3 哈希 Hash
Redis Hash 类似 Java 的 HashMap,允许存放多个 Key-Value。Spring Boot 在 Spring Session 中即采用了 Hash 结构来存放用户的 Seesion 数据,以实现 Web 系统的水平扩展。常用操作如下:
HSET key field value,将哈希表 key 中的字段 field 的值设为 value;
HGET key field,获取存储在哈希表中指定字段的值;
HEXISTS key field,查看哈希表 key 中,指定的字段是否存在;
HKEYS key,获取所有哈希表中的字段;
HGETALL key,获取在哈希表中指定 key 的所有字段和值;
HDEL key field1 [field2],删除一个或多个哈希表字段。
127.0.0.1:6379> hset user name Jim (integer) 1 127.0.0.1:6379> hset user phone 138110 (integer) 1 127.0.0.1:6379> hget user name "Jim" 127.0.0.1:6379> hkeys user 1) "name" 2) "phone" 127.0.0.1:6379> hgetall user 1) "name" 2) "Jim" 3) "phone" 4) "138110" 127.0.0.1:6379> hexists user name (integer) 1
Hash 的字段支持递增计算,如 hincby key field value,hincbyfloat key field value 等。
3.4 集合 set
Set 与 Java 中的 Java.util.Set 类似,代表了元素不重复的集合,Redis 的 Set 除了元素添加删除操作,还包含了集合的并集、交集等功能,可以用于统计访问网站所有的 IP,或者统计网站作者共同的粉丝等应用。常用操作如下:
SADD key member1 [member2],向集合添加一个或多个成员;
SREM key member1 [member2],移除集合中一个或多个成员;
SMEMBERS key,返回集合中的所有成员;
SINTER key1 [key2],返回给定所有集合的交集
SINTERSTORE destination key1 [key2],返回给定所有集合的交集并存储在 destination 中;
SUNION key1 [key2],返回所有给定集合的并集;
SUNIONSTORE destination key1 [key2],所有给定集合的并集存储在 destination 集合中。
比如统计网站访问 IP, 如下:
127.0.0.1:6379> sadd ipaddress 192.168.0.1 (integer) 1 127.0.0.1:6379> sadd ipaddress 192.168.0.2 (integer) 1 127.0.0.1:6379> sadd ipaddress 192.168.0.1 (integer) 0 127.0.0.1:6379> smembers ipaddress 1) "192.168.0.2" 2) "192.168.0.1"
比如查看两人共同好友,如下:
127.0.0.1:6379> sadd Jim Lucy Lili (integer) 2 127.0.0.1:6379> sadd Tom Bluce Adam Lucy (integer) 3 127.0.0.1:6379> sinter Jim Tom 1) "Lucy" 127.0.0.1:6379> sinterstore Jim-Tom Jim Tom (integer) 1 127.0.0.1:6379> smembers Jim-Tom 1) "Lucy"
3.5 有序集合 zset
Sorted Set,Redis 有序集合和集合一样也是string类型元素的集合,且不允许重复的成员。不同的是每个元素都会关联一个 double 类型的分数。Redis 正是通过分数来为集合中的成员进行从小到大的排序。Zset 中也提供了与 set 中类似功能的操作。
格式为:ZADD KEY_NAME SCORE1 VALUE1.. SCOREN VALUEN
127.0.0.1:6379> zadd dbkey 1 redis (integer) 1 127.0.0.1:6379> zadd dbkey 4 mongodb (integer) 1 127.0.0.1:6379> zadd dbkey 2 mysql (integer) 1 127.0.0.1:6379> zadd dbkey 2 mysql (integer) 0 127.0.0.1:6379> zadd dbkey 3 mysql (integer) 0 127.0.0.1:6379> zrange dbkey 0 10 1) "redis" 2) "mysql" 3) "mongodb" 127.0.0.1:6379> zrange dbkey 0 10 withscores 1) "redis" 2) "1" 3) "mysql" 4) "3" 5) "mongodb" 6) "4"
四、Pub/Sub
publish 作为主题,负责发布事件;subscribe 作为观察者,通过订阅这些事件来观察该主题。
Redis 除了 NoSql 特性,还提供了简单的消息队列服务,支持 publish/subscribe,即发布订阅模式,也称观察者模式。Redis 客户端可以订阅一个或者多个频道(Channel),这种行为被称为 subscribe。其他 Redis 客户端向这些 Channel 发送消息,称为 publish,订阅这些频道的客户端能接收到这些消息。
publish/subscribe 消息模式很好地解耦了消息发送者和消息接收者。消息订阅者不需要知道发送者,发送者也不需要知道消息接收者。发送者发送的消息将被所有的订阅者接收。
publish/subscribe 模式在 Spring Boot 也可以应用于事件通知,如配置文件更新、缓存更新等。
Redis 的 subscribe 可以订阅一个到多个频道,作为观察者,通过订阅这些事件来观察该主题。假设订阅了一个 news 频道:
127.0.0.1:6379> subscribe news Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "news" 3) (integer) 1
subscribe 命令会返回一个数组结构数据,第一行是固定的 "subscribe" 字符串,第二行是订阅的频道名字,第三行是数字,表示该频道总共有多少个订阅者。
redis-cli 一旦使用 subscribe,将一直等待频道的消息并输出到屏幕,因此,如果你还想在 redis-cli 中使用其他命令,比如 publish 消息,则需要重新打开一个终端,运行 redis-cli,使用以下 publish 命令:
127.0.0.1:6379> publish news hello (integer) 2 127.0.0.1:6379> publish news world (integer) 2
publish 表示主题,负责发布事件,命令可以向终端发送一条消息,并返回一个整数,表示有多少订阅者收到此消息,此处有两个观察者。
订阅者的终端会看到如下显示:
127.0.0.1:6379> subscribe news Reading messages... (press Ctrl-C to quit) 1) "subscribe" 2) "news" 3) (integer) 1 1) "message" 2) "news" 3) "hello" 1) "message" 2) "news" 3) "world"