Redis学习笔记1

125 阅读5分钟

简介

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

  1. "hello world" -- message键的值

  2. "10086" -- number键的值

  3. "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

  1. (nil) -- 键k1、 k2和k3都不存在
  2. (nil)
  3. (nil)
  4. "hello world" -- 键k4已存在

redis> MSETNX k1 "one" k2 "two" k3 "three" k4 "four"

(integer) 0 -- 因为键k4已存在,所以MSETNX未能执行设置操作

redis> MGET k1 k2 k3 k4 -- 各个键的值没有变化

  1. (nil)
  2. (nil)
  3. (nil)
  4. "hello world"

如果只对不存在的键k1、k2和k3进行设置,那么MSETNX可以正常地完成设置操作:

redis> MSETNX k1 "one" k2 "two" k3 "three"
(integer) 1 -- 所有给定键都不存在,成功执行设置操作
redis> MGET k1 k2 k3 k4

  1. "one" -- 刚刚使用MSETNX设置的3个值
  2. "two"
  3. "three"
  4. "hello world" -- 之前已经存在的键k4的值没有改变