Skip to main content

非关系型数据库服务器-Redis

非关系型数据库服务器-Redis

统信服务器操作系统中集成的非关系型数据库有Redis、mongodb。

概述

Redis是一个高性能Key-Value存储系统,使用ANSI C编写,它通常被称为数据结构服务器。因为值(value)可以是字符串(String)、哈希(hashes)、列表(list)、集合(sets)和有序集合(sorted sets)等类型,Redis是最流行的键值对存储数据库。

Redis安装

133执行如下命令,安装redis包。

yum install redis

134执行如下命令,查看版本号。

redis-cli -v

Redis启动

135执行如下命令,启动redis服务。

systemctl start redis.service

136执行如下命令,查看redis服务状态。

systemctl status redis.service

Active:active (running)since Fri 2021-01-2215:06:13 CST;4sago Main PID:5648 (redis-server) Tasks:4 Memory: 4.1M CGroup:/system.slice/redis.service -5648 /usr/bin/redis-server 127.0.0.1:6379 1月22 15:06:13 localhost.1ocaldomain systemd[1]:Starting Redis persistent key-value database... 1月22 15:06:13 1ocalhost. localdomain systemd [1]:Started Redis persistent key-value database.)

137执行如下命令,检查端口监听状态。

lsof -i:6379

Redis配置

您可以通过修改“redis.conf”文件或使用CONFIG set命令来修改配置。

  • 语法:Redis CONFIG命令格式如下。

redis 127.0.0.1:6379> CONFIG GET CONFIG_SETTING_NAME

  • 实例

138执行如下命令。

redis 127.0.0.1:6379> CONFIG GET loglevel

  1. "loglevel"

  2. "notice"

2)"notice" 127.0.0.1:6379>)

139使用*号获取所有配置项:

2)"dump.rdb" 3)"requirepass 4) 1111 "masterauth" 5) 6) 1111 c-nounc- 7) 11 11 8) 9)"unixsocket" 1111 10) 11)"logfile" 12)"/var/log/redis/redis.log" 13) "pidfile" 14)"/var/run/redis_6379.pid" 15)"slave-announce-ip" 16)"" 17)"maxmemory")

140设置redis密码。

127.0.0.1:6379> CONFIG SET requirepass “密码”

OK

127.0.0.1:6379> AUTH “密码”

OK

:::note 重启服务后,这样的设置会丢失,永久配置还需要写进“/etc/redis.conf”文件中。 :::

Redis连接

Redis-cli连接命令主要是用于连接redis服务。

  • 语法1:Redis客户端的基本语法如下。

$ redis-cli

  • 实例1:此实例讲解了如何启动redis客户端。启动redis客户端,并执行redis-cli命令,连接本地的redis服务。

$redis-cli

redis 127.0.0.1:6379> PING

PONG

在以上实例中我们连接到本地的redis服务并执行PING命令,该命令用于检测redis服务是否启动。如果需要在远程redis服务上执行命令,我们同样使用的也是redis-cli命令。

  • 语法2

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

  • 实例2:此实例演示了如何连接到主机为127.0.0.1、端口为6379、无密码的redis服务上。

$ redis-cli -h 127.0.0.1 -p 6379 -a ""

redis 127.0.0.1:6379>

redis 127.0.0.1:6379> PING

PONG

  • 实例3:此实例演示了在客户端如何通过验证密码连接到redis服务,并检测服务是否在运行。

redis-cli -h 127.0.0.1 -p 6379 -a "password"

redis 127.0.0.1:6379> AUTH "password"

OK

redis 127.0.0.1:6379> PING

PONG

Redis连接命令

下表列出了redis连接的基本命令。

表4.1redis基本命令

序号 命令及描述

1
AUTH password:验证密码是否正确。

2
ECHO message:打印字符串。

3
PING:查看服务是否运行。

4
QUIT:关闭当前连接。

5
SELECT index:切换到指定的数据库。

Redis键(key)

Redis键命令用于管理redis的键。

  • 语法:Redis键命令的基本语法如下。

redis 127.0.0.1:6379> COMMAND KEY_NAME

  • 实例

redis 127.0.0.1:6379> SET w3ckey redis

OK

redis 127.0.0.1:6379> DEL w3ckey

(integer) 1

127.0.0.1:6379> DEL w3ckey (integer) 0)

在以上实例中,DEL是一个命令,w3ckey是一个键。如果键被删除成功,执行命令后,会输出(integer) 1;否则,将输出(integer) 0。

Redis keys命令

表4.2给出了与Redis键相关的基本命令。

表4.1redis键操作命令

序号 命令及描述

1
DEL key:该命令用于在key存在时删除key。

2
DUMP key:序列化给定key,并返回被序列化的值。

3
EXISTS key:检查给定key是否存在。

4
EXPIRE key seconds:为给定key设置过期时间。

5
EXPIREAT key timestamp EXPIREAT:作用和EXPIRE类似,都用于为key设置过期时间。不同点在于EXPIREAT命令接受的时间参数是UNIX时间戳(unix timestamp)。

6
PEXPIRE key milliseconds:设置key的过期时间以毫秒计。

7
PEXPIREAT key milliseconds-timestamp:设置key过期时间的时间戳(unix timestamp)以毫秒计。

8
KEYS pattern:查找所有符合给定模式(pattern)的key。

9
MOVE key db:将当前数据库的key移动到给定的数据库db当中。

10
PERSIST key:移除key的过期时间,key将持久保持。

11
PTTL key:以毫秒为单位返回key的剩余的过期时间。

12
TTL key;以秒为单位,返回给定key的剩余生存时间(TTL,time to live)。

13
RANDOMKEY:从当前数据库中随机返回一个key。

14
RENAME key newkey:修改key的名称。

15
RENAMENX key newkey:仅当newkey不存在时,将key改名为newkey。

16
TYPE key:返回key所储存的值的类型。

Redis字符串(String)

string是redis最基本的类型,您可以理解成和Memcached一模一样的类型,一个key对应一个value。

string类型是二进制安全的,意思是redis的string可以包含任何数据,比如jpg图片或者序列化的对象。

string类型是Redis最基本的数据类型,一个键最大能存储512MB。

  • 语法

redis 127.0.0.1:6379> COMMAND KEY_NAME

  • 实例1

redis 127.0.0.1:6379> SET w3ckey redis

OK

redis 127.0.0.1:6379> GET w3ckey

"redis"

在以上实例中,我们使用了SET和GET命令,键为w3ckey。

  • 实例2

redis 127.0.0.1:6379> SET name "redis.net.cn"

OK

redis 127.0.0.1:6379> GET name

"redis.net.cn"

在以上实例中我们使用了Redis的SET和GET命令,键为name,对应的值为redis.net.cn。

  • Redis字符串命令:下表列出了常用的redis字符串命令。

表4.1redis字符串命令

序号 命令和描述

1
SET key value:设置指定key的值

2
GET key:获取指定key的值。

3
GETRANGE key start end:返回key中字符串值的子字符。

4
GETSET key value:将给定key的值设为value,并返回key的旧值(old value)。

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

6
MGET key1 [key2..]:获取所有(一个或多个)给定key的值。

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

8
SETEX key seconds value:将值value关联到key,并将key的过期时间设为seconds(以秒为单位)。

9
SETNX key value:只有在key不存在时设置key的值。

10
SETRANGE key offset value:用value参数覆写给定key所储存的字符串值,从偏移量offset开始。

11
STRLEN key:返回key所储存的字符串值的长度。

12
MSET key value [key value ...]:同时设置一个或多个key-value对。

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

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

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

16
INCRBY key increment:将key所储存的值加上给定的增量值(increment)。

17
INCRBYFLOAT key increment:将key所储存的值加上给定的浮点增量值(increment)。

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

19
DECRBY key decrement key:所储存的值减去给定的减量值(decrement)。

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

Redis哈希(Hash)

Redis hash是一个键值对集合。Redis hash是一个string类型的field和value的映射表,hash特别适合用于存储对象。Redis中每个hash可以存储232 - 1个键值对(40多亿)。

  • 实例

redis 127.0.0.1:6379> HMSET user:1 username redis.net.cn password redis.net.cn points 200

OK

redis 127.0.0.1:6379> HGETALL user:1

  1. "username"

  2. "redis.net.cn"

  3. "password"

  4. "redis.net.cn"

  5. "points"

  6. "200"

redis 127.0.0.1:6379>

2)"redis.net.cn" 3)"password" 4)"redis.net.cn" 5) "points" 6)"200" 127.0.0.1:6379>)

在以上实例中,hash数据类型存储了包含用户脚本信息的用户对象,使用了Redis的HMSET和HGETALL命令,user:1为键值。

  • Redis hash命令:下表列出了redis hash基本的相关命令。

表4.1redis hash命令描述

序号 命令及描述

1
HDEL key field2 [field2]:删除一个或多个哈希表字段。

2
HEXISTS key field:查看哈希表key中,指定的字段是否存在。

3
HGET key field:获取存储在哈希表中指定字段的值。

4
HGETALL key:获取在哈希表中指定key的所有字段和值。

5
HINCRBY key field increment:为哈希表key中的指定字段的整数值加上增量increment。

6
HINCRBYFLOAT key field increment:为哈希表key中的指定字段的浮点数值加上增量increment。

7
HKEYS key:获取所有哈希表中的字段。

8
HLEN key:获取哈希表中字段的数量。

9
HMGET key field1 [field2]:获取所有给定字段的值。

10
HMSET key field1 value1 [field2 value2 ]:同时将多个field-value(域-值)对设置到哈希表key中。

11
HSET key field value:将哈希表key中的字段field的值设为value。

12
HSETNX key field value:只有在字段field不存在时,设置哈希表字段的值。

13
HVALS key:获取哈希表中所有值。

14
HSCAN key cursor [MATCH pattern] [COUNT count]:迭代哈希表中的键值对。

Redis列表(List)

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

一个列表最多可以包含232-1个元素(4294967295,每个列表超过40亿个元素)。如下示例:

redis 127.0.0.1:6379> lpush redis.net.cn redis

(integer) 1

redis 127.0.0.1:6379> lpush redis.net.cn mongodb

(integer) 2

redis 127.0.0.1:6379> lpush redis.net.cn rabitmq

(integer) 3

redis 127.0.0.1:6379> lrange redis.net.cn 0 10

  1. "rabitmq"

  2. "mongodb"

) "redis"

redis 127.0.0.1:6379>

127.0.0.1:6379> 1push redis.net. cn mongodb (integer)2 127.0.0.1:6379> push redis.net.cn rabitmq (integer)3 127.0.0.1:6379> lrange redis.net.cn 0 10

  1. "rabitmq" 2)"mongodb" 3)"redis" 127.0.0.1:6379>)

下表列出了Redis列表相关的基本命令。

表4.1redis列表命令描述

序号 命令及描述

1
BLPOP key1 [key2 ] timeout:移出并获取列表的第一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

2
BRPOP key1 [key2 ] timeout:移出并获取列表的最后一个元素,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

3
BRPOPLPUSH source destination timeout:从列表中弹出一个值,将弹出的元素插入到另外一个列表中并返回它,如果列表没有元素会阻塞列表直到等待超时或发现可弹出元素为止。

4
LINDEX key index:通过索引获取列表中的元素。

5
LINSERT key BEFORE|AFTER pivot value:在列表的元素前或者后插入元素。

6
LLEN key:获取列表长度。

7
LPOP key:移出并获取列表的第一个元素。

8
LPUSH key value1 [value2]:将一个或多个值插入到列表头部。

9
LPUSHX key value:将一个或多个值插入到已存在的列表头部。

10
LRANGE key start stop:获取列表指定范围内的元素。

11
LREM key count value:移除列表元素。

12
LSET key index value:通过索引设置列表元素的值。

13
LTRIM key start stop:对一个列表进行修剪(trim),就是说,让列表只保留指定区间内的元素,不在指定区间之内的元素都将被删除。

14
RPOP key:移除并获取列表最后一个元素。

15
RPOPLPUSH source destination:移除列表的最后一个元素,并将该元素添加到另一个列表并返回。

16
RPUSH key value1 [value2]:在列表中添加一个或多个值。

17
RPUSHX key value:为已存在的列表添加值。

Redis集合(Set)

Redis的Set是string类型的无序集合。集合成员是唯一的,这就意味着集合中不能出现重复的数据。Redis中集合是通过哈希表实现的,所以添加、删除、查找的复杂度都是O(1)。集合中最大的成员数为232-1(4294967295,每个集合可存储40多亿个成员)。

  • 实例

redis 127.0.0.1:6379> SADD w3ckey redis

(integer) 1

redis 127.0.0.1:6379> SADD w3ckey mongodb

(integer) 1

redis 127.0.0.1:6379> SADD w3ckey mysql

(integer) 1

redis 127.0.0.1:6379> SADD w3ckey mysql

(integer) 0

redis 127.0.0.1:6379> SMEMBERS w3ckey

  1. "mysql"

  2. "mongodb"

  3. "redis"

127.0.0.1:6379> SADD w3ckey redis (integer)0 127.0.0.1:6379> SADD w3ckey mongodb (integer)0 127.0.0.1:6379> SADD w3ckey mysq1 (integer)0 127.0.0.1:6379> SMEMBERS w3ckey 1)"redis" 2)"mysql" 3)"mongodb" 127.0.0.1:6379>)

在以上实例中,我们通过SADD命令向名为w3ckey的集合插入三个元素。

  • Redis集合命令:下表列出了Redis集合的基本命令。

表4.1redis集合命令描述

序号 命令及描述

1
SADD key member1 [member2]:向集合添加一个或多个成员。

2
SCARD key:获取集合的成员数。

3
SDIFF key1 [key2]:返回给定所有集合的差集。

4
SDIFFSTORE destination key1 [key2]:返回给定所有集合的差集并存储在destination中。

5
SINTER key1 [key2]:返回给定所有集合的交集。

6
SINTERSTORE destination key1 [key2]:返回给定所有集合的交集并存储在destination中。

7
SISMEMBER key member:判断member是否是集合key的成员。

8
SMEMBERS key:返回集合中的所有成员。

9
SMOVE source destination member:将member元素从source集合移动到destination集合。

10
SPOP key:移除并返回集合中的一个随机元素。

11
SRANDMEMBER key [count]:返回集合中一个或多个随机数。

12
SREM key member1 [member2]:移除集合中一个或多个成员。

13
SUNION key1 [key2]:返回所有给定集合的并集。

14
SUNIONSTORE destination key1 [key2]:所有给定集合的并集存储在destination集合中。

15
SSCAN key cursor [MATCH pattern] [COUNT count]:迭代集合中的元素。

Redis事务

Redis事务可以一次执行多个命令,并且带有以下两个重要的保证:

  • 事务是一个单独的隔离操作:事务中的所有命令都会序列化、按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求所打断。

  • 事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。

一个事务从开始到执行会经历三个阶段,即开始事务、命令入队、执行事务。

以下是一个事务的例子,它先以MULTI开始一个事务,然后将多个命令入队到事务中,最后由EXEC命令触发事务,一并执行事务中的所有命令。

redis 127.0.0.1:6379> MULTI

OK

redis 127.0.0.1:6379> SET book-name "Mastering C++ in 21 days"

QUEUED

redis 127.0.0.1:6379> GET book-name

QUEUED

redis 127.0.0.1:6379> SADD tag "C++" "Programming" "Mastering Series"

QUEUED

redis 127.0.0.1:6379> SMEMBERS tag

QUEUED

redis 127.0.0.1:6379> EXEC

  1. OK

  2. "Mastering C++ in 21 days"

  3. (integer) 3

    1. "Mastering Series"

    2. "C++"

    3. "Programming"

2)"Mastering C++ in 21 days" 3)(integer)3 42) ein Serie 2)"Programming 3)"C++" 127.0.0.1:6379>)

表4.7列出了redis事务的相关命令。

表4.1redis事务命令描述

序号 命令及描述

1
DISCARD:取消事务,放弃执行事务块内的所有命令。

2
EXEC:执行所有事务块内的命令。

3
MULTI:标记一个事务块的开始。

4
UNWATCH:取消WATCH命令对所有key的监视。

5
WATCH key [key ...]:监视一个或多个key,如果在事务执行之前这个或这些key被其他命令所改动,那么事务将被打断。

Redis脚本

使用Lua解释器来执行Redis脚本。Reids 2.6版本通过内嵌支持Lua环境。执行脚本的常用命令为EVAL。

  • 语法:Eval命令的基本语法如下。

redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]

  • 实例:以下实例演示了redis脚本的工作过程。

redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second

  1. "key1"

  2. "key2"

  3. "first"

  4. "second"

  5. "key2" 3)"first" 4)"second")

  • Redis脚本命令:下表列出了redis脚本常用命令。

表4.1redis脚本命令描述

序号 命令及描述

1
EVAL script numkeys key [key ...] arg [arg ...]:执行Lua脚本。

2
EVALSHA sha1 numkeys key [key ...] arg [arg ...]:执行Lua脚本。

3
SCRIPT EXISTS script [script ...]:查看指定的脚本是否已经被保存在缓存当中。

4
SCRIPT FLUSH:从脚本缓存中移除所有脚本。

5
SCRIPT KILL:杀死当前正在运行的Lua脚本。

6
SCRIPT LOAD script:将脚本script添加到脚本缓存中,但并不立即执行这个脚本。

Redis服务器

Redis服务器命令主要是用于管理redis服务。

  • 实例:以下实例演示了如何获取redis服务器的统计信息。

redis 127.0.0.1:6379> INFO

Server

redis_version:2.8.13

redis_git_sha1:00000000

redis_git_dirty:0

redis_build_id:c2238b38b1edb0e2

redis_mode:standalone

os:Linux 3.5.0-48-generic x86_64

arch_bits:64

multiplexing_api:epoll

gcc_version:4.7.2

process_id:3856

run_id:0e61abd297771de3fe812a3c21027732ac9f41fe

tcp_port:6379

uptime_in_seconds:11554

uptime_in_days:0

hz:10

lru_clock:16651447


  • Redis 服务器命令:下表列出了redis服务器的相关命令。

表4.1redis服务器命令描述

序号 命令及描述

1
BGREWRITEAOF:异步执行一个AOF(AppendOnly File)文件重写操作。

2
BGSAVE:在后台异步保存当前数据库的数据到磁盘。

3
CLIENT KILL [ip:port] [ID client-id]:关闭客户端连接。

4
CLIENT LIST:获取连接到服务器的客户端连接列表。

5
CLIENT GETNAME:获取连接的名称。

6
CLIENT PAUSE timeout:在指定时间内终止运行来自客户端的命令。

7
CLIENT SETNAME connection-name:设置当前连接的名称。

8
CLUSTER SLOTS:获取集群节点的映射数组。

9
COMMAND:获取Redis命令详情数组。

10
COMMAND COUNT:获取Redis命令总数。

11
COMMAND GETKEYS:获取给定命令的所有键。

12
TIME:返回当前服务器时间。

13
COMMAND INFO command-name [command-name ...]:获取指定Redis命令描述的数组。

14
CONFIG GET parameter:获取指定配置参数的值。

15
CONFIG REWRITE:对启动Redis服务器时所指定的redis.conf配置文件进行改写。

16
CONFIG SET parameter value:修改redis配置参数,无需重启。

17
CONFIG RESETSTAT:重置INFO命令中的某些统计数据。

18
DBSIZE:返回当前数据库的key的数量。

19
DEBUG OBJECT key:获取key的调试信息。

20
DEBUG SEGFAULT:让Redis服务崩溃。

21
FLUSHALL:删除所有数据库的所有key。

22
FLUSHDB:删除当前数据库的所有key。

23
INFO [section]:获取Redis服务器的各种信息和统计数值。

24
LASTSAVE:返回最近一次Redis成功将数据保存到磁盘上的时间,以UNIX时间戳格式表示。

25
MONITOR:实时打印出Redis服务器接收到的命令,调试用。

26
ROLE:返回主从实例所属的角色。

27
SAVE:异步保存数据到硬盘。

28
SHUTDOWN [NOSAVE] [SAVE]:异步保存数据到硬盘,并关闭服务器。

29
SLAVEOF host port:将当前服务器转变为指定服务器的从属服务器(slave server)。

30
SLOWLOG subcommand [argument]:管理redis的慢日志。

31
SYNC:用于复制功能(replication)的内部命令。

参考

Redis其他操作请参见redis的官网指导:

  • https://www.redis.net.cn/tutorial/3501.html

  • http://www.redis.cn/documentation.html