@Redis常用功能介绍
Redis
一、Redis配置
【1、查看配置】
redis 127.0.0.1:6379> CONFIG GET *
【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,每次更新进行备份,但影响效率。
待补充