Redis 基本使用

博客地址:http://www.moonxy.com

一、前言

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:\Users\Administrator>cd F:\software\redis\

F:\software\redis>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:\Users\Administrator>cd F:\software\redis\

F:\software\redis>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"

 

posted on 2018-02-09 12:14  沐小悠  阅读(332)  评论(0编辑  收藏  举报