@Redis常用功能介绍

Redis

一、Redis配置

【1、查看配置】

redis 127.0.0.1:6379> CONFIG GET *

redis++有哪些接口 redis常用功能_客户端

【2、修改配置】

redis 127.0.0.1:6379> CONFIG SET loglevel “notice”

【3、配置说明】

1)、设置密码:requirepass

config set requirepass zx123456

2)、密码登陆:auth

auth zx123456

3)、每次更新进行日志记录:appendonly

config set appendonly yes

4)、多长时间,多少次更新,将数据同步到数据文件: save

Redis默认配置文件中提供了三个条件:

save 900 1
save 300 10
save 60 10000

分别表示900秒(15分钟)内有1个更改,300秒(5分钟)内有10个更改以及60秒内有10000个更改

5)、指定更新日志条件,共有3个可选值: appendfsync

no:表示等操作系统进行数据缓存同步到磁盘(快)
always:表示每次更新操作后手动调用fsync()将数据写到磁盘(慢,安全)
everysec:表示每秒同步一次(折中,默认值)

6)、是否启用*【虚拟内存机制】*,默认值为no:vm-enabled

VM机制将数据分页存放,由Redis将访问量较少的页即冷数据swap到磁盘上,访问多的页面由磁盘自动换出到内存中。【2.6版本后被去除】

二、数据类型

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

1)、string【最大能存储 512MB】

序号

命令

描述

1

set key value

新增

2

get key

查询

3

del key

删除

4

getrange key stare end

返回 key 中字符串值的子字符,字符串截取

5

getset key value

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

6

getbit key offset

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

7

mget key1 [key2…]

获取所有(一个或多个)给定 key 的值。

8

setbit key offset value

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

9

setex key seconds value

设置 key 的值并设置过期时间(秒)

10

setrange key offset value

用 value 值覆盖给定 key 所储存的字符串值,从偏移量 offset 开始。

11

strlen key

获取 key 值长度

12

mset key1 value1 [key2 value2…]

同时设置多个键值对

13

msetnx key1 value1 [key2 value2…]

同时设置多个键值对,当且仅当所有的 key 都不存在

14

psetex key milliseconds value

类似setex,以毫秒为单位设置 key 的生存时间

15

incr key

将 key 中储存的数字值增1,只对 intrger 有效

16

incrby key increment

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

17

incrbyfloat key increment

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

18

decr key

将 key 中储存的数字值减1,只对 intrger 有效

19

decrby key increment

将 key 所储存的值减去给定的减量值(decrement)

20

append key value

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

2)、hash【最大2^32 -1 键值对(40多亿)】

hmset hash field1 1 field2 2 (map hash 新增key field1 和 field2)
hget hash field1 (查询map hash key 为 field1)

3)、list【最多可存储 2^32 - 1 元素 (4294967295, 每个列表可存储40多亿)】

lpush list 1 (列表(头部)左边插入值1)
rpush list 4 (列表(尾部)右边插入值4)
lrange list stop end (从列表list取出(头部)指定范围值)

4)、set【string类型的无序集合,通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1),元素唯一】

sadd set 1 (添加一个 string 元素到 key 对应的 set 集合中,成功返回1,如果元素已经在集合中返回 0,如果 key 对应的 set 不存在则返回错误)
smembers set (查看set)

5)、zset【string类型元素的集合,且不允许重复的成员,每个元素都会关联一个double类型的分数。redis正是通过分数来为集合中的成员进行从小到大的排序】

语法:zadd key score member
zadd zset 0 1 (新增值1,分数为0,元素在集合中存在则更新对应score)
zrangebyscore zset 0 1 (查询分数为0-1的所有值并排序输出)

三、常用命令

序号

命令

描述

1

DEL key

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

2

DUMP key

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

3

EXISTS key

检查给定 key 是否存在。

4

EXPIRE key seconds

为给定 key 设置过期时间,以秒计。

5

EXPIREAT key timestamp

为 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 的名称,若 key 存在则覆盖。

15

RENAMENX key newkey

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

16

TYPE key

返回 key 所储存的值的类型。

四、发布订阅

【1、作用】

1、可实现消息提醒功能。

【2、发布】

序号

命令

描述

1

SUBSCRIBE channel message

发布信息到指定频道

2

PUBSUB subcommand [argument [argument …]]

查看订阅与发布系统状态。

【3、订阅】

序号

命令

描述

1

SUBSCRIBE channel [channel …]

订阅一个或多个频道的信息

2

PSUBSCRIBE pattern [pattern …]

订阅一个或多个符合给定模式的频道,用*通配

3

PUNSUBSCRIBE [pattern [pattern …]]

退订所有给定模式的频道

4

UNSUBSCRIBE [channel [channel …]]

指退订给定的频道。

五、事务

【1、简介】

Redis 事务可以一次执行多个命令:
1、批量操作在发送 EXEC 命令前被放入队列缓存。
2、收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行*【非原子性】*。
3、在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。

【2、步骤】

一个事务从开始到执行会经历以下三个阶段:
1、开始事务。
2、命令入队。
3、执行事务。

【3、实例】

1)、开始事物

multi

2)、命令入队

publish chat 11111111111
publish chat 22222222222

3)、执行事务

exec

【4、命令】

序号

命令

描述

1

WATCH key [key …]

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

2

MULTI

标记一个事务块的开始。

3

DISCARD

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

4

EXEC

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

5

UNWATCH

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

六、脚本

暂不考虑

七、服务器

【1、命令】

序号

命令

描述

1

info

查看 redis 服务器的统计信息

2

COMMAND

获取 Redis 命令详情数组

3

CLIENT LIST

获取连接到服务器的客户端连接列表

4

CLIENT KILL [ip:port] [ID client-id]

关闭客户端连接

5

BGSAVE

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

6

CLIENT SETNAME connection-name

设置当前连接的名称

7

time

redis服务器时间

8

CONFIG SET parameter value

修改 redis 配置参数,无需重启

9

CONFIG REWRITE

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

10

DBSIZE

返回当前数据库的 key 的数量

11

FLUSHALL

删除所有数据库的所有key

12

FLUSHDB

删除当前数据库的所有key

13

LASTSAVE

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

14

MONITOR

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

15

SAVE

同步保存数据到硬盘

16

ROLE

返回主从实例所属的角色

17

SHUTDOWN [NOSAVE] [SAVE]

异步存数据到硬盘,并关闭服务器,服务器重新启动后,客户端默认连上。(nosave:不保存数据;save:保存数据,默认保存)

18

SLAVEOF host port

将当前服务器转变为指定服务器的从属服务器(slave server)

19

SYNC

同步主从服务器

20

ROLE

返回主从实例所属的角色

八、数据备份与恢复

【1、备份】

序号

命令

描述

1

SAVE

创建当前数据库的备份,持久化到(dump.rdb) 文件

2

DBSAVE

后台执行当前数据库的备份,持久化到(dump.rdb)文件

【2、恢复】

只需将备份文件 (dump.rdb) 移动到 redis 安装目录并启动服务即可。
获取 redis 目录可以使用 CONFIG 命令:CONFIG GET dir

【3、数据持久化方式】

1)、aof(增量,一条数据可能保存多条记录)

像关系数据库中的binlog一样 把每一次写操作以追加的形式记录在其中以文件的形式刷到磁盘里。

并且可以使用不同的fsync策略,无fsync,每秒fsync,每次写的时候fsync。

优点:

1、使用默认的每秒fsync策略,Redis的性能依然很好(fsync是由后台线程进行处理的,主线程会尽力处理客户端请求)。
2、一旦出现故障,最多丢失1秒的数据.

缺点:

1、那就是aof文件的大小会随着时间线性增长 一段时间之后 就会变得很大。
2、以AOF的形式来恢复数据 那么由于AOF文件的巨大体积 可能会让进程如同假死一样 十分的慢。

2)、rdb(全量)

是一种快照机制,rdb就是每隔一段时间对内存中的数据做一次快照,保存在rdb文件中

优点:

1、redis的主从同步可以实现异步 也是由于rdb的机制 他在做快照时会fork出一个子进程 由子进程来做快照,父进程完全处理请求毫不影响,很适合数据的备份。

缺点:

1、如果数据量很大的话 rdb它要保存一个完整的数据集 是一个大的工作 如果时间间隔设置的太短 ,那么严重影响redis的性能,但是按照常规设置的话 如5分钟一次 那么如果宕机或者重启 就会基于上次做rdb的时间,从而丢失分钟级的数据

3)、rdb&aof

要求很高的数据保障性选用

4)、aof-rdb的混合方案

redis4.0的新特性,待观察

九、性能测试

todo

十、客户端连接

【1、客户端连接】

Redis 通过监听一个 TCP 端口或者 Unix socket 的方式来接收来自客户端的连接,当一个连接建立后,Redis 内部会进行以下一些操作:

1、客户端 socket 会被设置为非阻塞模式,因为 Redis 在网络事件处理上采用的是非阻塞多路复用模型。
2、为这个 socket 设置 TCP_NODELAY 属性,禁用 Nagle 算法。
3、创建一个可读的文件事件用于监听这个客户端 socket 的数据发送。

【2、连接数】

maxclients:最大连接数,默认10000
config set maxclients
config get maxclients

【3、客户端命令】

序号

命令

描述

1

CLIENT LIST

返回连接到 redis 服务的客户端列表

2

CLIENT SETNAME

设置当前连接的名称

3

CLIENT GETNAME

设置服务名称

4

CLIENT PAUSE time

挂起客户端连接,指定挂起的时间以毫秒计

5

CLIENT KILL

关闭客户端连接

【4、备注】

1、Nagle算法是通过缓存将多个小包积攒到一定数据时再发送,有一定延迟,不适合在高频互动的服务器/客户端使用。
2、TCP_NODELAY:TCP无延迟。

十一、管道技术

【1、管道技术】

1)、Redis是一种基于客户端-服务端模型以及请求/响应协议的TCP服务。这意味着通常情况下一个请求会遵循以下步骤:

1、客户端向服务端发送一个查询请求,并监听Socket返回,通常是以阻塞模式,等待服务端响应。
2、服务端处理命令,并将结果返回给客户端。

2)、Redis 管道技术可以在服务端未响应时,客户端可以继续向服务端发送请求,并最终一次性读取所有服务端的响应。

【2、作用】

1、提升 redis 服务的性能

【3、实例】

查看 redis 管道,只需要启动 redis 实例并输入以下命令:

客户端命令:
$(echo -en “PING\r\n SET runoobkey redis\r\nGET runoobkey\r\nINCR visitor\r\nINCR visitor\r\nINCR visitor\r\n”; sleep 10) | nc localhost 6379

服务端返回:
+PONG
+OK
redis
:1
:2
:3

以上实例中我们通过使用 PING 命令查看redis服务是否可用, 之后我们设置了 runoobkey 的值为 redis,然后我们获取 runoobkey 的值并使得 visitor 自增 3 次。

在返回的结果中我们可以看到这些命令一次性向 redis 服务提交,并最终一次性读取所有服务端的响应。

十二、分区

分区是分割数据到多个Redis实例的处理过程,因此每个实例只保存key的一个子集。

【1、分区优劣】

1)、分区的优势

1、通过利用多台计算机内存的和值,允许我们构造更大的数据库。
2、通过多核和多台计算机,允许我们扩展计算能力;通过多台计算机和网络适配器,允许我们扩展网络带宽。

2)、分区的不足

redis的一些特性在分区方面表现的不是很好:

1、涉及多个key的操作通常是不被支持的。举例来说,当两个set映射到不同的redis实例上时,你就不能对这两个set执行交集操作。
2、涉及多个key的redis事务不能使用。
3、当使用分区时,数据处理较为复杂,比如你需要处理多个rdb/aof文件,并且从多个实例和主机备份持久化文件。
4、增加或删除容量也比较复杂。redis集群大多数支持在运行时增加、删除节点的透明数据平衡的能力,但是类似于客户端分区、代理等其他系统则不支持这项特性。然而,一种叫做presharding的技术对此是有帮助的。

【2、分区类型】

Redis 有两种类型分区。 假设有4个Redis实例 R0,R1,R2,R3,和类似user:1,user:2这样的表示用户的多个key,对既定的key有多种不同方式来选择这个key存放在哪个实例中。也就是说,有不同的系统来映射某个key到某个Redis服务。

1)、范围分区

最简单的分区方式是按范围分区,就是映射一定范围的对象到特定的Redis实例。

比如,ID从0到10000的用户会保存到实例R0,ID从10001到 20000的用户会保存到R1,以此类推。

这种方式是可行的,并且在实际中使用,不足就是要有一个区间范围到实例的映射表。这个表要被管理,同时还需要各 种对象的映射表,通常对Redis来说并非是好的方法。

2)、哈希分区

另外一种分区方法是hash分区。这对任何key都适用,也无需是object_name:这种形式,像下面描述的一样简单:

用一个hash函数将key转换为一个数字,比如使用crc32 hash函数。对key foobar执行crc32(foobar)会输出类似93024922的整数。
对这个整数取模,将其转化为0-3之间的数字,就可以将这个整数映射到4个Redis实例中的一个了。93024922 % 4 = 2,就是说key foobar应该被存到R2实例中。注意:取模操作是取除的余数,通常在多种编程语言中用%操作符实现。

十三、其他配置

【1、配置 redis 外网可访问】

由于 redis 采用的安全策略,默认会只准许本地访问。需要通过简单配置,完成允许外网访问。
1)、修改 redis 的配置文件,将所有 bind 信息全部屏蔽。

bind 192.168.1.100 10.0.0.1
bind 192.168.1.8
bind 127.0.0.1
修改完成后,需要重新启动 redis 服务。

2)、修改 Linux 的防火墙(iptables),开启你的 redis 服务端口,默认是 6379。(待验证)

-A INPUT -m state –state NEW -m tcp -p tcp –dport 6379 -j ACCEPT
……
-A INPUT -j REJECT –reject-with icmp-host-prohibited

请注意,一定要将 redis 的防火墙配置放在 REJECT 的前面。然后执行

service iptables restart。

至此,就能够链接到 redis 服务,并且能够正确显示了。

十四、Redis异常

【1、断电】

1)、设置 appendonly 为 yes,每次更新进行备份,但影响效率。
待补充