• 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: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"
  • 相关阅读:
    tudou(土豆)、youku(优酷)API(有相应的dll [C#])
    创新工场2012笔试编程捕鱼和分鱼
    区别Web文本框和HTML文本框的RandOnly、Disabled
    DataRow[]、List<DataRow>无法绑定到GridView的问题解决!
    1、NHibernate入门
    Verilog HDL 学习笔记2blocking and nonblocking assignment
    Verilog HDL 学习笔记1data type
    2006.08.21网摘
    推荐十一个很酷的实用网站
    类 ObjectOutputStream的writeObject()方法的中英文对照
  • 原文地址:https://www.cnblogs.com/cnjavahome/p/8430995.html
Copyright © 2020-2023  润新知