简介
Redis是一个由名字叫Salvatore Sanfilippo(昵称:Antirez)开发的开源内存数据结构存储器,经常用作数据库、缓存以及消息代理等。
Redis最重要的特点:
结构丰富
Redis为用户提供了字符串、散列、列表、集合、有序集合、HyperLogLog、位图、流、地理坐标等一系列丰富的数据结构,每种数据结构都适用于解决特定的问题。
功能完备
Redis提供了很多非常实用的附加功能,比如自动过期、流水线、事务、数据持久化等。
速度飞快
内存数据库,它将所有数据存储在内存中。
用户友好
Redis API遵循的是UNIX“一次只做一件事,并把它做好”的设计哲学。Redis的API虽然丰富,但它们大部分都非常简短,并且只需接受几个参数就可以完成用户指定的操作。
支持广泛
Redis已经在互联网公司得到广泛应用,许多开发者为不同的编程语言开发了相应的客户端。
数据结构之字符串
SET:为字符串键设置值
SET key value
例子:
创建出一个字符串键,它的键为"number",值为"10086"
SET number "10086"
注解(个人理解):这里可以看到key是不带引号的,value是带引号的。
Redis数据库是以无序的方式存放数据库键的,一个新加入的键可能会出现在数据库的任何位置上,因此我们在使用Redis的过程中不应该对键在数据库中的摆放位置做任何假设,以免造成错误。
在默认情况下,对一个已经设置了值的字符串键执行SET命令将导致键的旧值被新值覆盖。
用户可以通过向SET命令提供可选的NX选项或者XX选项来指示SET命令是否要覆盖一个已经存在的值。
如果用户在执行SET命令时给定了NX选项,那么SET命令只会在键没有值的情况下执行设置操作,并返回OK表示设置成功;如果键已经存在,那么SET命令将放弃执行设置操作,并返回空值nil表示设置失败。
以下代码展示了带有NX选项的SET命令的行为:
redis> SET password "123456" NX
OK -- 对尚未有值的password键进行设置,成功
redis> SET password "999999" NX
(nil) -- password键已经有了值,设置失败
如果用户在执行SET命令时给定了XX选项,那么SET命令只会在键已经有值的情况下执行设置操作,并返回OK表示设置成功;如果给定的键并没有值,那么SET命令将放弃执行设置操作,并返回空值nil表示设置失败。
GET:获取字符串键的值
GET key
redis> GET number
"10086"
如果用户给定的字符串键在数据库中并没有与之相关联的值,那么GET命令将返回一个空值nil。
GETSET:获取旧值并设置新值
GETSET命令就像GET命令和SET命令的组合版本,GETSET首先获取字符串键目前已有的值,接着为键设置新值,最后把之前获取到的旧值返回给用户。
GETSET key new_value
redis> GET number -- number键现在的值为"10086"
"10086"
redis> GETSET number "12345"
"10086" -- 返回旧值
redis> GET number -- number键的值已被更新为"12345"
"12345"
如果被设置的键并不存在于数据库,那么GETSET命令将返回空值作为键的旧值。
redis> GET counter
(nil) -- 键不存在
redis> GETSET counter 50
(nil) -- 返回空值作为旧值
redis> GET counter
"50"
MSET:一次为多个字符串键设置值
MSET key value [key value ...]
以下代码展示了如何使用一条MSET命令去设置message、number和homepage这3个键:
redis> MSET message "hello world" number "10086" homepage "redis.io"
OK
redis> GET message
"hello world"
redis> GET number
"10086"
redis> GET homepage
"redis.io"
与SET命令一样,MSET命令也会在执行设置操作之后返回OK表示设置成功。此外,如果给定的字符串键已经有相关联的值,那么MSET命令也会直接使用新值去覆盖已有的旧值。
MGET:一次获取多个字符串键的值
MGET key [key ...]
以下代码展示了如何使用一条MGET命令去获取message、number和homepage这3个键的值:
redis> MGET message number homepage
"hello world" -- message键的值
"10086" -- number键的值
"redis.io" -- homepage键的值
与GET命令一样,MGET命令在碰到不存在的键时也会返回空值。
MSETNX:只在键不存在的情况下,一次为多个字符串键设置值
MSETNX key value [key value ...]
MSETNX与MSET的主要区别在于,MSETNX只会在所有给定键都不存在的情况下对键进行设置,而不会像MSET那样直接覆盖键已有的值:如果在给定键当中,即使有一个键已经有值了,那么MSETNX命令也会放弃对所有给定键的设置操作。MSETNX命令在成功执行设置操作时返回1,在放弃执行设置操作时则返回0。
redis> MGET k1 k2 k3 k4
- (nil) -- 键k1、 k2和k3都不存在
- (nil)
- (nil)
- "hello world" -- 键k4已存在
redis> MSETNX k1 "one" k2 "two" k3 "three" k4 "four"
(integer) 0 -- 因为键k4已存在,所以MSETNX未能执行设置操作
redis> MGET k1 k2 k3 k4 -- 各个键的值没有变化
- (nil)
- (nil)
- (nil)
- "hello world"
如果只对不存在的键k1、k2和k3进行设置,那么MSETNX可以正常地完成设置操作:
redis> MSETNX k1 "one" k2 "two" k3 "three"
(integer) 1 -- 所有给定键都不存在,成功执行设置操作
redis> MGET k1 k2 k3 k4
- "one" -- 刚刚使用MSETNX设置的3个值
- "two"
- "three"
- "hello world" -- 之前已经存在的键k4的值没有改变