Redis 简介

Remote Dictionary Server(Redis) 是一个key-value数据库。

Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、Key-Value数据库,并提供多种语言的API。 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Map), 列表(list), 集合(sets) 和 有序集合(sorted sets)等类型。 Redis 是完全开源免费的,遵守BSD协议,是一个高性能的key-value数据库。


什么时候使用redis?

在实际生产环境中,很多公司都曾经使用过这样的架构,使用MySQL进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:

  • MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。
  • Memcached与MySQL数据库数据一致性问题。
  • Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。
  • 跨机房cache同步问题。

Redis的特点

  • 速度飞快: Redis数据库完全在内存中,因此处理速度非常快,每秒能执行约11万集合,每秒约81000+条记录。
  • 数据持久化: redis支持数据持久化,可以将内存中的数据存储到磁盘上,方便在宕机等突发情况下快速恢复。
  • 支持丰富的数据类型: 相比许多其他的键值对存储数据库,Redis拥有一套较为丰富的数据类型。
  • 数据一致性: 所有Redis操作是原子的,这保证了如果两个客户端同时访问的Redis服务器将获得更新后的值。
  • 多功能实用工具: Redis是一个多实用的工具,可以在多个用例如缓存,消息,队列使用(Redis原生支持发布/订阅),任何短暂的数据,应用程序,如 Web应用程序会话,网页命中计数等。

文件说明

  • redis-server Redis服务器的启动程序。
  • redis-cli Redis命令行操作工具。当然,你也可以用telnet根据其纯文本协议来操作。
  • redis-benchmark Redis性能测试工具,测试Redis在你的系统及你的配置下的读写性能。
  • redis-stat Redis状态检测工具,可以检测Redis当前状态参数及延迟状况。

Window 下安装

下载地址

redis

64位

32位

  • 下载到的Redis支持32bit和64bit。根据自己实际情况选择,下载后把此文件解压到任意文件夹下。 如C:\redis
  • 打开一个cmd窗口 使用cd命令切换目录到 C:\redis 运行 redis-server.exe redis.conf
  • 如果想方便的话,可以把redis的路径加到系统的环境变量里,这样就省得再输路径了,后面的那个redis.conf可以省略,如果省略,会启用默认的。输入之后,会显示如下界面:
  • 这时候另启一个cmd窗口,注意原来的CMD窗口不要关闭,不然就无法访问服务端了。
  • 切换到redis目录下运行 redis-cli.exe -h 127.0.0.1 -p 6379
    设置键值对 set name zfpx
    取出键值对 get name
    

可执行文件路径

启动成功

mac安装

先安装homebrew

http://brew.sh/

然后使用homebrew安装redis

brew install redis

Linux 下安装(通用的源码编译安装)

下载地址

http://redis.io/download,下载最新文档版本。 本教程使用的最新文档版本为 2.8.17,下载并安装:

$ wget http://download.redis.io/releases/redis-3.0.5.tar.gz
$ tar xzf redis-3.0.5.tar.gz
$ cd redis-3.0.5
$ make

make完后,redis-3.0.5目录下会出现编译后的redis服务程序redis-server,还有用于测试的客户端程序redis-cli,两个程序位于安装目录 src 目录下:

下面启动redis服务.

$ cd src
$ ./redis-server

注意这种方式启动redis 使用的是默认配置。也可以通过启动参数告诉redis使用指定配置文件使用下面命令启动。

$ cd src
$ ./redis-server redis.conf

redis.conf是一个默认的配置文件。我们可以根据需要使用自己的配置文件。

启动客户端

启动redis服务进程后,就可以使用测试客户端程序redis-cli和redis服务交互了。 比如:

$ cd src
$ ./redis-cli
redis> set foo bar
OK
redis> get foo
"bar"

Ubuntu 下安装

在 Ubuntu 系统安装 Redi 可以使用以下命令:

$sudo apt-get update
$sudo apt-get install redis-server

启动 Redis

$ redis-server

查看 redis 是否启动?

$ redis-cli

以上命令将打开以下终端:

redis 127.0.0.1:6379>

Redis 命令(redis的开启)

Redis 命令用于在 redis 服务上执行操作。 要在 redis 服务上执行命令需要一个 redis 客户端。Redis 客户端在我们之前下载的的 redis 的安装包中。 语法 Redis 客户端的基本语法为:

$ redis-cli

实例 以下实例讲解了如何启动 redis 客户端: 启动 redis 客户端,打开终端并输入命令 redis-cli。该命令会连接本地的 redis 服务。

$redis-cli
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING

PONG

在以上实例中我们连接到本地的 redis 服务并执行 PING 命令,该命令用于检测 redis 服务是否启动。

在远程服务上执行命令

如果需要在远程 redis 服务上执行命令,同样我们使用的也是 redis-cli 命令。 语法

$ redis-cli -h host -p port -a password

实例 以下实例演示了如何连接到主机为 127.0.0.1,端口为 6379的 redis 服务上。

$redis-cli -h 127.0.0.1 -p 6379 
redis 127.0.0.1:6379>
redis 127.0.0.1:6379> PING
PONG

Redis 数据类型

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

String(字符串)

  • string是redis最基本的类型,你可以理解成与Memcached一模一样的类型,一个key对应一个value。
  • string类型是二进制安全的。意思是redis的string可以包含任何数据。比如jpg图片或者序列化的对象 。
  • string类型是Redis最基本的数据类型,一个键最大能存储512MB。

实例

redis 127.0.0.1:6379> SET name zfpx
OK
redis 127.0.0.1:6379> GET name
"zfpx"

在以上实例中我们使用了 RedisSETGET 命令。键为 name,对应的值为”zfpx”。 注意:一个键最大能存储512MB。

Hash(哈希)

  • Redis hash 是一个键值对集合。
  • Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。

实例

redis 127.0.0.1:6379> HMSET user:1 username zfpx password 123
OK
redis 127.0.0.1:6379> HGETALL user:1
1) "username"
2) "zfpx"
3) "password"
4) "123"

以上实例中 hash 数据类型存储了包含用户脚本信息的用户对象。 实例中我们使用了 Redis HMSET, HGETALL 命令,user:1 为键值。 每个 hash 可以存储 232 – 1 键值对(40多亿)。

List(列表)

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

redis 127.0.0.1:6379> lpush name zfpx1
(integer) 1
redis 127.0.0.1:6379> lpush name zfpx2
(integer) 2
redis 127.0.0.1:6379> lpush name zfpx3
(integer) 3
redis 127.0.0.1:6379> lrange name 0 -1
1) "zfpx2"
2) "zfpx1"
3) "zfpx3"

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

Set(集合)

Redis的Set是string类型的无序集合。 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1)。

sadd 命令

添加一个string元素到,key对应的set集合中,成功返回1,如果元素以及在集合中返回0,key对应的set不存在返回错误。

sadd key member

实例

redis 127.0.0.1:6379> sadd school zfpx1
(integer) 1
redis 127.0.0.1:6379> sadd school zfpx1
(integer) 1
redis 127.0.0.1:6379> sadd school zfpx2
(integer) 1
redis 127.0.0.1:6379> sadd school zfpx2
(integer) 0
redis 127.0.0.1:6379> smembers school

1) "zfpx1"
2) "zfpx2"

注意:以上实例中 zfpx1 添加了两次,但根据集合内元素的唯一性,第二次插入的元素将被忽略。 集合中最大的成员数为 232 – 1 (4294967295, 每个集合可存储40多亿个成员)。

zset(sorted set:有序集合)

Redis zset 和 set 一样也是string类型元素的集合,且不允许重复的成员。 不同的是每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序。 zset的成员是唯一的,但分数(score)却可以重复。 zadd 命令 添加元素到集合,元素在集合中存在则更新对应score

zadd key score member 

实例

redis 127.0.0.1:6379> zadd school 0 zfpx1
(integer) 1
redis 127.0.0.1:6379> zadd school 0 zfpx2
(integer) 1
redis 127.0.0.1:6379> zadd school 0 zfpx3
(integer) 1
redis 127.0.0.1:6379> zadd school 0 zfpx4
(integer) 0
redis 127.0.0.1:6379> ZRANGEBYSCORE school 0 100

1) "zfpx1"
2) "zfpx2"
3) "zfpx3"
4) "zfpx4"

基本操作总结

 

string 是 redis 中最基础的数据类型, redis 字符串是二进制安全的,这意味着他们有一个已知的长度没有任何特殊字符终止,所以你可以存储任何东西,512兆为上限。

SET

SET指令是将字符串值 value 关联到 key 。语法格式:

SET key value

示例:添加键 name,值为 ‘zfpx’

# 对不存在的键进行设置

redis 127.0.0.1:6379> SET key "value"
OK

redis 127.0.0.1:6379> GET key
"value"


# 对已存在的键进行设置

redis 127.0.0.1:6379> SET key "new-value"
OK

redis 127.0.0.1:6379> GET key
"new-value"

如果 key 已经持有其他值,SET就覆写旧值,无视类型。

SETEX

SETEX指令的作用是将值 value 关联到 key ,并将 key 的生存时间设为 seconds (以秒为单位)。如果 key 已经存在, SETEX命令将覆写旧值,语法格式:

SETEX key seconds value

示例 – 设置name的值为’zfpx’,生存时间为10秒。

redis> SETEX name 10 "zfpx"
OK

SETEX指令的作用类似如下两个命令:

SET name "zfpx"
EXPIRE key 10  # 设置生存时间

不同之处是,SETEX是一个原子性(atomic)操作, 关联值 和 设置生存时间 两个动作会在同一时间内完成,该命令在 Redis 用作缓存时,非常实用。

GET

GET指令是返回 key 所关联的字符串值。如果 key 不存在那么返回特殊值 nil 。假如 key 储存的值不是字符串类型,返回一个错误,因为GET只能用于处理字符串值,语法格式:

GET key 

示例 – 获取name的值。

redis> GET name
"zfpx"
redis> GET test
(nil)

返回值

当key不存在时,返回nil,否则返回key的值。 如果key的值不是字符串类型,那么将会返回一个错误。

APPEND

如果 key 已经存在并且是一个字符串,APPEND命令将 value 追加到 key 原来的值的末尾,语法格式:

APPEND key value 

示例 – 向name追加字符 ‘.cn’。

redis> APPEND name ".cn"    # 对已存在的字符串进行 APPEND
(integer) 6

redis> GET name
"zfpx.cn"

如果 key 不存在,APPEND就简单地将给定 key 设为 value ,就像执行 SET key value 一样。

MSET

MSET指令可以同时设置一个或多个 key-value 对,如果某个给定 key 已经存在,那么MSET会用新值覆盖原来的旧值,语法格式:

MSET key value [key value ...]

示例 – 设置 hour、minutes和second的值。

redis> MSET hour “23” minutes “23” second “23” OK

MSET是一个原子性(atomic)操作,所有给定 key 都会在同一时间内被设置,某些给定 key 被更新而另一些给定 key 没有改变的情况,不可能发生。

MGET

执行MGET指令,将返回所有(一个或多个)给定 key 的值,语法格式:

MGET key [key …]

示例 – 获取hour、minutes和second的值

redis> MGET hour minutes second day
1) "230"
2) "23"
3) "23"
4)(nil)

如果给定的 key 里面,有某个 key 不存在,那么这个 key 返回特殊值 nil 。因此,该命令永不失败。

STRLEN

STRLEN指令将会返回 key 所储存的字符串值的长度,语法格式:

STRLEN key

示例 – 获取say值的长度。

redis> STRLEN name
(integer) 4

当 key 储存的不是字符串值时,返回一个错误。

其他指令

除了前面我们提到的那些常用指令以外,还有很多其他的指令,这些指令只作了解即可,当我们真正用到的时候再来详细了解如何使用它。

指令
用途

GETSET
设置键的字符串值,并返回旧值。

GETRANGE
得到字符串的子字符串存放在一个键。

GETBIT
对 key 所储存的字符串值,获取指定偏移量上的位(bit)。

SETBIT
对 key 所储存的字符串值,设置或清除指定偏移量上的位(bit)。

SETNX
将 key 的值设为 value ,当且仅当 key 不存在。

MSETNX
同时设置一个或多个 key-value 对,当且仅当所有给定 key 都不存在。

PSETEX
和 SETEX 命令相似,但它以毫秒为单位设置 key 的生存时间,而不是像 SETEX 命令那样,以秒为单位。

INCR
将 key 中储存的数字值增一。

INCRBY
将 key 所储存的值加上指定增量。

INCRBYFLOAT
为 key 中所储存的值加上指定浮点数增量。

DECR
将 key 中储存的数字值减一。

DECRBY
将 key 所储存的值加上指定增量。

什么是hash? Redis的哈希值是字符串字段和字符串值之间的映射。

相比string等数据类型,它提供很多方便的域操作,因此在表示对象时,它是非常适合的数据类型。

在Redis中的哈希值存储容量也是非常大的,可存储超过400十亿键值对。

HSET(添加键值)

在 redis 中,使用HSET命令来将哈希表 key 中的字段 field 的值设为 value ,语法如下:

HSET key field value

示例 – 添加键name,值为’zfpx’。

redis> HSET person name “zfpx” # 设置一个字段 (integer) 1

如果 key 不存在,一个新的哈希表被创建并进行HSET操作。

如果字段 field 已经存在于哈希表中,旧值将被覆盖。

HGET(获取值)

redis 中如何获取key的值呢?HGET是用来获取指定 key 值的命令,语法如下:

HGET key field

示例 – 获取字段name的值。

redis> HGET person name
"zfpx"

执行HGET命令,如果 key 存在,将返回哈希表 key 中给定域 field 的值,如果 key 不存在,则返回 (nil)

HMSET(添加多个值)

除了HSET命令,HMSET命令的用途也是用来设置值,不同的是,HMSET一次可以设置多个 field-value (字段-值)对设置到哈希表 key 中,语法如下:

HMSET key field value [field value ...]

示例 – 添加键name、age。

redis> HMSET person name "zfpx" age 6
OK

如果 key 不存在,将会创建一个空的哈希表并执行HMSET操作。

如果添加的字段已存在哈希表中,那么它将被覆盖。

HMGET(获取多个值)

作为HMSET命令对应的获取命令,HMGET可以一次性获取哈希表 key 中,一个或多个给定域的值,基本语法:

 HMGET key field [field ...]

示例 – 获取域name、age、gender的值的值。

 redis> HMGET peson name age gender            # 返回值的顺序和传入参数的顺序一样
 1) "zfpx"
 2) "6"
 3) (nil)                              # 不存在的域返回nil值

(HGETALL)获取全部值

如果我们想要一次性获取全部域的值,很显然 HGETHMGET 都是不合适的,所幸的是我们还有HGETALL指令,通过它,我们可以轻松的获取到全部域值,基本语法如下:

HGETALL key

示例 – 获取person全部域的值。

redis> HSET person name "zfpx"
(integer) 1

redis> GET person
redis> HSET person age "6"
(integer) 1

redis> HGETALL person
1) "name"          # 域
2) "zfpx"  # 值
3) "age"
4) "6"

HEXISTS(验证key是否存在)

在应用环境中,我们经常会需要知道一个 key 中是否存在某个 field ,HEXISTS命令可以帮助我们达到这个目的,基本语法:

HEXISTS key field

示例 – 验证键name是否存在。

redis> HEXISTS person name 
(integer) 0

查看哈希表`key 中,给定域 field 是否存在。

如果哈希表含有给定字段,返回 1 。

如果哈希表不含有给定字段,或 key 不存在,返回 0 。

HKEYS(获取所有的key)

我们经常会遇见这样的应用场景,比如在线用户列表、课堂列表等等,这时候我们可以使用HKEYS来获取哈希表 key 中的所有域,基本语法:

HKEYS key

示例 – 查看键person中所有的字段。

redis> HMSET person name “zfpx” age “6” OK

redis> HKEYS person 1) “name” 2) “age”

HLEN(获取字段数量)

HLEN命令将返回哈希表 key 中域的数量,什么时候会用到它呢?比如:在线聊天室,显示在线用户数,基本语法:

HLEN key

示例 – 查看db键中域的个数。

   redis> HSET person name zfpx
   (integer) 1

   redis> HSET person age 6
   (integer) 1

   redis> HLEN person
   (integer) 2

   redis> HSET person home beijing
   (integer) 1

   redis> HLEN person
   (integer) 3

当 key 存在时,将返回哈希表中域的数量。 当 key 不存在时,返回 0 。

HDEL(删除某个键)

有添加就必定有删除的需求,当我们想要删除哈希表 key 中的一个或多个指定域时,可以使用HDEL命令,基本语法:

HDEL key field [field ...]

示例 – 删除键person中的home域。

redis> HDEL person home
(integer) 1

如果是不存在的域,那么它将被忽略掉。

 

Redis 列表是简单的字符串列表,按照插入顺序排序。

你可以添加一个元素导列表的头部(左边)或者尾部(右边) LPUSH 命令插入一个新的元素导头部, 而RPUSH插入一个新元素导尾部.

当一个这两个操作在一个空的Key上被执行的时候一个新的列表被创建。

从时间复杂度的角度来看 Redis 列表的主要特征是在头和尾的元素插入和删除是固定时间,即便是数以百万计的插入。. 在列表的两端访问元素是非常快的但是如果你试着访问一个非常大的列表的中间的元素是很慢的,因为那是一个O(N)操作。 你可以用 Redis 列表做很多有趣的事情,比如你可以:

  • 在一个微博中建立一个时间线模型,使用 LPUSH 去添加新的元素到用户的时间消息列表, 使用 LRANGE 去查找最近插入的元素。

LPUSH(向左添加元素)

LPUSH的作用是将一个或多个值 value 插入到列表 key 的左边,基本语法:

LPUSH key value [value ...]

示例:将zpfx添加到朋友列表。

redis> LPUSH fruits apple

如果有多个 value 值,那么各个 value 值按从左到右的顺序依次插入到表头,比如说,对空列表 msg 执行命令 LPUSH msg a b c ,列表的值将是 c b a 。

如果 key 不存在,一个空列表会被创建并执行LPUSH操作。

执行成功时,返回列表长度,当 key 存在但不是列表类型时,返回一个错误。

LSET(更新特定位置)

LSET可以将列表 key 下标为index的元素的值设置为 value ,基本语法:

LSET key index value

示例

redis>LSET fruits 0 Banana
ok

需要注意的是,列表 key 必须是已存在的,而且index不能超出列表长度范围。

LPOP(移除列表第一个元素)

LPOP命令执行时会移除列表第一个元素,并将其返回,基本语法:

LPOP key

示例 – 取出friends中的第一个元素。

redis>LPOP fruits 
Banana

请注意,LPOP命令会移除列表中的元素,如果仅仅是想要获取该元素,那么就不应该使用LPOP操作,因为redis中有专门获取元素的命令。

LINDEX(获取列表元素)

如果要获取列表元素,LINDEX命令是比较常用的,使用LINDEX,我们可以获取到指定位置的 value ,基本语法:

LINDEX key index

示例 – 获取friends的第一个元素。

redis>LINDEX fruits 0 Banana

下标 (index)为正数时,0表示第一个元素,1表示第二个元素,以此类推。

下标 可以是负数,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

LINSERT(插入元素)

插入元素是一个必要功能,LINSERT可以将值 value 插入到列表 key 当中,位于值 apple 之前或之后,基本语法:

LINSERT key BEFORE|AFTER fruits value

示例 – 将Andy插入到Lucy之前。

redis> LINSERT fruits BEFORE "Apple" "Banana"
(integer) 3

当 Apple 不存在于列表 key 时,不执行任何操作。

当 key 不存在时, key 被视为空列表,不执行任何操作。

如果 key 不是列表类型,返回一个错误。

LREM(移除列表元素)

在redis中,移除列表元素使用LREM命令,根据参数 count 的值,移除列表中与参数 value 相等的元素,基本语法:

LREM key count value

示例 – 移除fruits中,所有的名叫’Apple’的元素。

redis> LREM fruits 0 Apple
(integer) 1

count 的值可以是以下几种: count > 0 : 从表头开始向表尾搜索,移除与 value 相等的元素,数量为 count 。 count < 0 : 从表尾开始向表头搜索,移除与 value 相等的元素,数量为 count 的绝对值。 count = 0 : 移除表中所有与 value 相等的值。

LEN(获取到列表的长度)

现在fruits列表中记载着我所有水果的名称,可是要怎样才能知道我现在拥有多少种水果呢?

在redis中,LLEN命令可以获取到列表的长度,基本语法:

LLEN key

示例 – 查看fruits列表长度。

redis> LLEN fruits
(integer) 0

返回列表 key 的长度。

如果 key 不存在,则 key 被解释为一个空列表,返回 0 。

如果 key 不是列表类型,返回一个错误。

LTRIM(修剪元素)

LTRIM可以对一个列表进行修剪,就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除,基本语法:

LTRIM key start stop

示例 – 只保留列表 list 的前三个元素,其余元素全部删除。

LTRIM list 0 2 

下标(index)参数start和stop都以 0 为底,也就是说,以 0 表示列表的第一个元素,以 1 表示列表的第二个元素,以此类推。

你也可以使用负数下标,以 -1 表示列表的最后一个元素, -2 表示列表的倒数第二个元素,以此类推。

Redis 集合(Set)是一个无序的字符串集合.

你可以快速的完成添加、删除、以及测试元素是否存在。

Redis 集合多次添加相同的元素,最终在集合里只会有一个元素。 实际上说这些就是意味着在添加元素的时候无须检测元素是否存在。 一个Redis集合的非常有趣的事情是他支持一些服务端的命令从现有的集合出发去进行集合运算, 可以求交集,并集或差集。

应用场景

  • 使用集合追踪一件(独一无二的)事情,比如想要知道所有访问一个博客文章的独立IP? 每次当你处理一个页面访问时非常简单,因为可以肯定重复的IP是不会被插入的。
  • Redis 集合是很擅长表现关系的。你可以使用Redis集合创建一个标签系统去表现每一个标签。 接下来你能够使用SADD命令将有一个给定tag的所有对象的所有ID添加到一个用来展现这个特定tag的集合里。 你想要同时有三个不同tag的所有对象的ID吗?使用SINTER就好了。
  • 使用 SPOP 或者 SRANDMEMBER 命令你可以使用集合去随意的抽取元素。

SADD(添加)

集合操作中,SADD命令可以将一个或多个 member 元素加入到集合 key 当中,已经存在于集合的 member 元素将被忽略,基本语法:

SADD key member [member ...]

示例 – 添加‘good’到tags集合中。

redis> SADD tags "good"
(integer) 1

假如 key 不存在,则创建一个只包含 member 元素作成员的集合。

当 key 不是集合类型时,返回一个错误。

SPOP(随机取出)

如果我们需要随机取出集合中的某个元素,可以使用SPOP命令,基本语法:

SPOP key

示例:随机取出website集合中的元素。

redis> SPOP tags
"good"

需要注意的是,执行SPOP命令返回的元素将被移除该集合。

SMEMBERS(获取集合中全部的元素)

如果要获取集合中全部的元素,则需要使用SMEMBERS命令,基本语法如下:

SMEMBERS key

示例 – 获取tags集合中全部的元素。

redis> SMEMBERS tags
1) "good"
2) "terrific"

SMEMBERS命令只会返回集合中的全部成员,并不会移除它们,如果集合不存在,则视为空集合。

SCARD(查看集合中元素的数量)

如果想要查看集合中元素的数量,可以使用SCARD命令,基本语法:

SCARD key

示例 – 查看tags集合中元素的数量。

redis>SCARD tags
(integer) 2

执行SCARD命令,当集合存在时,返回集合中元素的数量,若集合不存在,则返回0。

SDIFF(差集)

假如现在有两个集合,我们想要获取到它们之间不同的元素,通常情况下,我们需要通过循环集合来比较,然后取得不同的元素。

在redis里面取得集合的差集非常简单,通过SDIFF命令即可轻松实现,基本语法:

SDIFF key [key …] 示例 – 取得tag1和tag2的差集。

redis> SMEMBERS tag1 1) “a” 2) “b” 3) “c”

redis> SMEMBERS tag2 1) “b” 2) “c” 3) “d”

redis> SDIFF tag1 tag2 1) “a”

如果 key 都存在,则返回一个集合的全部成员,该集合是所有给定集合之间的差集。

不存在的 key 被视为空集。

SINTER(交集)

在 redis 中获取集合的交集也是非常简单的,执行SINTER命令将返回集合的交集,基本语法:

SINTER key [key ...]

示例 – 获取集合tag1和tag2的交集。

redis> SMEMBERS tag1 1) “a” 2) “b” 3) “c”

redis> SMEMBERS tag2 1) “b” 2) “c” 3) “d”

redis> SINTER tag1 tag2 1) “b” 2) “c”

当集合都存在时,将返回一个集合的全部成员,该集合是所有给定集合的交集。

不存在的集合被视为空集。因此,当给定集合当中有一个空集时,结果也为空集(根据集合运算定律)。

SUNION(并集)

既然有差集和交集运算,当然少不了并集,在 redis 中,执行SUNION命令将返回给定集合的并集,基本语法:

SUNION key [key ...]

示例:获取集合tag1和tag2的并集。

redis> SMEMBERS tag1
1) "a"
2) "b"
3) "c"

redis> SMEMBERS tag2
1) "b"
2) "c"
3) "d"

redis> SUNION tag1 tag2
1) "a"
2) "b"
3) "c"
4) "d"

如果给定的集合都存在,则返回一个集合的全部成员,该集合是所有给定集合的并集。

同样,不存在的集合被视为空集。

SISMEMBER(判断集合是否包含某个元素)

如果要判断集合是否包含某个元素也不需要循环对比了,因为 redis 提供SISMEMBER命令可以实现这个功能,基本语法:

SISMEMBER key member

示例 – 判断 member 元素是否集合 key 的成员。

redis> SMEMBERS tags
1) "a"
2) "b"
3) "c"

redis> SISMEMBER tags “a” (integer) 1 如果集合包含给定的元素,则返回1,反之则返回0。

SMOVE(移动元素)

执行SMOVE可以移动元素,基本语法:

SMOVE source destination member

member 元素从 source 集合移动到 destination 集合。SMOVE是原子性操作,因此可以保证数据的一致性。

示例 – 将tag1集合中的歌曲‘a’移动到‘tag2’集合。

redis> SMEMBERS tag1 1) “a” 2) “b”

redis> SMEMBERS tag2 (empty list or set)

redis> SMOVE tag1 tag2 “a” (integer) 1

redis> SMEMBERS tag1 1) “b”

redis> SMEMBERS tag2 1) “a”

如果 source 集合不存在或不包含指定的 member 元素,则SMOVE命令不执行任何操作,仅返回 0 。否则, member 元素从 source 集合中被移除,并添加到 destination 集合中去。

当 destination 集合已经包含 member 元素时,SMOVE命令只是简单地将 source 集合中的 member 元素删除。

当 source 或 destination 不是集合类型时,返回一个错误。

SREM(从集合中移除)

执行命令SREM可以将元素从集合中移除,基本语法:

SREM key member [member ...]

示例 – 从tags集合中移除a。

redis> SMEMBERS tags
1) "a"
2) "b"
3) "c"
4) "d"

redis> SREM tags a # 移除单个元素
(integer) 1

redis> SMEMBERS tags
2) "b"
3) "c"
4) "d"

移除集合 key 中的一个或多个 member 元素,不存在的 member 元素会被忽略。

当 key 不是集合类型,返回一个错误。

Redis 有序集合与普通集合非常相似

是一个没有重复元素的字符串集合。不同之处是有序集合的每个成员都关联了一个评分,这个评分被用来按照从最低分到最高分的方式排序集合中的成员。集合的成员是唯一的,但评分可以重复。

使用有序集合你可以以非常快的速度 添加 、 删除 和 更新 元素。因为元素是有序的, 所以你也可以很快的根据评分(score)或者次序(position)来获取一个范围的元素。

访问有序集合的中间元素也是非常快的,因此你能够使用有序集合作为一个没有重复成员的智能列表。在有序集合中,你可以很快捷的访问一切你需要的东西:有序的元素,快速的存在性测试,快速访问集合的中间元素! 简而言之使用有序集合你可以做完成许多对性能有极端要求的任务,而那些任务使用其他类型的数据库真的是很难完成的。 使用有序集合你可以:

  • 在一个大型的在线游戏中展示一个排行榜,在那里一旦一个新的分数被提交,你可以使用ZADD命令去更新它.你也可用使用ZRANGE命令来得到顶级的用户,你还可以使用ZRANK命令根据用户名返回该用户在排行榜中的位次。
  • 有序集合常常被用来索引存储在 Redis 中的数据。举个例子,如果你有许多的 哈希 (Hashes)来代表用户,你可以使用一个有序集合,这个集合中的元素的年龄字段被用来当做评分,而ID作为值。因此,使用ZRANGEBYSCORE命令,那是微不足道的并且能够很快的接收到给定年龄段的所有用户。

ZADD(添加)

在redis中,使用ZADD命令将一个或多个 member 元素及其 score 值加入到有序集 key 当中,基本语法:

ZADD key score member [[score member] [score member] ...]

示例 – 添加zhangsanstudent集合,评分10。

redis> ZADD student 10 zhangsan
(integer) 1

如果某个 member 已经是有序集的成员,那么更新这个 memberscore 值,并通过重新插入这个 member 元素,来保证该 member 在正确的位置上。

score 值可以是整数值或双精度浮点数。

如果 key 不存在,则创建一个空的有序集并执行ZADD操作。

key 存在但不是有序集类型时,返回一个错误。

ZREM(移除指定成员)

ZREM命令可以移除指定成员,基本语法如下:

ZREM key member [member ...]

示例 – 移除student集合中zhangsan元素。

redis> ZREM student zhangsan

执行成功,zhangsan元素将从student集合中移除,如果zhangsan不存在,将被忽略。

如果 rank 集合存在但不是有序集类型时,返回一个错误。

ZSCORE(获取成员评分)

redis中使用ZSCORE命令来获取成员评分,基本语法:

ZSCORE key member

示例 – 获取集合student中元素zhangsan的评分。

redis> ZSCORE student zhangsan              # 注意返回值是字符串

如果 zhangsan 是集合 student 的成员,则返回成员 zhangsan 的评分值。

如果 zhangsan 元素不是有序集 student 的成员,或 zhangsan 不存在,则返回 nil 。

ZRANGE(获取集合成员)

如果想要获取集合成员,可以使用ZRANGE命令,基本语法:

ZRANGE key start stop [WITHSCORES]

示例 – 获取student集合的全部成员。

redis > ZRANGE salary 0 -1 WITHSCORES             # 显示整个有序集成员
1) "zhangsan"
2) "80"
3) "lisi"
4) "90"
5) "wangwu"
6) "100"

返回的成员的位置按 score 值递增(从小到大)来排序。

ZCARD(查看集合成员的数量)

如果需要查看集合成员的数量,那么我们需要使用到ZCARD命令,基本语法如下:

ZCARD key

示例 – 查看student集合的成员数量。

redis > ZCARD student
(integer) 2

执行成功,将返回有序集 student 的成员总数。

ZCOUNT(可以查看成员的数量)

除了ZCARD命令以外,ZCOUNT命令也可以查看成员的数量,和前者不同的是,ZCOUNT命令可以设定评分的最小和最大值:

ZCOUNT key min max

示例 – 查看分数在80-90之间的人数。

redis> ZRANGE student 0 -1 WITHSCORES # 测试数据 1) “zhangsan” 2) “80” 3) “lisi” 4) “90” 5) “wangwu” 6) “100”

redis> ZCOUNT student 80 90
(integer) 2

执行成功,将返回有序集 key 中, score 值在 min 和 max 之间(默认包括 score 值等于 min 或 max )的成员的数量。

ZRANK()

ZRANK命令可以获取到给定元素在集合中的排名,排名依据 评分(score) 值递增(从小到大)顺序排列,语法格式:

ZRANK key member 示例 – 显示 lisi 的分数排名。

redis> ZRANGE student 0 -1 WITHSCORES        # 显示所有成员及其 score 值
1) "zhangsan"
2) "80"
3) "lisi"
4) "90"
5) "wangwu"
6) "100"

redis> ZRANK salary lisi                    
(integer) 1

排名以 0 为底,也就是说, score 值最小的成员排名为 0 。

使用 ZREVRANK 命令可以获得成员按 score 值递减(从大到小)排列的排名。

ZINCRBY(评分值加上增量)

ZINCRBY命令可以为给定的成员评分值加上增量,语法格式:

ZINCRBY key increment member

示例 – 为student集合中的lisi加10分。

redis> ZSCORE student lisi
"90"

redis> ZINCRBY student 500 lisi 
"100"

可以通过传递一个负数值 increment ,让 score 减去相应的值,比如 ZINCRBY key -5 member ,就是让 member 的 score 值减去 5 。

当 key 不存在,或 member 不是 key 的成员时, ZINCRBY key increment member 等同于 ZADD key increment member

当 key 不是有序集类型时,返回一个错误。

score 值可以是整数值或双精度浮点数。

KEYS

Redis 的keys命令用于管理键。使用 Redis 的keys命令,语法格式:

KEYS pattern

查找所有符合给定模式 pattern 的 key 。

示例 – 查找包含o的键。

redis> MSET first 1 second 2 third 3 fourth 4  # 一次设置 4 个 key
OK

redis> KEYS *i*
1) "first"
2) "third"

KEYS * 匹配数据库中所有 key 。

KEYS w?rld 匹配 world , wllrld 和 wkrld 等。 ?匹配任意一个字符

KEYS w*rld 匹配 world 和 woorld 等。 * 匹配任意长度字符

KEYS w[cd]rld 匹配 wcrld 和 wdrld ,但不匹配 wkrld 。 [] 匹配中间的任意一个字符

特殊符号用 \ 隔开。

EXISTS

EXISTS命令的作用是判断指定key是否存在,语法格式如下:

EXISTS key

示例 – 判断student是否存在。

redis> SET student “zhangsan” OK

redis> EXISTS student (integer) 1

redis> DEL student (integer) 1

redis> EXISTS student (integer) 0 若 key 存在,返回 1 ,否则返回 0 。

SORT(排序)

排序是很常见的需求,在 redis 中可以使用SORT命令来实现排序,语法格式如下:

SORT key [BY pattern] [LIMIT offset count] [GET pattern [GET pattern …]] [ASC | DESC] [ALPHA] [STORE destination] 示例

标签列表

redis> LPUSH tag 4 3 1 2 (integer) 4

排序

redis> SORT tag 1) “1” 2) “2” 3) “3” 4) “4”

使用SORT命令,可以返回或保存给定列表、集合、有序集合 key 中经过排序的元素。

排序默认以数字作为对象,值被解释为双精度浮点数,然后进行比较。

EXPIRE

为key设置生存时间需要使用EXPIRE命令,语法格式:

EXPIRE key seconds

示例 – 设置rank的过期时间为30秒。

redis> EXPIRE rank 30  # 设置过期时间为 30 秒
(integer) 1

为给定 key 设置生存时间,当 key 过期时(生存时间为 0 ),它会被自动删除。

在 Redis 中,带有生存时间的 key 被称为『易失的』(volatile)。

生存时间可以通过使用 DEL 命令来删除整个 key 来移除,或者被 SET 和 GETSET 命令覆写(overwrite),这意味着,如果一个命令只是修改(alter)一个带生存时间的 key 的值而不是用一个新的 key 值来代替(replace)它的话,那么生存时间不会被改变。

TTL

TTL命令的作用是获取给定 key 剩余生存时间(TTL, time to live),语法格式如下:

TTL key

示例 – 查看key剩余生存时间。

redis> EXPIRE key 10086
(integer) 1

redis> TTL key
(integer) 10084

当 key 不存在时,返回 -2 。 当 key 存在但没有设置剩余生存时间时,返回 -1 。 否则,以秒为单位,返回 key 的剩余生存时间。

111111111111111111